【MQ中间件】RabbitMQ -- RabbitMQ消息模式(2)

人无名,则可专心练剑 2021-04-16 12:52:07
rabbitMQ 中间件 MQ 中间


RabbitMQ消息模式

各个模式相关代码及笔记md已汇总至gitHub专区:

RabbitMQStudy

 

1.RabbitMQ架构

1.1.RabbitMQ核心组成

核心概念:
Server:又称Broker ,接受客户端的连接,实现AMQP实体服务。 安装rabbitmq-server
Connection:连接,应用程序与Broker的网络连接 TCP/IP/ 三次握手和四次挥手
Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立对各Channel,每个Channel代表一个会话任务。
Message :消息:服务与应用程序之间传送的数据,由Properties和body组成,Properties可是对消息进行修饰,比如消息的优先级,延迟等高级特性,Body则就是消息体的内容。
Virtual Host 虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个虚拟主机理由可以有若干个Exhange和Queueu,同一个虚拟主机里面不能有相同名字的Exchange
Exchange:交换机,接受消息,根据路由键发送消息到绑定的队列。(==不具备消息存储的能力==)
Bindings:Exchange和Queue之间的虚拟连接,binding中可以保护多个routing key.
Routing key:是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息。
Queue:队列:也成为Message Queue,消息队列,保存消息并将它们转发给消费者。

 

1.2.RabbitMQ整体架构

 

 从架构图中我们可以看出:RabbitMQ架构包含了:Provider(生产者)Exchanges(交换机)Queues(队列)Consumer(消费者)

 

1.3.RabbitMQ的运行流程

生产者将业务方数据进行可能的包装, 之后封装成消息, 发送( AMQP 协议里这个动作对应的命令为Basic.Publish) 到Broker 中。消费者订阅并接收消息(AMQP 协议里这个动作对应的命令为Basic.Consume 或者Basic. Get) ,经过可能的解包处理得到原始的数据,之后再进行业务处理逻辑。这个业务处理逻辑并不一定需要和接收消息的逻辑使用同一个线程。

消费者进程可以使用一个线程去接收消息,存入到内存中,比如使用Java 中的BlockingQueue 。业务处理逻辑使用另一个线程从内存中读取数据,这样可以将应用进一步解稿,提高整个应用的处理效率。

详细的执行流程过程涉及到的底层通信原理比较复杂,有兴趣的可以了解另一篇博文,写的非常详细,这里就不再做过多地阐述:

rabbitMQ基本概念

rabbitMQ运转流程

 

2.RabbitMQ支持的消息模式

参考官网:https://www.rabbitmq.com/getstarted.html

2.1.简单模式 Simple

 

在简单模式的消息发送中,不需要特别创建交换机(指定交换机的类型),通过默认的交换机Binding Default exchange,通过指定Routing key关联Queues中的queue name向对应的Queue队列发送消息。

注意:

rabbitmq发送消息一定有一个交换机,如果没有创建交换机,默认使用Default_exchange进行绑定。

 

 

最终向queue1中发送消息,获取消息内容如下:

 

Ack Mode:消息应答模式

Nack message:接收消息后不对消息进行应答,及消费者不会回复反馈给生产者,Queue中仍然会保存消息;

Ack message:接收消息并应答,此时生成者受到消费者回复,将Queue中该条消息消费。

 

2.2.工作队列模式 WorkQueues

工作队列模式也是指定的默认的default默认交换机对多个Queue消费者进行消息的发送,

主要有两种模式:
1、轮询模式分发:一个消费者一条,按均分配,平均分,不会因为哪个消费者内部处理速率较快而减少消息的发送;
2、公平分发:根据消费者的消费能力进行公平分发,处理快的处理的多,处理慢的处理的少;按劳分配

 

实际代码上的区别就是公平分发一定要设置应答方式为手动应答,而轮询模式设置为自动应答:

//根据实际场景设置:取决于服务的处理速度、磁盘空间等,为1表示每次只消费1条
finalChannel.basicQos(1); //公平分发一定需要手动应答 finalChannel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);

 

 2.3.发布订阅模式 Publish/Subscribe

发布订阅模式使用fanout类型交换机绑定每一个消费者Queue队列,相当于广播的形式,订阅了该交换机(频道)的Queue都会收到通过交换机发送的来自生产者的消息。

而在此过程中消费者Queues必须与fanout_exchange进行一对一绑定。

 

 

 

 2.4.路由模式Routing

路由模式的交换机类型是:direct类型

路由模式与发布订阅模式非常相似,也非常容易理解。它只是在发布订阅模式上新增了路由key,通过对应的路由key与对应的Queue进行绑定,这个Queue就被key唯一标识了。

然后当交换机再去发送消息的时候,会在绑定了交换机的Queue中指定对应的路由key进行发送,只有对应路由key为发送key一一对应的才能收到消息。

 

测试发给Routing key为error的queue队列(队列都绑定了路由direct_exchange):

 

 

 

 

 

 2.5.主题Topic模式

 

主题模式topics相较于路由模式是非常相似的,只不过在路由的基础之上增加了支持模糊匹配的Routing key的形式。 

主题模式的交换机类型选择必须是topic类型。

匹配规则:

#:表示0个或者多个,取值范围为[0,+无穷大)

*:表示1个,取值为1,即必须要有一个。

 

测试队列Routing key如下,都绑定上了topic主题类型的交换机:

 

 

可以看到,只有queue1与queue2收到了对应的消息:

 

 

2.6.参数模式

参数模式的exchange类型为:headers。

参数模式会在路由匹配时根据相应的Queue携带的参数信息进行匹配,而exchange则根据arguement参数进行一对一发送:

Arguments信息标识,测试选择x=1的队列进行发送:

 

 

 

可以看到queue1中已经收到了消息:

 

 

3.总结

RabbitMQ支持的消息模式:

简单模式 Simple

  • 交换机类型:default
  • 特点:通过默认交换机实现一对一分发

工作模式 Work

  •  交换机类型:default
  • 特点:轮询分发:按均分配;公平分发:按劳分配;

发布订阅模式

  • 交换机类型:fanout
  • 特点:订阅频道,每个队列与交换机绑定,都能收到消息

路由模式

  • 交换机类型:direct
  • 特点:有route key作为标识,发送消息时通过路由key进行一对一发送,实际性能会有所损耗

主题模式

  • 交换机类型:topic
  • 特点:在route key基础上增加了模糊匹配,#:0个或者多个;*:必须有一个

参数模式

  • 交换机类型:headers
  • 特点:携带参数Arguments,实际发送与有对应参数的队列相匹配进行发送

 

版权声明
本文为[人无名,则可专心练剑]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/yif0118/p/14665274.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云