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