
本书介绍ZeroMQ 的API、套接字和模式的使用。通过建立应用程序来讲解如何使用ZeroMQ 编程技术构建多线程应用程序,并创建自己的消息传递架构。本书设计了大量工作实例来实现请求- 应答模式的高级使用和容错性,并对发布- 订阅模式的性能、可靠性、状态分发与监控进行了扩展。 本书面向的读者是希望制作大规模分布式软件的专业程序员和有志于这方面研究的专业人士,旨在帮助他们解决大规模、可扩展、低成本、高效率的问题,书中还展现了ZeroMQ所需的网络和分布式计算概念。
ZeroMQ译者序 ZeroMQ是iMatix开发的以消息为导向的开源中间件库,它类似于标准Berkeley套接字,支持多种通信模式(扇出、发布-订阅、任务分配和请求-应答)和传输协议(进程内、进程间、TCP和多播),可以用作一个并发框架。其核心由C编写,支持C++、Java等多种语言的API,能在大部分现代平台上运行。它的运行速度很快,其异步模型具有高可扩展性。ZeroMQ中的Zero(零)代表简约并涵盖不同目标:零代理、零延迟、零管理、零成本等。 本书源自ZeroMQ的参考手册,通过社区共同开发而成,数百人为本书做出了贡献,包括用各种编程语言编写的示例。本书也为运作一个成功的社区提供了范例。 值得一提的是,本书作者Pieter Hintjens是iMatix公司的首席执行官,他于2010年被查出患了晚期癌症,动了多次手术并化疗6个月,但2011年仍然坚持继续完成这本书的写作。这种奋不顾身的专业精神值得我们学习。 感谢电子工业出版社计算机出版分社的张春雨编辑选择我们翻译本书,感谢刘舫编辑,她从专业的角度对译文进行了把关,并进行了许多润色,使之更具可读性。 感谢李绿霞、卢林、陈克非、李洪秋、张慧珍、李又及、卢晓瑶、陈克翠、汤有四、李阳、刘雯、贾书民、苏旭晖对本书翻译工作做出的贡献。 还要感谢我们的儿子卢〇一小朋友,他知道我们在翻译书稿就常常自己安静地读书和玩耍,还放弃了很多出去玩的机会,让我们能够专注于本书的翻译,本书的出版也有他的一份贡献。 最后希望这本书对读者有帮助。但由于译者经验和水平有限,译文中难免有不妥之处,恳请读者批评指正! 前言 前言 ØMQ的一百字概括 ØMQ(也称为 ZeroMQ、0MQ或 zmq)看起来像一个可嵌入的网络库,但其作用就像一个并发框架。它为你提供了在各种传输工具,如进程内、进程间、 TCP和组播中进行原子消息传送的套接字。你可以使用各种模式实现 N对 N的套接字连接,这些模式包括扇出、发布 -订阅、任务分配和请求 -应答。它的速度足够快,因此可充当集群产品的结构。它的异步 I/O模型提供了可扩展的多核应用程序,用异步消息来处理任务。它有多种编程语言的 API,并可运行在大多数操作系统上。ØMQ是 iMatix(http://www.imatix.com)开发的,并在 LGPLv3许可下开源。 零之禅 ØMQ中的 .关乎权衡。一方面,ØMQ这个奇怪的名字使其在谷歌和 Twitter上降低了知名度。另一方面,它惹恼了一些丹麦人(译者注: .是丹麦语字母表中的字母),他们写给我们如下的东西,比如“.MG r.tfl”(译者注:把 .替换成 O后表示“天哪,笑翻了”)、“ .不是一个有趣的零!”(译者注:早期计算机输出中用这个符号表示数字 0,以便与字母 O区分)和“R.dgr.d med Fl.de!”(这显然是一种侮辱,意思是“愿你的邻居是格伦德尔的直系后裔!”)(译者注:在古英国史诗《贝奥武夫》中,格伦德尔是一只雄性怪兽,这里作者好像是在误导, r.dgr.d med fl.de,意为“浇了奶油的红莓布丁”,是个非常经典的丹麦语绕口令,它难倒了很多外国人,因为这短短的一句话中包括了三个“.”(两种不同的发音方式)、咽喉擦音 r、重音 gr组合和软化的 d(发音类似于英语 with中的 th)。)这毁誉参半的两方面似乎是一个公平的交易。 最初,ØMQ中的“零”是为了表示“零代理”和(尽可能接近)“零延迟”。但从那时起, 等宽斜体 用于表示应被替换为用户提供的有意义的值的预留位置。 此图标表示提示、建议或一般的注意。 中文版书中切口以“ ”表示原书页码,便于读者与原英文版图书对照阅读,本书的索引中所列的页码为原英文版页码。 使用代码示例 代码示例都在在线存储库中,它位于 https://github.com/imatix/zguide/tree/master/ examples/。你会发现每一个例子都被翻译成其他数种语言。这些例子都在 MIT/X11下授权,详情请查看该目录中的 LICENSE许可文件。本书正文解释了在各种情况下如何运行每个示例。 我们欢迎在使用代码示例时署名,但不强制要求这么做。一个署名通常包括标题、作者、出版商和 ISBN。例如: “ZeroMQ by Pieter Hintjens (O’Reilly). Copyright 2013 Pieter Hintjens, 978-1-449-33406-2.”。 如果你发现自己对书中代码的使用有失公允,或是违反了前述条款,敬请通过 permissions@oreilly.com与我们联系。 Safari. Books Online Safari Books Online是一家按需所取的数字图书馆,它同时提供来自世界各地领先的技术和业务作者的书籍和视频两种形式的专业内容。专业技术人员、软件开发人员、网页设计师,以及商业和创意专业人士使用 Safari联机丛书作为研究,是解决问题、学习和认证培训的主要资源。 Safari Books Online提供了一系列的产品组合和针对组织、政府机构和个人的定价方案。用户有机会在一个完全可搜索的数据库中访问成千上万的书籍、培训视频和即将出版的原稿,它们来自 O’Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、 John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology以及大量其他出版商。有关 Safari Books Online的更多详细信息,请访问我们的网站。 如何联系我们 请将对本书的评价和存在的问题通过如下地址告知出版者: 美国: O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 中国: 北京市西城区西直门南大街 2 号成铭大厦 C 座 807 室(100035) 奥莱利技术咨询(北京)有限公司 O’Reilly的每一本书都有专属网站,你可以在那里找到关于本书的相关信息,包括勘误列表、示例代码以及其他信息。本书的网站地址是: http:/bit.ly/ZeroMQ-OReilly 对于本书的评论和技术性的问题,请发送电子邮件到: bookquestions@oreilly.com 关于我们的书籍、课程、会议和新闻的更多信息,请参阅我们的网站 http://www.oreilly. com。 在 Facebook上找到我们: http://facebook.com/oreilly 在 Twitter上关注我们: http://twitter.com/oreillymedia 在 YouTube上观看我们: http://www.youtube.com/oreillymedia 致谢 感谢 Andy Oram使本书能够在 O’Reilly出版并对此书进行了编辑。 感谢 Bill Desmarais、Brian Dorsey、Daniel Lin、Eric Desgranges、Gonzalo Diethelm、 Guido Goldstein、Hunter Ford、Kamil Shakirov、Martin Sustrik、Mike Castleman、 Naveen Chawla、Nicola Peduzzi、Oliver Smith、Olivier Chamoux、Peter Alexander、Pierre Rouleau、Randy Dryburgh、John Unwin、Alex Thomas、Mihail Minkov、Jeremy Avnet、Michael Compton、Kamil Kisiel、Mark Kharitonov、Guillaume Aubert、Ian Barber、Mike Sheridan、Faruk Akgul、Oleg Sidorov、Lev Givon、Allister MacLeod、 Alexander D’Archangel、Andreas Hoelzlwimmer、Han Holl、Robert G. Jakabosky、 Felipe Cruz、Marcus McCurdy、Mikhail Kulemin、Dr. Gerg. érdi、Pavel Zhukov、 Alexander Else、Giovanni Ruggiero、Rick“Technoweenie”、Daniel Lundin、Dave Hoover、Simon Jefford、Benjamin Peterson、Justin Case、Devon Weller、Richard Smith、Alexander Morland、Wadim Grasza、Michael Jakl、Uwe Dauernheim、Sebastian Nowicki、Simone Deponti、Aaron Raddon、Dan Colish、Markus Schirp、Benoit Larroque、Jonathan Palardy、Isaiah Peng、Arkadiusz Orzechowski、Umut Aydin、 Matthew Horsfall、Jeremy W. Sherman、Eric Pugh、Tyler Sellon、John E. Vincent、 Pavel Mitin、Min RK、Igor Wiedler、Olof .kesson、Patrick Lucas、Heow Goodman、 Senthil Palanisami、John Gallagher、Tomas Roos、Stephen McQuay、Erik Allik、Arnaud Cogoluègnes、Rob Gagnon、Dan Williams、Edward Smith、James Tucker、Kristian Kristensen、Vadim Shalts、Martin Trojer、Tom van Leeuwen、Hiten Pandya、Harm Aarts、Marc Harter、Iskren Ivov Chernev、Jay Han、Sonia Hamilton、Nathan Stocks、 Naveen Palli和 Zed Shaw对这项工作做出的贡献。 感谢 Martin Sustrik多年来在 ZeroMQ上所做的令人难以置信的工作。 感谢 Stathis Sideris为 Ditaa(http://www.ditaa.org)做出的贡献。
目录 前言 ...................xix 第 1章基础知识 ..3 修复这个世界 ..............................................3 本书的读者对象...........................................5 获取示例......................................................5 问过就必有收获...........................................5 在字符串上的小注解 .................................10 版本报告....................................................12 获得消息....................................................12 分而治之....................................................16 用 ØMQ编程 .............................................21 获取正确的上下文 ..............................22 执行彻底的退出 ..................................22 为什么我们需要 ØMQ ..............................23 套接字的可扩展性 .....................................27 从 ØMQ v2.2升级到 ØMQ v3.2 ................28 警告:不稳定的典范! ..............................29 第 2章套接字和模式 ................................................... 31 套接字 API .................................................32 把套接字接入网络拓扑 ......................32 使用套接字来传输数据 .......................34 单播传输 .............................................35 ØMQ不是一个中性载体.....................35 I/O线程 ...............................................36 消息传递模式 ............................................37 高级别消息传递模式 ...........................38 处理消息 .............................................38 处理多个套接字 ..................................41 多部分消息 .........................................44 中间层及代理 ......................................45 动态发现问题 ......................................46 共享队列(DEALER和 ROUTER套接字) ..................................................48 ØMQ的内置代理功能 ........................53 传输桥接 .............................................55 处理错误和 ETERM...................................56 处理中断信号 ............................................61 检测内存泄漏 ............................................63 使用 ØMQ编写多线程程序 .......................64 线程间信令(PAIR套接字) ......................69 节点协调....................................................71 零拷贝........................................................75 发布 -订阅消息封包..................................76 高水位标记 ................................................78 消息丢失问题的解决方案..........................80 第 3章高级请求 -应答模式 ......................................... 83 请求 -应答机制 .........................................83 简单的应答封包 ..................................84 扩展的应答封包 ..................................84 这有什么好处呢 ..................................87 请求 -应答套接字回顾 .......................88 请求 -应答组合 .........................................88 REQ到 REP组合 ................................89 DEALER到 REP组合 ........................89 REQ到 ROUTER组合 ........................90 DEALER到 ROUTER组合 ................90 DEALER到 DEALER组合 ................90 ROUTER到 ROUTER组合 ................90 无效组合 .............................................91 探索 ROUTER套接字 ...............................91 身份和地址 .........................................92 ROUTER错误处理 .............................93 负载均衡模式 ............................................94 ROUTER代理和 REQ工人 ................95 ROUTER代理及 DEALER工人 .........97 负载均衡的消息代理 ...........................98 用于 ØMQ的一个高级别的 API .............. 105 高级别 API的特点 ............................ 107 CZMQ高级别 API ............................ 108 异步客户端 /服务器模式 ......................... 115 能够工作的示例:跨代理路由 ................ 120 建立详情 ........................................... 120 单集群架构 ....................................... 121 扩展到多个集群 ................................ 122 联盟与对等比较 ................................ 124 命名规范 ........................................... 126 状态流原型 ....................................... 127 本地流和云端流原型 ......................... 130 总结 ................................................... 137 第 4章可靠的请求 -应答模式 .................................... 147 什么是“可靠性”..................................... 147 可靠性设计 .............................................. 148 客户端可靠性(懒惰海盗模式).............. 149 基本可靠队列(简单海盗模式).............. 154 健壮的可靠队列(偏执海盗模式)........... 157 信号检测.................................................. 166 置若罔闻地将它关闭 ......................... 166 单向信号检测 .................................... 167 乒乓信号检测 .................................... 167 针对偏执海盗的信号检测 ................. 168 合同和协议 .............................................. 170 面向服务的可靠队列(管家模式)........... 170 异步管家模式 .......................................... 195 服务发现.................................................. 201 幂等服务.................................................. 203 断开连接的可靠性(泰坦尼克模式)....... 203 高可用性对(双星模式).......................... 216 详细需求 ........................................... 218 避免脑裂症状 .................................... 220 双星实现 ........................................... 221 双星反应器 ....................................... 228 无代理可靠性(自由职业者模式)........... 234 模型一:简单的重试和故障转移 ...... 235 模型二:粗暴猎枪屠杀 ..................... 238 模式三:复杂和讨厌的 ..................... 244 结论 ......................................................... 256 第 5章高级发布 -订阅模式 ....................................... 257 发布 -订阅模式的优点和缺点 ................. 257 发布 -订阅跟踪(特浓咖啡模式)........... 259 最后一个值缓存....................................... 262 慢速订阅者检测(自杀蜗牛模式)........... 267 高速订阅者(黑盒模式).......................... 270 可靠的发布 -订阅(克隆模式)............... 272 集中式与分散式 ................................ 273 将状态表示为键 -值对 ..................... 273 得到带外的快照 ................................ 284 重新发布来自客户端的更新 ............. 290 处理子树 ........................................... 295 临时值 ............................................... 298 使用反应器 ....................................... 306 在双星模式中添加可靠性 ................. 311 集群的散列映射协议 ......................... 321 构建一个多线程栈和 API .................. 325 第 6章 ØMQ社区 ..................................................... 341 ØMQ社区的架构..................................... 342 如何制作真正的大型架构........................ 343 软件架构的心理学 ............................ 344 合同 ................................................... 346 过程 ................................................... 348 疯狂,美丽,并且容易 ..................... 348 陌生人,遇见陌生人 ......................... 349 无限的财富 ....................................... 349 照管和培育 ....................................... 350 ØMQ过程: C4 ........................................ 351 语言 ................................................... 351 目标 ................................................... 352 热身 ................................................... 354 许可和所有权 .................................... 355 对补丁程序的要求 ............................ 356 开发过程 ........................................... 357 建立稳定的版本 ................................ 361 公共合同的演变 ................................ 362 一个实际例子 .......................................... 364 Git分支是有害的 ..................................... 368 简单性与复杂性的对比 .....................369 更改延迟 ...........................................369 学习曲线 ...........................................369 出故障的成本 ....................................369 前期协调 ...........................................369 可扩展性 ...........................................370 惊奇和期望 .......................................370 参与的经济学 ....................................370 在冲突中的强壮性 ............................370 隔离的保证 .......................................370 能见度 ...............................................371 结论 ...................................................371 为创新而设计 ..........................................371 双桥传说 ...........................................371 ØMQ的路线图是如何失去的 ........... 372 垃圾桶化的设计 ................................ 374 复杂化的设计 .................................... 376 简约化的设计 .................................... 377 职业倦怠.................................................. 379 成功模式.................................................. 380 懒惰的完美主义者 ............................ 381 仁慈暴君 ........................................... 381 天和地 ............................................... 381 门户开放 ........................................... 381 大笑的小丑 ....................................... 382 留心的将军 ....................................... 382 社会工程师 ....................................... 382 不朽的园丁 ....................................... 382 滚石 ................................................... 382 海盗帮 ............................................... 383 快闪族 ............................................... 383 加那利看守 ....................................... 383 执行绞刑的刽子手 ............................ 383 历史学家 ........................................... 383 煽动者 ............................................... 384 神秘人 ............................................... 384 第 7章使用ØMQ的高级架构 .................................... 385 用于弹性设计的面向消息模式 ................ 386 第 1步:内部化的语义 ..................... 387 第 2步:描绘一个粗略的架构 .......... 387 第 3步:决定合同 ............................ 388 第 4步:编写一个最小的端到端解决方案 ................................................. 388 第 5步:解决一个问题,然后重复 .. 389 Unprotocol ............................................... 389 合同是艰难的 .................................... 390 如何编写 Unprotocol ......................... 391 为什么使用 GPLv3的公开规范 ........ 392 使用 ABNF........................................ 393 廉价或讨厌的模式 ............................ 393 序列化数据 .............................................. 395 ØMQ组帧 ......................................... 396 序列化语言 ....................................... 396 序列化库 ........................................... 397 手写的二进制序列化 ......................... 399 代码生成 ........................................... 400 传输文件.................................................. 406 状态机...................................................... 417 使用 SASL认证 ....................................... 424 大型文件发布: FileMQ........................... 426 为什么要制作 FileMQ ....................... 426 最初的设计切片: API ...................... 426 最初的设计切片:协议 ..................... 427 构建和尝试 FileMQ........................... 429 内部架构 ........................................... 430 公共 API ............................................ 431 设计说明 ........................................... 432 配置 ................................................... 433 文件稳定性 ....................................... 434 递交通知 ........................................... 434 符号链接 ........................................... 435 恢复和后期加入者 ............................ 435 测试用例:曲目工具 ......................... 437 得到一个官方端口号 ............................... 439 第 8章分布式计算的框架 .......................................... 441 用于现实世界的设计 ............................... 442 无线网络的秘密生活 ............................... 443 为什么网状网络现在还没出现 .......... 444 一些物理知识 .................................... 445 现状是什么 ....................................... 446 结论 ................................................... 448 发现 ......................................................... 448 通过原始套接字先发制人的发现 ...... 448 使用 UDP广播协同发现 ................... 450 一台设备上的多个节点 ..................... 455 设计 API ............................................ 456 关于 UDP的更多内容....................... 465 分拆一个库项目....................................... 466 点对点消息传递....................................... 467 UDP信标帧 ...................................... 467 真正的对等连接(和谐模式) ........... 469 检测失踪 ........................................... 471 群发消息.................................................. 472 测试与模拟 .............................................. 474 使用断言 ........................................... 474 前期测试 ........................................... 475 Zyre测试仪 ....................................... 476 测试结果 ........................................... 479 跟踪活动 ........................................... 481 处理阻塞节点 .................................... 481 分布式日志记录和监视............................ 484 一个合理的最小实现 ......................... 485 协议断言 ........................................... 488 二进制日志记录协议 ......................... 489 内容分发.................................................. 490 编写 Unprotocol ....................................... 493 结论 ......................................................... 494 第 9章后记 .... 497 番外篇...................................................... 497 Rob Gagnon的故事 ........................... 497 Tom van Leeuwen的故事 .................. 497 Michael Jakl的故事 .......................... 498 Vadim Shalts的故事 .......................... 498 本书是如何诞生的 ................................... 499 消除摩擦.................................................. 500 许可 ......................................................... 502 索引 ................. 503