我正在尝试设计一种重播机制,该机制将使用户能够重播队列中的消息。
对于包含多个队列和多个使用者的交换,我得出的最佳设计是:
问题:
1.这有意义吗?
2.我是在发明轮子吗?有兔子固有的解决方案吗?插入?
3.创建多个交易所是否被视为一种好习惯?
在此解决方案中,将创建每个队列的交换以发布相同的消息。
另一个解决方案:
1.为每个队列创建一个附加队列“ReplayQueue”。设置一个TTL(假设一个月)。
2.每次用户请求重播时,请他从其自己的ReplayQueue中重播,而不进行确认。
该解决方案有点问题,因为。
最佳答案
是
您不是要重新发明轮子。 AFAIK没有兔子解决方案,也没有开箱即用的解决方案。
我认为您的第一个解决方案是好的。 Another solution
非常有问题,因为一只健康的兔子是空的,兔子不是数据存储库。
您将有一个队列(STORE
),所有已发布的消息都应路由到该队列。您可以考虑使用主题交换,而不是将STORE
与所有绑定(bind)键绑定(bind)。以此价格,绑定(bind)密钥不得包含. # *
和路由消息时的少量开销。 STORE
队列将与绑定(bind)键#
绑定(bind)。
您可以看看firehose。
为什么要进行网络请求?您可以将Rabbit与RPC call一起使用:
reply-to
队列名称。队列可以是客户端和请求所独有的。 您也可以看看direct-reply-to模式。
是的,只要您需要它。对于您的特定情况,我认为没有必要按用户交换。该请求已包含队列名称。您可以简单地使用默认交换
amq.direct
将其发布到此队列,并且路由密钥等于队列名称。如果要进行交换,我将创建一个唯一的交换(例如“重播”),并让每个订阅者将其重播队列绑定(bind)到此交换。 “重播”交换可以是约定,也可以与请求一起发送。