ruby e erlang de mãos dadas

32
Ruby e Erlang de mãos dadas Éverton Ribeiro [email protected]

Upload: everton-ribeiro

Post on 26-Jun-2015

1.194 views

Category:

Technology


3 download

DESCRIPTION

Apresentação

TRANSCRIPT

Page 1: Ruby e Erlang de mãos dadas

Ruby e Erlangde mãos dadas

Éverton [email protected]

Page 2: Ruby e Erlang de mãos dadas

Quem?

Page 3: Ruby e Erlang de mãos dadas

Quem?

• Desenvolvedor web

• Ex Administrador de redes

• Desenvolvedor e Pesquisador Abril

• http://nuxlli.com.br

• @nuxlli

Page 4: Ruby e Erlang de mãos dadas

O que queremos?

Criar uma arquitetura que junte as duas linguagens de forma que uma possa favorecer a outra e tentar eliminar

suas deficiências.

Page 5: Ruby e Erlang de mãos dadas

Agenda

• Linguagens: Vantagens e Desvantagens

• Onde usamos

• Erlang distribuída

• Lib para facilitar a vida

• Futuro da lib

Page 6: Ruby e Erlang de mãos dadas
Page 7: Ruby e Erlang de mãos dadas

Erlang - Vantagens

• Suporte à concorrência (no threads)

• Hot Swapping Code nativo

• Distribuída

• Feita para ambientes Real Time

• Libs de alta performance

Page 8: Ruby e Erlang de mãos dadas

Erlang - Desvantagens

• Curva de aprendizado muito alta (paradigma funcional)

• Dificuldade para criação de framework web

• Code base complexo

• Poucos desenvolvedores

Page 9: Ruby e Erlang de mãos dadas
Page 10: Ruby e Erlang de mãos dadas

Ruby - Vantagens

• Curva de aprendizado baixa

• Menos é mais

• Comunidade de desenvolvedores grande

Page 11: Ruby e Erlang de mãos dadas

Ruby - Desvantagens

• Desempenho

• Pouca aceitação no mundo EE

• Complexidade para desenvolver aplicações distribuídas

Page 12: Ruby e Erlang de mãos dadas

O que elas ganham?

• Erlang

• Produtividade

• Facilidade em escrever testes

• Ruby

• Performance

• Programação distribuída

Page 13: Ruby e Erlang de mãos dadas

na prática - live

Page 14: Ruby e Erlang de mãos dadas

Mas antes

Page 15: Ruby e Erlang de mãos dadas

Programação distribuída com Erlang

• Clusters

• Todo interpretador rodando é um nó.

• Um nó confia plenamente no outro.

• rpc call

Page 16: Ruby e Erlang de mãos dadas

Exemplo-module(math).-export([start/0,add/2]).

start() -> register(?MODULE, spawn(fun() -> loop() end)).

add(X,Y) -> ?MODULE ! {self(), add, X, Y}, receive {?MODULE, Response} -> Response end.

loop() -> receive {From, add, X, Y} -> Sum = X + Y, From ! {?MODULE,Sum}, loop(); Any -> loop() end.

Page 17: Ruby e Erlang de mãos dadas

ExemploPrimeiro nó

$ erlc math.erl$ erl -sname smath(smath@localhost) 1> math:start().true(smath@localhost) 2> math:add(1, 2).3

Segundo nó$ erl -sname cmath(cmath@localhost) 1> rpc:call(smath@localhost, math, add, [2, 3]).4

Page 18: Ruby e Erlang de mãos dadas

voltando ao live

Page 19: Ruby e Erlang de mãos dadas

Como fizemos

EPMD (Erlang Port Mapper Daemon)

Page 20: Ruby e Erlang de mãos dadas

Problemas identificados:

• Fora do padrão Erlang

• Manutenção, 3 pontos de mudança:

• Nós Erlang

• Servidor Erlang (API HTTP)

• Aplicação Ruby on Rails

Page 21: Ruby e Erlang de mãos dadas

Uma forma melhor

EPMD (Erlang Port Mapper Daemon)

Page 22: Ruby e Erlang de mãos dadas

Porque é melhor:

• É mantido o padrão Erlang

• Manutenção, 2 pontos de mudança:

• Nós Erlangs

• Aplicação Ruby on Rails

Page 23: Ruby e Erlang de mãos dadas

Mas como fazer?

?

Page 24: Ruby e Erlang de mãos dadas

rinterface

• http://github.com/nofxx/rinterface

• Lib de comunicação com nós erlang

• EPMD (Erlang Port Mapper Daemon)

• Criado por: Dave Bryson

• Contribuição: nofxx e nuxlli

Page 25: Ruby e Erlang de mãos dadas

Como funciona?

Em Erlang:

rpc:call(smath@localhost, math, add, [10, 20])

Em Ruby:

Erlang::Node.rpc(:smath,:math,:add, [10,20])

Page 26: Ruby e Erlang de mãos dadas

Status:• O que faz:

• Chamadas rpc aos nós erlang

• Tratamento de tipos: inteiros, flutuantes, atoms, tuplas, listas e strings

• API simples para execução de chamadas

• O que queremos:

• Comportar como um nó Erlang

• Facilities para rodar testes

• DSL para chamadas e respostas

Page 27: Ruby e Erlang de mãos dadas

Testes em Erlangfib.erl

-module(fib).-export([fib/1]).-include_lib("eunit/include/eunit.hrl").

fib(0) -> 1;fib(1) -> 1;fib(N) when N > 1 -> fib(N-1) + fib(N-2).

fib_test_() -> [?_assert(fib(0) =:= 1), ?_assert(fib(1) =:= 1), ?_assert(fib(2) =:= 2), ?_assert(fib(3) =:= 3), ?_assert(fib(4) =:= 5), ?_assert(fib(5) =:= 8), ?_assertException(error, function_clause, fib(-1)), ?_assert(fib(31) =:= 2178309)].

Page 28: Ruby e Erlang de mãos dadas

Teste com rinterface(atualmente)

fib_spec.rbrequire 'minitest/unit'require 'minitest/spec'require 'rinterface'MiniTest::Unit.autorun

describe "Erlang Fib" do it "should " do assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [0]), [:ok, 1] assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [1]), [:ok, 1] assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [3]), [:ok, 3] assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [4]), [:ok, 5] assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [5]), [:ok, 8] assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [-1])[0], :badrpc assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [31]), [:ok, 2178309] endend

Page 29: Ruby e Erlang de mãos dadas

Teste com rinterfacefib_spec.rb

require 'minitest/unit'require 'minitest/spec'require 'rinterface/test'MiniTest::Unit.autorun

describe "Erlang Fib" do before do FibMod = Erlang::Node.new(:sfib, :fib) end it "should " do assert_equal FibMod.fib(0), 1 assert_equal FibMod.fib(1), 1 assert_equal FibMod.fib(3), 3 assert_equal FibMod.fib(4), 5 assert_equal FibMod.fib(5), 8 assert_equal FibMod.fib(31), 2178309 assert_raises (Server::Badrpc) { assert_equal FibMod.fib(-1) } endend

Page 30: Ruby e Erlang de mãos dadas

Futuro - Client Node

# Erlang::Node.new(:'node@localhost')ServerFib = Erlang::Node.new(:sfib)ServerFib.fib.fib(1) # 1

# Erlang::Node.new(:'node@localhost', :module)ModFib = Erlang::Node.new(:sfib, :fib)ModFib.fib(1) # 1

Page 31: Ruby e Erlang de mãos dadas

Futuro - Server Node

Erlang::Mod.new :math do def add x, y x + y endend

module Fib def fib(n) n < 2 ? n : fib(n-1) + fib(n-2) endendErlang::Mod.new :fib => Fib