1.是什么?
它是开源的消息队列系统,实现了高级的消息队列协议(AMQP),它是用Erlang编写的,设计主要目标是处理分布式系统庞大数据流,可以实现不同系统直接调用,跨不同系统不同语言。是一款非常好异步处理组件。
2.基本原理介绍
它的核心思想就是生产者将消息发送到MQ服务器(Broker),消费者从Broker中订阅发布消息。下面就是它的原理图:
上图中,Producer将消息推送到Exchange中,Exchange根据RoutingKey将消息路由到一个或者多个Queue中, Customer从Queue消费消息,其中Exchange和Queue可以使用Binding Key绑定,在实际使用中,Exchange可以有多个策略模式,包括FanOut(广播模式)、Direct(路由模式\直连模式)、Topic(通配符模式)等模式。
1)消息确认机制
生产者消息确认:生产者将消息发送到Broker后,Broker会返回给生产者一个确认(ACK)信号,如果没有收到确认信号,说明消息发送失败,此时可以根据需要重发等操作。
消费者消息确认:消费者消费一条消息后,向Broker发送一个消费确认(ACK)信号,告诉Broker消费成功,可以从Queue中移除消息,如果没有收到消息确认(ACK)信号,Broker认为消息没有被消费,Broker会将其消息发送给其他消费者消费。通常用basic.ack或者basic.nack方法来实现消费者消费消息,消费成功丢弃消息,反之将消息重新放回队列当中。
消息确认机制虽然可以提供消息的可靠性,同时就会增加系统复杂度和开销。
2)消息持久化机制
消息持久化之后,即使Broker宕机,消息也不会丢失。持久化一般分为两种:一是Producer发送的消息的持久化,channel.basicPublic,设MessageProperties.PERSISTENT_TEXT_PLAIN
为2;二是持久化Queue,channel.queueDeclare设置durable=true。
消息持久机制虽然可以提供消息的可靠性,同时就会增加系统复杂度和开销,具体可以根据使用场景来确认是否持久化。
3)事务
为了确保数据一致性,保证所有操作原子性。如果事务提交成功,消息会发送到Broker,如果事务提交失败,消息不会发送到Broker。避免消息发送不确定性。提供方法有三个,打开事务channel.txSelect、channel.txCommit,channel.txRollback。
3.如何保证了高可用和性能
1)集群部署:将多个节点组成一个逻辑集群,各个节点之间进行数据同步和负载均衡,实现高可用和可扩展性。
2)消息持久化
3)消息确认机制
4)消息预取:RabbitMQ提供了消息预取机制,可以让消费者一次性获取多个消息进行消费,避免频繁地从队列中获取消息,提高性能