我正在编写一个Kafka Producer,它利用HDFS INotify API监视特定目录,并在文件添加到该目录时将消息发送到该主题。
展望HA,我正在考虑使用supervisor(或类似的)来确保始终有生产者实例在运行。但是,我无法确保在重新启动生产者时不会丢失FS更改。我知道HDFS允许我在获取事件流时手动设置lastReadTXid
。当生产者重新启动时,我希望能够从此偏移量开始。
我相信我将在该主题上发送的消息将新文件的路径作为键,将TXid作为值。
我有一些想法:
想法1-写我自己的主管。我的程序将启动另一个线程/进程,即生产者。父进程维护TXid,如果第一个生产者线程/进程失败,它将处理启动另一个生产者线程/进程。但是,我遇到了同样的问题。如果父进程失败,则最后一个TXid将丢失,并且可能会丢失交易。
想法2-生产者可以某种方式检查关于该主题的最后发送的消息。我可以看到最后发送的值(最后一个TXid),并从该点开始事件流。
想法3-有2个制作人,两个制作人都针对同一主题。一个人是领导者,一个人是副本。如果一个失败,则在重新启动第一个消息时,还有另一个继续产生消息。我看到的问题是现在有重复的消息发送到该主题。
有人可以指出我正确的方向吗?