我有一个与事件驱动系统中棘手的情况有关的问题,我想请教。情况如下:
在我们的系统中,我将redis
用作内存缓存数据库,并将kafka
a用作消息队列。为了提高redis的性能,我使用lua scripting
处理数据,同时将事件推送到redis的阻止列表中。然后将有一个过程来从该阻止列表中选择Redis事件并将其移至kafka。因此,在此过程中,共有3个步骤:
1)从Redis列表中读取事件
2)批量生产卡夫卡
3)删除redis中的相应事件
不幸的是,如果进程死于2到3之间,这意味着在将所有事件生成到kafka中之后,它不会删除redis中的相应事件,然后在该进程重启后,它将生成重复的事件到kafka中,这就是不可接受的。任何人对这个问题都有任何解决方案。预先感谢,我非常感谢。
答案 0 :(得分:0)
即使仅编写一次,Kafka仍倾向于重新处理事件。几乎可以肯定,重新处理客户端将导致重新处理。重新平衡可能是由以下原因触发的:
换句话说,如果您需要确保只对消息进行一次处理,则需要确保在客户端进行处理。您可以通过设置分区键来确保相关消息被同一客户端按顺序使用,从而做到这一点。然后,该客户可以维护其已处理内容的数据库记录。