消息队列之 rabbitMQ


文章目录


提示:以下是本篇文章正文内容,下面案例可供参考


一、为什么要用消息队列 ?

1. 高并发 业务、大量数据处理、复杂业务处理。常规的流程化处理不能满足业务的需求

      针对不需要立即处理消息,尤其那种非常耗时的操作,通过消息队列提供了异步处理机制

2.解耦

    在应用和应用之间,提供了异构系统之间的消息通讯的机制,使用消息队列在突发事件下的防脉冲能力提供了一种保障,能够接管前台的大脉冲请求,然后异步慢速消费。

3.消峰

     在访问量剧增的情况下,应用仍然需要继续发挥作用

4.扩展性

     因为消息队列解耦了主流程的处理过程,只要另外增加处理过程即可,不需要改变代码、不需要调整参数,便于分布式扩容。

消息队列带来的问题

    

目前几种消息队列

特性RabbitMQActiveMQRocketMQKafka
开发语言erlangJAVAJAVAscala
单机吞吐量万级万级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提供了异步处理机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值