Ruby e Erlang de mãos dadas
-
Upload
everton-ribeiro -
Category
Technology
-
view
1.194 -
download
3
description
Transcript of Ruby e Erlang de mãos dadas
Ruby e Erlangde mãos dadas
Éverton [email protected]
Quem?
Quem?
• Desenvolvedor web
• Ex Administrador de redes
• Desenvolvedor e Pesquisador Abril
• http://nuxlli.com.br
• @nuxlli
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.
Agenda
• Linguagens: Vantagens e Desvantagens
• Onde usamos
• Erlang distribuída
• Lib para facilitar a vida
• Futuro da lib
Erlang - Vantagens
• Suporte à concorrência (no threads)
• Hot Swapping Code nativo
• Distribuída
• Feita para ambientes Real Time
• Libs de alta performance
Erlang - Desvantagens
• Curva de aprendizado muito alta (paradigma funcional)
• Dificuldade para criação de framework web
• Code base complexo
• Poucos desenvolvedores
Ruby - Vantagens
• Curva de aprendizado baixa
• Menos é mais
• Comunidade de desenvolvedores grande
Ruby - Desvantagens
• Desempenho
• Pouca aceitação no mundo EE
• Complexidade para desenvolver aplicações distribuídas
O que elas ganham?
• Erlang
• Produtividade
• Facilidade em escrever testes
• Ruby
• Performance
• Programação distribuída
na prática - live
Mas antes
Programação distribuída com Erlang
• Clusters
• Todo interpretador rodando é um nó.
• Um nó confia plenamente no outro.
• rpc call
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.
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
voltando ao live
Como fizemos
EPMD (Erlang Port Mapper Daemon)
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
Uma forma melhor
EPMD (Erlang Port Mapper Daemon)
Porque é melhor:
• É mantido o padrão Erlang
• Manutenção, 2 pontos de mudança:
• Nós Erlangs
• Aplicação Ruby on Rails
Mas como fazer?
?
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
Como funciona?
Em Erlang:
rpc:call(smath@localhost, math, add, [10, 20])
Em Ruby:
Erlang::Node.rpc(:smath,:math,:add, [10,20])
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
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)].
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
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
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
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