2009-07-30 28 views
35

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?Programación de baja latencia

+0

¿Qué famoso caso de espionaje corporativo? –

+3

Programador de Goldman Sachs supuestamente robando el código fuente a su plataforma de negociación de alta frecuencia: http://ftalphaville.ft.com/blog/2009/07/08/60761/the-cold-war-in-high-frequency-trading/ – mattnewport

+0

Gracias Matt! –

Respuesta

4

Cualquier cosa en la programación en tiempo real encajaría en la factura. No es precisamente lo que estás buscando, sospecho, pero es un muy buen lugar para comenzar.

+1

Real la programación de tiempo no es de baja latencia, se trata de reaccionar a eventos dentro de un cierto período de tiempo, no necesariamente uno rápido. – user997112

1

Si recuerdo correctamente en tiempo real, se usa Java (RTSJ) en esta área, aunque no pude encontrar un buen artículo para vincular ahora.

+0

Estoy trabajando en RTSJ. Lamentablemente, ya no hay más lanzamientos de RTSJ. (Oracle detuvo el lanzamiento de RTSJ y el soporte para él). Evita principalmente detener todo en la recolección de basura. – BalaB

5

Bueno, no es solo la 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.

+0

¿qué idioma usas para tu software, C/C++ u otra cosa? –

1

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.

42

Trabajo para una empresa financiera que produce software de baja latencia para la comunicación directa con las bolsas (para la presentación de operaciones 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 idea justa de la habilidades requeridas, que incluiría lo siguiente en mi opinión:

  • El conocimiento detallado del modelo y técnicas de memoria de Java para evitar recolección innecesaria de basura (por ejemplo, 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 creación de perfiles.
  • Conocimiento del paquete java.nio, experiencia en el desarrollo de aplicaciones de servidores escalables basadas en NIO, experiencia en el diseño de protocolos de conexión. 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 comercial FIX (por ejemplo, Cameron FIX).

Desafortunadamente muchas de las habilidades sólo puede desarrollarse "en el trabajo" ya que no hay sustituto para la experiencia obtenida al aplicar un motor de servidor de precio o de comercio basado en una especificación. de un intercambio o vendedor. Sin embargo, también vale la pena mencionar que nuestra empresa al menos atiende para no buscar experiencia específica en esta (u otra) área de nicho, en lugar de eso prefiere contratar personas con buenas habilidades analíticas y de resolución de problemas.

+7

Baja latencia y Java? parece una especie de oxímoron. –

+6

@ZamfirKerlukson: tenemos una aplicación de mensajería Java que procesa los mensajes entrantes en 8-9 microsegundos. Nuestros procesos de aplicaciones de servidor más complicados en 65-80 microsegundos. Una cosa a tener en cuenta acerca de Java es la capacidad del compilador JIT para hacer análisis de código y dinámicamente los métodos en línea y el acceso a los datos. Eso automatiza lo que los programadores C hacen manualmente con la palabra clave "en línea". Sin embargo, controlar los tiempos de pausa de GC es un desafío (aunque hay algunas soluciones de JVM que intentan solucionar esto). –

+0

Baja latencia en Java ??? ¿Cómo es posible? Si desea obtener una latencia baja, al menos debe cambiar a C/C++ o incluso ensamblar. Estoy trabajando para el gateway de intercambio de baja latencia y podemos obtener de 10 a 20 us para un procesamiento de paquetes que incluye análisis de mensajes, verificación de riesgos, asignación de bases de datos, conversión de mensajes nativos a FIX en C++. Con Java, acaba siendo totalmente erróneo en el primer día. –

3

Eche un vistazo a ZeroMQ. http://www.zeromq.org

Lea los libros blancos en ese sitio y obtendrá una idea de lo que se requiere para la programación de baja latencia.

1

Si usted está hablando sobre el diseño de baja latencia del servidor, estos son unos puntos básicos: http://www.kegel.com/c10k.html http://pl.atyp.us/content/tech/servers.html

19

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 tarda su aplicación en 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 coincidencia de pedido. 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, derivación de núcleo (compatible con Java 7, Informatica Ultra Messaging y muchos otros) en redes Infiniband son algunas tecnologías comunes 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 modo que cree (casi) cero basura se vuelve extremadamente importante para la latencia. Como dice Adamski, tener un conocimiento del modelo de memoria 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!

6

Hay muchas buenas respuestas en esta publicación. Me gustaría añadir mi experiencia también

  • Para conseguir una baja latencia en java que tiene que tomar el control de GC en Java, hay muchas maneras de hacer que los objetos para, por ejemplo asignar previamente (es decir, utilizar el patrón de diseño de peso mosca), utilizar objetos primitivos - trove es muy bueno para eso, toda la estructura de datos se basa en primitiva, instancia de objeto de reutilización para, por ejemplo, crear diccionario de todo el sistema para reducir la creación de objetos nuevos, muy buena opción al leer datos de stream/socket/db

    • Intenta utilizar el algoritmo de espera (que es un poco difícil), bloquea el algo libre. Puede encontrar toneladas de ejemplos para eso

    • Use la computación en la memoria. La memoria es barata, puedes tener tera bytes de datos en la memoria.

    • Si puede dominar bit-wise algo, entonces ofrece muy buen rendimiento.

    • Uso simpatía mecánica del dispositivo - Consulte disruptor lmáx, excelente marco

3

Si usted está interesado en Java baja latencia en desarrollo, usted debe saber que se puede hacer sin RTSJ (Real- Hora) JVM siempre que mantenga el recolector de basura bajo control. Sugiero que eche un vistazo al this article que habla sobre el desarrollo de Java sin sobrecarga de GC. También tenemos muchos otros artículos en our site que hablan sobre los componentes de Java de baja latencia.

2

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 demorar 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 de servidor, como el sistema de procesador múltiple puede funcionar bien si su aplicación es multiproceso.

Cuestiones relacionadas