据我所知,ZooKeeper将保留螺栓发出的元组,因此如果螺栓崩溃(或螺栓崩溃的计算机,或整个群集崩溃),螺栓发出的元组将不会丢失。一旦重新启动所有内容,将从ZooKeeper获取元组,一切都将继续,好像什么都没发生过一样。
我还不明白的是,对于鲸鱼是否同样如此。如果一个spout发出一个元组(即,执行了一个spout中的emit()
函数),并且此后不久就会出现崩溃的计算机,那么该元组是否会被ZooKeeper复活?或者我们是否需要卡夫卡以保证这一点?
P.S。我知道,在调用emit()
时,必须为spout发出的元组分配一个唯一的ID。
P.P.S。我看到书籍中的示例代码使用类似ConcurrentHashMap<UUID, Values>
的内容来跟踪尚未被激活的已发送的元组。这是以某种方式自动持有ZooKeeper?如果没有,那么我不应该这样做,我应该吗?我应该做什么呢?使用Kafka?
答案 0 :(得分:1)
Florian Hussonnois在this风暴用户话题中彻底清楚地回答了我的问题。这是他的答案:
实际上,元组不会持久存入“zookeeper”。如果你的 “spout”会发出一个具有唯一ID的元组,它将自动生成 风暴内部(即阿克斯)。因此,万一发射 由于螺栓失效,元组失败,风暴调用了 使用唯一id作为参数的原始spout任务的'fail'方法。
然后由你来重新发射失败的元组。
在示例代码中,spouts使用Map来跟踪哪些元组是完整的 由您的整个拓扑处理,以便能够重新发射 螺栓失效的情况。
但是,如果故障不是来自螺栓,而是来自你的喷口, 内存映射将丢失,您的拓扑将无法使用 赦免失败的元组。
对于这种情况,你可以依靠卡夫卡。事实上,卡夫卡喷口 将其读取偏移量存储到zookeeper中。这样,如果是喷口任务 在它之后,它将能够从zookeeper中读取它的偏移量 重新启动。