RabbitMQ简单学习

1.RabbitMQ主要有些什么作用?
RabbitMQ主要用在项目中,一些不需要即时的返回和耗时的操作提取出来,看的出来这里用到了异步,这里大大的减少了服务器的并发量,也增加了系统的吞吐量。
使用消息队列能够使关键组件顶住增长的访问压力,而不是因为超出负荷的请求而完全崩溃。

2.RabbitMQ到底是什么?
RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。

3.生产者,消费者,队列?
生产者就是生产消息的,将消息投递到队列中去,消费者就是从队列获取消息的,队列是用来存储消息体的对象。多个消费者可以订阅同一个队列。

4.Exchange,Bingding?
交换器,实际上生产者不能把消息直接传递给队列,而是先发送到交换器,然后再通过Bingding发送到对应的队列中去。

5.Exchange Type、Bingding key、routing key?
第一个是生产者根据交换机的类型,发送消息的方式。
第二个是交换机和队列绑定的方式。一个交换机要绑定多个队列,那么这个Bingding key可以相同。
第三个是生产者发送到交换机时,可以根据routing key 来确定消息流向。

RabbitMQ常用的Exchange Type有三种:fanout、direct、topic。
fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中。

  direct:把消息投递到那些binding key与routing key完全匹配的队列中。

  topic:将消息路由到binding key与routing key模式匹配的队列中。

最后来具体解析一下几个问题:

1、可以自动创建队列,也可以手动创建队列,如果自动创建队列,那么是谁负责创建队列呢?是生产者?还是消费者?

  如果队列不存在,当然消费者不会收到任何的消息。但是如果队列不存在,那么生产者发送的消息就会丢失。所以,为了数据不丢失,消费者和生产者都可以创建队列。那么如果创建一个已经存在的队列呢?那么不会有任何的影响。需要注意的是没有任何的影响,也就是说第二次创建如果参数和第一次不一样,那么该操作虽然成功,但是队列属性并不会改变。

  队列对于负载均衡的处理是完美的。对于多个消费者来说,RabbitMQ使用轮询的方式均衡的发送给不同的消费者。

2、RabbitMQ的消息确认机制

  默认情况下,如果消息已经被某个消费者正确的接收到了,那么该消息就会被从队列中移除。当然也可以让同一个消息发送到很多的消费者。

  如果一个队列没有消费者,那么,如果这个队列有数据到达,那么这个数据会被缓存,不会被丢弃。当有消费者时,这个数据会被立即发送到这个消费者,这个数据被消费者正确收到时,这个数据就被从队列中删除。

 那么什么是正确收到呢?通过ack。每个消息都要被acknowledged(确认,ack)。我们可以显示的在程序中去ack,也可以自动的ack。如果有数据没有被ack,那么:

 RabbitMQ Server会把这个信息发送到下一个消费者。

 如果这个app有bug,忘记了ack,那么RabbitMQServer不会再发送数据给它,因为Server认为这个消费者处理能力有限。

而且ack的机制可以起到限流的作用(Benefitto throttling):在消费者处理完成数据后发送ack,甚至在额外的延时后发送ack,将有效的均衡消费者的负载。

你可能感兴趣的:(RabbitMQ简单学习)