TDC2016SP - Trilha Programação Funcional

50
Pedro Medeiros Software Engineer @ Globo.com /pedrosnk /pesnk Escalando Elixir com OTP

Transcript of TDC2016SP - Trilha Programação Funcional

Page 1: TDC2016SP - Trilha Programação Funcional

Pedro Medeiros

Software Engineer @ Globo.com

/pedrosnk /pesnk

Escalando Elixir com OTP

Page 2: TDC2016SP - Trilha Programação Funcional

O que vamos falar?

➔ Introdução a Elixir➔ Processos (modelo de concorrência)➔ OTP➔ GenServer, Supervisor, Application

Page 3: TDC2016SP - Trilha Programação Funcional

Elixir

Page 4: TDC2016SP - Trilha Programação Funcional

ElixirLinguagem funcional com suporte a meta-programação na maquina virtual Erlang.

Page 5: TDC2016SP - Trilha Programação Funcional

ElixirLinguagem funcional com suporte a meta-programação na maquina virtual Erlang.

Page 6: TDC2016SP - Trilha Programação Funcional

ElixirSample

defmodule Fibonacci do

def fib(0), do: 0

def fib(1), do: 1

def fib(n), do

fib(n-1) + fib(n-2)

end

end

IO.puts Fibonacci.fib(10)

Page 7: TDC2016SP - Trilha Programação Funcional

Disclaimer

Page 8: TDC2016SP - Trilha Programação Funcional

Disclaimer

Elixir não é apenas uma linguagem com syntax melhor que

Erlang.

Page 9: TDC2016SP - Trilha Programação Funcional

1. Extensibilidade

2. Produtividade

3. CompatibilidadeElixir Design Goals

Page 10: TDC2016SP - Trilha Programação Funcional

Polimorfismo de tipo e de modulos.Extensibilidade

Page 11: TDC2016SP - Trilha Programação Funcional

Extensibilidade

Process

Estrutura 1 Estrutura 2

dado.value

Page 12: TDC2016SP - Trilha Programação Funcional

Extensibilidade

Process

Process

Process

Call.here?

Page 13: TDC2016SP - Trilha Programação Funcional

Extensibilidade

Process

Mensagem1 Mensagem2

JSON.decode

Page 14: TDC2016SP - Trilha Programação Funcional

Extensibilidade

Process

Process

Process

Call.here?

Page 15: TDC2016SP - Trilha Programação Funcional
Page 16: TDC2016SP - Trilha Programação Funcional

Produtividade1. Mix2. Hex3. Docs4. Test

Great tooling

Page 17: TDC2016SP - Trilha Programação Funcional

Produtividade

Mix

Page 18: TDC2016SP - Trilha Programação Funcional

Produtividade

Hex

Page 19: TDC2016SP - Trilha Programação Funcional

Produtividade

Docs

Page 20: TDC2016SP - Trilha Programação Funcional

Produtividade

Test

Page 21: TDC2016SP - Trilha Programação Funcional

Produtividade

Test

defmodule Fibonacci do

@doc """

Fibonacci

iex> Fibonacci.fib(10)

55

"""

def fib(0), do: 0

def fib(1), do: 1

def fib(n) do

fib(n - 1) + fib(n - 2)

end

end

Page 22: TDC2016SP - Trilha Programação Funcional

Produtividade

Summary

$ mix new foobar$ cd foobar$ mix test$ mix hex.publish$ mix hex.docs

Page 23: TDC2016SP - Trilha Programação Funcional

Compatibilidade Elixir and Erlang sitting on a tree

Page 24: TDC2016SP - Trilha Programação Funcional

Compatibilidade

Elixir calls Erlang

Page 25: TDC2016SP - Trilha Programação Funcional

Compatibilidade

Erlang calls Elixir

Page 26: TDC2016SP - Trilha Programação Funcional

Processos 101

O modelo básico de concorrência

Page 27: TDC2016SP - Trilha Programação Funcional

Processos

def ExpensiveProcess do

def loop do

receive do

{:operation, {sender, operation}} ->

operation = expensive_method(operation)

send sender, {:ok, operation}

loop()

:stop ->

:error

_ ->

loop()

end

end

end

Page 28: TDC2016SP - Trilha Programação Funcional

ProcessosA P

B

C

Page 29: TDC2016SP - Trilha Programação Funcional

ProcessosA P

B

C

Page 30: TDC2016SP - Trilha Programação Funcional

ProcessosA P

B

C

Page 31: TDC2016SP - Trilha Programação Funcional

ProcessosA P

B

C

Page 32: TDC2016SP - Trilha Programação Funcional

OTP

Open Telecom Platform

Page 33: TDC2016SP - Trilha Programação Funcional

OTP1. Building na Erlang VM2. Super Toolset para

construir aplicações tolerante a falha, escaláveis e distribuidas.

Open Telecom Platform

Page 34: TDC2016SP - Trilha Programação Funcional

OTP

Qual problema resolve?

Page 35: TDC2016SP - Trilha Programação Funcional

OTP

Switch

Switch

Page 36: TDC2016SP - Trilha Programação Funcional

OTP

Server

Browser, Mobile, IoTsEndpoints

Page 37: TDC2016SP - Trilha Programação Funcional

OTP

Open Telecom Platform

1. GenServer2. Supervisor3. Application

Behaviours

Page 38: TDC2016SP - Trilha Programação Funcional

OTP

GenServer

defmodule MyServer do

use GenServer

def handle_call({:pop, _from, [item | state]}) do

{:reply, item, state}

End

def handle_cast({:push, item}, state) do

{:noreply, [item | state]}

End

def handle_info(:log, state) do

IO.puts("State of server is #{inspect(state)}")

{:noreply, state}

end

end

Page 39: TDC2016SP - Trilha Programação Funcional

OTP

GenServer

defmodule MyServer do

use GenServer

def handle_call({:pop, _from, [item | state]}) do

{:reply, item, state}

End

def handle_cast({:push, item}, state) do

{:noreply, [item | state]}

End

def handle_info(:log, state) do

IO.puts("State of server is #{inspect(state)}")

{:noreply, state}

end

end

Sincronos

Assíncronos

Mensagem

Page 40: TDC2016SP - Trilha Programação Funcional

OTP

Supervisor

Supervisor

S1 S2 S3

● Olha se o filho está vivo.● Gerencia filhos a partir de um

comportamento e estratégia● :one_for_one, :rest_for_all, :

rest_for_one

Page 41: TDC2016SP - Trilha Programação Funcional

OTP

Supervisor

Supervisor

S1 S3

Estratégia :one_for_one

:one_for_one

Supervisor

S1 S3S1

Page 42: TDC2016SP - Trilha Programação Funcional

OTP

Supervisor

Supervisor

S1 S3

Estratégia :rest_for_all

:rest_for_all

Supervisor

S1 S3S1

Page 43: TDC2016SP - Trilha Programação Funcional

OTP

Supervisor

Supervisor

S1 S3

Estratégia :rest_for_one

:rest_for_all

Supervisor

S1 S3S1

Page 44: TDC2016SP - Trilha Programação Funcional

OTP

Supervisor

defmodule MyServer.Supervisor do

use Supervisor

def start_link do

Supervisor.start_link(__MODULE__, [])

end

def init([]) do

children = [

worker(MyServer, []),

worker(MyServer2, [])

]

supervise(children, strategy: :one_for_one)

end

end

Page 45: TDC2016SP - Trilha Programação Funcional

OTP

Applicaton

Application é aonde todos os supervisors se inicializam.

● Código pequeno● Inicializa os Supervisors

que vivem “pra sempre”

Page 46: TDC2016SP - Trilha Programação Funcional

OTP

Applicaton

Page 47: TDC2016SP - Trilha Programação Funcional

OTP

Applicaton

defmodule Logger.App do

use Application

def start(_type, _args) do

import Supervisor.Spec

# ...

options = [strategy: :rest_for_one, name: Logger.

Supervisor]

children = [worker(GenEvent, [[name: Logger]]),

worker(Logger.Watcher, [Logger, Logger.Config, []],

[id: Logger.Config, function: :watcher]),

supervisor(Logger.Watcher, [Logger.Config, :handlers, []]),

worker(Logger.Watcher,

[:error_logger, Logger.ErrorHandler,

{otp_reports?, sasl_reports?, threshold},

:link],

[id: Logger.ErrorHandler, function: :

watcher])]

case Supervisor.start_link(children, options) do

{:ok, sup} ->

{:ok, sup, config}

{:error, _} = error ->

error

end

end

Page 48: TDC2016SP - Trilha Programação Funcional

Lembram dele?

Server

Browser, Mobile, IoTsEndpoints

Page 49: TDC2016SP - Trilha Programação Funcional

Obrigado

Page 50: TDC2016SP - Trilha Programação Funcional

Recursos:

1. http://elixir-lang.org/2. https://hex.pm3. Programming Elixir Book4. The little Elixir and OTP Guidebook5. slideshare.net/pemedeiros