1. Rabbitmq中的一个queue可以被多少个消费者进行消费?
在Rabbitmq中,一个队列(queue)可以被多个消费者共享,这种模式被称为“多消费者模式”或“竞争消费者模式”。在这种模式下,多个消费者同时订阅同一个队列,并且每个消息只能被其中一个消费者消费。这样可以实现消息的负载均衡。
2. 如果消费端没有启用消息确认机制的话,消费者故障,重启之后还是会重新开始消费
因为RabbitMQ并不会记录队列的消费记录,所以如果消费者没有启用ACK的话,还是会有重复消费的问题,解决办法:启用ACK消息确认机制,或者在消费端实现消息的幂等逻辑。 或者两个都要进行使用(避免在消息重试机制下,重复发送相同的消息,导致业务失败问题)。
3.Rabbitmq 如何保证高可用?
- 消息持久化(保证数据不丢失): 通过设置消息的
deliveryMode来实现消息的持久性,将消息设置为持久性可以确保消息在RabbitMQ服务器重新启动时不会丢失。在发布消息时,可以设置deliveryMode为2(PERSISTENT)
channel.basicPublish(exchangeName, routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
- 镜像队列(保证一个服务挂掉之后还可以由镜像节点来提供服务): RabbitMQ提供了队列的镜像机制,使得队列中的消息可以在多个节点之间复制,提供高可用性。这可以在通过生命队列时设置
x-ha-policy属性为all来实现:
Map<String, Object> queueArgs = new HashMap<>();
queueArgs.put("x-ha-policy", "all");
channel.queueDeclare(queueName, true, false, false, queueArgs);
这样,队列将在所有节点之间复制,确保即使某个节点宕机,其他节点上的队列仍然可用。
请注意,镜像队列可能会对性能产生一些影响,因为消息需要在节点之间进行复制。因此,在使用镜像队列时,需要根据具体的业务需求和性能要求进行权衡。