书海网短评:
适读人群:RabbitMQ开发人员大部分现代分布式应用的核心就是队列。它提供了缓存、优先级区分和消息路由的能力。RabbitMQ是一款高性能的消息代理服务器,基于高级消息队列协议。它经受住了实践的检验,足够快速,足够
大部分现代分布式应用的核心就是队列。它提供了缓存、优先级区分和消息路由的能力。RabbitMQ是一款高性能的消息代理服务器,基于高级消息队列协议。它经受住了实践的检验,足够快速,足够强大,几乎可以满足所有消息投递的需要。仅需要一些简单的设置,就能立即使用它管理低级别服务通信、应用集成和分布式系统的消息路由。《深入RabbitMQ》是构建和维护基于消息的应用程序的实用指南。《深入RabbitMQ》详细介绍了RabbitMQ,其中重点介绍了它的工作机制。不论是简单的网络服务,还是复杂的分布式设计,都可以从中找到真实系统的示例与详细解释。还可以从中领略到核心架构决策和有效运营管理流程开发所需的深刻见解。
具体内容包括:
◎AMQP协议(AdvancedMessageQueueingProtocol)
◎使用MQTT、Stomp和HTTP进行通信◎非常有价值的故障诊断技术
◎数据库集成《深入RabbitMQ》适合那些对面向消息的系统有一定基础的开发者阅读。
《深入RabbitMQ》对RabbitMQ这一业界主流的消息中间件做了全面介绍,给出了如何使用RabbitMQ构建消息通信系统的方法和实践。《深入RabbitMQ》从AMQP协议出发,深入介绍各种消息属性,给出RabbitMQ在发送和消费消息上的特性和佳实践,并阐述基于RabbitMQ所特有的交换器组件实现灵活的消息路由机制。同时,《深入RabbitMQ》也讨论了如何利用RabbitMQ强大的集群机制实现分布式环境下的消息通信,并展示了如何在RabbitMQ中,使用其他传输协议以及数据库集成等功能来实现各种定制化需求。
《深入RabbitMQ》的读者对象为从事互联网行业中各种分布式和服务化系统开发的研究人员、高等院校计算机相关专业的研究生和本科生,以及广大的IT爱好者。
GavinM.Ray是一位积极主动的开源传播者和倡导者,自20世纪90年代中期以来一直从事互联网和企业技术方面的工作。技术编辑jamesTitcumb是一个自由开发者、培训师、演讲者,并且是开源项目积极贡献者。
汪佳南,拥有10年以上软件开发经验。对编程情有独钟,对产品设计很感兴趣,始终坚信技术可以改变世界。译有《RabbitMQ实战高效部署分布式消息队列》《深入理解Redis》等知名图书。
第一篇RabbitMQ和应用程序体系结构
第1章RabbitMQ基础3
1.1RabbitMQ特性以及好处4
1.1.1RabbitMQ与Erlang5
1.1.2RabbitMQ与AMQP6
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.1AMQP作为一种RPC传输机制19
2.1.1启动会话20
2.1.2调整正确的信道20
2.2AMQPRPC帧结构21
2.2.1AMQP帧组件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发布消息到RabbitMQ29
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.1Message-id45
3.4.2Correlation-id45
3.5创建时间:timestamp属性46
3.6消息自动过期47
3.7使用delivery-mode平衡速度和安全性48
3.8使用app-id和user-id验证消息来源49
3.8.1app-id50
3.8.2user-id51
3.9使用type属性获取明细51
3.10使用reply-to属性实现动态工作流52
3.11使用消息头自定义属性53
3.12优先级属性54
3.13不能使用的属性:cluster-id/reserved54
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.7HA队列与事务72
4.1.8通过设置delivery-mode为2将消息持久化到磁盘72
4.2RabbitMQ回推75
4.2.1使用rabbitpy来检测连接状态77
4.2.2使用管理API管理连接状态77
4.3小结78
第5章消费消息,避免拉取79
5.1对比Basic.Get和Basic.Consume80
5.1.1Basic.Get80
5.1.2Basic.Consume82
5.2优化消费者性能84
5.2.1使用no-ack模式实现更快的吞吐量85
5.2.2通过服务质量设置控制消费者预取86
5.2.3消费者使用事务89
5.3拒绝消息90
5.3.1Basic.Reject90
5.3.2Basic.Nack91
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.1MQTT和RabbitMQ178
9.1.1MQTT协议178
9.1.2通过MQTT发送消息182
9.1.3MQTT订阅者184
9.1.4MQTT插件配置187
9.2STOMP和RabbitMQ189
9.2.1STOMP协议190
9.2.2发布消息191
9.2.3消费消息195
9.2.4配置STOMP插件198
9.2.5在Web浏览器中使用STOMP199
9.3通过HTTP进行无状态发布200
9.3.1statelessd的由来200
9.3.2使用statelessd201
9.3.3运营架构202
9.3.4通过statelessd来发布消息203
9.4小结203
第10章数据库集成205
10.1PostgreSQL扩展:pg_amqp206
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安装PostgreSQLLISTEN交换器213
10.2.2基于策略的配置215
10.2.3创建交换器217
10.2.4创建并绑定测试队列217
10.2.5通过NOTIFY发送消息218
10.3将消息存入InfluxDB中219
10.3.1InfluxDB的安装与设置220
10.3.2安装InfluxDB存储交换器222
10.3.3创建测试交换器223
10.3.4测试交换器224
10.4小结227
附录准备就绪228
A.1安装VirtualBox228
A.2安装Vagrant230
A.3设置Vagrant虚拟机233
A.4确认安装234
A.5小结236
序言
当ManningPublications于2012年4月发布《RabbitMQ实战》一书时,RabbitMQ迅速普及。时至今日,RabbitMQ已然成为消息代理服务器世界的领导者之一,并且是各种应用程序应用场景的理想之选。通过分布式应用程序助力通信,在面向服务体系结构中采用微服务,并实现CQRS和事件源组件的逻辑分离,这都是一些常见的RabbitMQ用法。
通过对AMQP协议结构的研究,对各种交换器的逐步探索,以及对性能方面的考察等事项,我们以全新的视角对RabbitMQ本身进行深入探索。《深入RabbitMQ》一书旨在将你对RabbitMQ的理解提升至新的水平,使你能在实际应用中进一步应用这些原理。
致谢
《深入RabbitMQ》写作并非一蹴而就。首先要感谢我们的家人和朋友,他们孜孜不倦地陪伴在左右,毫无怨言,特别是傍晚的那些咖啡让我们坚持不懈地编写这样一《深入RabbitMQ》。再次说声感谢!感谢《RabbitMQ实战》(2012年4月由ManningPublications出版)的作者AlvaroVidela和JasonJ.W.Williams,是他们激发了无数开发者对RabbitMQ的兴趣、开拓了大家的眼界,为日后的研究奠定了基础。
感谢我们的开发编辑Karen,正是她在这段时间里付出的无尽耐心和理解,再加上整个Manning团队所有人的巨大努力,才将我们推向成功。这份艰苦卓绝的工作历经反复打磨,最终成就了《深入RabbitMQ》,我们心存感恩!
同样感谢技术校对者KarstenStr?b?k,他对《深入RabbitMQ》的贡献非常大。还要感谢以下审稿人,他们的意见对《深入RabbitMQ》的帮助同样重要。他们是PhillipWarner、JerryKuch、NadiaSaadNoori、BruceSnyder、RobertKielty、MilosMilivojevic、ArathiMaddula、IanDallas、GeorgeHarley、DimitriAivaliotis、HechenGao、StefanTuralski、AndrewMeredith、ArtemDayneko、DavidPaccoud、BarryAlexander、BijuKunjummen、AdolfoPérez?lvarez、BrandonWilhite、DavidPull和RayLugo。
还有许多朋友也以不同的方式为《深入RabbitMQ》做出了贡献。我们无法提及每个人的名字,否则整《深入RabbitMQ》都可能装不下。总之,非常感谢那些曾经帮助我们成就这《深入RabbitMQ》的朋友们!
关于《深入RabbitMQ》
RabbitMQ是采用Erlang编写的开源消息代理服务器,目前隶属于PivotalSoftware。它基于AMQP开放协议,官方客户端库提供了基于Java、.NET和Erlang版本,以及大多数其他流行的编程语言编写的库。
《深入RabbitMQ》力求和最新版的RabbitMQ3.6.3保持一致。由于RabbitMQ本身的发布计划并不确定,在你拿到《深入RabbitMQ》时RabbitMQ很可能已经发布了新的版本。别担心,根据我们的经验,RabbitMQ极少会在新版本中削减特性,而只会增加新特性并修复问题。
《深入RabbitMQ》中使用的代码示例是采用Python编写的。如果你没有安装Python和RabbitMQ,或者你只是想做实验而不想安装完整的环境的话,我们编写了有关如何配置安装Vagrantbox的教程,里面预装了所有需要的程序。请确保你查看了附录,清楚如何安装并运行。
路线图
第1章讨论了RabbitMQ的基础:RabbitMQ众多的功能以及RabbitMQ的基础,高级消息通信队列模型。
第2章探讨了AMQ协议,讲解了帧结构,以及从RabbitMQ收发消息时底层处理逻辑。
第3章的内容更为深入,讲解了消息属性,包括消息头以及如何在应用程序中使用它们。我们可以利用消息头向消息添加重要的元数据信息,例如content-type以及编码类型。
第4章重点讲解了性能权衡。每种级别的保证都会对应用程序的性能产生影响。本章将介绍这些参数并帮助你在保证消息可靠性的环境所需与快速消息投递之间达到平衡,这就是所谓的金发姑娘原则(GoldilocksPrinciple)。
第5章探索了消息消费的概念,讲解了Basic.Get和Basic.Consume两者之间在底层上根本上的差异,以及通常情况下为什么使用Basic.Consume会更好。本章还讲解了消息预取(prefetching)、服务质量、消息确认、死信交换器、临时队列以及消息过期。
第6章深入讲解了RabbitMQ中的四种核心交换器类型,以及如何在应用架构中选择使用,并从中受益。
第7章着眼于如何通过集群管理来扩展RabbitMQ,集群中的节点故障恢复,以及在应用集群环境时更进一步的性能考虑。
第8章的主要内容是集群的核心概念,包括互联(federate)交换器和队列,将RabbitMQ集群与AWS进行集成,以及各种策略的应用。
第9章讲解了与RabbitMQ通信的其他几种方式:使用MQTT和STOMP等替代协议,或者基于statelessd的HTTP协议进行消息通信。
最后,第10章介绍了数据库集成方面的内容,讲解了将PostgreSQL、InfluxDB与RabbitMQ集成的方式。









