amazon web services - servidores - ¿Ideas para escalar el chat en AWS?
servidores amazon precios (6)
Construir un servicio de chat no es tan fácil como parece.
Construí servidores XMPP completos, clientes y SDK, y puedo dar fe de algunos de los problemas sutiles y difíciles que surgen. Un prototipo donde los usuarios se ven y chatean es fácil. Un sistema de funciones completas con creación de cuentas, seguridad, descubrimiento, presencia, entrega fuera de línea y listas de amigos es mucho más difícil. Para luego escalar eso a través de un número arbitrario de servidores es especialmente difícil.
PubSub es una función ofrecida por los Servicios de chat ( ver XEP-60 ) en lugar de un medio tradicional de construir un servicio de chat. Puedo ver el encanto, pero PubSub puede tener inconvenientes.
Algunas preguntas para usted: 1. ¿Está haciendo esto en la Web? ¿Los usuarios se van a conectar y usar polos largos o tienes una solución Web Sockets?
¿Cuántos usuarios? ¿Cuántas conexiones por usuario? Proporción de escrituras a lecturas?
Su idea de usar SQS de esa manera es interesante, pero probablemente no se escalará. No es inusual tener 50k o más usuarios en un servidor de chat. Si está encuestando cada cola SQS para cada usuario, no va a llegar a ninguna parte cerca de eso. Sería mejor tener una cola para cada servidor, y el servidor sondea solo esa cola. Luego, depende de usted averiguar en qué servidor se encuentra un usuario y colocar el mensaje en la cola correcta.
Sospecho que querrás ir algo como:
- Una gran base de datos RDS en el backend.
- Un grupo de servidores front-end que manejan las conexiones del cliente.
- Algunos códigos Java / C # de nivel medio rastrean todo y enrutan los mensajes al lugar correcto.
Para tener una idea de la complejidad de la construcción de un servidor de chat, lea los RFC de XMPP: RFC 3920 RFC 3921
Estoy tratando de encontrar la mejor solución para escalar un servicio de chat en AWS. He encontrado un par de soluciones potenciales:
Redis Pub / Sub - Cuando un usuario establece una conexión a un servidor, ese servidor se suscribe a la ID de ese usuario. Cuando alguien envía un mensaje a ese usuario, un servidor realizará una publicación en el canal con la identificación del usuario. El servidor al que está conectado el usuario recibirá el mensaje y lo enviará al cliente correspondiente.
SQS: he pensado en crear una cola para cada usuario. El servidor al que está conectado el usuario sondeará (o usará SQS de sondeo largo) esa cola. Cuando se descubre un nuevo mensaje, se enviará al usuario desde el servidor.
SNS - Realmente me gustó esta solución hasta que descubrí el límite de 100 temas. Necesitaría crear un tema para cada usuario, que solo admitiría 100 usuarios.
¿Hay alguna otra forma en que se pueda escalar el chat utilizando AWS? ¿Es viable el enfoque SQS? ¿Cuánto tiempo tarda AWS en agregar un mensaje a una cola?
Dado que un nuevo servicio de AWS IoT comenzó a ser compatible con WebSockets, Keepalive y Pub / Sub hace un par de meses, puede crear fácilmente un chat elástico en él. AWS IoT es un servicio administrado con muchos SDK para diferentes idiomas, incluido JavaScript, que fue creado para manejar cargas monstruosas (miles de millones de mensajes) con administración cero.
Puedes leer más sobre la actualización aquí:
Editar:
Última actualización de SQS (2016/11): ahora puede usar el Servicio de cola simple de Amazon (SQS) para las aplicaciones que requieren que los mensajes se procesen en una secuencia estricta y exactamente una vez utilizando las colas First-in, First-out (FIFO). Las colas FIFO están diseñadas para garantizar que el orden en que se envían y reciben los mensajes se mantiene estrictamente y que cada mensaje se procesa exactamente una vez.
Ahora, la implementación de SQS + SNS también parece ser una buena idea.
Es posible que SQS / SNS no se ajuste a sus requisitos de chat. hemos observado cierta latencia en SQS que podría no ser adecuada para una aplicación de chat. Asimismo, SQS no garantiza FIFO. He trabajado con Redis en AWS. Es bastante fácil y estable si se configura teniendo en cuenta todas las mejores prácticas.
HI chat en tiempo real no funciona bien con SNS. Está diseñado para correo electrónico / SMS o servicio 1 o unos segundos de latencia es aceptable. En el chat en tiempo real, 1 o unos segundos no son aceptables.
Latency (i.e. “Realtime”) for PubNub vs SNS
Amazon SNS no ofrece garantías de latencia, y la gran mayoría de las latencias se miden durante 1 segundo y, a menudo, mucho más lento. De nuevo, esto es algo irrelevante; Amazon SNS está diseñado para notificaciones de servidor a servidor (o correo electrónico / SMS), donde a menudo se acepta y espera una latencia de muchos segundos.
Debido a que PubNub entrega datos a través de un socket de red abierto existente y establecido, las latencias son menores a 0.25 segundos desde la publicación hasta la suscripción en el percentil del 95% de los dispositivos suscritos. La mayoría de los seres humanos perciben algo como "tiempo real" si el evento se percibe dentro de 0.6 a 0.7 segundos.
He pensado en construir un servidor de chat utilizando SNS, pero en lugar de hacer un tema por usuario, como describe, hacer un tema para todo el sistema de chat y hacer que cada servidor se suscriba al tema, donde cada servidor ejecuta algún tipo de Encuesta larga o sistema de chat web sockets. Luego, cuando ocurre un evento, los datos se envían en la carga útil de la notificación SNS. Luego, el servidor puede usar esta carga útil para determinar qué clientes en su cola deben recibir la respuesta, dejando intactos a los clientes no relacionados. Realmente construí un pequeño prototipo para esto, pero no he hecho un montón de pruebas para ver si es lo suficientemente robusta para una gran cantidad de usuarios.
la forma en que implementaría tal cosa (si no utilizara algún marco) es la siguiente:
tener un servidor web (en ec2) que acepte los mensajes del usuario. Utilice el grupo de llamada automática en este servidor web. El servidor web puede actualizar cualquier base de datos en Amazon RDS que puede escalar fácilmente.
Si está utilizando su propia base de datos, podría considerar desacoplar la base de datos del servidor web mediante el uso de los sqs (enviando todas las solicitudes a la misma cola), y luego u puede tener un consumidor que consuma la cola. este consumidor también se puede ubicar detrás de un grupo de llamada automática, de modo que si la cola es más grande que X msgs, se escalará (u puede configurarlo con alarmas)
Los sqs normalmente se actualizan bastante rápido, es decir, menos de un segundo. (desde el momento en que lo envió, hasta el momento en que aparece en la cola), y rara vez más que eso.