要了解RabbitMQ首先要知道什么是消息队列?为什么会产生消息队列?
- 首先,什么是消息队列呢?
消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。
其主要用途:不同进程Process/线程Thread之间通信。 - 为什么会产生消息队列?
不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个;
不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列;
MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里开源的RocketMQ。本文主要介绍RabbitMq
-
什么是RabbitMQ呢?
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库 -
应用场景
1.异步处理
2.系统解耦
3.高负载请求/任务的缓冲处理 -
RabbitMQ的整体设计
消息队列的三个核心要素:消息产生者,消息队列,消息消费者
RabbitMQ增加了交换器
交换器:RabbitMQ接收到消息之后交换器会把对应的消息转发到对应的队列上面
交换器类型:
Direct exchange:直连交换机,转发消息到routigKey指定的队列
Fanout exchange:广播交换机,转发消息到所有绑定队列(速度最快),不需要规则
Topic exchange:主题交换机,按规则转发消息(最灵活),*号匹配多个单词,#号匹配一个单词,用.号隔开的为一个单词
例如:
Headers exchange:首部交换机 (未接触),基于消息内容中的headers属性进行匹配 -
消息的流转过程