我需要卡夫卡有一个可靠的风暴喷口吗?

时间:2015-02-23 21:55:16

标签: apache-storm

据我所知,ZooKeeper将保留螺栓发出的元组,因此如果螺栓崩溃(或螺栓崩溃的计算机,或整个群集崩溃),螺栓发出的元组将不会丢失。一旦重新启动所有内容,将从ZooKeeper获取元组,一切都将继续,好像什么都没发生过一样。

我还不明白的是,对于鲸鱼是否同样如此。如果一个spout发出一个元组(即,执行了一个spout中的emit()函数),并且此后不久就会出现崩溃的计算机,那么该元组是否会被ZooKeeper复活?或者我们是否需要卡夫卡以保证这一点?

P.S。我知道,在调用emit()时,必须为spout发出的元组分配一个唯一的ID。

P.P.S。我看到书籍中的示例代码使用类似ConcurrentHashMap<UUID, Values>的内容来跟踪尚未被激活的已发送的元组。这是以某种方式自动持有ZooKeeper?如果没有,那么我不应该这样做,我应该吗?我应该做什么呢?使用Kafka?

1 个答案:

答案 0 :(得分:1)

Florian Hussonnois在this风暴用户话题中彻底清楚地回答了我的问题。这是他的答案:

  

实际上,元组不会持久存入“zookeeper”。如果你的   “spout”会发出一个具有唯一ID的元组,它将自动生成   风暴内部(即阿克斯)。因此,万一发射   由于螺栓失效,元组失败,风暴调用了   使用唯一id作为参数的原始spout任务的'fail'方法。

     

然后由你来重新发射失败的元组。

     

在示例代码中,spouts使用Map来跟踪哪些元组是完整的   由您的整个拓扑处理,以便能够重新发射   螺栓失效的情况。

     

但是,如果故障不是来自螺栓,而是来自你的喷口,   内存映射将丢失,您的拓扑将无法使用   赦免失败的元组。

     

对于这种情况,你可以依靠卡夫卡。事实上,卡夫卡喷口   将其读取偏移量存储到zookeeper中。这样,如果是喷口任务   在它之后,它将能够从zookeeper中读取它的偏移量   重新启动。