1.RabbitMQ是什么
RabbitMQ是一个广泛使用的消息服务器,采用Erlang语言编写,是一种开源的实现AMQP(高级消息队列协议)的消息中间件
;RabbitMQ最初起源于金融系统,它的性能及稳定性都非常出色。
AMQP协议(http://www.amqp.org),即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
简单来说,消息中间件就是指保存数据的一个容器(服务器),可以用于两个系统之间的数据传递。
消息中间件一般有三个主要角色:生产者、消费者、消息代理(消息队列、消息服务器);
生产者发送消息到消息服务器,然后消费者从消息代理(消息队列)中获取数据并进行处理。
2.还有哪些消息队列
- RabbitMQ:稳定可靠,数据一致,支持多协议,有消息确认,基于erlang语言
- Kafka:高吞吐,高性能,快速持久化,无消息确认,无消息遗漏,可能会有重复消息,依赖于zookeeper,成本高
- ActiveMQ:不够灵活轻巧,对队列较多的情况支持不好
- RocketMQ:性能好,高吞吐,高可用性,支持大规模分布式,语言支持单一
为什么使用RabbitMQ?
RabbitMQ稳定可靠,在系统并发量不大的情况下,可以使用RabbitMQ。
3.MQ的使用场景
3.1 解耦
场景说明:用户下单后,订单系统要通知库存系统
传统方式:订单系统直接调用库存系统提供的接口,如果库存系统出现故障会导致订单系统失败
使用消息队列:
3.2 异步
场景说明:用户注册成功之后,需要发送注册邮件及注册短信提醒
传统方式:
使用消息队列:
3.3 消息通信
场景说明:应用系统之间的通信,例如聊天室
聊天室
3.4 流量削峰
场景说明:高负载请求/任务的缓冲处理,例如秒杀业务
3.5 日志处理
场景说明:系统中大量的日志处理
ELK日志处理解决方案(E:elastic search L:logstash K:kibana):
loger.error(…) –> logstash收集消息 –> 发送消息到kafka –> elastic search –> kibana elk日志处服务器托管网理平台
4.RabbitMQ工作模型
broker相当于mysql服务器,virtural host相当于数据库(可以有多个数据库),queue相当于表,消息相当于记录。
消息队列有三个核心要素:消息生产者、消息队列、消息消费者
生产者(producer):发送消息的应用;(java程序,也可能是别的语言写的程序)
消费者(Consumer):接收消息的应用;(Java程序,也可能是别的语言写的程序)
代理(Broker):就是消息服务器,RabbitMQ Server就是Message Broker;
连接(Connection):连接RabbitMQ服务器的TCP长连接;
信道(Channel):连接中的一个虚拟通道,消息队列发送或者接收消息时,都是通过信道进行的;
虚拟主机(Virtual host):一个虚拟分组,在代码中就是一个字符串,当多个不同的用户使用同一个RabbitMQ服务时,可以划分出多个Virtual Host,每个用户在自己的Virtual Host创建exchange/queue等;(分类比较清晰、相互隔离)
交换机(Exchange):交换机负责从生产者接收消息,并根据交换机类型分发到对应的消息队列中,起到一个路由作用;
路由键(Routing Key):交换机根据路由键来决定消息分发到哪个队列,路由键是消息的目的地址;
绑定(Binding):绑定是队列和交换机的一个关联连接(关联联系);
队列(Queue):存储消息的缓存;
消息(Message):由生产者通过RabbitMQ发送给消费者的信息;(消息可以任何数据、字符串、user对象、json串等等)。
5.RabbitMQ工作方式
5.1简单模式
一个队列只有一个消费者
生产者将消息发送到队列,消费者从队列取出数据 |
5.2工作模式
多个消费者监听同一个队列
多个消费者监听同一个队列,但多个消费者中只有一个消费者会成功消费消息 |
5.3 订阅模式
一个交换机绑定多个消息队列,每个消息队列有一个消费者监听
消费者服务器托管网发送的消息可以被每一个消费者接收 |
5.4路由模式
一个交换机绑定多个消息队列,每个消息队列都有自己唯一的key,每个消息队列有一个消费者监听
路由模式 |
5.5通配符模式
一个交换机绑定多个消息队列,每个消息队列都有通配符方式的key。
通配符模式 |
6.RabbitMQ交换机类型
6.1 Fanout Exchange
投递到所有绑定的队列,不需要路由键,不需要进行路由键的匹配,相当于广播、群发;
6.2 Direct Exchange
根据路由键精确匹配,进行路由消息队列。
6.3 Topic Exchange
通配符匹配,相当于模糊匹配;
#匹配多个单词,用来表示任意数量(零个或多个)单词;
*匹配一个单词(必须有一个,而且只有一个),用.隔开的为一个单词;
beijing.# == beijing.queue.abc, beijing.queue.xyz.xxx
beijing.* == beijing.queue, beijing.xyz
发送时指定的路由键:lazy.orange.rabbit,所有队列都收到了,但是Q2不会收到两条消息。
6.4 Headers Exchange
基于消息内容中的headers属性进行匹配。
声明:以上内容参考了多个mq教程,会和其他资料有雷同之处。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net