Si tuviera que crear una aplicación de chat escalable y concurrente en Java, ¿cómo la diseñaría?

¿Qué necesidad tendrías de construir una aplicación de chat altamente concurrente y escalable? Las aplicaciones de chat generalmente no requieren mucha arquitectura para hacer lo que deben hacer. Esto suena como un caso de optimización prematura, pero aquí hay una discusión teórica:

Considere los siguientes casos de uso:
1) Hay tantas publicaciones en esta aplicación de chat que un solo servidor de tamaño mediano no podría manejar el tráfico: en este caso, ningún humano podría leer ni siquiera 1/100 de las publicaciones, lo que hace que la aplicación de chat sea inútil como una aplicación de chat Como tal, ni siquiera lo consideraremos.

2) Hay muchos usuarios que leen este chat, pero muy pocos usuarios escriben en el chat, lo que lo hace útil como una aplicación de chat, pero más como una aplicación para espectadores:

En este caso, puede escalar horizontalmente sin tener que preocuparse por sincronizar las escrituras, por lo que tiene un servidor que maneja todas las solicitudes de escritura. Este servidor debe estar respaldado por un único servidor de base de datos y luego replica las escrituras en servidores secundarios.

Una granja de servidores de escala horizontal que maneja solicitudes de lectura persistentes de clientes debe escuchar los cambios en la base de datos y emitir los cambios a los clientes suscritos.

3) Los usuarios pueden escribir mensajes durante una hora al día y no pueden escribir el resto del tiempo. Por lo tanto, golpean los servidores durante una hora y solo se preocupan por leer los mensajes después de que todos hayan escrito. Por lo tanto, los mensajes no necesitan ser entregados en tiempo real.

En este caso, el rendimiento de escritura debería poder escalar, mientras que las lecturas pueden retrasarse. Esto se puede lograr al dividir las solicitudes de escritura en diferentes servidores de bases de datos y luego cotejar los datos en un almacén de datos final unificado en lotes periódicamente.

4) Las aplicaciones de chat persona-persona como WhatsApp que maximizan el hardware pueden llevar cada grupo de chat y convertirlo en una combinación de servidor / servidor de base de datos y emitir nuevos mensajes y procesar nuevas escrituras para ese grupo. Esto permite mensajes de baja latencia y garantiza que la aplicación pueda escalar horizontalmente agregando más servidores en paralelo.

Jabber es (o al menos fue) un servidor de chat de código abierto que incluye compatibilidad con una serie de otros servicios de chat e incluye federación y variantes de procesamiento distribuido en varios servidores, como WildFire. Ese es un buen punto de partida para aprender a hacer esto.