惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
Webroot Blog
Webroot Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
V2EX - 技术
V2EX - 技术
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
Recorded Future
Recorded Future
S
Schneier on Security
I
InfoQ
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The GitHub Blog
The GitHub Blog
S
Security @ Cisco Blogs
O
OpenAI News
W
WeLiveSecurity
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
人人都是产品经理
人人都是产品经理
Cloudbric
Cloudbric
The Last Watchdog
The Last Watchdog
The Hacker News
The Hacker News
Google Online Security Blog
Google Online Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
GbyAI
GbyAI
NISL@THU
NISL@THU
T
Tailwind CSS Blog
V
Visual Studio Blog
PCI Perspectives
PCI Perspectives
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
D
DataBreaches.Net
B
Blog RSS Feed
N
News and Events Feed by Topic
N
News and Events Feed by Topic
H
Heimdal Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
腾讯CDC
Latest news
Latest news
V
Vulnerabilities – Threatpost
Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
V
V2EX
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Register - Security
The Register - Security
Help Net Security
Help Net Security

浮华生

Elasticsearch 检索性能优化 - 浮华生 舆情监控系统综述 - 浮华生 2024 半年度总结 - 浮华生 2023 年终总结 - 浮华生 异地机器组网方案 - 浮华生 Kubernetes 部署 Elasticsearch 和 Kibana - 浮华生 2022 年终总结 - 浮华生 RabbitMQ connection channel 的关系 - 浮华生 Kafka Java 客户端 Producer 原理分析 - 浮华生 RabbitMQ 和 Kafka 应用原理简单对比 - 浮华生 阿里云 OpenSearch 介绍 - 浮华生 Golang Array 和 Slice 区别 - 浮华生 Mac OS 下打造 golang nvim 编程环境之基础配置 - 浮华生 电商搜索技术总结 - 浮华生 电商搜索业务总结 - 浮华生 2021 年终总结 - 浮华生 Cypress 实践总结 - 浮华生 年终总结 - 浮华生 关于我 - 浮华生 使用 cucumber 进行行为驱动开发(BDD) - 浮华生 微服务应用集成 SpringCloud 步骤 - 浮华生 电商搜索数据同步方案 - 浮华生 通过一道数值转换题重温计算机补码 - 浮华生 macOS 系统推荐的一些软件 - 浮华生 DevOps 实施规划(持续更新) - 浮华生 rabbitmq 如何提高可靠性并保证消费端幂等 - 浮华生 结对编程 - 浮华生 RSocket 介绍 - 浮华生 面向对象的理解 - 浮华生 企业平台技术框架 - 浮华生 对创业的思考 - 浮华生 知难行易 - 浮华生 一年工作经验总结 - 浮华生 我与领域驱动之缘 - 浮华生 TDD 中使用的工具 - 浮华生 tf-idf 算法 - 浮华生 gitlab 添加代码规范检测 - 浮华生 query 改写 - 浮华生 阶段性总结 - 浮华生 操作系统作用 - 浮华生 - 浮华生 hamming-distance - 浮华生 ElasticSearch API 基本操作 - 浮华生 elasticsearch 集群容错 - 浮华生 ElasticSearch 基础概念 - 浮华生 技术选型怎么做 - 浮华生 条件概率、全概率与贝叶斯公式 - 浮华生 年终总结 - 浮华生 迁移到 ubuntu18 的问题及配置 - 浮华生 总结 - 浮华生 使用 psi-probe 监控 Tomcat - 浮华生 Tomcat 远程 Debug - 浮华生 jstack 死循环和死锁定位 - 浮华生 jmap & mat 内存溢出 - 浮华生 JVM 常用参数查看 - 浮华生 周总结(8.13-8.19) - 浮华生 周总结(7.30-8.4) - 浮华生 使用移位运算符 - 浮华生 master 公式 - 浮华生 VMware 12 NAT网络下配置 ubuntu 16.04 LTS 系统静态 IP - 浮华生 关于进制的计算 - 浮华生 项目总结 第三篇 - 浮华生 项目总结 第二篇 - 浮华生 editor.md 富文本编辑器的使用 - 浮华生 项目总结 第一篇 - 浮华生 2017至今总结 - 浮华生 谈谈微服务 - 浮华生 单例模式 - 浮华生 tor 使用 - 浮华生 归档 - 浮华生 搜索 - 浮华生 搜索 && 推荐 - 浮华生
AMQ Model总结 - 浮华生
浮华生 · 2020-03-21 · via 浮华生

前言

最近在写公司的消息队列组件,因为使用的是 RabbitMQ,其实现的规范是基于 AMQP-0-9-1 ,所以抽时间把官方的规范过了一遍,整理出主要的内容,记录于此。

AMQ 模型架构(AMQ Model Architecture)

基础组件

  • Publisher application 发送者
  • Consumer application 消费者
  • Server AMQP 服务器
  • Virtual host 在 Server 中提供逻辑隔离,类似于 MySQL 数据库中的多个表
  • Exchange 将消息根据不同的配置路由到不同队列
  • Message Queue 存储消息的地方

消息流转

从上图可看出,AMQP 的关键之处和难点在于 Exchange 是如何将不同的消息发送到不同的 Message Queue 中

消息的生命周期

在发送者发送消息和消费者确认消费,对于如何保证消息的可靠性,在 RabbitMQ 中有两种方式,一种是放到同一个事务中处理,但是这种方式对于并发量不大的可以使用,保证了准确性,但是牺牲了性能;还有一种是轻量级的通过 confirm 去异步确认,这部分以后会单独写出来。

消息队列

消息队列能将消息存到内存或者磁盘上,供消费者消费。它有几个主要的配置

  • 名称 name
  • 专用 exclusive: 随 channel 创建和销毁
  • 持久化 durable:broker 重启后能够恢复持久化的消息

队列生命周期

  • 持久化队列
  • 临时队列

临时队列生命周期

交换机

交换机,根据预先设定的 bindings 规范进行匹配和路由,exchange 根据 bindings 的信息决定应该将消息发送到哪个 queue 或者 exchange,exchange 此模块不存储任何消息,对于使用时我们一般说的是交换机的类型,就像车,有火车、汽车、自行车等,而 exchange 有四种类型,下面介绍常用的三种。

direct

AMQP 默认使用的是 direct 模式,此模式的特点是 routing key 和 bindings 必须匹配才能发送成功,如下图所示,如果 routing key 为 abc 的消息只能被 Consumer A 消费。

topic

topic 模式可以说是 direct 的一种扩展,这个扩展支持使用通配符来进行路由,规则是 # 代表多个单词,***** 代表单个单词,下图中的消息能够被 Consumer A 和 Consumer C 消费,而 Consumer B 所监听的队列绑定的是 a.* ,最多只能是两个字母,不匹配。

fanout

此模式也能叫做广播模式,此模式没有 routing key 的概念,发送方将消息发到 exchange 中,只要是有消息队列与之绑定就直接发送过去。

exchange 生命周期

在 borker 启动时会创建内部的交换机,这些交换机无法删除,还有一种就是应用创建(官方觉得叫 声明 更好),声明一个私有的交换机,私有的交换机可以被删除,但是在实际使用时声明出来以后不会再删。

Routing Key

存在于发送者和 broker 之间,交换机会根据 routing key 将消息发送到对应的队列中。

Bindings

Bindings 存在于 exchange 和 message queue 之间,用来告诉 exchange 应该将消息路由到哪个队列上。

利用 bindings 可以实现

  • 共享队列(Shared Queue):多个消费者监听同一个队列
  • 应答队列(Reply Queue):应用不声明队列,由 broker 临时生成一个队列进行消费
  • 发布订阅队列(Pub/Sub Queue):使用 topic 类型实现,结合 bind() 方法

除了以上的 AMQ 模型外,AMQP 还有命令、传输、功能、技术架构,这些等有时间再看。