我一直在阅读很多关于低延迟金融系统的信息(特别是自着名的企业间谍案以来),从那以后我就一直想到低延迟系统。有一百万个应用程序可以使用这些人正在做的事情,所以我想更多地了解这个主题。问题是我找不到任何关于这个主题的有价值的东西。任何人都可以在低延迟系统上推荐书籍,网站和示例吗?
答案 0 :(得分:45)
我为一家金融公司工作,该公司生产低延迟软件,用于直接与交易所进行通信(用于提交交易和流媒体价格)。我们目前主要使用Java开发。虽然低延迟方面不是我直接工作的区域,但我对所需的技能组合有一个很好的想法,其中包括以下内容:
不幸的是,许多技能只能在“工作中”开发,因为根据规范实现价格服务器或交易引擎所获得的经验是无法替代的。来自交易所或供应商。但是,值得一提的是,我们公司至少倾向于不在这个(或其他)利基领域寻找特定的经验,而是更愿意雇用具有良好分析和解决问题能力的人。
答案 1 :(得分:24)
低延迟是很多事情的函数,其中最重要的两个是:
因此,如果您说编写订单匹配系统,网络延迟将表示您的网络能够在多长时间内收到订单匹配请求。处理延迟将代表您的应用程序将订单与现有的未结订单进行匹配所需的时间。
Infiniband网络上的多播,UDP,可靠多播,内核旁路(由Java 7,Informatica Ultra Messaging等支持)是该领域所有公司使用的一些常用技术。
此外,还有低延迟编程框架,如disruptor(http://code.google.com/p/disruptor/),它实现了处理低延迟应用程序的设计模式。什么可以杀死你是必须写入数据库或日志文件作为主要工作流程的一部分。您必须提出独特的解决方案,以满足您尝试解决的问题的要求。
在像Java这样的语言中,实现你的应用程序使其创建(几乎)零垃圾对于延迟变得极其重要。正如Adamski所说,了解Java内存模型非常重要。了解不同的JVM实现及其局限性。围绕小对象创建的典型Java设计模式是你将抛出窗口的第一件事 - 人们永远无法修复Java垃圾收集器以实现低延迟 - 唯一可以修复的就是垃圾。
祝你好运!答案 2 :(得分:8)
这篇文章有很多好的答案。我想补充一下我的经验
要在java中实现低延迟,你必须在java中控制GC,有很多方法可以做到这一点,例如预分配对象(即使用flyweight设计模式),使用原始对象 - trove非常对此有利,所有数据结构都基于原始, 重用对象实例,例如创建系统范围的字典以减少创建新对象,从stream / socket / db读取数据时非常好的选择
尝试使用等待算法(这有点困难),锁定自由算法。你可以找到很多这样的例子
使用内存计算。内存很便宜,你可以在内存中有tera字节的数据。
如果你能掌握逐位算法,那么它会提供非常好的表现。
使用技术上的同情 - 参考lmax disruptor,优秀的框架
答案 3 :(得分:5)
嗯,它不仅仅是“传统的”实时编程,它的一切。我在股票交易所工作 - 速度是王道。一个典型的问题是写入文件的最快方法是什么?序列化对象的最快方法?等
答案 4 :(得分:4)
关于实时编程的任何内容都符合要求。我怀疑,这并不是你所追求的,但这是一个非常好的起点。
答案 5 :(得分:4)
看看ZeroMQ。 http://www.zeromq.org
阅读该网站上的白皮书,您将了解低延迟编程所需的内容。
答案 6 :(得分:4)
如果您对Java低延迟开发感兴趣,您应该知道可以在没有RTSJ(实时)JVM的情况下完成它,只要您能够控制垃圾收集器。我建议你看看this article谈论Java开发而没有GC开销。我们在our site中还有许多其他文章讨论了低延迟的Java组件。
答案 7 :(得分:4)
我想就低延迟编程提供一些意见。 目前,我在财务软件中开发低延迟和高执行引擎方面拥有超过5年的经验。
是否有必要了解什么是延迟?
延迟意味着需要时间来完成您的流程。它不一定取决于您使用的开发工具,如java,c ++ ,. net等,它取决于您的编程技能和系统。
假设您正在使用java,但是您可能会因为一个错误而导致延迟。例如,您已经开发了一个交易应用程序,在每个价格刷新时,您可以调用某些函数,等等。这可能导致额外的变量,不必要的内存使用,不必要的循环,这可能会导致进程延迟。如果开发人员关心上述错误,.net中开发的相同应用程序可能比java更好。
它还取决于您的服务器系统,如果您的应用程序是多线程的,多处理器系统可能表现良好。
答案 8 :(得分:2)
如果您谈论低延迟服务器设计,这些是一些很好的指针: http://www.kegel.com/c10k.html http://pl.atyp.us/content/tech/servers.html
答案 9 :(得分:1)
如果我没记错,那么在这个区域使用Java(RTSJ),虽然我找不到一篇好的文章可以链接到现在。
答案 10 :(得分:1)
通常,在低延迟环境中工作意味着要了解调用依赖关系以及如何减少它们以最小化依赖关系链。这包括使用数据结构和库来存储所需的可缓存数据,以及重构现有资源以减少相互依赖性。
答案 11 :(得分:1)
http://g-wan.com/使用ANSI C脚本以200 KB完成所有操作。