首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring-kafka固定事件迁移实现

spring-kafka固定事件迁移实现
EN

Stack Overflow用户
提问于 2021-12-17 09:41:07
回答 1查看 87关注 0票数 0

我有几个服务,其中之一是真理之源(SOT)。卡夫卡是他们的信息经纪人。我不时需要生成一组事件,这些事件将被消耗并应用于其他服务中。所谓固定事件迁移。

我的夹具文件示例:

代码语言:javascript
复制
EntityUpdated (topicA)
- id
- relation

RelationUpdated (topicB)
- id
- relation

类是在应用事件后在数据库中具有投影的spring实体。

代码语言:javascript
复制
class Entity: Model {
  id
  val relation: Relation
}

class Relation: Model {
  id
}

当前的使用者实现以任意的方式读取主题,并且使用者可以在topicA之前从topicA读取数据,而当消息由于还不存在相关实体而无法应用时,就可以使用。(RelationUpdated在EntityUpdated之前食用)。

我有几个解决办法:

  1. 暂停所有分区/主题,并按指定的顺序恢复。这样我就可以避免RelationUpdated consumed before EntityUpdated案件了。然后,在恢复所有主题的所有分区之后,我可以继续以任意方式工作。我不喜欢开关,但它看起来很好用。

  1. 将无法应用于所谓的死信队列的消息重复播放一遍又一遍,直到它们全部应用为止。

也许有人会做类似的事。我很高兴知道你的想法。

EN

回答 1

Stack Overflow用户

发布于 2021-12-17 14:40:59

这不是Apache Kafka设计的目的。更明确的信息传递是关于独立性和关注点的分离。我的意思是,一个源中的消息不应该影响其他消息,而您想要对暂停和DLT所做的事情对剩下的内容产生很大影响的就是这些主题。

我建议您看看Spring及其聚合器模式实现:https://docs.spring.io/spring-integration/docs/current/reference/html/message-routing.html#aggregator。其想法是:您的EntityRelation在该id上有关联。因此,独立于谁首先到达,聚合器将等待第二部分,只有在此之后才会释放这两个部分以进行下一个处理步骤。有了这种集成解决方案,就不需要任何类似消费者暂停的东西,也不需要通过DLT进行额外的代理循环。

如果Spring看起来对您来说太复杂了,您可以考虑使用本地Map来实现自己的解决方案,以添加基于第一次到达(computeIfAbsent())和返回第二次到达(computeIfPresent())的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70391162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档