www tutorialspoint tutorial software que nube kafka introduccion instal herramienta ejemplos development arquitectura performance message-queue xmpp amqp

performance - software - tutorialspoint rabbitmq



Latencia de baja latencia y cola de mensajes a gran escala (5)

Mi experiencia fue con una alternativa no abierta, BizTalk. La lección más dolorosa que aprendimos es que estos sistemas complejos NO son rápidos. Y como creíste de los requisitos de hardware, eso se traduce directamente en costos significativos.

Por esa razón, ni siquiera se acerque a XML para las interfaces principales. Su clúster de servidor analizará 2 millones de mensajes por segundo. ¡Eso podría fácilmente ser de 2-20 GB / seg de XML! Sin embargo, la mayoría de los mensajes serán para algunas colas, mientras que la mayoría de las colas son, de hecho, de poco tráfico.

Por lo tanto, diseñe su arquitectura para que sea fácil comenzar con los servidores de cola COTS y luego mover cada cola (tipo) a un servidor de cola personalizado cuando se identifica un cuello de botella.

Además, por razones similares, no asuma que una arquitectura de cola de mensajes es la mejor para todas las necesidades de comunicación que tiene su aplicación. Tome su ejemplo de "ubicación de entidad en una instancia". Este es un caso clásico en el que no desea la entrega garantizada de mensajes. La razón por la que necesita compartir esta información es porque cambia todo el tiempo. Entonces, si se pierde un mensaje, no quiere perder tiempo recuperándolo. Solo enviarías el antiguo local de la entidad afectada. En cambio, le gustaría enviar la ubicación actual de esa entidad. En lo que respecta a la tecnología, esto significa que quiere UDP, no TCP y un mecanismo personalizado de recuperación de pérdidas.

Estoy repasando un poco los juegos multijugador a gran escala en la era de las aplicaciones de Facebook y la computación en la nube.

Supongamos que voy a construir algo sobre los protocolos abiertos existentes, y quiero servir a 1,000,000 de jugadores simultáneos, solo para enfocar el problema.

Supongamos que cada jugador tiene una cola de mensajes entrantes (para chat y otras cosas) y, en promedio, una cola de mensajes entrantes (gremios, zonas, instancias, subastas, etc.) por lo que tenemos 2.000.000 de colas. Un jugador escuchará de 1 a 10 colas a la vez. Cada cola tendrá en promedio quizás 1 mensaje por segundo, pero ciertas colas tendrán una tasa mucho más alta y un mayor número de oyentes (por ejemplo, una cola de "ubicación de entidad" para una instancia de nivel). Supongamos que no hay más de 100 milisegundos de latencia de cola del sistema, lo que está bien para los juegos orientados a la acción leve (pero no para juegos como Quake o Unreal Tournament).

De otros sistemas, sé que servir a 10,000 usuarios en una sola caja de 1U o blade es una expectativa razonable (suponiendo que no pase nada más caro, como la simulación de física o lo que sea).

Por lo tanto, con un sistema de clúster de barra cruzada, donde los clientes se conectan a las puertas de enlace de conexión, que a su vez se conectan a servidores de cola de mensajes, obtendríamos 10,000 usuarios por puerta con 100 máquinas de puerta de enlace y 20,000 colas de mensajes por cola con 100 máquinas de cola. Nuevamente, solo para un alcance general. La cantidad de conexiones en cada máquina MQ sería pequeña: alrededor de 100, para hablar con cada una de las puertas de enlace. El número de conexiones en las puertas de enlace sería mucho mayor: 10.100 para los clientes + conexiones a todos los servidores de cola. (Además de esto, agregue algunas conexiones para servidores de simulación del mundo del juego o lo que sea, pero estoy tratando de mantener eso separado por ahora)

Si no quería construir esto desde cero, tendría que usar alguna infraestructura de mensajería y / o puesta en cola que exista. Los dos protocolos abiertos que puedo encontrar son AMQP y XMPP. El uso previsto de XMPP es un poco más de lo que necesitaría este sistema de juego, pero la sobrecarga es bastante notable (XML, más los datos de presencia detallada, además de otros canales que deben construirse en la parte superior). El modelo de datos real de AMQP está más cerca de lo que describo arriba, pero todos los usuarios parecen ser grandes corporaciones de tipo empresarial, y las cargas de trabajo parecen estar relacionadas con el flujo de trabajo, no con la actualización del juego en tiempo real.

¿Alguien tiene alguna experiencia diurna con estas tecnologías, o implementaciones de las mismas, que pueda compartir?


FWIW, para los casos en que los resultados intermedios no son importantes (como la información de posicionamiento) Qpid tiene una "cola de último valor" que puede entregar solo el valor más reciente a un suscriptor.


Estoy construyendo un sistema así ahora, en realidad.

He realizado una buena cantidad de evaluaciones de varios MQ, incluidos RabbitMQ, Qpid y ZeroMQ. La latencia y el rendimiento de cualquiera de ellos son más que adecuados para este tipo de aplicación. Lo que no está bien, sin embargo, es el tiempo de creación de cola en medio de medio millón de colas o más. Qpid en particular se degrada bastante severamente después de unos pocos miles de colas. Para evitar ese problema, normalmente tendrá que crear sus propios mecanismos de enrutamiento (un número menor de colas totales, y los consumidores de esas colas reciben mensajes que no les interesan).

Mi sistema actual probablemente usará ZeroMQ, pero de una manera bastante limitada, dentro del clúster. Las conexiones de los clientes se manejan con un sim personalizado. daemon que construí usando libev y tiene un único subproceso (y muestra una escala muy buena, debería poder manejar 50,000 conexiones en una sola caja sin ningún problema), nuestra tasa de tics sim es bastante baja, y hay no física).

XML (y, por lo tanto, XMPP) no es adecuado para esto, ya que vinculará el procesamiento de la CPU XML mucho antes de que quede vinculado a E / S, que no es lo que desea. Estamos utilizando Buffers de Protocolo de Google, por el momento, y esos parecen adecuados para nuestras necesidades particulares. También estamos usando TCP para las conexiones del cliente. He tenido experiencia usando UDP y TCP para esto en el pasado, y como señalaron otros, UDP tiene alguna ventaja, pero es un poco más difícil trabajar con él.

Con suerte, cuando estemos un poco más cerca del lanzamiento, podré compartir más detalles.


@MSalters

Re ''message queue'':

La operación predeterminada de RabbitMQ es exactamente lo que describes: pubsub transitorio. Pero con TCP en lugar de UDP.

Si desea una entrega eventual garantizada y otras características de persistencia y recuperación, entonces PUEDE tener eso también: es una opción. Ese es el objetivo de RabbitMQ y AMQP: puede tener muchos comportamientos con un solo sistema de entrega de mensajes.

El modelo que describes es el comportamiento PREDETERMINADO, que es transitorio, "dispara y olvida", y envía mensajes a donde estén los destinatarios. La gente usa RabbitMQ para hacer descubrimiento de multidifusión en EC2 por esa misma razón. Puede obtener comportamientos de tipo UDP sobre el pubsub de TCP de unidifusión. Limpio, ¿eh?

Re UDP:

No estoy seguro si UDP sería útil aquí. Si desaparece Nagling, se ha medido la latencia de ida y vuelta de un solo mensaje de RabbitMQ (cliente-intermediario-cliente) a 250-300 microsegundos. Vea aquí para una comparación con la latencia de Windows (que fue un poco más alta) http://old.nabble.com/High%28er%29-latency-with-1.5.1--p21663105.html

No puedo pensar en muchos juegos multijugador que necesiten una latencia de ida y vuelta inferior a 300 microsegundos. Podría obtener menos de 300us con TCP. La ventana TCP es más costosa que el UDP sin procesar, pero si usa UDP para ir más rápido, y agrega un administrador personalizado de recuperación de pérdida o seqno / ack / reenviar, eso puede ralentizarlo nuevamente. Todo depende de tu caso de uso. Si realmente necesitas usar UDP y packs perezosos, y así sucesivamente, puedes quitar el TCP de RabbitMQ y probablemente lo hagas.

Espero que esto ayude a aclarar por qué recomendé RabbitMQ para el caso de uso de Jon.


Jon, esto suena como un caso de uso ideal para AMQP y RabbitMQ.

No estoy seguro de por qué dices que los usuarios de AMQP son todas grandes corporaciones de tipo empresarial. Más de la mitad de nuestros clientes se encuentran en el espacio ''web'' que abarca desde grandes hasta pequeñas empresas. Muchos juegos, sistemas de apuestas, sistemas de chat, sistemas tipo twittery e infraestructuras de computación en la nube se han creado a partir de RabbitMQ. Incluso hay aplicaciones para teléfonos móviles. Los flujos de trabajo son solo uno de muchos casos de uso.

Intentamos hacer un seguimiento de lo que está sucediendo aquí:

http://www.rabbitmq.com/how.html (¡asegúrese de hacer clic en las listas de casos de uso en del.icio.us también!)

Por favor, eche un vistazo. Estamos aquí para ayudar. No dude en enviarnos un correo electrónico a [email protected] o llamarme en twitter (@monadic).