【问题标题】:Spring cloud stream with RabbitMQ使用 RabbitMQ 的 Spring 云流
【发布时间】:2018-10-10 19:08:03
【问题描述】:

目前,在我的项目中,我正在使用带有rabbitmq的spring cloud stream。一切都很好,但问题是在 StreamListener 中我为消息类型设置了条件。如果 RabbitMQ 不匹配类型(找不到与 id: ZZZZZZ 消息匹配的@StreamListener),则此消息从队列中消失。如果消息类型错误,我不想删除此消息。这个问题有解决方案吗?

【问题讨论】:

    标签: spring rabbitmq spring-cloud-stream


    【解决方案1】:

    有两种方法可以做到:

    • 如果消息类型错误,则引发异常。在这种情况下,消息不会从队列中移除,因为它没有被成功处理并且没有收到 ACK。
    • 在检测到类型错误后,自行将消息插入队列。

    这两种方法都可能遭受所谓的无限循环。消息被处理,它是错误的类型,它被重新插入,并且重复。为避免这种情况,您可以添加一些重新插入策略,例如:指数延迟或有限数量的重新插入等。

    但是出现了一些疑问:为什么您的服务会使用它不应该使用的消息?也许你需要一个特定的处理器这个消息?在这种情况下,您可以路由到合适的处理器。

    【讨论】:

    • 在交换机上发送所有不同类型的消息(类型在标头中)。我想如果我在 StreamListener 注释中设置条件,那么 spring 会为我这样做
    • 为什么需要这些bad 类型的消息?
    • 我想知道这个应用程序的设计。因为目前是一个交换和几个订阅的服务,每个服务只订阅一种类型的消息。我不确定,但交换可能仍然只有一个,但消息可以通过路由键拆分并委托给其他队列。
    • 是的,我考虑过使用路由键将这些消息路由到特定队列,例如可以是 deadLetter。
    • 我对此有意见。因为我们只有一个主题(RabbitMQ 中的交换),而我有几个订阅相同消息的不同应用程序实例。例如。消息(UserRegistred)在 Exchange 上发布,一个单独的应用程序订阅此消息并发送欢迎电子邮件,但第二个不同的应用程序订阅同一消息并发送信息,例如到统计服务。我该如何解决这个问题?因为目前如果一个服务读取消息第二个没有看到这个消息。
    猜你喜欢
    • 2021-08-07
    • 2019-05-11
    • 1970-01-01
    • 2016-11-12
    • 2017-01-31
    • 2021-08-21
    • 2017-06-01
    • 2019-01-16
    • 2020-11-29
    相关资源
    最近更新 更多