python - exchange - rabbitmq start
RabbitMQ: ¿Qué ofrece el apio que Pika no hace? (2)
Agregaré una respuesta aquí porque esta es la segunda vez que hoy alguien recomienda el apio cuando no es necesario, según sospecho de esta respuesta. Entonces, la diferencia entre una cola de tareas distribuida y un intermediario es que un intermediario simplemente pasa mensajes. Nada más y nada menos. Celery recomienda usar RabbitMQ como el intermediario predeterminado para IPC y coloca encima de los adaptadores para administrar tareas / colas con procesos de daemon. Si bien esto es útil especialmente para tareas distribuidas donde necesita algo genérico muy rápidamente. Es solo construir para el proceso editor / consumidor. Las tareas reales en las que ha definido el flujo de trabajo que necesita para avanzar y garantizar la durabilidad del mensaje en función de sus necesidades específicas, sería mejor escribir su propio editor / consumidor que confiar en apio. Obviamente, todavía tiene que hacer todas las comprobaciones de durabilidad, etc. Con la mayoría de los servicios relacionados con la web, uno no controla las unidades de "trabajo" reales, sino que las pasa a un servicio. Por lo tanto, tiene poco sentido para una cola de tareas distribuidas a menos que esté alcanzando un límite de llamadas de API arbitrario en función de la región geográfica / geográfica o el número de cuenta ... O algo por el estilo. Por lo tanto, usar apio no le impide tener que escribir o lidiar con el código de estado o la administración del flujo de trabajo, etc., y expone el AMQP de una manera que le facilita evitar escribir los constructos del código del editor / consumidor.
En resumen, si necesita una cola de tareas simple para repasar el trabajo y no está realmente preocupado por los matices del rendimiento, las complejidades de la durabilidad de su flujo de trabajo o los procesos reales de publicación / consumo. El apio funciona. Si solo le estás pasando mensajes a una API o un servicio que en realidad no controlas, puedes usar Celery, pero puedes fácilmente crear tu propia editorial / consumidor con Pika en un par de minutos. Si necesita algo sólido o que se adhiera a sus propios escenarios de durabilidad, escriba su propio código de publicación / consumidor como todos los demás.
He estado trabajando para conseguir que algunas tareas distribuidas funcionen a través de RabbitMQ.
Pasé un tiempo tratando de hacer que Celery hiciera lo que quería y no podía hacerlo funcionar.
Luego intenté usar Pika y las cosas simplemente funcionaron, sin fallas, y en minutos.
¿Hay algo que me esté perdiendo al usar Pika en lugar de Celery?
Lo que proporciona pika es solo una pequeña parte de lo que Celery está haciendo. Pika es la biblioteca de Python para interactuar con RabbitMQ. RabbitMQ es un agente de mensajes; en su núcleo, simplemente envía mensajes a / recibe mensajes de colas. Puede usarse como una cola de tareas, pero también podría usarse para pasar mensajes entre procesos, sin distribuir "trabajo".
Apio implementa una cola de tareas distribuidas, opcionalmente, utiliza RabbitMQ como intermediario para IPC. En lugar de simplemente proporcionar una forma de enviar mensajes entre procesos, proporciona un sistema para distribuir tareas / trabajos reales entre procesos. Así es como lo describe el sitio de Celery:
Las colas de tareas se utilizan como un mecanismo para distribuir el trabajo a través de hilos o máquinas.
La entrada de una cola de tareas es una unidad de trabajo, llamada tarea, los procesos de trabajo dedicados luego monitorean constantemente la cola para el nuevo trabajo a realizar.
El apio se comunica a través de mensajes, generalmente utilizando un agente para mediar entre los clientes y los trabajadores. Para iniciar una tarea, un cliente pone un mensaje en la cola, el agente luego entrega el mensaje a un trabajador.
Un sistema de apio puede constar de varios trabajadores y corredores, lo que da paso a una alta disponibilidad y escala horizontal.
El apio tiene un montón de funcionalidades integradas que están fuera del alcance de pika. Puedes echar un vistazo a los documentos de Celery para tener una idea del tipo de cosas que puede hacer, pero aquí hay un ejemplo:
>>> from proj.tasks import add
>>> res = add.chunks(zip(range(100), range(100)), 10)()
>>> res.get()
[[0, 2, 4, 6, 8, 10, 12, 14, 16, 18],
[20, 22, 24, 26, 28, 30, 32, 34, 36, 38],
[40, 42, 44, 46, 48, 50, 52, 54, 56, 58],
[60, 62, 64, 66, 68, 70, 72, 74, 76, 78],
[80, 82, 84, 86, 88, 90, 92, 94, 96, 98],
[100, 102, 104, 106, 108, 110, 112, 114, 116, 118],
[120, 122, 124, 126, 128, 130, 132, 134, 136, 138],
[140, 142, 144, 146, 148, 150, 152, 154, 156, 158],
[160, 162, 164, 166, 168, 170, 172, 174, 176, 178],
[180, 182, 184, 186, 188, 190, 192, 194, 196, 198]]
Este código quiere agregar cada x + y donde x está en el range(0, 100)
e y está en el range(0,100)
. Lo hace tomando una tarea llamada add
, que agrega dos números, y distribuye el trabajo de agregar 1+1
, 2+2
, 3+3
, etc., en trozos de 10, y distribuye cada trozo a tantos trabajadores de Apio como hay disponibles Cada trabajador ejecutará add
en su fragmento de 10 elementos, hasta que se complete todo el trabajo. Luego, los resultados son recogidos por la llamada res.get()
. Estoy seguro de que puedes imaginar una forma de hacerlo utilizando pika, pero estoy seguro de que también puedes imaginar cuánto trabajo se requeriría. Estás sacando esa funcionalidad de la caja con Celery.
Si lo desea, puede usar pika para implementar una cola de tareas distribuida, especialmente si tiene un caso de uso bastante simple. Celery solo proporciona una solución de "baterías incluidas" para la programación de tareas, la administración, etc., que tendrá que implementar manualmente si decide que las quiere con su solución pika.