Pregunta

Necesito usar alguna cosa Para coordinar mi sistema con varios consumidores/productores que se ejecutan en diferentes máquinas con diferentes sistemas operativos. He estado investigando sobre el uso de MySQL para hacer esto, pero parece ridículamente difícil.

Mis requisitos son simples: quiero poder agregar o eliminar a los consumidores/productores en cualquier momento y, por lo tanto, no deben depender del otro en absoluto. Naturalmente, una base de datos separaría las dos muy bien.

He estado buscando un complemento de cola de mensajes Q4M para MySQL, pero parece complicado de usar.

Realmente necesito una información sobre cómo construir mi sistema mejor posible.

¿Fue útil?

Solución

Necesito usar algo para coordinar mi sistema con varios consumidores/productores que se ejecutan en diferentes máquinas con diferentes sistemas operativos.

Esa es una cola de mensajes. No busque otras alternativas. Todo lo demás (es decir, usar una base de datos con inserción y eliminación) es terriblemente lento y engorroso.

Construir una cola de mensajes grande y lenta con una base de datos a menudo resulta mal en la práctica porque (1) las bases de datos son lentas, (2) las bases de datos son enormes y complejas, (3) tiene problemas de bloqueo y contención que hacen que cada transacción sea potencialmente lenta (( 4) Es mucho más sobrecarga de lo que el problema merece.

Existen numerosas soluciones de cola de mensajes.

Si no puede hacer que Q4M funcione, debe pasar a otro.

http://en.wikipedia.org/wiki/message_queue

http://linux.die.net/man/7/mq_overview

http://qpid.apache.org/

http://code.google.com/p/httpsqs/

Otros consejos

En realidad, es (bastante) complicado construir dicho sistema. (Digo de manera justa, porque por supuesto es factible).

Si tiene múltiples productores y una consumidor, es fácil. Todos los productores escriben simultáneamente, y el consumidor único lee datos tan pronto como sean visibles (comprometidos).

Pero si quieres escalabilidad con varios Consumidor, deberá crear un esquema de bloqueo que no sea trivial. (Debe asegurarse de que no se envíe ninguna fila a dos consumidores. Esto no es fácil de lograr con las transacciones y bloqueos de la base de datos. Las soluciones ingenuas conducen a la serialización de toda la entrega de mensajes, como si solo tuviera un consumidor, que no queremos. ).

Sugeriría usar una solución incorporada. También puedes leer esta pregunta sobre una pregunta similar.

Creo que es factible sin software de terceros.

Mi primer diseño se vería así:

  • El productor escribe datos en la base de datos
  • Para garantizar la consistencia, tiene que usar transacciones
  • El consumidor procesa los datos (leer y eliminar) también utilizando transacciones.

Debido al requisito de transacciones, innodb es la elección lógica del motor de almacenamiento. También debe elegir cuidadosamente el nivel de aislamiento. Mi primera suposición es "serializable" para evitar las lecturas fantasmas, pero quizás también sea posible un nivel más débil.

Si el rendimiento y la escalabilidad son un problema, debe considerar usar una solución de mensajería "real". La implementación de su uno probablemente conducirá a problemas de rendimiento y/o escalabilidad.

Depende de situaciones.

En mi caso, el único productor hace miles de mensajes por día, y varios consumidores consumen estos mensajes en las siguientes 24 horas, que cada uno toma varios minites para terminar. Entonces, creo que el MySQL cumpliría con mis requisitos, y puedo usar las transacciones para garantizar la consistencia entre los consumidores.

Espero que ayude.

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