Pregunta

Tengo una aplicación web Pilones servido por Apache (mod_wsgi, prefork). Debido a Apache, hay varios procesos separados que funcionan mi código de la aplicación al mismo tiempo. Algunas de las tareas no críticas que la aplicación no quiero aplazar para el procesamiento en segundo plano para mejorar los tiempos de respuesta "en vivo". Así que estoy pensando en cola de tareas, muchos procesos de Apache añade tareas a esta cola, un único proceso de Python independiente procesarlos uno por uno y la eliminación de la cola.

La cola debe ser preferentemente persistió en el disco para tareas en cola sin procesar no se pierden debido a la interrupción de la energía, el reinicio del servidor, etc. La pregunta es lo que sería una forma razonable para implementar dicha cola ?

En cuanto a las cosas que he intentado: Empecé con la base de datos SQLite simple y única tabla en él para almacenar elementos de la cola. En las pruebas de carga, al aumentar el nivel de concurrencia, empecé a recibir "base de datos bloqueada" errores, como se esperaba. La solución fue reemplazar quick'n'dirty SQLite con MySQL - que maneja los problemas de concurrencia bien pero se siente como una exageración por la simple cosa que tengo que hacer. DB operaciones relacionadas con cola-también aparecen prominentemente en mis informes de perfiles.

¿Fue útil?

Solución

Un intermediario de mensajes como ActiveMQ es una solución ideal aquí.

El gasoducto podría ser la siguiente:

  • Proceso de aplicación que se encarga de manejar las peticiones HTTP genera respuestas rápidamente y envía de baja prioridad, las tareas pesadas a la cola de AMQ.
  • Una o más de otros procesos están suscritos a consumir cola AMQ y hacer lo que se pretende hacer con estas tareas pesadas.

El requisito de la persistencia de colas se cumple fuera de la caja, ya ActiveMQ almacena los mensajes que aún no se consumen en el almacenamiento persistente. Además se escala muy bien ya que es libre de implementar múltiples aplicaciones HTTP, múltiples aplicaciones de consumo y AMQ sí en diferentes equipos cada uno.

Utilizamos algo como esto en nuestro proyecto escrito en Python utilizando STOMP protocolo de comunicación como subyacente .

Otros consejos

Un servidor web (cualquier servidor web) es multi-productor, proceso de un solo consumidor.

Una solución sencilla es construir una wsgiref o Werkzeug servidor backend para manejar sus solicitudes de back-end.

Desde este servidor "back-end" es construir utilizando tecnología WSGI, es muy, muy similar al servidor web front-end. Excepto. No produce respuestas HTML (JSON es generalmente más simple). Aparte de eso, es muy sencillo.

A diseñar transacciones de descanso para este componente de fondo. Utiliza todas las diversas características WSGI para URI de análisis, autorización, autenticación, etc. - en general - no necesitan gestión de sesiones, ya que los servidores REST por lo general no ofrecen sesiones.

Si usted entra en graves problemas de escalabilidad, sólo tiene que envolver el servidor back-end en lighttpd o algún otro motor web para crear un motor multi-hilo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top