当前位置:  开发笔记 > 编程语言 > 正文

低延迟编程

如何解决《低延迟编程》经验,为你挑选了6个好方法。

我一直在阅读很多关于低延迟金融系统的信息(特别是自着名的企业间谍案以来),从那以后我就一直想到低延迟系统.有一百万个应用程序可以使用这些人正在做的事情,所以我想更多地了解这个主题.问题是我找不到任何关于这个主题的有价值的东西.任何人都可以在低延迟系统上推荐书籍,网站和示例吗?



1> Adamski..:

我在一家金融公司工作,该公司生产低延迟软件,用于直接与交易所进行通信(用于提交交易和流媒体价格).我们目前主要使用Java开发.虽然低延迟方面不是我直接工作的区域,但我对所需的技能组合有一个很好的想法,其中包括以下内容:

详细了解Java内存模型和技术,以避免不必要的垃圾收集(例如对象池).在传统的OO环境中,所使用的一些技术通常可被视为"反模式".

详细了解TCP/IP和UDP多播,包括用于调试和测量延迟的实用程序(例如Solaris上的DTrace).

具有分析应用程序的经验.

了解java.nio包,体验开发基于NIO的可伸缩服务器应用程序,体验设计有线协议.另请注意,我们通常会避免使用框架和外部库(例如Google Protobuf),而是更喜欢编写大量定制代码.

了解FIX和商业FIX库(例如Cameron FIX).

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


低延迟和Java?似乎是各种各样的矛盾.
@ZamfirKerlukson:我们有一个Java消息传递应用程序,可以在8-9微秒内处理传入的消息.我们更复杂的服务器应用程序进程在65-80微秒.关于Java,要记住的一件事是JIT编译器能够进行代码分析和动态内联方法和数据访问.这可以自动化C程序员使用"内联"关键字手动执行的操作.但是,控制GC暂停时间是一项挑战(尽管有一些JVM解决方案试图解决这个问题).

2> inder..:

低延迟是很多事情的函数,最重要的两个是:

网络延迟 - 即网络传输/接收消息所花费的时间.

处理延迟 - 即应用程序对消息/事件采取行动所花费的时间.

因此,如果您说编写订单匹配系统,网络延迟将表示您的网络能够在多长时间内收到订单匹配请求.处理延迟将代表您的应用程序将订单与现有的未结订单进行匹配所需的时间.

Infiniband网络上的多播,UDP,可靠多播,内核旁路(Java 7支持,Informatica Ultra Messaging等等)是该领域所有公司使用的一些常用技术.

此外,还有低延迟编程框架,如disruptor(http://code.google.com/p/disruptor/),它实现了处理低延迟应用程序的设计模式.什么可以杀死你是必须写入数据库或日志文件作为主要工作流程的一部分.您必须提出独特的解决方案,以满足您尝试解决的问题的要求.

在像Java这样的语言中,实现你的应用程序使其创建(几乎)零垃圾对于延迟变得极为重要.正如Adamski所说,了解Java内存模型非常重要.了解不同的JVM实现及其局限性.围绕小对象创建的典型Java设计模式是您将抛出窗口的第一件事 - 人们永远无法修复Java垃圾收集器以实现低延迟 - 唯一可以修复的是垃圾.

祝好运!



3> 小智..:

这篇文章有很多好的答案.我也想补充一点经验

要在java中实现低延迟,你必须在java中控制GC,有很多方法可以做到这一点,例如预分配对象(即使用flyweight设计模式),使用原始对象 - trove非常好,所有数据结构基于原始,重用对象实例,例如创建系统范围的字典以减少创建新对象,从stream/socket/db读取数据时非常好的选择

尝试使用无等待算法(这有点困难),锁定免费算法.你可以找到大量的例子

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

如果你能掌握逐位算法,那么它会提供非常好的性能.

使用机械同情 - 参考lmax disruptor,优秀的框架



4> 小智..:

我想对低延迟编程发表一些意见。目前,我在开发财务软件中的低延迟和高执行引擎方面拥有5年以上的经验。

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

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

假设您使用的是Java,但是一个错误可能会使过程延迟。例如,您开发了一个交易应用程序,在该应用程序中,每刷新一次价格,您便会调用一些函数,依此类推。这可能会导致额外的变量,不必要的内存使用,不必要的循环,从而可能导致过程延迟。如果开发人员关心上述错误,则.net中开发的同一应用程序的性能可能会比Java好。

它还取决于您的服务器系统,例如,如果您的应用程序是多线程的,那么多处理器系统可能会表现良好。



5> 小智..:

好吧,它不仅仅是"传统的"实时编程,它的一切.我在股票交易所工作 - 速度是王道.一个典型的问题是写入文件的最快方法是什么?序列化对象的最快方法?等等



6> 小智..:

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

阅读该站点上的白皮书,您将了解低延迟编程所需的内容。

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有