1

我们正在尝试使用Apache Storm.

应用程序
接收到大量的广告请求(100 TPS- 一百个事务/秒),对它们
进行一些简单的计算,然后
结果存储在 NoSQL 数据库
中,最大延迟为 10 毫秒

我们将Cassandra其用作接收器的写入功能。

但是,我们已经超过了8 ms要求,我们在100ms.

我们尝试使用螺栓的并行性来最小化缓冲区(Disruptor 缓冲区)的大小并很好地平衡拓扑。

但是我们还在20ms

有 4 个工作人员(8 个核心 / 16GB),我们20k TPS仍然处于非常低的水平。

是否有任何优化建议,或者
我们是否刚刚达到Apache Storm
(limits of Java) 的限制?

4

2 回答 2

2

我不知道您使用的平台,但在 C++10ms中是 eternity。我认为您使用了错误的工具来完成这项工作。

使用 C++,提供一些本地查询需要不到一微秒的时间。

涉及多个内存位置和/或必须等待磁盘或网络 I/O 的非本地查询,别无选择,只能花费更多时间。在这种情况下,并行性是你最好的朋友。

你必须找到瓶颈。

  1. 是 I/O 吗?
  2. 是CPU吗?
  3. 是内存带宽吗?
  4. 是内存访问时间吗?

找到瓶颈后,您可以对其进行改进、异步和/或相乘(=并行化)它。

于 2015-07-20T11:39:16.233 回答
2

低延迟和高吞吐量之间存在权衡。

如果你真的需要高吞吐量,你应该依靠批量调整缓冲区的大小,或者使用 Trident。

尽量避免将元组传输给其他工作人员有助于降低延迟。(localOrShuffleGrouping)

请不要忘记监控导致 stop-the-world 的 GC。如果您需要低延迟,则应将其最小化。

于 2015-07-12T00:05:31.883 回答