当我的系统数据发生变化时,我将每一个更改发布到至少4个不同的消费者(每秒约3000条消息),所以我想使用消息代理。
大多数消费者负责通过更改来更新他们的数据库表。
(DB是不同的 - 沙发,mysql等,因此无法使用自己的复制机制或使用db触发器等解决方案) 问题
是否有人使用消息代理在DB之间进行数据复制? 这是一个好习惯吗?
如果发生故障,我该怎么办? 假设使用RabbitMQ,客户端在处理它们之前每次从队列中删除10,000条消息,确认并抛出异常。现在他们迷路了。有没有办法回到队列中?
(重新排队会使他们的订单混乱)。
使用rabbitMQ是一个好习惯吗?是不是像Kafka一样重新回到队列中的能力对于失败场景很重要?
感谢。
答案 0 :(得分:0)
我没有使用消息代理进行数据库复制的经验,但这可能有助于您走上正确的轨道:
2。如果发生故障,我该怎么办?
假设使用RabbitMQ,客户端从中移除了10,000条消息 每次处理之前,每次都会排队,确认并抛出异常。 现在他们迷路了。有没有办法回到队列中?
您可以使用dead lettering来避免丢失邮件。在您确定消费者已成功处理它们之前,我建议不要确认,除非这是一项长期运行的任务。如果失败,basic.reject
而不是basic.ack
将它们发送到死信队列。你有一个中等吞吐量,所以要小心。
但是,订单无法保证。您需要实现一个手动机制来按照它们发布的顺序恢复它们,可能是通过使用带有某种时间戳或id机制的消息头来按正确的顺序重新处理它们。