Cómo diseñar un programa en Go que pueda manejar 10 millones de conexiones TCP simultáneas en una instancia de AWS m4.xlarge

En primer lugar, debe reconsiderar tener un requisito de “10 millones por una instancia de Amazon”.

No hay razón para poner tanto tráfico en una máquina. En cambio, piense en la escalabilidad horizontal y utilice muchas máquinas más pequeñas (BTW Erlang / OTP o Elixir en lugar de ir puede permitir lograr esto con menos esfuerzo debido a la enorme cantidad de complementos integrados, bibliotecas y patrones hechos específicamente para ese propósito).

En segundo lugar, lea sobre cómo funciona el enrutamiento en la infraestructura de Amazon. No estoy seguro de si su pila TCP todavía tiene errores (es fácil encontrar historias sobre problemas con las conexiones TCP con AWS), pero cuando tiene 10 millones de conexiones abiertas, puede alcanzar otros límites además de los límites de la máquina.

Luego busque proveedores más baratos que un Amazon. Por ejemplo, OVH ofrece excelentes servidores de metal desnudo, por una fracción del precio de AWS.

Piense en la confiabilidad, la falla y otros mecanismos.

En otras palabras, su pregunta parece haber omitido la arquitectura de planificación y ha pasado directamente a seleccionar el proveedor y el idioma (elegir dos soluciones promocionadas, buenas pero no necesariamente las mejores). Regrese y piense primero en los problemas reales que pueden ocurrir.

¿Por qué no una solución existente? MongooseIM, tal vez (o ejabberd se basa en)? Se escalan tanto horizontal como verticalmente y son soluciones establecidas a nivel empresarial para usuarios multimillonarios ( sin embargo, no en una sola máquina).