文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、为什么要用消息队列 ?
1. 高并发 业务、大量数据处理、复杂业务处理。常规的流程化处理不能满足业务的需求。
针对不需要立即处理消息,尤其那种非常耗时的操作,通过消息队列提供了异步处理机制
2.解耦
在应用和应用之间,提供了异构系统之间的消息通讯的机制,使用消息队列在突发事件下的防脉冲能力提供了一种保障,能够接管前台的大脉冲请求,然后异步慢速消费。
3.消峰
在访问量剧增的情况下,应用仍然需要继续发挥作用
4.扩展性
因为消息队列解耦了主流程的处理过程,只要另外增加处理过程即可,不需要改变代码、不需要调整参数,便于分布式扩容。
消息队列带来的问题
目前几种消息队列
特性 | RabbitMQ | ActiveMQ | RocketMQ | Kafka |
开发语言 | erlang | JAVA | JAVA | scala |
单机吞吐量 | 万级 | 万级 | 10万级 | 10万级 |
时效性 | us级 | ms级 | ms级 | ms级以内 |
可用性 | 高(主从架构) | 高(主从架构) | 非常高(分布式架构) | 非常高(分布式架构) |
功能特性 | 基于erlang开发,所以并发能力强,性能极其好,延时很低;管理界面较丰富 | 成熟的产品,在很多公司得到应用;有较多的文档;各种协议支持较好 | MQ功能比较完备.扩展性佳 | 只支持主要的MQ 功能.像一些消息查询,消息回溯等功能没有提供,毕竟是胃大数据准备的,在大数据领域应用广 |
由于 ActiveMQ 过于依赖 JMS 的规范而限制了它的发展,所以 RabbitMQ 在性能和吞吐量上明显会优于 ActiveMQ。由于上市时间较长,在可用性、稳定性、可靠性上 RabbitMq 会比 Kafka 技术成熟,而且 RabbitMq 使用 Erlang 开发,所以天生具备高并发高可用的特点。而 Kafka 属于分布式系统,它的性能、吞吐量、TPS 都会比 RabbitMq 要强。
二、RabbitMQ的实现原理及示例
生产者(Producer)、消费者(Consumer)、服务中心(Broker)之间的关系
在 RabbitMQ 使用时,系统会先安装并启动 Broker Server,也就是 RabbitMQ 的服务中心。无论是生产者 (Producer),消费者(Consumer)都会通过连接池(Connection)使用 TCP/IP 协议(默认)来与 BrokerServer 进行连接。然后 Producer 会把 Exchange / Queue 的绑定信息发送到 Broker Server,Broker Server 根据 Exchange 的类型逻辑选择对应 Queue ,最后把信息发送到与 Queue 关联的对应 Consumer 。
基础对象
Producer 建立连接后,并非直接将消息投递到队列 Queue 中,而是把消息发送到交换器 Exchange,由 Exchange 根据不同逻辑把消息发送到一个或多个对应的队列当中
目前 Exchange 提供了四种不同的常用类型:Fanout、Direct、Topic、Header。
Queue 队列
Queue 队列是消息的载体,每个消息都会被投入到 Queue 当中,它包含 name,durable,arguments 等多个属性,name 用于定义它的名称,当 durable(持久化)为 true 时,队列将会持久化保存到硬盘上。反之为 false 时,一旦 Broker Server 被重启,对应的队列就会消失,后面还会有例子作详细介绍。
Channel 通道
当 Broker Server 使用 Connection 连接 Producer / Cousumer 时会使用到信道(Channel),一个 Connection上可以建立多个 Channel,每个 Channel 都有一个会话任务,可以理解为逻辑上的连接。主要用作管理相关的参数定义,发送消息,获取消息,事务处理等。
Binding 绑定
Binding 主要用于绑定交换器 Exchange 与 队列 Queue 之间的对应关系,并记录路由的 Routing-Key。Binding 信息会保存到系统当中,用于 Broker Server 信息的分发依据
Fanout Exchange
FanoutExchange模式需要提前将 Exchange 与 Queue 进行绑定,一个 Exchange 可以绑定多个 Queue,一个 Queue 可以同多个 Exchange 进行绑定。是多对多关系不需要 RoutingKey。如果接受到消息的 Exchange 没有与任何 Queue 绑定,则消息会被抛弃。
Fanout Exchange 与Queue 绑定
Producer 发消息
Producer将消息发给fanoutExchange交换机。由交换机分发给fanout.first和fanout.second 队列
DirectExChange类型
Topic ExChange类型
我们通过direct exchange(直连交换机)可以根据路由键进行路由,但是还是不够灵活,它只能进行完全匹配。这节我们引入Topic exchange(主题交换机),支持对路由键的模糊匹配
*(星号)可以代替一个字。
#(散列)可以代替零个或多个单词。
1. 路由键"quick.orange.rabbit"和"lazy.orange.elephant"会被同时投递到Q1和Q2
2. 路由键"quick.orange.fox" 只被同时投递到Q1
3. 路由键"lazy.brown.fox" 只被投递到Q2
4. 路由键"lazy.pink.rabbit" 只会被投递到Q2,且只投递一次,尽管它同时符合两个键的值"*.*.rabbit", lazy.#"。
5. 路由键"quick.brown.fox"、"orange" 、 "quick.orange.male.rabbit" 没有符合两个队列的要求,被丢弃
三 、 Produce 端 发送消息与监控示例
第四、Consumer 端 发送消息与监控
总结
以上就是今天要讲的内容,本文仅仅简单介绍了消息队列,而rabbitMQ提供了异步处理机制