我通过rabbitmq发邮件:我从主应用程序发送一个邮件列表,消费者读取并发送它。一个广播可能包含不同的消息,这些消息必须以正确的顺序发送。
实际上,邮件列表是一个消息列表:[message_1, message_2, message_3, message_4]
某些消息可以发送,但在某些时候第三方服务会停止接受请求。
我来描述一下消费者的过程:
1.我从包含分发的队列中取出消息。
1.发送:1部分〉2部分
1.发生错误,仍需发送3部分〉4部分。
1.从队列中确认原始消息。
1.在同一队列的开头放置一个新队列:[message 3, message 4]
.
- 问题1**:将从旧消息的一部分创建的新消息(来自使用者)发送到同一队列是否合适?
- 问题2**:这是个好办法吗?还有其他办法吗?
1条答案
按热度按时间ovfsdjhp1#
如果处理程序进程在第4步和第5步之间崩溃,那么您发布的序列将丢失一条消息,因此您必须切换第4步和第5步的顺序,但是一旦您这样做,您就必须处理消息的重复。(就像一个bug)对于很大比例的消息,ack失败,你可能最终会在队列中重复多次相同的广播。因此,如果你想避免重复的消息,你必须使用一些外部持久性来执行重复数据删除。而且,RabbitMQ不保证消息以相同的顺序传递。因此,你可能会遇到同一地址的两条消息传递顺序不一致的情况。因此,重复数据删除应该在单个部分的级别上进行,而不是整个消息。
问题2:这是一个好的解决方案吗?还有其他的解决方案吗?
考虑使用像temporal.io这样的协调器,它可以消除我描述的大部分一致性问题。