sql >> Base de Datos >  >> NoSQL >> Redis

Uso de Celery para consultas API externas sincrónicas en tiempo real con Gevent

Intentaré responder la mayor cantidad de preguntas posible.

¿Se puede (y se debe) hacer esto usando apio?

Sí puedes

Estoy usando django. ¿Debería intentar usar django-celery sobre apio simple?

Django tiene un buen soporte para apio y facilitaría mucho la vida durante el desarrollo

Cada una de esas tareas puede generar otras tareas, como registrar lo que acaba de suceder u otros tipos de bifurcaciones. ¿Es esto posible?

Puede iniciar subtareas dentro de una tarea con ignore_result =true solo para efectos secundarios

¿Podrían las tareas devolver los datos que obtienen, es decir, potencialmente Kb de datos a través del apio (redis como subyacente en este caso) o deberían escribir en la base de datos y simplemente pasar punteros a esos datos?

Sugeriría poner los resultados en db y luego pasar la identificación haría felices a su corredor y trabajadores. Menos transferencia de datos/decapado, etc.

Cada tarea está principalmente vinculada a E/S, e inicialmente solo iba a usar un evento del subproceso web para desplegar las solicitudes y omitir todo el diseño de la cola, pero resulta que se reutilizaría para un componente diferente. Tratar de mantener todo el viaje de ida y vuelta a través de las Q en tiempo real probablemente requerirá que muchos trabajadores se aseguren de que las colas estén casi vacías. ¿O es eso? ¿Ejecutar gevent workerpool ayudaría con esto?

Dado que el proceso está vinculado a io, gevent definitivamente ayudará aquí. Sin embargo, cuánto debería ser la concurrencia para el trabajador de gevent pool'd, es algo que también estoy buscando respuesta.

¿Tengo que escribir tareas específicas de gevent o utilizaré gevent pooldeal con red IO automáticamente?

Gevent hace el parche mono automáticamente cuando lo usas en la piscina. Pero las bibliotecas que use deberían funcionar bien con gevent. De lo contrario, si está analizando algunos datos con simplejson (que está escrito en c), eso bloquearía otros gevent greenlets.

¿Es posible asignar prioridad a ciertas tareas?

No puede asignar prioridades específicas a ciertas tareas, sino enrutarlas a una cola diferente y luego hacer que esas colas sean escuchadas por un número variable de trabajadores. Cuantos más trabajadores haya para una cola en particular, mayor será la prioridad de esas tareas en esa cola.

¿Qué hay de mantenerlos en orden?

La cadena es una forma de mantener el orden. El acorde es una buena manera de resumir. El apio se encarga de eso, así que no tienes que preocuparte por eso. Incluso cuando se usa gevent pool, al final sería posible razonar sobre el orden de ejecución de las tareas.

¿Debo omitir el apio y solo usar kombu?

Puede, si su caso de uso no cambiará a algo más complejo con el tiempo y también si está dispuesto a administrar sus procesos a través de celeryd + supervisado por usted mismo. Además, si no te importa el monitoreo de tareas que viene con herramientas como celerymon, flower, etc.

Parece que el apio está más orientado a "tareas" que se pueden aplazar y no son urgentes.

El apio también admite tareas programadas. Si eso es lo que quiso decir con esa declaración.

¿Estoy loco por tratar de mantener este tiempo real?

No me parece. Mientras sus consumidores sean lo suficientemente rápidos, será tan bueno como en tiempo real.

¿Qué otras tecnologías debo mirar?

Con respecto al apio, debe elegir la tienda de resultados sabiamente. Mi sugerencia sería usar cassandra. Es bueno para datos en tiempo real (tanto de escritura como de consulta). También puede usar redis o mongodb. Vienen con su propio conjunto de problemas como almacén de resultados. Pero luego, un pequeño ajuste en la configuración puede ser muy útil.

Si te refieres a algo completamente diferente al apio, entonces puedes buscar asyncio (python3.5) y zeromq para lograr lo mismo. Sin embargo, no puedo comentar más sobre eso.