DRB
DRB o Distributed Ruby es una abstracción de sockets tcp y serialización de objetos que trae integrada ruby por defecto.
Tenía ganas de jugar con drb y su abstracción superior sobre el patron tuple spaces que es una forma de implementar el paradigma de memoria asociativa (associative memory) desda linda, que es una forma de coordinar y comunicar diferentes procesos entre máquinas. Ya jugaremos con Rinda, pero como bien dice mi amigo Jack... Vayamos por partes.
En este caso vamos a poner un caso real en rails para procesar emails. No es que sea necesario utilizar DRb, es que es la única forma rentable que he encontrado. Recibimos e-mails con una frecuencia indeterminada, y los procesamos desde una tarea rake. Esto está bien salvo por que levantar una tarea rake que como dependencia tiene :environment, puede suponer bastante tiempo. Si supone 10 segundos y cada instancia supone 40 o 50 megas. 10 correos por segundo... tumbarían la máquina.
Pues lejos de ir más lejos se implementa una arquitectura cliente-servidor en el que el servidor es la tarea rake y el cliente es lo que se conecta con el MTA(Mail Transfer Agent) del sistema. Al grano:
El cliente, solo necesita esto
#!/usr/bin/env ruby require 'drb' URI="druby://localhost:9999" server = DRbObject.new_with_uri URI return server.process($stdin.read.to_s)
Mientras que el servidor se arreglaría con esto
desc 'Start Mail Daemon' task :daemon => :environment do require 'drb' URI="druby://localhost:9999" class Processor def process(mail) ModeloActiveRecordParaMails.create(TMail.new(mail)) end end DRb.start_service URI, Processor.new DRb.thread.join end
Con esto estaría ya todo el trabajo hecho.
Creo que el código es bastante auto-explicativo. Si hay alguna duda... A los comentarios.
4, ene | sin comentarios cientifico compártelo Tags: client server, start service, thread join, drb, ruby, rails, daemon, cliente, servidor, druby

Escribe un comentario