风暴与三叉戟:什么时候不用三叉戟?

我正在和Storm合作,很多用例都很好。 最近我看了一下Trident ,这是Storm的一个高级抽象。 它支持精确的一次处理,并使状态处理更容易。

但现在我想知道..为什么我不能总是使用三叉戟,而不是风暴?

我读到目前为止:

  • Trident分批处理消息,所以吞吐时间可能会更长。
  • Trident目前还不能在拓扑中处理循环。

使用Trident而不是Storm时还有其他的缺点吗? 因为现在我认为上面列出的缺点是微不足道的。

Trident无法实现哪些用例?


后果:

因为我问了这个问题,我的公司决定先去三叉戟。 出现性能问题时,我们只会使用纯风暴。 可悲的是,这不是一个积极的决定,它只是成为默认行为(我当时不在)。

他们的假设是,在大多数使用情况下,我们需要进行状态处理或者只处理一次处理,否则我们将在不久的将来需要它。 我理解他们的推理,因为从风暴到三叉戟还是后退不是一个容易的转换,但是我个人认为,没有状态的stream处理的概念并不是所有人都能理解的,这也是使用Trident的主要原因。

回答你的问题:什么时候不应该使用三叉戟? 每当你不能承受。

Trident增加了Storm拓扑的复杂性,降低了性能并生成状态。 问自己这个问题:你是否需要Trident的“恰好一次”处理语义,或者你可以接受Storm的“至less一次”处理语义。 只有一次,使用三叉戟,否则不。

我也想强调一下,Storm保证所有的消息都将被处理。 一些消息可能会被处理多次。

如果最低延迟是你的目标,而且你不需要一次处理,那么使用Storm比Trident要好。

Trident是一个高级抽象,用于在Storm Storm上使用实时计算,在Storm 0.8.x中可用。 Storm是无状态的stream处理框架,Trident提供有状态的stream处理。

克里斯,因为这两个是开源技术,三叉戟只是在风暴之上的场景实现,当然,这带来了性能开销。 如果三叉戟无法满足您的要求,您可以在风暴之上创build自己的状态实施。 三叉戟及时产生了三叉戟ML等更高水平的项目。

假设我们想要做一个元组过滤+添加一个字段。 如果我们使用风暴,通常我们使用2个机器人进行过滤,增加场地。 所以我们再次需要通过可能使用全局分组来发送元组到新螺栓。 所以这里新的带宽可能会成为瓶颈。

通过使用三叉戟,我们可以在一台机器上使用上面的方法。 所以在这种情况下不需要重组。 这样的用例除了“正好一次”/“东一次”之外还可以区分使用什么等等。

三叉戟是一种分组逻辑分组

Interesting Posts