web-services tcp finagle

web services - ¿Qué significa para las conexiones TCP para batir?



endpoint web config (1)

Puede haber múltiples usos para este término, pero siempre lo he visto utilizado en casos en los que se realizan muchas conexiones TCP en muy poco tiempo, lo que causa problemas de rendimiento en el cliente y potencialmente también en el servidor.

Esto ocurre a menudo cuando se escribe un código de cliente que se conecta automáticamente a una falla TCP de cualquier tipo. Si esta falla es una falla de conexión incluso antes de que se establezca la conexión (o muy temprano en el intercambio de protocolo), entonces el cliente puede entrar en un circuito casi ocupado constantemente haciendo conexiones. Esto puede causar problemas de rendimiento en el lado del cliente, en primer lugar que hay un proceso en un ciclo muy ocupado que absorbe los ciclos de la CPU y, en segundo lugar, que cada intento de conexión consume un número de puerto del lado del cliente. cuando alcanzan el número de puerto máximo (como un puerto es solo un número de 16 bits, esto no es imposible).

Aunque escribir un código sólido es un objetivo valioso, este enfoque simple de "reintento automático" es un poco ingenuo. Puede ver problemas similares en otros contextos, por ejemplo, un proceso principal reiniciando continuamente un proceso secundario que se bloquea inmediatamente. Un mecanismo común para evitarlo es una especie de retroceso creciente. Por lo tanto, cuando falla la primera conexión, inmediatamente se vuelve a conectar. Si falla nuevamente dentro de un tiempo corto (por ejemplo, 30 segundos), espere, digamos, 2 segundos antes de volver a conectar. Si vuelve a fallar en 30 segundos, espere 4 segundos, y así sucesivamente. Lea el artículo de Wikipedia sobre el retroceso exponencial (o esta publicación de blog podría ser más apropiada para esta aplicación) para obtener más información acerca de esta técnica.

Este enfoque tiene la ventaja de que no satura al cliente o servidor, pero también significa que el cliente puede recuperarse sin intervención manual (lo cual es especialmente importante para el software en un servidor desatendido, por ejemplo, o en grandes grupos).

En los casos en que el tiempo de recuperación es crítico, también es posible una limitación de velocidad simple de la creación de conexión TCP, tal vez no más de 1 por segundo o algo así. Sin embargo, si hay muchos clientes por servidor, este enfoque más simplista puede dejar al servidor abrumado por la carga de aceptar y luego cerrar una alta tasa de conexión.

Una cosa a tener en cuenta si planea emplear un retroceso exponencial: sugiero imponer un tiempo de espera máximo, o puede encontrar que las fallas prolongadas dejan a un cliente tardando demasiado en recuperarse una vez que el servidor comienza a aceptar conexiones nuevamente. Sugeriría algo así como 5 minutos como un máximo razonable en la mayoría de las circunstancias, pero por supuesto depende de la aplicación.

En el contexto de los servicios web, he visto usar el término "abandono de la conexión TCP". Específicamente, la solución de Twitter tiene formas de evitar que suceda. ¿Cómo sucede? Qué significa eso?