如何使用弹簧云流和kafka活页夹优先处理某些消息

时间:2017-12-22 15:30:46

标签: spring-cloud-stream spring-kafka

TLDR:我希望能够在同一主题中的其他人之前处理一些紧急消息。

更多解释:

我正在开发一个相当大的应用程序,它使用许多依赖spring-cloud-stream的spring微服务和kafka-binder来完成某些任务。

计划任务可能会产生大量事件。当消耗这些事件时,可能会产生并发送中间事件,并且可能需要相当长的时间才能消耗所有初始和中间消息并完成所有工作。

在此期间,如果有人想手动发送相同类型的事件,则只有在完成其他所有操作后才会对其进行排队和处理。

在所有其他事件发生之前,我被问到是否无法优先处理这些“手动事件”。

通常在这种情况下,您会看到有人主张复制所有主题(例如topic-normaltopic-urgent),并重复@StreamListener。这似乎是一个相当复杂的选项,因为我们在这里涉及许多不同的主题。我们还有一些kafka-streams聚合,需要重写才能将其考虑在内。

对于一位开发人员,我们考虑过可能需要复制每个主题的消费者群体(consumerGroupNormalconsumerGroupUrgentusing)。然后,我会为每条消息添加一个优先级标头,复制StreamListener并仅使用其中一个侦听器中带有priority: urgent标头的消息,而只消耗另一个侦听器中带有priority:normal的消息。

我也可能会创建一个ChannelInterceptorAdapter来自动添加和读取这个“优先级”标头(a bit like Sleuth does it)。

但我仍然需要为绑定器添加大量配置才能编写,并且需要复制监听器,添加检查标头的小代码并执行或不执行监听器代码。

总而言之,对于某些看起来像是一个非常常见且简单的用例而言,这看起来非常有用,对其他人来说非常有用,所以我想知道是否有更简单的方法可以做到这一点? / p>

1 个答案:

答案 0 :(得分:1)

在每个主题上使用两个使用者组几乎是唯一的方法,并且有两个听众。

但是,您不需要自定义频道拦截器;您可以使用condition之类的"headers['foo'].equals('urgent')"属性。