Buenas noches rubystas queridos,
hoy me plantié un dilema que quiero compartir con ustedes, de paso aprovecho para comentarles mis pensamientos y hacer una que otra consulta:
Mi aplicación está corriendo con Rails 4 y Ruby 2.0.0.
En 3 meses aprox. la cantidad de usuarios será de 20.000. La verdad que por ahora escapa a mis conocimientos predecir cuántos de ellos serán concurrentes o no,
pero es mejor un número antes que nada.
Hace horas que estoy leyendo sobre DJ, Resque y Sidekiq, ventajas y desventajas, terminología más simple que otra, etc etc.
Quiero elegir uno de los 3 para controlar las tareas realizadas en background por mi aplicación (sin ningún orden en particular),
que se dividen en 3 categorías (bien podrían ser 3 queues :) )
"Notifications" - Similar al estilo de notificaciones diarias de Facebook que nos avisan sobre comentarios en fotos, etiquetas, relaciones, etc.
Valga la aclaración, éstas notificaciones no estarían siendo usadas por mail.
Simplemente impactarían en la BD y ésa información se usaría para mostrarse en una sección del usuario como ser "NewsFeed".
"Linkedin" - Permiten a la aplicación, una vez obtenida la autorización del usuario, importar datos personales de su cuenta en Linkedin: skills, work history, languages, etc.
"Emails" - El clásico envío de email cuando el usuario se: loguea en el sitio, solicita un desbloqueo del password, se suscribe al sitio, etc.
Mi razonamiento es el siguiente:
1.- Descarto DJ, por el simple hecho de que requiere usar mi BD para "manejar" todo lo referido a su funcionamiento, es decir, decidir qué Job procesar a continuación,
almacenar el estado del Job, etc., cuando bien podría NO usar mi BD para almacenar ésa información.
Con 20.000 usuarios realizando alguna o todas de las 3 actividades descritas arriba, suena lógico no elegir DJ.
2.- Aquí es donde encuentro el conflicto:
Usar exclusivamente Resque vs. Usar Sidekig (que se basa en Resque) Y la mejor fuente que encontré hasta ahora está aquí:
https://github.com/mperham/sidekiq/wiki/FAQ Los posts más actuales y "serios" recomiendan Sidekiq debido a que es más rápido que Resque principalmente, dado que Sidekiq procesos "multi-threaded" para manejar los jobs en background
y Resque usa procesos "single-threaded". De ésta forma, procesar 30 notificaciones en paralelo requeriría 20 procesos (con Resque) y 1 proceso con 20 threads (con Sidekiq).
Estando a punto de comenzar a implementar Sidekiq, encontré éste bienemérito post:
http://www.sitepoint.com/comparing-background-processing-libraries-sidekiq/ Extrapolando la sección del artículo que me genera confusión:
"Sidekiq is easy enough if you learned Resque, but it has a pretty big “problem” that we haven’t discussed yet: thread safety.
Since Sidekiq uses threads, you can only uses libraries in Sidekiq if they are thread safe – anything else will likely cause a ton of problems that are difficult to track down.
This really limits what you can do with
Sidekiq."
Secondly, you must ensure that your code is thread safe (e.g. global variables are a no-go).
Ruby (rather, the “default” ruby interpreter which is MRI) also has something called an “interpreter lock”, which means that only one thread can run at a time,
so Sidekiq will work much better with alternative implementations of Ruby, such as Rubinus and JRuby. "
3.- Concluyo que, en Ruby, Sidekiq no presentaría ventaja alguna de performance, dado que el GIL (Global Interpreter Locker) estaría limitando la ventaja fundamental de Sidekiq,
la cual es trabajar con múltiples threads en paralelo dentro de 1 proceso mejorando la performance y la utilización de recursos (memoria) dentro de la aplicación.
Lo cual me deja a elegir
Resque, el único "vencedor" y con una interfaz muy buena para ver los jobs pendientes, procesados y borrados.
Preguntas: (al fin), a) es la elección correcta? dadas las condiciones que les comenté más arriba.
b) si confundí algún concepto o lo malinterpreté, serían tan amables de poder aclarármelo? Sigo leyendo artículos en internet y obtengo el mismo enfoque.
Espero sus opiniones,
Un abrazo!
Ing. Juan Roldán