前言
大約在2008年的時候,我參與設計和開發的一個電信系統在月初出帳期,總是發生大量的連接超時和讀寫超時異常,業務的失敗率相比于平時高了很多,報表中的很多指標都差強人意。后來經過排查,發現問題的主要原因出現在下游網元的處理性能上,月初的時候BSS出帳,在出帳期間BSS系統運行緩慢,由于雙方采用了同步阻塞式的HTTP+XML進行通信,導致任何一方處理緩慢都會影響對方的處理性能。按照故障隔離的設計原則,對方處理速度慢或者不回應答,不應該影響系統的其他功能模塊或者協議棧,但是在同步阻塞I/O通信模型下,這種故障傳播和相互影響是不可避免的,很難通過業務層面解決。
受限于當時Tomcat和Servlet的同步阻塞I/O模型,以及在Java領域異步HTTP協議棧的技術積累不足,當時我們并沒有辦法完全解決這個問題,只能通過調整線程池策略和HTTP超時時間來從業務層面做規避。
2009年,由于對技術的熱愛,我作為業務骨干被領導派去參加一個重點業務平臺的研發工作,與兩位資深的架構師(其中一位工作20年,做華為交換機出身)共同參與。這是我第一次全面接觸異步I/O編程和高性能電信級協議棧的開發,眼界大開——異步高性能內部協議棧、異步HTTP、異步SOAP、異步SMPP……所有的協議棧都是異步非阻塞。后來的性能測試表明:基于Reactor模型統一調度的長連接和短連接協議棧,無論是性能、可靠性還是可維護性,都可以“秒殺”傳統基于BIO開發的應用服務器和各種協議棧,這種差異本質上是一種代差。
在我從事異步NIO編程的2009年,業界還沒有成熟的NIO框架,那個時候Mina剛剛開始起步,功能和性能都達不到商用標準。最困難的是,國內Java領域的異步通信還沒有流行,整個業界的積累都非常少。那個時候資料匱乏,能夠交流和探討的圈內人很少,一旦踩住“地雷”,就需要夜以繼日地維護。在隨后2年多的時間里,經歷了10多次的在通宵、凌晨被一線的運維人員電話吵醒等種種磨難之后,我們自研的NIO框架才逐漸穩定和成熟。期間,解決的BUG總計20~30個。
從2004年JDK1.4首次提供NIO 1.0類庫到現在,已經過去了整整10年。JSR 51的設計初衷就是讓Java能夠提供非阻塞、具有彈性伸縮能力的異步I/O類庫,從而結束Java在高性能服務器領域的不利地位。然而,在相當長的一段時間里,Java的NIO編程并沒有流行起來,究其原因如下。
1.大多數高性能服務器,被C和C++語言盤踞,由于它們可以直接使用操作系統的異步I/O能力,所以對JDK的NIO并不關心;
2.移動互聯網尚未興起,基于Java的大規模分布式系統極少,很多中小型應用服務對于異步I/O的訴求不是很強烈;
3.高性能、高可靠性領域,例如銀行、證券、電信等依然以C++為主導,Java充當打雜的角色,NIO暫時沒有用武之地;
4.當時主流的J2EE服務器,幾乎全部基于同步阻塞I/O構建,例如Servlet、Tomcat等,由于它們應用廣泛,如果這些容器不支持NIO,用戶很難具備獨立構建異步協議棧的能力;
5.異步NIO編程門檻比較高,開發和維護一款基于NIO的協議棧對很多中小型公司來說像是一場噩夢;
6.業界NIO框架不成熟,很難商用;
7.國內研發界對NIO的陌生和認識不足,沒有充分重視。
基于上述幾種原因,NIO編程的推廣和發展長期滯后。值得欣慰的是,隨著大規模分布式系統、大數據和流式計算框架的興起,基于Java來構建這些系統已經成為主流,NIO編程和NIO框架在此期間得到了大規模的商用。在互聯網領域,阿里的分布式服務框架Dubbo、RocketMQ,大數據的基礎序列化和通信框架Avro,以及很多開源的軟件都已經開始使用Netty來構建高性能、分布式通信能力,Netty社區的活躍度也名列前茅。根據目前的信息,Netty已經在如下幾個領域得到了大規模的商業應用。
1.互聯網領域;
2.電信領域;
3.大數據領域;
4.銀行、證券等金融領域;
5.游戲行業;
6.電力等企業市場。
2014年春節前,我分享了一篇博文《Netty5.0架構剖析和源碼解讀》,短短1個月下載量達到了4000多。很多網友向我咨詢NIO編程技術、NIO框架如何選擇等問題,也有一些圈內朋友和出版社邀請我寫一本關于Netty的技術書籍。作為最流行、表現最優異的NIO框架,Netty深受大家喜愛,但是長期以來除了UserGuide之外,國內鮮有Netty相關的技術書籍供廣大NIO編程愛好者學習和參考。由于Netty源碼的復雜性和NIO編程本身的技術門檻限制,對于大多數讀者而言,通過自己閱讀和分析源碼來深入掌握Netty的設計原理和實現細節是件困難的事情。從2011年開始我系統性的分析和應用了Netty和Mina,轉瞬間已經過去了3年多。在這3年的時間里,我們的系統經受了無數嚴苛的考驗,在這個過程中,對Netty和Mina有了更深刻的體驗,也積累了豐富的運維和實戰經驗。我們都是開源框架Netty的受益者,為了讓更多的朋友和同行能夠了解NIO編程,深入學習和掌握Netty這個NIO利器,我打算將我的經驗和大家分享,同時也結束國內尚無Netty學習教材的尷尬境地。
聯系方式
盡管我也有技術潔癖,希望諸事完美,但是由于Netty代碼的龐雜和涉及到的知識點太多,一本書籍很難涵蓋所有的功能點。如有遺漏或者錯誤,懇請大家能夠及時批評和指正,如果你有好的建議或者想法,也可以聯系我。我的聯系方式如下。
郵箱:neu_lilinfeng@sina.com。
新浪微博:Nettying。
微信:Nettying。
致謝
如果說個人能夠改變自己命運的話,對于程序員來說,唯有通過不斷的學習和實踐,努力提升自己的技能,才有可能找到更好的機會,充分發揮和體現自己的價值。我希望本書能夠為你的成功助一臂之力。
感謝博文視點的策劃編輯丁一瓊和幕后的美編,正是你們的辛苦工作才保證了本書能夠順利出版;感謝華為Netty愛好者和關注本書的領導同事們的支持,你們的理解和鼓勵為我提供了足夠的勇氣。感謝我的家人和老婆的支持,寫書占用了我幾乎所有的業余時間,沒有你們的理解和支持,我很難安心寫作。
最后感謝Netty中國社區的朋友,我的微博粉絲和所有喜歡Netty的朋友們,你們對技術的熱情是鼓勵我寫書的最重要動力,沒有你們,就沒有本書。希望大家一如既往的喜歡NIO編程,喜歡Netty,以及相互交流和分享,共同推動整個國內異步高性能通信領域的技術發展。
李林鋒
5月11日于南京紫軒閣