操作场景
本文主要介绍使用双写双消费方案,将自建 RabbitMQ 集群的服务切换到 腾讯云消息队列 RabbitMQ 中的方法。
方案:双写双消费模式
前提条件
1. 已购买云上 RabbitMQ 实例
2. 已将自建 RabbitMQ 集群元数据迁移到腾讯云 RabbitMQ。
操作步骤
1. 切换消费者集群中部分节点的接入信息,将这部分消费者接入到新版 RabbitMQ 集群。切换的这部分消费者将消费新版 RabbitMQ 集群中的消息,剩余消费者继续消费原 RabbitMQ 集群中的消息。
2. 切换生产者集群中部分节点的接入信息,将这部分生产者接入到新版 RabbitMQ。切换的这部分生产者将发送消息到新版 RabbitMQ 集群中;剩余的生产者还是将消息发送到旧版 RabbitMQ 集群中。为了防止消息的重复或丢失,可以事先做好消息消费的幂等逻辑。
3. 将剩余的生产者全部接入到新的 RabbitMQ 集群上。此时所有消息将全部被发送到新版 RabbitMQ 集群中。
Tips 1:可以在自建集群的 RabbitMQ 社区管控台,确认自建集群的生产流量已经停止。
Tips 2:在自建集群的 RabbitMQ 社区管控台上,可以确认自建 RabbitMQ 集群的堆积消息在下降。
4. 检查原 RabbitMQ 集群是否有堆积的消息没有消费,确认原 RabbitMQ 集群没有堆积或者未处理的消息后,将剩余的消费者全部接入到新版 RabbitMQ 集群上。完成整个数据流的迁移操作。
Tips:确认云上 RabbitMQ 集群的消息写入和消费,并确保消息无堆积。
注意:
如您没有按照上述顺序进行切换,如先切换生产者再切换消费者,可能导致消息丢失的情况。
切换剩余消费者之前,请确保原 RabbitMQ 集群中的消息已全部消费完,否则可能会导致消费遗漏。
可能存在的问题
顺序问题
由于集群切换,切换过程中,消息顺序问题无法保证;切换的过程中会导致局部乱序。
消息重复
理论上不会重复,极端情况下会发生,例如切换过程中,消费者消费了消息,但是还未给服务端(原 RabbitMQ 集群)ACK,这时会导致该消息进入重试队列导致重复消费。对消息做幂等处理逻辑可以规避这个问题。
消费延迟
读切换过程中,由于分区重新分配,需要进行队列和消费者客户端间的 rebalance,可能导致短暂的消费延迟现象。遇到该情况无需额外操作,切换完成后即可恢复。