【问题标题】:rabbitmq with custom ordering based on an attribute具有基于属性的自定义排序的rabbitmq
【发布时间】:2017-10-14 06:32:42
【问题描述】:

我们对带有确认的基本 rabbit mq 队列进行了研发。我们现在想更进一步,使用路由键之类的用户名拆分频道。 (https://www.cloudamqp.com/blog/2015-09-03-part4-rabbitmq-for-beginners-exchanges-routing-keys-bindings.html)。

但是,我们需要为每个用户使用自定义排序,我们从上游获取的 json 有一个名为 sequence 的参数。将数据推送到rabbitmq 的服务可能会从上游获取第一个json,序列号为2,然后获取1。有没有办法将带有 seuqence 编号 2 的 json 推送到队列中,但只有在队列收到带有 1 的 json 并交付后才交付它。

基本上我们想知道的是,是否有一种方法可以在rabbitmq 上使用自定义排序来基于此sequence 参数进行消息传递,而无需单独的服务来维护此顺序。

【问题讨论】:

    标签: java rabbitmq


    【解决方案1】:

    基本上我们想知道的是,是否有一种方法可以在 rabbitmq 上使用自定义排序来基于此序列参数进行消息传递,而无需单独的服务来维护此顺序。

    没有。见https://www.rabbitmq.com/semantics.html

    从 RabbitMQ 2.7.0 版开始,消息始终按发布顺序保存在队列中,即使存在重新排队或通道关闭。

    因此,您的用例似乎不容易支持。

    当然,如果您真的想要重新排队(并且您不想将消息保留在您的消费者身上),您可以为您的消费者实现类似下面的伪代码:

    expected_message_id = 0
    while (true) {
        m = receive_message(queue)
        if (m.id == expected_message_id) {
            process(m)
            m.acknowledge()
            expected_message_id++
        } else {
            republish_to_queue(m, queue) // might use old exchange, or pick a new-one for this type of back-channel
        }
    }
    

    显然,这意味着您需要额外的网络/处理负载 - 消息可能会被多次传递和丢弃。

    【讨论】:

    • 有点跑题了,但是您知道是否有其他队列产品可以支持此功能,您是否建议使用服务中的用户名参数打破队列以减少数量队列交换
    猜你喜欢
    • 2017-10-27
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多