RabbitMQ Q&A

1.为什么要有connection和channel?

ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。ConnectionFactory为Connection的制造工厂。Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。

Connection就是建立一个TCP连接,生产者和消费者的都是通过TCP连接到RabbitMQ Server中。Channel虚拟连接,建立在TCP连接的基础上,数据流动都是通过Channel来进行的。如果建立在TCP的基础上进行数据流动,建立和关闭TCP连接有代价。频繁的建立关闭TCP连接对于系统的性能有很大的影响,而且TCP的连接数也有限制,这也限制了系统处理高并发的能力。但是,在TCP连接中建立Channel是没有上述代价的。

 

2.重复声明交换器和队列的影响?

生产者和消费者都可以声明一个交换器或队列。如果尝试声明一个已经存在的交换器或者队列,只要声明的参数完全匹配现存的交换器或者队列,RabbitMQ就可以什么都不做,并成功返回。如果声明的参数不匹配则会抛出异常。

 

3.何时创建(声明)队列?

按照RabbitMQ官方建议,生产者和消费者都应该尝试创建(这里指声明操作)队列。这是一个很好的建议,但不适用于所有情况。如果业务本身在架构设计之处已经充分地预估了队列的使用情况,完全可以在业务程序上线之前在服务器上创建好(比如通过页面管理、RabbitMQ命令或者更好的是从配置中心下发),这样业务程序也可以免去声明的过程,直接使用即可。

如果集群资源充足,而即将使用的队列所占用的资源又在可控的范围之内,为了增加业务程序的灵活性,也完全可以在业务程序中声明队列。

 

4.RabbitMQ如何处理消费者长时间未确认的消息?

RabbitMQ不会为未确认的消息设置过期时间,它判断此消息是否需要重新投递给消费者的唯一依据是消费该消息的消费者连接是否已经断开,这么设计的原因是RabbitMQ允许消费者消费一条消息的时间可以很久很久。

 

5.Messages中的ready和unacked具体指什么?

对于RabbitMQ服务端而言,队列中的消息分成了两个部分:一部分是等待投递给消费者的消息(ready状态),一部分是已经投递给消费者,但是还没有收到消费者确认信号的消息(Unacked状态)

你可能感兴趣的:(MessageSystem,rabbitmq)