我决定使用Kafka进行事件采购实施,还有一些我还不太确定的事情。一种是在发生故障时找到一种重新创建物化视图(存储在Postgres数据库中)的好方法。
我正在构建消息传递应用程序,因此请考虑接收REST请求以创建新消息的服务示例。它将验证请求,然后在Kafka中创建一个事件(例如“NewMessageCreated”)。然后,该服务(以及可能的其他服务)将接收该事件以更新其本地数据库。但是假设数据库已崩溃,因此保存数据库中的顺序失败。如果我正确理解如何处理这种情况,我应该清空数据库并尝试通过重放所有Kafka事件来重新创建它。
如果我的假设是正确的,我可以看到以下问题:
1)我需要通过userId对我的“messages”主题强制执行排序(因此所有来自特定用户的消息都按顺序使用),这意味着我无法使用Kafka的日志压缩功能来完成该主题。这意味着无论我的应用程序变得多大,我都将不得不重播来自Kafka的所有活动!有没有办法以更好的方式解决这个问题?
2)每次我重播来自Kafka的任何事件时,他们都可能触发新事件的创建(例如,消费者可能会进行一些处理,然后在提交之前生成新事件)。这听起来确实有问题所以我在想,如果不是在重建我的缓存时重放事件,我应该处理事件但禁止生成新事件(即使这需要额外的代码并且看起来很麻烦)。
3)当在消费某些消息时发生错误(例如由于某些资源故障或由于错误而导致)时,我应该提交消息并在Kafka主题中生成错误,还是我根本不应该提交?在后一种情况下,这意味着同一分区中的后续消息也不能被提交(否则它们也将隐式提交前一个消息)。
如何解决这些问题? 感谢。