我有几个服务,其中之一是真理之源(SOT)。卡夫卡是他们的信息经纪人。我不时需要生成一组事件,这些事件将被消耗并应用于其他服务中。所谓固定事件迁移。
我的夹具文件示例:
EntityUpdated (topicA)
- id
- relation
RelationUpdated (topicB)
- id
- relation类是在应用事件后在数据库中具有投影的spring实体。
class Entity: Model {
id
val relation: Relation
}
class Relation: Model {
id
}当前的使用者实现以任意的方式读取主题,并且使用者可以在topicA之前从topicA读取数据,而当消息由于还不存在相关实体而无法应用时,就可以使用。(RelationUpdated在EntityUpdated之前食用)。
我有几个解决办法:
RelationUpdated consumed before EntityUpdated案件了。然后,在恢复所有主题的所有分区之后,我可以继续以任意方式工作。我不喜欢开关,但它看起来很好用。也许有人会做类似的事。我很高兴知道你的想法。
发布于 2021-12-17 14:40:59
这不是Apache Kafka设计的目的。更明确的信息传递是关于独立性和关注点的分离。我的意思是,一个源中的消息不应该影响其他消息,而您想要对暂停和DLT所做的事情对剩下的内容产生很大影响的就是这些主题。
我建议您看看Spring及其聚合器模式实现:https://docs.spring.io/spring-integration/docs/current/reference/html/message-routing.html#aggregator。其想法是:您的Entity和Relation在该id上有关联。因此,独立于谁首先到达,聚合器将等待第二部分,只有在此之后才会释放这两个部分以进行下一个处理步骤。有了这种集成解决方案,就不需要任何类似消费者暂停的东西,也不需要通过DLT进行额外的代理循环。
如果Spring看起来对您来说太复杂了,您可以考虑使用本地Map来实现自己的解决方案,以添加基于第一次到达(computeIfAbsent())和返回第二次到达(computeIfPresent())的方法。
https://stackoverflow.com/questions/70391162
复制相似问题