• No se han encontrado resultados

T a r e a s e n b a c k g r o u n d c o n R o R y B a c k g r o u n D R b

N/A
N/A
Protected

Academic year: 2021

Share "T a r e a s e n b a c k g r o u n d c o n R o R y B a c k g r o u n D R b"

Copied!
24
0
0

Texto completo

(1)

T a r e a s e n b a c k g r o u n d c o n

R o R y B a c k g r o u n D R b

IULA – UPF

Este trabajo se enmarca dentro del proyecto AAILE (financiado por el Ministerio de Educación y Ciencia y el Fondo Social

Europeo PTA-CTE/1370/2003)

(2)
(3)

C i c l o p e t i c i ó n / r e s p u e s t a

RAILS SERVER PETICIÓN RESPUESTA Inicio de la ejecución Final de la ejecución Cliente Web

(4)

P r o b l e m a

● Procesos de cálculo largos

● Actualizaciones masivas de datos ● Peticiones de datos a servidores

externos:

– WebServices

– Transferencia de archivos ● etc ...

(5)

S o l u c i o n e s p o s i b l e s

● UNIX Cron y script/runner

– script/runner “Modelo.accion”

● Estable pero consume muchos recursos ● No ejecutable desde la aplicación rails

● Forks o Threads

– Programación a muy bajo nivel – Fork da problemas en Windows

(6)

B a c k g r o u n D r b

● Framework para extraer tareas del ciclo

de petición/respuesta en RoR

● Permite fácilmente la comunicación entre

la tarea y la aplicación rails

● Servidor de objetos (DRb)

– http://chadfowler.com/ruby/drb.html ● Desarrollado por:

– Ezra Zygmuntowicz (http://brainspl.at/) – skaar@waste.org

(7)

B a c k g r o u n D R b , p o s i b l e s

a p l i c a c i o n e s

● Caching

– Mantener en cache objetos ActiveRecord

● Mantener sesiones remotas abiertas – Cliente web de servicios de mensajería

instantánea (ej. Jabber)

(8)

A r q u i t e c t u r a

B a c k g r o u n D R b

● Servidor de tareas – Workers – MiddleMan ● Aplicación Rails – MiddleMan

(9)

M a n o s a l a o b r a

¡Creación de un contador

de segundos!

(10)

I n s t a l a c i ó n

● script/plugin install svn://rubyforge.org/var/svn/backgroundrb vendor/plugins/backgroundrb/backgroundrb_rails.rb vendor/plugins/backgroundrb/backgroundrb.rb vendor/plugins/backgroundrb/init.rb vendor/plugins/backgroundrb/lib/backgroundrb.rb vendor/plugins/backgroundrb/tasks/backgroundrb_tasks.rake vendor/plugins/backgroundrb/script/backgroundrb/stop vendor/plugins/backgroundrb/script/backgroundrb/start vendor/plugins/backgroundrb/generators/worker/worker_generator.rb vendor/plugins/backgroundrb/examples vendor/plugins/backgroundrb/test ● rake backgroundrb:setup config/backgroundrb.yml script/background lib/workers

(11)

c o n f i g / b a c k g r o u n d r b . y m l --- port: "22222" timer_sleep: 60 load_rails: true environment: development host: localhost database_yml: config/database.yml acl: deny: all allow: localhost 127.0.0.1 order: deny,allow

(12)

P u e s t a e n m a r c h a

● Encender:

– ruby script/backgroundrb/start ● Apagar:

(13)

C r e a c i ó n d e u n w o r k e r

● script/generate worker Currante – lib/workers/currante_worker.rb

(14)

l i b / w o r k e r s / c u r r a n t e _ w o r k e r . r b

class CurranteWorker < BackgrounDRb::Rails

attr_reader :progreso, :total, :resultado

def do_work(args)

@progreso = 0; @total = args @total.times {

sleep 1

@progreso += 1

}

@resultado = "He contado #{args} segundos!" ActiveRecord::Base.connection.disconnect!

end end

(15)

l i b / w o r k e r s / c u r r a n t e _ w o r k e r . r b

class CurranteWorker < BackgrounDRb::Rails

attr_reader :progreso, :total, :resultado

def do_work(args)

@progreso = 0; @total = args @total.times {

sleep 1

@progreso += 1

}

@resultado = "He contado #{args} segundos!"

ActiveRecord::Base.connection.disconnect!

ActiveRecord::Base.connection.disconnect!

(16)

P o n e r a t r a b a j a r a n u e s t r o

w o r k e r

● script/generate controller Vigilante – app/controllers/vigilante_controller.rb

test/functional/vigilante_controller_test.rbapp/helpers/vigilante_helper.rb

(17)

a p p / c o n t r o l l e r s / v i g i l a n t e _ c o n t r o l l e r . r b class VigilanteController < ApplicationController

def index end

def lanzar_tarea # Crear el worker

session[:jobkey_currante] = MiddleMan.new_worker :class => :currante_worker, :args => 30 end def progreso # Actualizar el % finalizado if session[:jobkey_currante]

@progreso = MiddleMan.get_worker(session[:jobkey_currante]).progreso @total = MiddleMan.get_worker(session[:jobkey_currante]).total

@completado = @progreso.to_f * 100.0/ @total.to_f

redirect_to :action => "finalizado" if @progreso >= @total

end

end

def finalizado

# Mostrar resultados

(18)

a p p / v i e w s / v i g i l a n t e / i n d e x . r h t m l

<html> <head>

<meta http-equiv="Content-type" content="text/html; charset=utf-8"> <title>Conferencia Rails Hispana: BackgrounDRb </title>

<%= javascript_include_tag :defaults %>

</head>

<body bgcolor="#F8FAEC" style="font-size: 1.5em; font-family: georgia;">

<center>

<div style="text-align: center; margin-top:100px; padding: 10px; width:70%; background-color:#ccc; border:1px solid;">

<%= periodically_call_remote :url => {:action => "progreso" },

:frequency => 1 %>

<div id="progreso"></div>

<div id="tarea">

<%= link_to_remote "Hacer currar", :url => {:action => "lanzar_tarea" }%> </div> </div> </center> </body> </html>

(19)

a p p / v i e w s / v i g i l a n t e / * . r j s

app/views/vigilante/lanzar_tarea.rjs:

if session[:jobkey_currante]

page.replace_html 'tarea', "Currante con job key #{session[:jobkey_currante]} creado"

end

app/views/vigilante/progreso.rjs:

if @completado

page.replace_html 'progreso', " #{"%.2f" % @completado} % Completado"

end

app/views/vigilante/finalizado.rjs:

(20)
(21)
(22)

B a c k g r o u n D R b e n

d e s a r r o l l o

● Versión < 0.2.0 (utilizada en los

ejemplos)

– Instalable como plugin

– 1 proceso, multi threaded ● Versión 0.2.0 (actual)

Experimental, instalable directamente del

svn

– Multiproceso y más robusta ● Versión 0.3.x (futura)

(23)

M á s i n f o r m a c i ó n

● BackgrounDRB version < 0.2.0 – vendor/plugins/backgroundrb/README ● BackgrounDRB version 0.2.0 – http://backgroundrb.rubyforge.org – http://brainspl.at/articles/tag/background – http://backgroundrb.devjavu.com

● Transparencias + Código + Recursos

(24)

G r a c i a s !

¿PREGUNTAS?

Referencias

Documento similar

DEBE CUBRIRSE CON BASE EN EL SUELDO PREVISTO EN EL ARTÍCULO 18 DE LA LEY DEL TRABAJO RELATIVA:”.- Y DE LA DOCUMENTAL.- Consistente en copia del reverso de los

h)  contaminantes  del  medio  ambiente  laboral:  son  todas  las  sustancias  químicas  y  mezclas  capaces  de  modificar  las  condiciones  del  medio 

primordial, porque hemos sido arrancados de nuestra condición, como bien intuía Spinoza. Es notable que los distintos asentamientos indoeuropeos y sus lejanas migraciones

Con tantas opciones de revestimientos en diferentes sustratos, el cristal arquitectónico avanzado sunguard te da la flexibilidad que necesitas tanto para lograr un

Diplomado en Entrenamiento Deportivo Especializado, en el Centro de Educación Continua de Estudios Superiores del Deporte (CECESD) de la

I. Cuando se trate de personas físicas, el nombre, la nacionalidad y el domicilio del postor y, en su caso, la clave del Registro Federal de Contribuyentes; tratándose

Derivado del proceso de mejora administrativa en el procedimiento para integrar la Lista de personas que pueden fungir como peritos ante los órganos del Poder Judicial de

III. Deberán estar impermeabilizadas en su interior y en los muros colindantes con las fachadas y pasillos de circulación atendiendo lo que para tal efecto determine la