低延迟编程

我一直在阅读很多关于低延迟金融系统(尤其是自知名企业间谍案以来)以及低延迟系统的想法。 有一百万个应用程序可以使用这些人正在做的事情,所以我想了解更多关于这个话题。 事情是我找不到有关这个话题的任何有价值的东西。 任何人都可以在低延迟系统上推荐书籍,网站和示例吗?

我为一家生产低延迟软件的金融公司工作,直接与交易所进行交stream(提交交易和stream媒体价格)。 我们目前主要使用Java进行开发。 虽然低延迟方面不是我直接工作的一个领域,但我对所需的技能有一个公正的理解,在我看来,这包括以下内容:

  • 详细了解Java内存模型和技术以避免不必要的垃圾回收(例如对象池)。 在传统的OO环境中,所使用的一些技术可能通常被认为是“反模式”。
  • 详细了解TCP / IP和UDP多播,包括用于debugging和测量延迟的实用程序(例如Solaris上的DTrace)。
  • 有分析应用程序的经验。
  • 了解java.nio包,体验开发基于NIO的可伸缩服务器应用程序,体验devise有线协议。 另外请注意,我们通常避免使用框架和外部库(例如Google Protobuf),宁愿编写大量的定制代码。
  • 了解FIX和商业FIX库(如Cameron FIX)。

不幸的是,许多技能只能在“工作中”开发,因为根据规范实施价格服务器或交易引擎的经验是无可替代的。 来自交易所或供应商。 然而,值得一提的是,我们公司至less倾向于不在这个(或者其他)利基领域寻找具体的经验 ,而倾向于聘用具有良好分析和解决问题能力的人才。

低延迟是许多事情的function,最重要的两个是:

  • networking延迟 – 即networking发送/接收消息所用的时间。
  • 处理延迟 – 即您的应用程序在消息/事件上采取行动所花费的时间。

因此,如果您要写一个订单匹配系统,networking延迟将代表您的networking内能够收到订单匹配请求的时间。 而处理等待时间将表示您的应用程序将该订单与现有的未结订单进行匹配所花费的时间。

Infinibandnetworking上的多播,UDP,可靠的多播,内核旁路(由Java 7,Informatica Ultra Messaging等支持)是所有公司在该领域使用的常见技术。

另外,还有一些低延迟编程框架,比如干扰器(http://code.google.com/p/disruptor/),它实现了处理低延迟应用程序的devise模式。; 什么可以杀死你是不得不写入数据库或日志文件作为您的主要工作stream程的一部分。 您将不得不提出独特的解决scheme来满足您正在尝试解决的问题的要求。

在像Java这样的语言中,实现您的应用程序,使其创build(几乎)零垃圾对于等待时间非常重要。 正如Adamski所说,了解Java内存模型非常重要。 了解不同的JVM实现及其局限性。 围绕小型对象创build的典型Javadevise模式是您要抛出窗口的第一件事 – 从来不能修复Java垃圾收集器以实现低延迟 – 唯一可以解决的问题就是垃圾。

祝你好运!

那么,它不只是“传统”的实时编程,它的一切。 我为证券交易所工作 – 速度是王道。 一个典型的问题是写入文件最快的方法是什么? 序列化对象的最快方法是什么? 等等

任何关于实时编程的东西都适合这个法案。 我怀疑这不是你所追求的,但是这是一个非常好的开始。

这篇文章有很多好的答案。 我想补充一下我的经验

  • 为了在java中实现低延迟,你必须在java中控制GC,有很多方法可以做到这一点,例如预先分配对象(即使用flyweightdevise模式),使用原始对象 – trove非常好,所有的数据结构是基于原始的,重用对象实例为例如创build系统范围的字典,以减less创build新的对象,非常好的select从stream/套接字/数据库读取数据时

    • 尝试使用免等待algorithm(这是有点困难),locking自由algorithm。 你可以find很多的例子

    • 使用内存计算。 内存很便宜,你可以在内存中有数据的字节。

    • 如果你可以掌握按位algorithm,那么它会提供非常好的性能。

    • 使用机械的同情 – 请参阅lmax干扰器,优秀的框架

看看ZeroMQ。 http://www.zeromq.org

阅读该网站上的白皮书,您将了解低延迟编程所需的一些知识。

如果您对Java低延迟开发感兴趣,您应该知道,只要您保持垃圾收集器的控制权,就可以在没有RTSJ(实时)JVM的情况下完成此任务。 我build议你看看这篇文章 ,谈论Java开发没有GC开销。 我们在网站上还有许多其他文章讨论低延迟的Java组件。

我想就低延迟编程提出一些意见。 目前,我在金融软件开发低延迟和高执行引擎方面拥有超过5年的经验。

是否有必要了解什么是延迟?

延迟意味着需要时间来完成您的过程。 它不一定取决于你正在使用的开发工具,如java,c ++,.net等,这取决于你的编程技巧和系统。

假设你正在使用Java,但你可能会拖延一个错误。 例如,您已经开发了一个交易应用程序,在每个价格刷新中您都可以调用某些函数等等。 这可能会导致额外的variables,不必要的内存使用,不必要的循环,这可能会导致进程延迟。 如果开发人员关心上述错误,那么.net中开发的相同应用程序可能比java执行得更好。

这也取决于您的服务器系统,就像多处理器系统可能执行得很好,如果你的应用程序是multithreading的。

如果我没有记错的话,实时Java( RTSJ )在这个领域使用,虽然我找不到一篇好的文章链接到现在。

通常,在低延迟环境中工作意味着了解调用依赖关系,以及如何减less调用依赖链以最小化依赖关系链。 这包括使用数据结构和库来存储所需的可caching数据以及重构现有资源以减less相互依赖性。

如果您正在谈论低延迟服务器devise,这些是一些好的指针: http: //www.kegel.com/c10k.html http://pl.atyp.us/content/tech/servers.html