个人博客地址:
http://xiaohe-blog.top/

1. MQ基本概念

1.1 MQ简述

MQ 全称 :Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。

分布式系统完成通信有两种方式:

  • 直接通信 :A直接远程调用B。
  • 间接通信 :A先将信息发给C,C再发给B。

发送消息的的称为生产者,接收信息的称为消费者

1.2 MQ的优势

  1. 应用解耦

    我们一直追求的编码方式就是 高内聚,低耦合,并且在这上面花了很大心思,高内聚,低耦合也是我们评价一个技术/框架是否优秀的重要方式,MQ在就这方面做的非常好。

    使用直接远程调用的方式,A调用B、C、D完成业务,如果我们想要将B业务删除,那么就要疯狂改A业务中的代码,十分麻烦。

    而如果使用MQ消息队列,想将B删除,只需要关闭MQ与B的消息通道;以后如果想将B恢复使用,还可以恢复消息队列通向B的消息通道。

    image-20221109193846156
  2. 异步提速

    一个客户端请求发送进来,系统A会调用系统B、C、D三个系统,同步请求的话,响应时间就是系统A、B、C、D的总和。如果使用MQ,系统A发送数据到MQ,然后就可以返回响应给客户端,不需要再等待系统B、C、D的响应,可以大大地提高性能。对于一些非必要的业务,比如发送短信,发送邮件等等,就可以采用MQ。

  3. 削峰填谷

    假设系统A在某一段时间请求数暴增,有5000个请求发送过来,系统A这时就会发送5000条SQL进入MySQL进行执行,MySQL对于如此庞大的请求当然处理不过来,MySQL就会崩溃,导致系统瘫痪。

    如果使用MQ,系统A不再是直接发送SQL到数据库,而是把数据发送到MQ,MQ短时间积压数据是可以接受的,然后由消费者每次拉取2000条进行处理,防止在请求峰值时期大量的请求直接发送到MySQL导致系统崩溃

1.3 MQ的劣势

  1. 系统可用性降低

    在远程直接调用中,我们只需要保证已有业务不出错就行了。

    使用了MQ,我们还要维护MQ,而维护的越多,bug出现的机率越高。

  2. 系统复杂度提高

    这个是肯定的,远程直接调用虽然不好看,但是好写。而且我们要保证信息没有被MQ重复发送、重复接收、信息丢失问题等等…

  3. 一致性问题

    A调用B、C、D业务功能,如果B、C成功了,但是D失败了,该如何处理数据的一致性问题?

2. RabbitMQ基本概念

2.1 RabbitMQ特点

(从网上搜的)

RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件。首先要知道一些RabbitMQ的特点,官网可查:

  • 可靠性 :支持持久化,传输确认,发布确认等保证了MQ的可靠性。
  • 灵活的分发消息策略 :这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
  • 支持集群 :多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
  • 多种协议 :RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
  • 支持多种语言客户端 :RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
  • 可视化管理界面 :RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
  • 插件机制 :RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。

2.2 AMQP协议

AMQPAdvanced Message Queuing Protocol(高级消息队列协议),一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受开发语言、不同产品等条件的限制。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐