记录一下rabbitmq的学习

版权声明:本文为博主原创文章,转载请注明作者和出处。 https://blog.csdn.net/xinqing5130/article/details/79283829

  架构的演变:单一应用架构——>垂直应用架构——>分布式服务架构——>面向服务架构。

  消息队列分布式是架构中的至关重要的一部分。

  AMQP,高级消息队列协议。因为rabbitmq就是这个协议的一个实现。当然这个协议的实现有很多,但我们这里只说说rabbitmq。

  消息队列的作用:

  异步处理 

 应用解耦

 流量削峰,提供系统的处理能力。 

消息队列图解


几个重要的概念
  producer:消息的生产者,应用客户端程序;
  consumer:消息的消费者,应用客户端程序;
  exchange:交换器,消息首先进去exchange,由exchange来确认消息要被投递到哪个queue中;
  queue:消息队列,实际上就是消息容器,用于存储消息,类似于一个邮箱;
  bidding:根据路由规则,将exchange和queue绑定;
  routing_key:exchange根据这个路由键来投递消息到queue;
  channel:一个tcp链接可以有多个channel;

  exchange的四种类型:

   1、direct:需要指定一个routing_key,即要发到的queue的名字,可使用默认exchange(空name的exchange)。

    

    2、fanout:不需routing_key,只要指定bidding。

    

   3、topic:消息会发送到所有关心routing_key的话题queue上,需要routing_key,也需要bidding。

       bidding中可使用两个特殊字符:“#”和“*”:“#”表示0个或若干个关键字,“*”表示一个关键字。

       如“log.*”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。

    

    4、header:不常用

消息确认

消息删除之前必须要收到消费者的回执,否则消息永远保留着,并且如果存在多个消费者,那么消息将会继续发给其他的消费者,

直到有了回执(message acknowledgement)。

这样做可以防止消息被消费者拿到后,没来得及处理,但是消费者客户端挂了。这样消息从队列中删除,但是并未被处理。

这里有一点需要注意,如果开发人员没有设置回执,那么会导致严重的bug,即消息会严重积压,并且消费者重启后会重复收到

消息。

消息持久化

exchange持久化

queue持久化

message持久化

上面已经了解了消息确认的重要性,但是还有一种情况。如果消息在被消费者拿走之前,也就是存到消息队列时,rabbitmq

挂了,消息也没有被消费处理,但是也没有了,怎么办?这就用到了消息持久化。当mq重启后,还可以看到消息。

 

       

猜你喜欢

转载自blog.csdn.net/xinqing5130/article/details/79283829
今日推荐