¿Cuál es el significado de las conexiones concurrentes?

Por lo general, significa que muchos sockets (probablemente sockets TCP / IP ) están conectados al mismo tiempo.

Por ejemplo, un servidor HTTP se desconecta después de que el cliente haya recibido todos los archivos que necesita o después de que la canalización haya excedido su número máximo de solicitudes (por cierto, los WebSockets son una excepción a esto). Esto significa que si tiene, digamos, 1 millón de usuarios en HTTP, solo puede tener 80,000 conexiones simultáneas en cualquier momento. Si, por otro lado, tiene 1 millón de usuarios que usan WebSockets, tendrá 1 millón de conexiones simultáneas.

Al diseñar un sistema, es importante saber cuántas conexiones concurrentes pretendemos servir. Esto se debe a que se utilizan diferentes técnicas para obtener una escala vertical y horizontal. Un servidor que está diseñado para servir solo 50 conexiones concurrentes generalmente no usará las mismas técnicas que un servidor diseñado para servir 1 millón de conexiones concurrentes.

Supongamos que necesita solo 50 conexiones simultáneas, por ejemplo, podría optar por utilizar procesos o subprocesos separados para cada conexión. Si, por otro lado, necesita manejar más de 100. Probablemente deba cambiar a algo como el método select (). Si necesita millones, se vuelve más complicado porque necesita tolerancia a fallas. No desea, por ejemplo, un solo error para eliminar todo el sistema, por lo que debe encontrar formas de aislar sus conexiones. Aparte de mirarlo desde un punto de vista de rendimiento, necesita usar cosas como kqueue () y epoll () para obtener este tipo de escala vertical (busque el problema C10K en google). Para la tolerancia a fallas, puede obtener esto agregando más servidores y difundiendo el trabajo y buscando tecnologías que se especialicen en tolerancia a fallas y aislamiento, como Erlang y Elixir.

La concurrencia en la programación es tener trabajadores o procesos asincrónicos que realizan tareas. La conexión asincrónica no es muy diferente. Aquí hay un ejemplo de uno de nuestros servicios en segundo plano. La compañía para la que trabajo desarrolla software para la administración de la fuerza laboral principalmente para centros de llamadas. Para recibir datos de su sistema telefónico, establecemos conexiones, por ejemplo, a través de enchufes TCP (dependiendo del sistema telefónico. A veces también necesitamos obtener datos a través de http). Como cada cliente tiene su propia instalación, necesitamos manejar muchas conexiones en paralelo. Son conexiones concurrentes a nuestro sistema. Ve lo mismo, por ejemplo, en un chat de WhatsApp dentro de los grupos. Envía un mensaje y todos los miembros de ese grupo reciben este mensaje. No conozco los detalles de implementación aquí, pero supongo que WhatsApp se conecta a través de un socket TCP a algún servidor de WhatsApp que actualiza todos sus clientes relacionados.

Los lenguajes especialmente funcionales como Erlang o Elixir tienen excelentes funciones y bibliotecas de concurrencia (quizás por eso Whatsapp fue escrito en Erlang).