Language agnostic 低延迟编程

Language agnostic 低延迟编程,language-agnostic,trading,low-latency,Language Agnostic,Trading,Low Latency,我已经读了很多关于低延迟金融系统的书,特别是自从著名的公司间谍案之后,低延迟系统的想法就一直在我的脑海中。有一百万个应用程序可以使用这些人正在做的事情,所以我想了解更多关于这个主题的信息。问题是我找不到关于这个话题的任何有价值的东西。有人能推荐一些关于低延迟系统的书籍、网站和例子吗?任何关于实时编程的东西都可以。我想这并不完全是你想要的,但这是一个非常好的起点。如果我没记错的话,实时Java在这一领域的应用,尽管我现在找不到一篇好文章来链接。好吧,这不仅仅是传统的实时编程,而是一切。我在一家证券

我已经读了很多关于低延迟金融系统的书,特别是自从著名的公司间谍案之后,低延迟系统的想法就一直在我的脑海中。有一百万个应用程序可以使用这些人正在做的事情,所以我想了解更多关于这个主题的信息。问题是我找不到关于这个话题的任何有价值的东西。有人能推荐一些关于低延迟系统的书籍、网站和例子吗?

任何关于实时编程的东西都可以。我想这并不完全是你想要的,但这是一个非常好的起点。

如果我没记错的话,实时Java在这一领域的应用,尽管我现在找不到一篇好文章来链接。

好吧,这不仅仅是传统的实时编程,而是一切。我在一家证券交易所工作——速度为王。一个典型的问题是什么是写入文件的最快方式?序列化对象的最快方法是什么?等等。

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

我为一家金融公司工作,该公司生产低延迟软件,用于直接与交易所进行通信,以提交交易和流媒体价格。我们目前主要用Java开发。虽然低延迟方面不是我直接工作的领域,但我对所需的技能有一个大致的了解,我认为这包括以下几点:

详细了解Java内存模型和技术,以避免不必要的垃圾收集,例如对象池。在传统的OO环境中,使用的一些技术通常被视为反模式。 详细了解TCP/IP和UDP多播,包括调试和测量延迟的实用程序,例如Solaris上的DTrace。 有分析应用程序的经验。 了解java.nio包,有开发基于nio的可扩展服务器应用程序的经验,有设计有线协议的经验。还要注意的是,我们通常避免使用框架和外部库,例如GoogleProtobuf,更喜欢编写大量定制代码。 了解修复和商业修复库,例如Cameron修复。 不幸的是,许多技能只能在工作中培养,因为没有什么可以替代根据交易所或供应商的规范实施价格服务器或交易引擎所获得的经验。然而,也值得一提的是,我们公司至少不倾向于寻找在这一领域或其他利基领域的具体经验,而是倾向于雇佣具有良好分析和解决问题能力的人员。

看看ZeroMQ


阅读该网站上的白皮书,您将了解低延迟编程需要什么

使用ANSI C脚本在200 KB内完成所有工作。

如果您正在谈论低延迟服务器设计,以下是一些很好的建议:
http://pl.atyp.us/content/tech/servers.html低延迟是许多因素的作用,其中最重要的两个因素是:

网络延迟-即在网络上传输/接收消息所花费的时间。 处理延迟—即应用程序处理消息/事件所花费的时间。 因此,如果您正在编写订单匹配系统,那么网络延迟将表示您能够在网络中多久收到订单匹配请求。处理延迟表示应用程序将订单与现有未结订单进行匹配所需的时间

多播、UDP、可靠多播、Java 7支持的内核旁路、Informatica Ultra Messaging以及Infiniband网络上的许多其他技术都是该领域所有公司使用的一些常见技术

此外,还有像disruptor这样的低延迟编程框架http://code.google.com/p/disruptor/ 它实现了用于处理低延迟应用程序的设计模式。作为主要工作流程的一部分,必须写入数据库或日志文件,这可能会让您丧命。您必须提出独特的解决方案,以满足您试图解决的问题的要求

在Java等语言中,实现应用程序以使其几乎不产生垃圾对于延迟来说变得极其重要。正如Adamski所说,了解Java内存模型非常重要。了解不同的JVM实现及其局限性。围绕小对象创建的典型Java设计模式是您将要扔出窗口的第一件事情——永远无法修复Java垃圾收集器以实现低延迟——唯一可以修复的就是垃圾


祝你好运

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

为了在java中实现低延迟,您必须控制G C在java中,有很多方法可以做到这一点,例如预分配对象。e使用flyweight设计模式,使用primitive对象。trove非常适合这样做,所有数据结构都基于primitive, 重用对象实例,例如创建系统范围的字典,以减少创建新对象,这是从stream/socket/db读取数据时的一个很好的选择

尝试使用有点困难的无等待算法,无锁算法。你可以找到很多这样的例子

使用内存计算。内存很便宜,内存中可以有TB的数据

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

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


如果您对Java低延迟开发感兴趣,您应该知道,如果您能够控制垃圾收集器,那么在没有RTSJ实时JVM的情况下就可以完成这项工作。我建议您看看关于无GC开销的Java开发的讨论。我们还有许多其他文章讨论低延迟Java组件。

我想谈谈低延迟编程。 目前,我在金融软件开发低延迟和高执行引擎方面有超过5年的经验

有必要了解什么是延迟吗

延迟意味着需要时间来完成您的流程。它不一定取决于你正在使用的开发工具,如java、C++、.NET等,它取决于编程技巧和系统。 假设您正在使用java,但一个错误就可能导致进程延迟。例如,您开发了一个交易应用程序,在该应用程序中,您可以在每次价格刷新时调用一些函数等等。这可能会导致额外的变量、不必要的内存使用、不必要的循环,从而导致进程延迟。如果开发人员关心上述错误,那么在.net中开发的同一个应用程序可能会比java更好


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

什么著名的公司间谍案?高盛程序员据称窃取了他们高频交易平台的源代码:有点晚,但你可能对这些链接感兴趣。你可以开发延迟低于20微秒的Java系统在RTSJ上工作的箱体外部TCPI am。遗憾的是,没有更多的RTSJ版本了,Oracle停止了RTSJ版本并支持它。它主要避免垃圾收集上的停止。低延迟和Java?看起来有点矛盾。@ZamfirKerlukson:我们有一个Java消息传递应用程序,它可以在8-9微秒内处理传入的消息。我们更复杂的服务器应用程序处理时间为65-80微秒。关于Java,需要记住的一点是JIT编译器能够进行代码分析、动态内联方法和数据访问。这将自动化C程序员使用inline关键字手动执行的操作。然而,控制GC暂停时间是一个挑战,尽管有一些JVM解决方案试图解决这个问题???怎么可能呢???如果想降低延迟,至少应该切换到C/C++甚至汇编。我在低延迟Exchange网关工作,我们可以在一个包处理中获得10-20美元,包括消息解析、风险检查、数据库分配、C++中的本地消息转换的修复。对于Java,第一天就证明它是完全错误的。你的软件使用什么语言,C/C++还是其他语言?实时编程不是低延迟,而是在一定的时间段内对事件做出反应,不一定是快速的。