深入RabbitMQ
内容介绍
本书对 RabbitMQ 这一业界主流的消息中间件做了全面介绍,给出了如何使用 RabbitMQ 构建消息通信系统的方法和实践。本书从 AMQP 协议出发,深入介绍各种消息属性,给出 RabbitMQ 在发送和消费消息上的特性和*实践,并阐述基于 RabbitMQ 所特有的交换器组件实现灵活的消息路由机制。同时,本书也讨论了如何利用 RabbitMQ 强大的集群机制实现分布式环境下的消息通信,并展示了如何在 RabbitMQ中,使用其他传输协议以及数据库集成等功能来实现各种定制化需求。本书的读者对象为从事互联网行业中各种分布式和服务化系统开发的研究人员、高等院校计算机相关专业的研究生和本科生,以及广大的 IT 爱好者。
目录
- 第一篇 RabbitMQ和应用程序体系结构
- 第1章 RabbitMQ基础 3
- 1.1 RabbitMQ特性以及好处 4
- 1.1.1 RabbitMQ与Erlang 5
- 1.1.2 RabbitMQ与AMQP 6
- 1.2 谁在使用RabbitMQ,在怎么用 7
- 1.3 松耦合架构的优势 8
- 1.3.1 解耦你的应用 10
- 1.3.2 解耦数据库写入 11
- 1.3.3 无缝添加新功能 12
- 1.3.4 复制数据与事件 12
- 1.3.5 多主(Multi-Master)互联化数据与事件 13
- 1.3.6 高级消息队列模型 14
- 1.4 小结 16
- 第2章 使用AMQ协议与Rabbit进行交互 18
- 2.1 AMQP作为一种RPC传输机制 19
- 2.1.1 启动会话 20
- 2.1.2 调整正确的信道 20
- 2.2 AMQP RPC帧结构 21
- 2.2.1 AMQP帧组件 21
- 2.2.2 帧类型 22
- 2.2.3 将消息编组成帧 23
- 2.2.4 方法帧结构 24
- 2.2.5 内容头帧 26
- 2.2.6 消息体帧 26
- 2.3 使用协议 27
- 2.3.1 声明交换器 27
- 2.3.2 声明队列 28
- 2.3.3 绑定队列到交换器 29
- 2.3.4 发布消息到RabbitMQ 29
- 2.3.5 从RabbitMQ中消费消息 30
- 2.4 用Python编写消息发布者 32
- 2.5 从RabbitMQ中获取消息 36
- 2.6 小结 37
- 第3章 消息属性详解 38
- 3.1 合理使用属性 39
- 3.2 使用content-type属性创建显式的消息契约 41
- 3.3 通过gzip和content-encoding属性压缩消息大小 43
- 3.4 使用message-id和correlation-id引用消息 45
- 3.4.1 Message-id 45
- 3.4.2 Correlation-id 45
- 3.5 创建时间:timestamp属性 46
- 3.6 消息自动过期 47
- 3.7 使用delivery-mode平衡速度和安全性 48
- 3.8 使用app-id和user-id验证消息来源 49
- 3.8.1 app-id 50
- 3.8.2 user-id 51
- 3.9 使用type属性获取明细 51
- 3.10 使用reply-to属性实现动态工作流 52
- 3.11 使用消息头自定义属性 53
- 3.12 优先级属性 54
- 3.13 不能使用的属性:cluster-id/reserved 54
- 3.14 小结 55
- 第4章 消息发布的性能权衡 58
- 4.1 平衡投递速度与可靠投递 59
- 4.1.1 如果没有保证机制我们能期待什么 60
- 4.1.2 使用mandatory设置,RabbitMQ将不接受不可路由消息 62
- 4.1.3 发布者确认作为事务的轻量级替代方法 64
- 4.1.4 使用备用交换器处理无法路由的消息 66
- 4.1.5 基于事务的批量处理 68
- 4.1.6 使用HA队列避免节点故障 70
- 4.1.7 HA队列与事务 72
- 4.1.8 通过设置delivery-mode为2将消息持久化到磁盘 72
- 4.2 RabbitMQ回推 75
- 4.2.1 使用rabbitpy来检测连接状态 77
- 4.2.2 使用管理API管理连接状态 77
- 4.3 小结 78
- 第5章 消费消息,避免拉取 79
- 5.1 对比Basic.Get 和Basic.Consume 80
- 5.1.1 Basic.Get 80
- 5.1.2 Basic.Consume 82
- 5.2 优化消费者性能 84
- 5.2.1 使用no-ack模式实现更快的吞吐量 85
- 5.2.2 通过服务质量设置控制消费者预取 86
- 5.2.3 消费者使用事务 89
- 5.3 拒绝消息 90
- 5.3.1 Basic.Reject 90
- 5.3.2 Basic.Nack 91
- 5.3.3 死信交换器 92
- 5.4 控制队列 94
- 5.4.1 临时队列 94
- 5.4.2 永久队列 97
- 5.4.3 任意队列设置 99
- 5.5 小结 99
- 第6章 消息路由模式 101
- 6.1 通过direct交换器路由消息 102
- 6.1.1 创建应用架构 103
- 6.1.2 创建RPC工作者 107
- 6.1.3 编写简单的RPC发布者 110
- 6.2 通过fanout交换器广播消息 115
- 6.2.1 修改面部检测消费者 116
- 6.2.2 创建一个简单的图片哈希消费者 117
- 6.3 使用topic交换器有选择地路由消息 119
- 6.4 使用headers交换器有选择地路由消息 122
- 6.5 交换器性能基准 124
- 6.6 交换器间路由 125
- 6.7 使用一致性哈希交换器路由消息 127
- 6.8 小结 131
- 第二篇 管理数据中心或云中的RabbitMQ
- 第7章 RabbitMQ集群 135
- 7.1 集群简介 136
- 7.1.1 集群和管理界面 137
- 7.1.2 集群节点类型 138
- 7.1.3 集群和队列行为 139
- 7.2 集群设置 142
- 7.2.1 虚拟机设置 143
- 7.2.2 向集群中添加节点 144
- 7.3 小结 147
- 第8章 跨集群的消息分发 148
- 8.1 联合交换器和联合队列 149
- 8.1.1 联合交换器 149
- 8.1.2 联合队列 152
- 8.2 创建RabbitMQ虚拟机 153
- 8.2.1 创建首个实例 153
- 8.2.2 复制EC2实例 159
- 8.3 连接上游节点 162
- 8.3.1 定义联合中的上游节点 162
- 8.3.2 定义策略 164
- 8.3.3 利用上游集合 167
- 8.3.4 双向联合交换器 170
- 8.3.5 使用联合来升级集群 171
- 8.4 小结 173
- 第三篇 集成与定制
- 第9章 使用替代协议 177
- 9.1 MQTT和RabbitMQ 178
- 9.1.1 MQTT协议 178
- 9.1.2 通过MQTT发送消息 182
- 9.1.3 MQTT订阅者 184
- 9.1.4 MQTT插件配置 187
- 9.2 STOMP和RabbitMQ 189
- 9.2.1 STOMP协议 190
- 9.2.2 发布消息 191
- 9.2.3 消费消息 195
- 9.2.4 配置STOMP插件 198
- 9.2.5 在Web浏览器中使用STOMP 199
- 9.3 通过HTTP进行无状态发布 200
- 9.3.1 statelessd的由来 200
- 9.3.2 使用statelessd 201
- 9.3.3 运营架构 202
- 9.3.4 通过statelessd来发布消息 203
- 9.4 小结 203
- 第10章 数据库集成 205
- 10.1 PostgreSQL扩展:pg_amqp 206
- 10.1.1 安装pg_amqp扩展 207
- 10.1.2 配置pg_amqp扩展 209
- 10.1.3 通过pg_amqp发送消息 210
- 10.2 监听PostgreSQL通知 212
- 10.2.1 安装PostgreSQL LISTEN交换器 213
- 10.2.2 基于策略的配置 215
- 10.2.3 创建交换器 217
- 10.2.4 创建并绑定测试队列 217
- 10.2.5 通过NOTIFY发送消息 218
- 10.3 将消息存入InfluxDB中 219
- 10.3.1 InfluxDB的安装与设置 220
- 10.3.2 安装InfluxDB存储交换器 222
- 10.3.3 创建测试交换器 223
- 10.3.4 测试交换器 224
- 10.4 小结 227
- 附录 准备就绪 228
- A.1 安装VirtualBox 228
- A.2 安装Vagrant 230
- A.3 设置Vagrant虚拟机 233
- A.4 确认安装 234
- A.5 小结 236