Java rabbitmq,具有基于属性的自定义排序
我们使用confirms为基本rabbit mq队列进行了研发。我们现在想更进一步,使用路由密钥之类的东西,通过用户名分割频道。() 然而,我们需要使用每个用户的自定义排序,我们从上游获得的json有一个名为Java rabbitmq,具有基于属性的自定义排序,java,rabbitmq,Java,Rabbitmq,我们使用confirms为基本rabbit mq队列进行了研发。我们现在想更进一步,使用路由密钥之类的东西,通过用户名分割频道。() 然而,我们需要使用每个用户的自定义排序,我们从上游获得的json有一个名为sequence的参数。将数据推送到rabbitmq的服务可能会从上游获取序列号为2的第一个json,然后获取1。是否有一种方法可以将带有seuqencenumber2的json推送到队列中,但只有在队列收到带有1的json并将其传递后,才能将其传递 基本上,我们想知道的是,是否有一种方法可
sequence
的参数。将数据推送到rabbitmq的服务可能会从上游获取序列号为2
的第一个json,然后获取1
。是否有一种方法可以将带有seuqence
number2
的json推送到队列中,但只有在队列收到带有1
的json并将其传递后,才能将其传递
基本上,我们想知道的是,是否有一种方法可以使用rabbitmq上的自定义排序来基于此序列
参数进行消息传递,而无需使用单独的服务来维护此顺序
基本上,我们想知道的是,是否有一种方法可以基于此序列参数在rabbitmq上使用自定义排序进行消息传递,而无需使用单独的服务来维护此顺序
不,见:
从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
}
}
显然,这意味着您需要额外的网络/处理负载-消息可能会多次传递和丢弃。有点离题,但您知道是否有其他队列产品支持此功能,另外,您是否建议在服务中使用username参数来中断队列,以减少队列交换的数量