今日学习,RabbitMQ | 青训营笔记

93 阅读3分钟

今日学习,RabbitMQ,同步异步,交换机,通道,消息队列。

交换机:

  1. Fanout:广播,将消息交给所有绑定到交换机的队列
  2. Direct:定向,把消息交给符合指定routing key的队列
  3. Topic:通配符,把消息交给符合routing pattern(路由模式)的队列
  • 同步通讯:就像打电话,需要实时响应,而且通话期间,不能响应其他的电话,当有其他妹子给你打电话的时候,就容易错失良机。时效性强
  • 异步通讯:就像发邮件,QQ/微信聊天,不需要马上回复。可以同时给多个妹子发消息,支持多线操作,时间管理大师的必备技能。时效性弱

同步调用存在以下问题

  1. 耦合度高:每次加入新的请求,都需要修改原来的代码
  2. 性能下降:调用者需要等待服务提供者响应,如果调用链过长,则响应时间等于每次调用服务的时间之和
  3. 资源浪费:调用链中的每个服务在等待响应过程中,不能释放请求占用资源,高并发场景下会极度浪费系统资源
  4. 级联失败:如果服务提供者出现问题,那么调用方都会跟着出现问题,就像多米诺骨牌一样,迅速导致整个微服务故障

异步通讯的优点:

  • 耦合度低

  • 吞吐量提升

  • 故障隔离

  • 流量削峰

    缺点:

  • 依赖于Broker的可靠性、安全性、吞吐能力

  • 架构复杂时,业务没有明确的流程线,不好追踪管理


  • 追求可用性:Kafka、RockerMQ、RabbitMQ
  • 追求可靠性:RabbitMQ、RocketMQ
  • 追求吞吐能力:RocketMQ、Kafka
  • 追求消息低延迟:RabbitMQ、Kafka

集群部署


在RabbitMQ的官方文档中,讲述了两种集群的配置方式:

  • 普通模式:普通模式集群不进行数据同步,每个MQ都有自己的队列、数据信息(其它元数据信息如交换机等会同步)。例如我们有2个MQ:mq1,和mq2,如果你的消息在mq1,而你连接到了mq2,那么mq2会去mq1拉取消息,然后返回给你。如果mq1宕机,消息就会丢失。
  • 镜像模式:与普通模式不同,队列会在各个mq的镜像节点之间同步,因此你连接到任何一个镜像节点,均可获取到消息。而且如果一个节点宕机,并不会导致数据丢失。不过,这种方式增加了数据同步的带宽消耗。

消息队列

发送:

  1. 建立connection
  2. 创建channel
  3. 利用声明队列
  4. 向队列发送消息

使用SpringAMQP

Wrok Queue

  • Work Queue,也被称为(Task queues),任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的信息。
  • 适用:生产消息的速度会远远大于消息的消费速度