我们正在尝试使用 Apache Storm
实现一个Web应用程序。
申请接收大量广告请求( 100 TPS
- 一百次交易/秒),对其进行一些简单的计算,然后将存储结果存储在NoSQL数据库中,最大延迟为10 ms 。
我们使用 Cassandra
作为其写作功能的接收器。
但是,我们已经超越了 8 ms
要求,我们处于 100ms
。
我们尝试使用螺栓的并行性来最小化缓冲区(Disruptor缓冲区)的大小并平衡拓扑。
但我们仍然在 20ms
。
对于4名工作人员(8核/ 16GB),我们处于 20k TPS
,这仍然非常低。
是否有任何优化建议或是否我们刚刚达到Apache Storm
的限制(Java
的限制)?
答案 0 :(得分:2)
在低延迟和高吞吐量之间进行权衡。
如果你真的需要高吞吐量,你应该依靠批量调整更大的缓冲区大小,或者使用Trident。
尽量避免向其他工作人员传输元组有助于降低延迟。 (localOrShuffleGrouping)
请不要忘记监控导致世界停止的GC。如果您需要低延迟,则应将其最小化。
答案 1 :(得分:2)
我不知道您正在使用的平台,但在C ++中 10ms
是永恒的。我认为你正在使用错误的工具。
使用C ++,提供一些本地查询应该不到一微秒。
触及多个内存位置和/或必须等待磁盘或网络I / O的非本地查询别无选择,只能花费更多时间。在这种情况下,并行性是你最好的朋友。
你必须找到瓶颈。
找到瓶颈之后,您可以改进它,异步它和/或乘以(=并行化)它。