基本信息
编辑推荐
大部分现代分布式应用的核心就是队列。它提供了缓存、优先级区分和消息路由的能力。RabbitMQ是一款高性能的消息代理服务器,基于高级消息队列协议。它经受住了实践的检验,足够快速,足够强大,几乎可以满足所有消息投递的需要。仅需要一些简单的设置,就能立即使用它管理低级别服务通信、应用集成和分布式系统的消息路由。
本书是构建和维护基于消息的应用程序的实用指南。本书详细介绍了RabbitMQ,其中重点介绍了它的工作机制。不论是简单的网络服务,还是复杂的分布式设计,都可以从中找到真实系统的示例与详细解释。还可以从中领略到核心架构决策和有效运营管理流程开发所需的深刻见解。具体内容包括:
◎AMQP协议(Advanced Message Queueing Protocol)
◎使用MQTT、Stomp和HTTP进行通信
◎非常有价值的故障诊断技术
◎数据库集成
本书适合那些对面向消息的系统有一定基础的开发者阅读。
内容简介
计算机书籍
《深入RabbitMQ》对RabbitMQ 这一业界主流的消息中间件做了全面介绍,给出了如何使用RabbitMQ 构建消息通信系统的方法和实践。《深入RabbitMQ》从AMQP 协议出发,深入介绍各种消息属性,给出RabbitMQ 在发送和消费消息上的特性和最佳实践,并阐述基于RabbitMQ 所特有的交换器组件实现灵活的消息路由机制。同时,本书也讨论了如何利用RabbitMQ 强大的集群机制实现分布式环境下的消息通信,并展示了如何在RabbitMQ中,使用其他传输协议以及数据库集成等功能来实现各种定制化需求。
《深入RabbitMQ》的读者对象为从事互联网行业中各种分布式和服务化系统开发的研究人员、高等院校计算机相关专业的研究生和本科生,以及广大的IT 爱好者。
作译者
目录
第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
译者序
消息通信机制在消息发送方和消息接收方之间添加了存储转发(Store and Forward)功能。通过存储转发功能,消息发送方和消息接收方之间并不需要知晓对方的存在,也不需要同时在线,更不会限制必须采用同样的实现技术。紧耦合的单阶段远程方法调用因而转变成松耦合的两阶段过程,技术、空间和时间上的约束凭借中间层得到显著缓解。
然而消息通信机制并没有想象的那么简单。我们需要在消息的生产者和消费者之间建立有效的通信链路并确定双方的通信协议。消息的消费者通常采取主动拉取和被动消费这两种模式实现消息消费;同时,出于稳定性的考虑,消费者还需要提供限流的能力。消息发送方的逻辑则相对简单,一旦消息发送出去之后,它将依赖路由规则,最终投递给符合条件的一个或多个消费者。这些构成了消息通信机制所应该具备的核心组件。
围绕消息通信机制的这些核心组件,业界存在一批关于消息通信的设计规范。而基于这些规范,不同厂商也提供了多种消息通信系统实现方案。本书所介绍的是基于高级消息队列协议(Advanced Message Queuing Protocol,AMQP)规范的RabbitMQ,在内容上详细阐述了RabbitMQ 的以下几个主题:
● AMQP 规范以及消息定义。
● 消息发送的过程以及可靠消息投递机制。
● 消息消费的过程以及消费者性能优化方法。
● 交换器组件以及消息路由机制。
● RabbitMQ 分布式集群构建。
● RabbitMQ 在系统集成上的具体应用。
目前,RabbitMQ 在各大互联网公司中应用十分广泛。通过RabbitMQ 所提供的丰富的交互API、友好的管理界面以及与生俱来的分布式特性,我们可以轻松构建一个强大的消息
通信系统。然而消息通信系统的构建一方面降低了耦合性,另一方面也不可避免地引入了复杂性。如果使用不当,反而会引发各种问题。本书深入分析消息通信的各个方面,不仅介绍了RabbitMQ 的各项基本功能,更为重要的是提供了一系列面向实战的最佳实践,可以作为广大技术人员的开发指南。
在整个翻译过程中,我们首先要感谢张春雨和顾慧芳编辑的辛苦工作,是你们的细心指导才让本书得以最终呈现给读者。其次要感谢我们的家人和朋友,没有你们的体谅和关怀,我们无法专心致志工作。最后要感谢这段经历,本书是我们首次尝试以合译的方式来完成的,当中充满了乐趣和挑战。
本书第1 章至第5 章是由郑天民负责翻译的,第6 章至第10 章是由汪佳南负责翻译的。由于时间仓促,译者水平和经验有限,书中难免有欠妥和错误之处,恳请读者批评指正。
郑天民、汪佳南
2018 年3 月于杭州
序言
通过对AMQP 协议结构的研究,对各种交换器的逐步探索,以及对性能方面的考察等事项,我们以全新的视角对RabbitMQ 本身进行深入探索。《深入RabbitMQ》一书旨在将你对RabbitMQ 的理解提升至新的水平,使你能在实际应用中进一步应用这些原理。
致谢
本书写作并非一蹴而就。首先要感谢我们的家人和朋友,他们孜孜不倦地陪伴在左右,毫无怨言,特别是傍晚的那些咖啡让我们坚持不懈地编写这样一本书。再次说声感谢!感谢《RabbitMQ 实战》(2012 年4 月由Manning Publications 出版) 的作者Alvaro Videla 和Jason J.W. Williams,是他们激发了无数开发者对RabbitMQ 的兴趣、开拓了大家的眼界,为日后的研究奠定了基础。
感谢我们的开发编辑Karen,正是她在这段时间里付出的无尽耐心和理解,再加上整个Manning 团队所有人的巨大努力,才将我们推向成功。这份艰苦卓绝的工作历经反复打磨,最终成就了本书,我们心存感恩!
同样感谢技术校对者Karsten Str?b?k,他对本书的贡献非常大。还要感谢以下审稿人,他们的意见对本书的帮助同样重要。他们是Phillip Warner、Jerry Kuch、Nadia Saad Noori、Bruce Snyder、Robert Kielty、Milos Milivojevic、Arathi Maddula、Ian Dallas、George Harley、Dimitri Aivaliotis、Hechen Gao、Stefan Turalski、Andrew Meredith、Artem Dayneko、David Paccoud、Barry Alexander、Biju Kunjummen、Adolfo Pérez ?lvarez、Brandon Wilhite、David Pull 和Ray Lugo。
还有许多朋友也以不同的方式为本书做出了贡献。我们无法提及每个人的名字,否则整本书都可能装不下。总之,非常感谢那些曾经帮助我们成就这本书的朋友们!
关于本书
RabbitMQ 是采用Erlang 编写的开源消息代理服务器,目前隶属于Pivotal Software。它基于AMQP 开放协议,官方客户端库提供了基于Java、.NET 和Erlang 版本,以及大多数其他流行的编程语言编写的库。
本书力求和最新版的RabbitMQ 3.6.3 保持一致。由于RabbitMQ 本身的发布计划并不确定,在你拿到本书时RabbitMQ 很可能已经发布了新的版本。别担心,根据我们的经验,RabbitMQ 极少会在新版本中削减特性,而只会增加新特性并修复问题。
本书中使用的代码示例是采用Python 编写的。如果你没有安装Python 和RabbitMQ,或者你只是想做实验而不想安装完整的环境的话,我们编写了有关如何配置安装Vagrant box 的教程,里面预装了所有需要的程序。请确保你查看了附录,清楚如何安装并运行。
路线图
第1 章讨论了RabbitMQ 的基础:RabbitMQ 众多的功能以及RabbitMQ 的基础,高级消息通信队列模型。
第2 章探讨了AMQ 协议,讲解了帧结构,以及从RabbitMQ 收发消息时底层处理逻辑。
第3 章的内容更为深入,讲解了消息属性,包括消息头以及如何在应用程序中使用它们。我们可以利用消息头向消息添加重要的元数据信息,例如content-type 以及编码类型。
第4 章重点讲解了性能权衡。每种级别的保证都会对应用程序的性能产生影响。本章将介绍这些参数并帮助你在保证消息可靠性的环境所需与快速消息投递之间达到平衡,这就是所谓的金发姑娘原则(Goldilocks Principle)。
第5 章探索了消息消费的概念,讲解了Basic.Get 和Basic.Consume 两者之间在底层上根本上的差异,以及通常情况下为什么使用Basic.Consume 会更好。本章还讲解了消息预取(prefetching )、服务质量、消息确认、死信交换器、临时队列以及消息过期。
第6 章深入讲解了RabbitMQ 中的四种核心交换器类型,以及如何在应用架构中选择使用,并从中受益。
第7 章着眼于如何通过集群管理来扩展RabbitMQ,集群中的节点故障恢复,以及在应用集群环境时更进一步的性能考虑。
第8 章的主要内容是集群的核心概念, 包括互联(federate) 交换器和队列,将RabbitMQ 集群与AWS 进行集成,以及各种策略的应用。
书摘
当下互联网行业中的各种分布式和服务化系统的开发本质上就是解决一个问题,即系统如何进行拆分和集成。服务拆分需要用到面向领域思想,而服务集成则可以采用RPC、REST、消息通信等多种技术体系。从软件设计角度讲,无论是RPC 还是REST 都存在一定的耦合度问题。耦合度包括技术耦合、空间耦合和时间耦合等不同的表现形式,而消息通信机制能够降低这几种耦合度。
消息通信机制在消息发送方和消息接收方之间添加了存储转发(Store and Forward)功能。通过存储转发功能,消息发送方和消息接收方之间并不需要知晓对方的存在,也不需要同时在线,更不会限制必须采用同样的实现技术。紧耦合的单阶段远程方法调用因而转变成松耦合的两阶段过程,技术、空间和时间上的约束凭借中间层得到显著缓解。
然而消息通信机制并没有想象的那么简单。我们需要在消息的生产者和消费者之间建立有效的通信链路并确定双方的通信协议。消息的消费者通常采取主动拉取和被动消费这两种模式实现消息消费;同时,出于稳定性的考虑,消费者还需要提供限流的能力。消息发送方的逻辑则相对简单,一旦消息发送出去之后,它将依赖路由规则,最终投递给符合条件的一个或多个消费者。这些构成了消息通信机制所应该具备的核心组件。
围绕消息通信机制的这些核心组件,业界存在一批关于消息通信的设计规范。而基于这些规范,不同厂商也提供了多种消息通信系统实现方案。本书所介绍的是基于高级消息队列协议(Advanced Message Queuing Protocol,AMQP)规范的RabbitMQ,在内容上详细阐述了RabbitMQ 的以下几个主题:
● AMQP 规范以及消息定义。
● 消息发送的过程以及可靠消息投递机制。
● 消息消费的过程以及消费者性能优化方法。
● 交换器组件以及消息路由机制。
● RabbitMQ 分布式集群构建。
● RabbitMQ 在系统集成上的具体应用。
目前,RabbitMQ 在各大互联网公司中应用十分广泛。通过RabbitMQ 所提供的丰富的交互API、友好的管理界面以及与生俱来的分布式特性,我们可以轻松构建一个强大的消息
通信系统。然而消息通信系统的构建一方面降低了耦合性,另一方面也不可避免地引入了复杂性。如果使用不当,反而会引发各种问题。本书深入分析消息通信的各个方面,不仅介绍了RabbitMQ 的各项基本功能,更为重要的是提供了一系列面向实战的最佳实践,可以作为广大技术人员的开发指南。
在整个翻译过程中,我们首先要感谢张春雨和顾慧芳编辑的辛苦工作,是你们的细心指导才让本书得以最终呈现给读者。其次要感谢我们的家人和朋友,没有你们的体谅和关怀,我们无法专心致志工作。最后要感谢这段经历,本书是我们首次尝试以合译的方式来完成的,当中充满了乐趣和挑战。
本书第1 章至第5 章是由郑天民负责翻译的,第6 章至第10 章是由汪佳南负责翻译的。由于时间仓促,译者水平和经验有限,书中难免有欠妥和错误之处,恳请读者批评指正。
郑天民、汪佳南
2018 年3 月于杭州