ZeroMQ:雲時代極速消息通訊庫(大規模|可擴展|低成本|高效率解決之道,大規模分佈式|多線程應用程序|消息傳遞架構構建利器)git
【美】Pieter Hintjens(皮特.亨特金斯)著 程序員
盧濤 李穎 譯github
ISBN 978-7-121-25311-9數據庫
2015年3月出版編程
訂價:108.00元 緩存
536頁服務器
16開網絡
編輯推薦多線程
請潛心研究0MQ(又名ZeroMQ)這個智能套接字庫,它讓你的應用程序可以得到快速、簡便、基於消息的併發性。有了這本快節奏的指南,你將在實踐中學習如何使用這個可擴展、輕量級且高度靈活的網絡工具,從而在集羣、雲服務端等各類多系統環境之間交換消息。架構
0MQ的維護者Pieter Hintjens帶你觀察現實世界的應用程序,並用C語言編寫的擴展例子幫助你使用0MQ的API、套接字和模式。瞭解如何使用特定的0MQ編程技術,構建多線程應用程序,並建立本身的消息傳遞架構。你會學到0MQ如何與多種編程語言和大多數操做系統共用,只有不多的成本或根本沒有成本。
□ 瞭解0MQ的主要模式:請求-應答、發佈-訂閱和管道
□ 經過創建幾個小應用程序來使用0MQ套接字和模式
□ 經過工做實例探索0MQ的請求-應答模式的高級使用
□ 構建一個在代碼或硬件出現故障時保持工做可靠性的請求-應答模式
□ 擴展0MQ的核心發佈-訂閱模式的性能、可靠性、狀態分發與監控
□ 瞭解用0MQ來構建分佈式架構的技術
□ 探索爲分佈式應用程序創建一個通用的框架有什麼要求
內容提要
《ZeroMQ:雲時代極速消息通訊庫》介紹ZeroMQ 的API、套接字和模式的使用。經過創建應用程序來說解如何使用ZeroMQ 編程技術構建多線程應用程序,並建立本身的消息傳遞架構。《ZeroMQ:雲時代極速消息通訊庫》設計了大量工做實例來實現請求- 應答模式的高級使用和容錯性,並對發佈- 訂閱模式的性能、可靠性、狀態分發與監控進行了擴展。
《ZeroMQ:雲時代極速消息通訊庫》面向的讀者是但願製做大規模分佈式軟件的專業程序員和有志於這方面研究的專業人士,旨在幫助他們解決大規模、可擴展、低成本、高效率的問題,書中還展示了ZeroMQ所需的網絡和分佈式計算概念。
目錄
前言 ..................................xix
第1 部分 學習如何使用0MQ 來開展工做
第1 章 基礎知識 ................. 3
修復這個世界 ..................3
本書的讀者對象 ...............5
獲取示例 ..........................5
問過就必有收穫 ...............5
在字符串上的小注解 .....10
版本報告 ........................12
得到消息 ........................12
分而治之 ........................16
用0MQ 編程 .................21
獲取正確的上下文 ..22
執行完全的退出 ......22
爲何咱們須要0MQ ..23
套接字的可擴展性 .........27
從0MQ v2.2 升級到0MQ v3.2 ...............................28
警告:不穩定的典範! ..29
第2 章 套接字和模式 ........ 31
套接字API .....................32
把套接字接入網絡拓撲 .....................................32
使用套接字來傳輸數據 ......................................34
單播傳輸 .................35
0MQ 不是一箇中性載體 ....................................35
I/O 線程 ...................36
消息傳遞模式 ................37
高級別消息傳遞模式 ..........................................38
處理消息 .................38
處理多個套接字 ......41
多部分消息 .............44
中間層及代理 ..........45
動態發現問題 ..........46
共享隊列(DEALER 和ROUTER 套接字) .......48
0MQ 的內置代理功能 .......................................53
傳輸橋接 .................55
處理錯誤和ETERM.......56
處理中斷信號 ................61
檢測內存泄漏 ................63
使用0MQ 編寫多線程程序 ......................................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
用於0MQ 的一個高級別的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
第2 部分 使用0MQ 的軟件工程
第6 章 0MQ 社區 .......... 341
0MQ 社區的架構......... 342
如何製做真正的大型架構 ....................................... 343
軟件架構的心理學 344
合同 ....................... 346
過程 ....................... 348
瘋狂,美麗,而且容易 .................................... 348
陌生人,碰見陌生人 ........................................ 349
無限的財富 ........... 349
照管和培育 ........... 350
0MQ 過程: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
0MQ 的路線圖是如何失去的 .......................... 372
垃圾桶化的設計 .... 374
複雜化的設計 ........ 376
簡約化的設計 ........ 377
職業倦怠 ...................... 379
成功模式 ...................... 380
懶惰的完美主義者 381
仁慈暴君 ............... 381
天和地 ................... 381
門戶開放 ............... 381
大笑的小丑 ........... 382
留心的將軍 ........... 382
社會工程師 ........... 382
不朽的園丁 ........... 382
滾石 ....................... 382
海盜幫 ................... 383
快閃族 ................... 383
加那利看守 ........... 383
執行絞刑的劊子手 383
歷史學家 ............... 383
煽動者 ................... 384
神祕人 ................... 384
第7 章 使用0MQ 的高級架構 .................................... 385
用於彈性設計的面向消息模式 ............................... 386
第1 步:內部化的語義 .................................... 387
第2 步:描繪一個粗略的架構 ......................... 387
第3 步:決定合同 388
第4 步:編寫一個最小的端到端解決方案 ...... 388
第5 步:解決一個問題,而後重複 ................. 389
Unprotocol ................... 389
合同是艱難的 ........ 390
如何編寫Unprotocol ........................................ 391
爲何使用GPLv3 的公開規範 ....................... 392
使用ABNF ............ 393
廉價或討厭的模式 393
序列化數據 .................. 395
0MQ 組幀 ............. 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
精彩節摘
序
ZeroMQ 是iMatix 開發的以消息爲導向的開源中間件庫,它相似於標準Berkeley 套接字,支持多種通訊模式(扇出、發佈- 訂閱、任務分配和請求- 應答)和傳輸協議(進程內、進程間、TCP 和多播),能夠用做一個併發框架。其核心由C 編寫,支持C++、Java 等多種語言的API,能在大部分現代平臺上運行。它的運行速度很快,其異步模型具備高可擴展性。ZeroMQ 中的Zero(零)表明簡約並涵蓋不一樣目標:零代理、零延遲、零管理、零成本等。
本書源自ZeroMQ 的參考手冊,經過社區共同開發而成,數百人爲本書作出了貢獻,包括用各類編程語言編寫的示例。本書也爲運做一個成功的社區提供了範例。
值得一提的是,本書做者Pieter Hintjens 是iMatix 公司的首席執行官,他於2010 年被查出患了晚期癌症,動了屢次手術並化療6 個月,但2011 年仍然堅持繼續完成這本書的寫做。這種奮不顧身的專業精神值得咱們學習。
感謝電子工業出版社計算機出版分社的張春雨編輯選擇咱們翻譯本書,感謝劉舫編輯,她從專業的角度對譯文進行了把關,並進行了許多潤色,使之更具可讀性。
感謝李綠霞、盧林、陳克非、李洪秋、張慧珍、李又及、盧曉瑤、陳克翠、湯有4、李陽、劉雯、賈書民、蘇旭暉對本書翻譯工做作出的貢獻。
還要感謝咱們的兒子盧〇一小朋友,他知道咱們在翻譯書稿就經常本身安靜地讀書和玩耍,還放棄了不少出去玩的機會,讓咱們可以專一於本書的翻譯,本書的出版也有他的一份貢獻。
最後但願這本書對讀者有幫助。但因爲譯者經驗和水平有限,譯文中不免有不妥之處,懇請讀者批評指正!
盧濤 李穎
2014 年12 月8 日
做者簡介
Pieter Hintjens,iMatix公司的CEO和首席軟件設計師,該公司建立了0MQ。他是自由信息基礎設施基金會(FFII)的前任會長,歐洲專利大會和數字標準組織的創辦人,Wikidot公司的前CEO,他仍是0MQ的一位維護者。
媒體評論
本年度你能讀到的最好的愛與套接字的故事。
——Alexis Richardson VMware的高級主管和新人訓練師。
前言
0MQ 的一百字歸納
0MQ(也稱爲ZeroMQ、0MQ 或zmq)看起來像一個可嵌入的網絡庫,但其做用就像一個併發框架。它爲你提供了在各類傳輸工具,如進程內、進程間、TCP 和組播中進行原子消息傳送的套接字。你可使用各類模式實現N 對N 的套接字鏈接,這些模式包括扇出、發佈- 訂閱、任務分配和請求- 應答。它的速度足夠快,所以可充當集羣產品的結構。
它的異步I/O 模型提供了可擴展的多核應用程序,用異步消息來處理任務。它有多種編程語言的API,並可運行在大多數操做系統上。0MQ 是iMatix(http://www.imatix.com)開發的,並在LGPLv3 許可下開源。
零之禪
0MQ 中的0 關乎權衡。一方面,0MQ 這個奇怪的名字使其在谷歌和Twitter 上下降了知名度。另外一方面,它惹惱了一些丹麥人(譯者注:0 是丹麥語字母表中的字母),他們寫給咱們以下的東西,好比「0MG r0tfl」(譯者注:把0 替換成O 後表示「天哪,笑翻了」)、「0 不是一個有趣的零!」(譯者注:早期計算機輸出中用這個符號表示數字0,以便與字母O 區分)和「R0dgr0d med Fl0de!」(這顯然是一種侮辱,意思是「願你的鄰居是格倫德爾的直系後裔!」)(譯者注:在古英國史詩《貝奧武夫》中,格倫德爾是一隻雄性怪獸,這裏做者好像是在誤導,r0dgr0d med fl0de,意爲「澆了奶油的紅莓布丁」,是個很是經典的丹麥語繞口令,它難倒了不少外國人,由於這短短的一句話中包括了三個「0」(兩種不一樣的發音方式)、咽喉擦音r、重音gr 組合和軟化的d(發音相似於英語with 中的th)。)這譭譽參半的兩方面彷佛是一個公平的交易。
最初,0MQ 中的「零」是爲了表示「零代理」和(儘量接近)「零延遲」。但從那時起,它已經涵蓋了不一樣的目標:零管理、零成本、零浪費。更通常的,「零」是指貫穿項目的簡約文化。咱們經過消除複雜性,而不是經過公開新功能來增長威力。
本書的歷程
在2010 年的夏天,0MQ 還是一個名不見經傳的小衆庫,它由至關簡潔的參考手冊和一個活躍但精煉的wiki 來描述。那時,Martin Sustrik 和我坐在布拉迪斯拉發Kyjev 酒店的酒吧裏,密謀如何讓0MQ 得到更普遍的普及。Martin 寫了大部分的0MQ 代碼,而我提供了資金並組織了社區。由於某種緣由,咱們一致認爲0MQ 須要一個更簡單的新網站,並須要爲新用戶寫一本基本指南。
Martin 收集了一些要講解的主題。因爲在此以前,我連一行0MQ 代碼都沒寫過,所以這本書的寫做過程成了一個活學活用的見證。當我經過簡單的例子進入複雜的工做時,我試着回答了不少在郵件列表上見過的問題。由於30 年來我一直在構建大型架構,因此我有不少問題渴望用0MQ 來解決。使人驚訝的是,用0MQ 來解決問題所得到的結果大可能是簡單而優雅的,甚至當我用C 語言工做時,學習0MQ 和用它解決實際問題也會使我感到一種純粹的快樂,這使我在幾年的停頓後,再一次迴歸編程領域。而每每,咱們起初也不知道它「應該」如何完成某項工做,在使用過程當中,咱們不斷地對0MQ 進行着改進。
由於從一開始,我就想把這本指南作成一個社區項目,因此我把它放到GitHub 上,讓別人經過提出請求的方式爲本書作出貢獻。這種作法被某些人認爲是激進的,甚至是低俗的。咱們實現了分工:我負責寫做和製做原始的C 語言示例,其餘人幫助修復文本中的錯誤並把示例翻譯成其餘語言。
這種模式工做得比我想象的更好。如今你能夠找到全部示例的多種語言版本,許多例子甚至有十幾種語言版本。它是一塊編程語言的羅塞塔石碑(譯者注:刻有古埃及國王托勒密五世登基的詔書的石碑。上面用希臘文字、古埃及文字和當時的通俗體文字刻了一樣的內容),這自己就是一個有價值的結果。咱們創建了高分標準:翻譯程度達到80%,每種語言都有本身的指南。PHP、Python、Lua 和Haxe 都達到了這個目標。人們要求咱們建立PDF 文件,咱們就建立好後提供給他們。人們要求提供電子書,他們也如願以償了。目前,這本指南獲得了大約一百多人的幫助。
該指南實現了普及0MQ 的目標。這種風格取悅了大多數人但也惹惱了一些人,這是天然的。2010 年12 月,我在0MQ 和指南上的工做停頓了下來,由於我查出本身患了晚期癌症,動了屢次手術並化療6 個月。當我在2011 年年中再度拾起這項工做時,它開始在能夠想象的最大的用例之一上爆發,即:在全球最大的電子公司的手機和平板電腦上使用0MQ。
可是,本指南的目標從一開始就是一本印刷書籍。因此,在2012 年1 月我收到Bill Lubanovic 發來的一封電子郵件,這是使人興奮的,他把我介紹給O’Reilly 公司的Andy Oram 編輯,建議出一本0MQ 的圖書。「固然!」我說,「可我在哪裏簽名呢?我須要付多少錢?呵呵,我能獲得錢嗎?全部我須要作的就是完成它嗎?」
固然,只要O’Reilly 發佈一本0MQ 圖書,其餘出版社就會開始給潛在的做者發送電子郵件約稿。明年你可能會看到大量的0MQ 圖書現身。這是很好的。咱們的小衆庫已經成爲主流,並值得擁有六英寸的書架空間。我要向其餘0MQ 圖書的做者致歉,咱們已經設置了可怕的高門檻,個人建議是讓你的書具備互補性,也許能夠專一於一種特定的語言、平臺或模式。
這就是社區的神奇和力量:若是你建立的社區能成爲在某一個領域中的第一個社區,並保持健康發展,你就將永遠佔據這個領域的領導地位。
讀者對象
本書是爲專業程序員編寫的,旨在幫助他們瞭解如何製做將主宰將來計算的大規模分佈式軟件。咱們假設你可以閱讀C 代碼,由於這裏的大多數示例都用C 語言編寫(儘管0MQ被用在許多語言中)。咱們假設你關注規模,由於0MQ解決了上述全部其餘的問題。
咱們假設你須要用最少的成本得到最好的結果,由於不然你不會欣賞0MQ 所作的權衡。除了這些基本的背景,咱們還試圖爲你呈現使用0MQ 將須要的全部網絡和分佈式計算的概念。
本書所使用的約定
本書使用如下印刷約定:
斜體(Italic)
用於表示新的術語、命令或命令行選項、URL、電子郵件地址、文件名和文件擴展名。
等寬字體(Constant width)
用於程序清單,以及段落中引用的程序元素,如變量、函數名、數據類型和環境變量。
等寬粗體(Constant width bold)
用於表示由用戶輸入的命令行。
等寬斜體(Constant width italic)
用於表示應被替換爲用戶提供的有意義的值的預留位置。
此圖標表示提示、建議或通常的注意。
中文版書中切口以「 」表示原書頁碼,便於讀者與原英文版圖書對照閱讀,本書的索引中所列的頁碼爲原英文版頁碼。
使用代碼示例
代碼示例都在在線存儲庫中,它位於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)作出的貢獻。