RabbitMQ概述

生活中的案例

  • 学生问问题
  • 分布式项目中通过 RPC 框架调用处理时间过长的问题

为什么要使用MQ

  • 微服务架构后,链式调用是我们在写程序的时候都是基本的写法
  • 为了这完成这一个整体功能会把它拆分成多个函数(或子模块)
  • 比如模块 A 调用模块 B,模块 B 调用模块 C,模块 C 调用模块 D
  • 但是大型分布式应用中,系统间的 RPC 交互复杂,一个功能后面要调用上百个接口并非不可能
  • 单体 架构过渡到 分布式 微服务 架构中,这样的架构中会出现什么问题呢
  • 当然是有的, 根据上面的几个问题,在设计系统时,就可以明确的要达到以下的几个目标
    • 能够解耦
    • 能够削峰
    • 能够异步
  1. 要做到系统 解耦,当新的模块进来时,可以做到代码改动最小
  2. 设置流程的缓冲池,可以让后端系统按自身吞吐能力进行消费,不被冲垮
  3. 强弱的依赖梳理,能把非关键的调用链路的操作,异步化,并提升整体系统的吞吐能力

什么是MQ

  • 面向 消息 的中间件(message-oriented middleware0)
  • MOM 能够很好的解决以上的问题
  • MQ 是指利用高效可靠的消息传递机制进行与平台无关的数据交流
  • 并基于 数据通信 来进行分布式系统的集成
  • 通过提供消息传递和消息排队模型在分布式环境下提供应用解耦,弹性伸缩,冗余存储,流量削峰,异步通信,数据同步等

大致流程

  • 发送者把 消息 发送到消息服务器,消息服务器把消息存放在若干个队列或主题中,在合适的时候,消息服
    务器会把消息转发给接受者,也就是消费者
  • 在这个过程中,发送和接受是 异步 的,也就是发送无需等待,和发送者和接受者的生命周期也没有任何关系
  • 在发布 pub / 订阅 sub模式下,也可以完成 一对多 的通信,可以让一个消息有多个接受者
  • 微信订阅号就是这样的

MQ的特点

异步处理模式

  • 消息发送者可以发送一个消息不需要等待响应
  • 消息发送者把消息发送到一条虚拟的通道(主题或队列)上
  • 消息接收者则订阅或监听该通道
  • 一条信息可能最终转发给一个或多个消息接收者,这些接收者都无需对消息发送者做出回应
  • 整个过程都是异步的
  • 举个例子:
  • 也就是说,一个系统和另一个系统之间进行通信的时候,假如系统 A 希望发送一个消息给系统B,让它去处理,但是系统 A 不关注系统 B 到底怎么处理或者有没有处理好,所以系统 A 把消息发送给 MQ,然后就不管这条消息的 死活 了,接着系统 B 从 MQ 里面消费这条消息处理即可
  • 至于怎么处理,是否处理完毕,什么时候处理,都是系统 B 的事,与系统 A 无关

  • 这样的一种通信方式,就是所谓的 异步 通信方式,对于系统 A 来说,只要把消息发给 MQ
  • 然后系统 B 就会异步的去进行处理了,系统 A不能 同步 的等待系统 B 处理完
  • 这样的好处是什么呢,当然是 解耦

应用系统的解耦

  • 发送者和接收者不必了解对方,只需要 确认消息
  • 发送者和接收者,可以不在同一时间在线

现实中的业务

Rabbit概述及注意点

  • RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)
  • RabbitMQ 服务器是用 Erlang 语言编写的,而集群和故障转移是构建在开放 电信 平台框架上的
  • 所有主要的编程语言均有与代理接口通讯的客户端库

归纳一下

  • RabbitMQ 实现了 AMQP 协议来构建自己的消息队列
  • RabbitMQ 是 Erlang 语言写的,但是我们操作 RabbitMQ 的驱动是 Java 编写的

ActiveMQ和RabbitMQ的区别

  • ActiveMQ 他实现的是 JMS 协议(Java 消息协议)
  • RabbitMQ 实现的是 AMQP 协议(高级消息队列协议)
  • ActiveMQ:是 Java 写的
  • RabbitMQ:是 Erlang 写的,吞吐更多,延时更低!
  • 当然:区别还有很多,你一学就知道了我就不在多说了,后面有时间我会更新好的

RabbitMQ的特点

  • RabbitMQ 最初起源于 金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗
  • 具体特点如下:

可靠性

  • 可靠性(Reliability)
  • RabbitMQ 使用一些机制来保证消息的可靠性,如持久化、传输确认、发布确认

灵活的路由

  • 灵活的路由(Flexible Routing)
  • 在消息进入队列之前,通过 Exchange 来路由消息的
  • 对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现
  • 针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也能通过插件机制实现自己的 Exchange

消息集群

  • 消息集群(Clustering)
  • 多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker

高可用

  • 高可用(Highly Available Queues)
  • 队列可以在集群中的任意一台机器上进行存储,使得在部分节点出问题的情况下队列仍然可用

多种协议

  • 多种协议(Multi-protocol)
  • RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等

多语言客户端

  • 多语言客户端(Many Clients)
  • RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等

管理界面

  • 管理界面(Management UI)
  • RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面

跟踪机制

  • 跟踪机制(Tracing)
  • 如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么

插件机制

  • 插件机制(Plugin System)
  • RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件
posted @ 2020-10-07 08:19  BNTang  阅读(214)  评论(0编辑  收藏  举报