可以参考RocketMQ或者Kafka的高可用设计。
比如RocketMQ的,可以分为消费端的高可用和生产端的高可用:
-
消费端的高可用:**Master Broker支持读和写,Slave Broker只支持读。**当Master不可用的时候,Consumer会自动切换到Slave进行读,也就是说,当Master节点的机器出现故障后,Consumer仍然可以从Slave节点读取消息,不影响消费端的消费程序。
-
生产端的高可用:如果一个Master宕机了,要让生产端程序继续可以生产消息,为此需要部署多个Master节点,组成多个broker组。在创建Topic的时候,把Topic的不同消息队列分布在多个broker组中,即使某一个broker组的Master节点不可用了,其他组的Master节点仍然可用,保证了Producer可以继续发送消息。
另外高可用过程中,会涉及到很多问题,也是值得进一步思考的:
- 发生故障转移之后,如何保证消息消费不丢失或者消息消费不重复?
- 故障转移过程中,消息会丢失吗?
- 生产者宕机了,发生消费Rebalance,如何保证消息消费不丢失或者不重复?