language agnostic - parte - Programación de baja latencia
microservicios ventajas y desventajas (12)
Bueno, no es solo programación "tradicional" en tiempo real, es todo. trabajo para una bolsa de valores: la velocidad es el rey. un problema típico es ¿cuál es la manera más rápida de escribir en un archivo? la forma más rápida de serializar un objeto? etc.
He estado leyendo mucho sobre los sistemas financieros de baja latencia (especialmente desde el famoso caso del espionaje corporativo) y la idea de los sistemas de baja latencia ha estado en mi mente desde entonces. Hay un millón de aplicaciones que pueden usar lo que estos muchachos están haciendo, por lo que me gustaría aprender más sobre el tema. El problema es que no puedo encontrar nada valioso sobre el tema. ¿Alguien puede recomendar libros, sitios, ejemplos sobre sistemas de baja latencia?
Cualquier cosa en la programación en tiempo real se ajustaría a la factura. No es precisamente lo que estás buscando, sospecho, pero es un muy buen lugar para comenzar.
Eche un vistazo a ZeroMQ. http://www.zeromq.org
Lea los documentos técnicos en ese sitio y obtendrá una idea de lo que se requiere para la programación de baja latencia.
Hay muchas buenas respuestas en esta publicación. Me gustaría agregar mi experiencia también
Para lograr una baja latencia en Java, debes tomar el control de GC en Java, hay muchas maneras de hacerlo, por ejemplo, pre-asignar objetos (es decir, usar un diseño de diseño flyweight), usar objetos primitivos, testar es muy bueno para eso, todos los datos la estructura se basa en primitiva instancia de objeto Reutilizar, por ejemplo, crear un diccionario de todo el sistema para reducir la creación de nuevos objetos, muy buena opción cuando se leen datos de stream / socket / db
Intenta usar el algoritmo de espera (que es un poco difícil), bloquea el algo gratis. Puedes encontrar toneladas de ejemplos para eso
Usa la computación en memoria. La memoria es barata, puedes tener tera bytes de datos en la memoria.
Si puedes dominar el bit-wise algo entonces da muy buen rendimiento.
Utilice simpatía técnica: consulte el disruptor lmax, excelente marco
La baja latencia es una función de muchas cosas, las dos más importantes son:
- latencia de la red, es decir, el tiempo empleado en la red para transmitir / recibir mensajes.
- latencia de procesamiento, es decir, el tiempo que toma su aplicación para actuar en un mensaje / evento.
Por lo tanto, si escribe un sistema de ajuste de pedidos, la latencia de la red representará cuán pronto dentro de su red pudo recibir la solicitud de ajuste de pedidos. Y la latencia de procesamiento representaría el tiempo que tarda su aplicación para hacer coincidir el pedido con los pedidos abiertos existentes.
Multidifusión, UDP, multidifusión confiable, omisión de Kernel (compatible con Java 7, Informatica Ultra Messaging y muchos otros) en redes Infiniband son algunas de las tecnologías más utilizadas por todas las empresas en este campo.
Además, existen marcos de programación de baja latencia como disruptor (http://code.google.com/p/disruptor/) que implementan patrones de diseño para tratar con aplicaciones de baja latencia. Lo que podría matarte es tener que escribir en un DB o archivos de registro como parte de tu flujo de trabajo principal. Tendrá que encontrar soluciones únicas que satisfagan los requisitos del problema que está tratando de resolver.
En lenguajes como Java, la implementación de su aplicación de manera que cree (casi) cero basura se vuelve extremadamente importante para la latencia. Como dice Adamski, tener un conocimiento del modelo de memoria de Java es extremadamente importante. Comprender las diferentes implementaciones de JVM y sus limitaciones. Los patrones de diseño típicos de Java en torno a la creación de objetos pequeños son las primeras cosas que arrojará por la ventana: nunca se puede reparar el recopilador de basura de Java lo suficiente para lograr una baja latencia; lo único que se puede solucionar es la basura.
¡Buena suerte!
Me gustaría dar algunos comentarios sobre la programación de baja latencia. Actualmente tengo más de 5 años de experiencia en el desarrollo de motores de baja latencia y alta ejecución en software financiero.
¿Es necesario entender qué es la latencia?
Latencia significa que necesita tiempo para completar su proceso. No necesariamente depende de las herramientas de desarrollo que esté utilizando, como java, c ++, net, etc., depende de sus habilidades de programación y sistema.
Supongamos que está utilizando Java, pero un error puede retrasar el proceso. Por ejemplo, ha desarrollado una aplicación comercial en la que cada actualización de precios llama a algunas funciones, etc. Esto puede generar variables adicionales, uso de memoria innecesario, bucles innecesarios que pueden causar demoras en el proceso. La misma aplicación desarrollada en .net puede funcionar mejor que Java si el desarrollador se preocupó por los errores anteriores.
También depende de su sistema servidor, como el sistema multiprocesador puede funcionar bien si su aplicación es multiproceso.
Normalmente, trabajar en entornos de baja latencia significa comprender las dependencias de las llamadas y cómo reducirlas para minimizar la cadena de dependencia. Esto incluye el uso de estructuras de datos y bibliotecas para almacenar los datos deseados en caché, así como la refacturación de los recursos existentes para reducir las interdependencias.
Si está hablando de un diseño de servidor de baja latencia, estos son algunos buenos consejos: http://www.kegel.com/c10k.html http://pl.atyp.us/content/tech/servers.html
Si está interesado en el desarrollo de baja latencia de Java, debe saber que puede hacerlo sin una JVM RTSJ (en tiempo real), siempre que mantenga el recopilador de basura bajo control. Le sugiero que eche un vistazo a este artículo que habla sobre el desarrollo de Java sin gastos generales de GC. También tenemos muchos otros artículos en nuestro sitio que hablan de componentes Java de baja latencia.
Si recuerdo correctamente, en tiempo real se usa Java ( RTSJ ) en esta área, aunque no pude encontrar un buen artículo para vincular ahora.
Trabajo para una compañía financiera que produce software de baja latencia para comunicarse directamente con los intercambios (para enviar intercambios y precios de transmisión). Actualmente nos desarrollamos principalmente en Java. Mientras que el lado de baja latencia no es un área en la que trabajo directamente, tengo una buena idea del conjunto de habilidades requeridas, que incluiría lo siguiente en mi opinión:
- Conocimiento detallado del modelo de memoria de Java y técnicas para evitar la recolección innecesaria de basura (por ejemplo, la agrupación de objetos). Algunas de las técnicas utilizadas pueden ser consideradas como "antipatrones" en un entorno OO tradicional.
- Conocimiento detallado de la multidifusión TCP / IP y UDP, incluidas las utilidades para depurar y medir la latencia (por ejemplo, DTrace en Solaris).
- Experiencia con aplicaciones de perfiles.
- Conocimiento del paquete java.nio, experiencia en el desarrollo de aplicaciones de servidor escalables basadas en NIO, experiencia en el diseño de protocolos de cable. También tenga en cuenta que normalmente evitamos el uso de marcos y bibliotecas externas (por ejemplo, Google Protobuf), y preferimos escribir un montón de código personalizado.
- Conocimiento de las bibliotecas FIX y FIX comerciales (p. Ej., Cameron FIX).
Desafortunadamente, muchas de las habilidades solo se pueden desarrollar "en el trabajo", ya que no hay sustituto para la experiencia adquirida al implementar un servidor de precios o un motor de negociación basado en una especificación. de un intercambio o vendedor. Sin embargo, también vale la pena mencionar que, al menos, nuestra empresa tiende a no buscar experiencia específica en esta (u otra) área de nicho, sino que prefiere contratar personas con buenas habilidades analíticas y de solución de problemas.
http://g-wan.com/ hace todo en 200 KB con scripts ANSI C.