RabbitMQ 是采用AMQP协议进行通信的。比起简单的TCP/UDP之类的通信,该模型更为复杂,功能也更为强大。

最近项目中用到RabbitMQ比较多,就比较系统深入的过来看看它的具体方式。

内容基本上从官网文档借鉴。

在这个模型中,publisher将消息首先发布给Exchange,由Exchange负责发送到一个或多个Queue中,发送的规则称为binging。最后发送给consumer或者consumer来pull。感觉这个概念就像寄送快递,发件人只需要和快递员打交道,告诉要发什么地址,甚至多个地址。派送则由快递公司承担。最后用户既可以选择送货上门,也可以选择自己去取件。

为了保证传递的可靠性,AMQP中有一个确认机制。consumer在收到快递后,要签个字,快递公司才会把订单从系统中撤掉。

如果消息无法送抵,则可以回退给publisher,或者扔掉,或者放入旧货堆(dead letter queue)

exchange:

Exchange作为AMQP中重要的一个中间实体,其交换类型(exchange type), 共有以下4种:

Direct, Fanout, Topic, Headers

除了类型外,还有一些关键的属性:

Name,  Durability, Auto-delete, Arguments.

针对每种类型的具体解释如下:

Default Exchange:

default exchange是一种直接交换,所使用的exchange是不需要命名的默认exchange(empty string)。它有一个特别之处是在每个queue生成的时候会自动帮定到一个同名的routing key上。这样从默认exchange上出来的消息就可以根据这个routing key自动找到对应的queue。从外界看来,好像exchange不存在,publisher直接将消息写入了queue中。

Fanout Exchange:

fanout exchange 会忽略routing key的作用,向所有与其绑定的queue发送消息。当一条消息从publisher发布到exchange之后,exchange会负责到所有的N个queue中。这是用来做广播的理想方式。

Topic Exchange:

topic exchange会分发消息到一个或多个queue上,这取决于routing key和pattern的设置,只有相符合的消息才会被传到queue上。这个模式常用来做多播和订阅模式。

Headers Exchange:

headers exchange 在分发消息的时候,不依赖于routing key的规则,而是直接根据消息的headers attribute.每个queue可以指定一个或多个header,也可以指定是指需要满足一个header还是要所有的header都满足才算是匹配成功。

队列

队列(Queue)也是AMQP中重要的组成部分。它也有一些重要的属性:

Name

Durable(持久化)

Exclusive(只被用于一条连接,连接关闭后自动删除)

Auto-delete(最后一个consumer退订后自动删除)

Arguments

队列在使用之前要先被声明,如果声明一个已存在的队列,则看声明时用到的参数是否一致,不一致时报406错。

用户可以用255位之内的UTF-8字符命名队列,也可以让broker生成一个唯一的名称(在定义时传入空名字),之后使用的时候只要输入空字符串,会自动匹配到这个唯一的名字上。

绑定

在AMQP中,绑定是用来判定exchange向那些队列传递消息的规则。绑定可能会用到一个叫做routing key的属性,这个属性用来订制选择的规则,类似于一个filter的工作方式。

消费者(consumer)

在AMQP中,消费者有两种消费模式:Push和Pull。

在Push方式下,消费者订阅某一个队列,队列的消息就被推送来。

对于消息回执,有两种选择,一种由消费者主动发送回执或者broker自动发送。

RabbitMQ 使用的AMQP模型解析相关推荐

  1. 理解RabbitMQ中的AMQP模型,知乎上已获万赞

    前言 在实际开发,Redis使用会频繁,那么在使用过程中我们该如何正确抉择数据类型呢?哪些场景下适用哪些数据类型.而且在面试中也很常会被面试官问到Redis数据结构方面的问题: Redis为什么快呢? ...

  2. RabbitMQ简介以及AMQP协议

    RabbitMQ能为你做些什么? 消息系统允许软件.应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和接收分离来实现应用程序的异步 ...

  3. RabbitMQ(03)——RabbitMQ的Fanout消息模型

    RabbitMQ--RabbitMQ的Fanout消息模型 Fanout消息模型结构 P:生产者,向Exchange发送消息 X: Exchange(交换机),接收生产者的消息 C:消费者,领取消息并 ...

  4. Python基于statsmodels包构建多元线性回归模型:模型构建、模型解析、模型推理预测

    Python基于statsmodels包构建多元线性回归模型:模型构建.模型解析.模型推理预测 目录

  5. 旧文重发:做人、做事,做架构师——架构师能力模型解析

    这篇文章发表于<程序员>2008.04期.其中有关模型图参见: http://blog.csdn.net/aimingoo/archive/2007/06/26/1667508.aspx ...

  6. RabbitMQ支持的消息模型

    一.rabbitMQ支持的消息模型如下 第一种模型(直连) 在上图的模型中,有以下概念: P:生产者,也就是要发送消息的程序 C:消费者:消息的接受者,会一直等待消息到来. queue:消息队列,图中 ...

  7. Qt Creator使用Clang代码模型解析C ++文件

    Qt Creator使用Clang代码模型解析C ++文件 使用Clang代码模型解析C ++文件 关于Clang代码模型 配置C语代码模型 lang检查 在项目级别指定Clang代码模型设置 使用编 ...

  8. 模型解析之独立顶点的筛选

    1.模型需求 存储三维模型的文件,通常需要更高效的空间分配,来尽量减少文件的物理体积. 例如一个模型,可能存有position,uv,normal,tangents ... 等等相关信息. 如果简单的 ...

  9. Kubernetes应用部署模型解析(原理篇)

    2019独角兽企业重金招聘Python工程师标准>>> Kubernetes应用部署模型解析(原理篇) 博客分类: Kubernetes [编者按]Kubernetes可用来管理Li ...

  10. 3D姿态估计——ThreeDPose项目简单易用的模型解析

    前言 之前写过tensorflow官方的posenet模型解析,用起来比较简单,但是缺点是只有2D关键点,本着易用性的原则,当然要再来个简单易用的3D姿态估计.偶然看见了ThreeDPose的项目,感 ...

最新文章

  1. 精通八大排序算法系列:二、堆排序算法
  2. 关于Unity中的刚体和碰撞器的相关用法(一)
  3. Linux安装PHP报错Sorry, I cannot run apxs. Possible reasons follow:
  4. IEDA中彻底删除项目
  5. SpringFramework4系列之SpringJMS:(一)搭建JMS-注解加XML版
  6. P4899-[IOI2018]werewolf 狼人【Kruskal重构树,主席树】
  7. 架构师2月刊发布:解读Android、高效运维、API设计方法论
  8. java做类似于qq空间动态加载_实现类似微博、QQ空间等的动态加载
  9. 体检结果(2018年10月,胃肠镜)
  10. 焦仲卿刺杀孙策_惊闻:孙伯符死于焦仲卿之手。。。
  11. 电子签名,后疫情时代“智慧校园”创新新方向
  12. 对接环信踩坑记(环信客服+IMSDk即时通信)
  13. 什么是语法糖(Syntactic sugar)?
  14. fwr310刷openwrt_全网首拆迅捷FWR310 V4.0 300M 路由硬改后刷华硕N14U
  15. 计算机专业该不该考研?
  16. (windows图形化界)粘滞键后门
  17. gpio驱动重构版,未优化,附上测试demo
  18. 开源规则引擎 drools
  19. 滑块验证码后台生成及校验
  20. 六顶思考帽(一)-----白色

热门文章

  1. sql:mysql:数据库优化
  2. html 图片上面显示文字,Html 让文字显示在图片的上面
  3. Mac下禁用开机自启软件
  4. 安卓和ios针对小程序兼容以及小程序技术实现上本身遇到的一些问题
  5. 2022/12/11创建openai账号(chatgpt)
  6. 想去美国?看完会成功率飙升的美国签证面试技巧
  7. 沉降观测原始数据编译
  8. c语言flappy bird,c语言版本flappy bird
  9. DWF低代码开发技术及其在数字化运营和运维平台建设中的应用
  10. python处理FITS文件 2:astropy.io.fits介绍及打开FITS文件