java - 如何提高股票数据传输应用程序的性能?

标签 java performance

这个问题我已经工作了几年,但是现在我仍然没有一个好的解决方案。

我的应用程序分为两部分:


第一个运行在称为“ ROOT服务器”的服务器中。它将从HKEx(香港证券和期货交易所)接收实时股票数据,并将其广播到其他5个子服务器。广播时,它将在每个数据项上附加一个时间戳。
第二个在“儿童”服务器中运行。他们将从ROOT服务器接收库存数据,解析每个数据,并获取重要信息。最后,他们将以新的文本格式将其发送给客户端。客户可能是成百上千,他们可以注册某种股票,并获得它们的实时信息。


性能是最重要的。在过去的几年中,我尝试了各种已知的解决方案以使其更快。这里的“更快”表示,第一个将尽可能快地接收和发送数据到子级服务器,而子服务器将尽快接收和解析并将数据发送到客户端。

目前,当来自香港交易所的数据速度为20万,并且有5个子服务器时,第一个应用程序平均每个数据项有10毫秒的延迟。第二个不容易测试,取决于客户数量。

我正在使用什么:


OpenSUSE 10
Sun Java 5.0
米娜2.0


服务器硬件:


4核CPU(我不知道类型)
4G内存


我正在考虑如何提高性能。


我是否需要将并发框架用作akka
尝试另一种语言,例如斯卡拉? C ++?
使用real-time java system
您的建议...


需要你的帮助!



更新:

这些应用程序已记录了一些重要信息以供分析,但是我没有发现任何瓶颈。明年香港交易所将提供更多数据,我认为我的申请不够快。

我的一位客户已经测试了我们的应用程序,而另一家公司已经测试过,但是我们的客户在速度方面没有优势。我只想找到一种使它更快的方法。

第一个应用程序如何运行

第一个应用程序将从香港交易所接收股票数据,并将其广播到其他几台服务器。这些步骤是:


连接香港交易所
登入
读取数据。数据为二进制格式,每个项目都有一个头部,该头部是2字节的整数,表示主体的长度,然后是主体,然后是下一个项目。
将它们放入内存中的哈希表。键是项目的顺序,值是字节数组。
将接收到的每个项目的顺序记录到磁盘中。使用log4j的缓冲区附加程序。
守护程序线程尝试从哈希图中读取数据,并每隔1分钟将其插入到postgresql中。 (这仅用于备份数据)
当客户端连接到该服务器时,它接受它们并尝试从内存中的哈希映射中发送所有数据。我在Mina中使用了线程池,接受者和发送者处于不同的线程中。


我认为逻辑很简单。当有5个客户端时,我监视的传输速度最多仅为1.5M / s。我用Java编写了一个最简单的套接字程序,发现它可以达到10M / s。

实际上,我已经花了1年多的时间在此应用程序上尝试各种解决方案,只是为了使其更快。那就是为什么我感到绝望。我需要尝试使用Java以外的其他语言吗?



大约10毫秒的延迟

当应用程序从香港交易所收到数据时,我将为其记录时间戳。当根服务器将数据广播到子级服务器时,它将时间戳附加到数据上。

当子级服务器获取数据时,它将向根服务器发送一条消息以获取当前时间戳,然后对其进行比较。

因此,10ms的延迟包含:


根服务器获取数据--->子服务器获取数据
子服务器发送对根服务器时间戳的请求--->根服务器收到了它


但是第二个很小,我们可以忽略它。

最佳答案

如果检查了所有内容,但未发现明显的性能优化,则可能需要更改体系结构以获得更好的性能。如果您至少可以确定应用程序在哪里花费时间,那么这显然是最富有成果的-听起来有几个主要组成部分:


HK Ex服务器(不受您控制)
Exchange与您的系统之间的网络
“根”服务器
“根”服务器与“子”服务器之间的网络
“子”服务器
“子”服务器和客户端之间的网络
客户


要知道您将时间,金钱和精力花在哪里,我至少希望看到对这些组件的分析,每个组件花费的时间(最小,最大,平均)以及每种资源的规格。

最容易更改的是硬件-更大的服务器,更多的内存等,或者更好的带宽。您能看到其中任何资源是否受到限制吗?

接下来要看的是更改通信协议以提高效率-客户如何接收库存?可以减少数据大小吗?仅5个客户就需要150万听起来...

接下来,您可能会研究某种服务质量解决方案-为“高级”客户提供专用硬件,从而减少资源争用,增加服务器,增加带宽-这可能需要更改体系结构。

接下来,您可以考虑更改体系结构-现在,您的客户端从客户端服务器“拉”数据。相反,您可以“推送”数据-这样,您就可以减少客户端的轮询间隔。

在列表的最后,我将考虑使用不同的技术堆栈。 Java是一种很好的编程语言,但是如果绝对性能是重中之重,那么C / C ++仍然会更快。显然,这是一个巨大的变化,编写良好的Java应用程序将比编写不良的C / C ++应用程序更快(并且更加稳定)。

关于java - 如何提高股票数据传输应用程序的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7812171/

相关文章:

ios - UIKit Dynamics 的性能问题

java - Java中如何将两个 "Cards"的值相加?

java - 无法解析 java.text.ParseException : Unparseable date 行中的日期

java - 如何使用类型安全配置解析 JSON 数组?

php - 什么被认为是较长的执行时间?

Java 作为 Java 的脚本语言?

MySQL JOIN 需要 10 秒以上

java - 如何删除双向链表中的尾部?

java - 读取目录类路径资源时的行分隔符是什么?

c++ - 是++(a = b);比 a = b + 1 快;?