再見,Netty!你好,smart-socket!

再見,Netty

Netty,當前最流行的NIO框架,通訊領域開發的不二之選。通過多年的發展,已在互聯網領域、大數據分佈式計算領域、遊戲行業、通訊行業等得到了普遍的應用,一些業界著名的開源組件也基於Netty的NIO框架構建。目前市面上幾乎找不到同類型能夠與之媲美的通訊框架,可是做爲通訊技術的愛好者,卻向來沒法對其產生親近感。html

我並不否定Netty的確是一款優秀的框架,曾經我也本身寫過NIO框架,深知其實現難度有多大,最終選擇了放棄。Netty的出現爲廣大程序員提供了便利,大大下降了開發高效、穩定服務的難度。至於本人對其無好感,究其緣由有如下幾點(首先申明一下,本人僅曾經簡單使用過netty,並未深刻研究):git

  • 複雜;如下代碼摘錄自Netty官網,初看代碼,應該大部分人對於run方法比較費解。EventLoopGroup是幹嗎的?bossGroupworkerGroup是什麼關係?childHandle入參如此複雜!ch.pipeline().addLast(new DiscardServerHandler())實現的是什麼功能?等等...。總之,這一個方法會引起你諸多疑惑。
public class DiscardServer {
    
    private int port;
    
    public DiscardServer(int port) {
        this.port = port;
    }
    
    public void run() throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap(); // (2)
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class) // (3)
             .childHandler(new ChannelInitializer<SocketChannel>() { // (4)
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ch.pipeline().addLast(new DiscardServerHandler());
                 }
             })
             .option(ChannelOption.SO_BACKLOG, 128)          // (5)
             .childOption(ChannelOption.SO_KEEPALIVE, true); // (6)
    
            // Bind and start to accept incoming connections.
            ChannelFuture f = b.bind(port).sync(); // (7)
    
            // Wait until the server socket is closed.
            // In this example, this does not happen, but you can do that to gracefully
            // shut down your server.
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
    
    public static void main(String[] args) throws Exception {
        int port;
        if (args.length > 0) {
            port = Integer.parseInt(args[0]);
        } else {
            port = 8080;
        }
        new DiscardServer(port).run();
    }
}
  • 臃腫;下載Netty源碼後,你會看到它的工程裏有二十幾個模塊。發展了這麼多年,它已然成了一個龐然大物。再加上其高深的設計哲學,以至於吾等凡夫俗子難以經過閱讀源碼領悟其精髓。
  • 面試必問;有過幾年工做經歷後再去面試,基本都會遭遇被問及Netty相關問題的狀況。彷佛沒用過Netty你就不是一個合格的程序猿,不懂Netty線程模型就要給你的技術能力打上一個問號。親身經歷,不爽!也不屑去背網上那些相關的理論,不務實。
  • Netty解決了人們工做上的困擾,但同時它也限制了不少Java開發人員的技術成長。有些同窗花費幾十元RMB購買Netty相關的書籍,可不管書讀的有多麼透徹,也只是茶餘飯後與同行有一些談資,又不能讓你也有能力寫一個Netty出來。

Netty是一條橫跨在你與通訊領域之間的河,你能夠遠觀河對岸的景色,卻沒法近距離感覺其魅力。結合對Netty的我的成見,是時候跟Netty說再見了,或者說回頭見。工做中能夠採用Netty,出於學習目的則能夠考慮一下本文的主角:smart-socket。程序員

你好,smart-socket

這也是一款通訊框架,並且是一款沒有資格與Netty相提並論的國產開源項目,至少現階段是如此。smart-socket是學習的產物,是做者在學習AIO過程當中逐漸優化改進而成。本文的目的也是但願能夠把smart-socket介紹給你們,讓你們瞭解到有那麼一波人,不安於已有的優質解決方案,致力於經過重複造輪子的形式,爲這個開源社區注入新鮮血液。面試

Java於1.7版本提供了AIO通訊API,Netty曾經也發佈過AIO版,但最終仍是選擇了放棄,聽說是因爲性能改善並不顯著。但經過開發smart-socket,本人有一點愚見。Java AIO已經將Socket編程門檻降到了一個很是低的程度。只要該技術點獲得普及,會有不少AIO框架如雨後春筍般冒出來,有點技術能力的朋友均可以開發一套屬於本身的通訊框架。而Netty基於AIO的實現方案,至關於革了本身的命,在NIO上實現異步非阻塞通訊並達到目前這種成就所付出的成本不言而喻,但AIO卻讓這一切來得很是低廉,導致Netty陷入了進退兩難的局面,總很差捨棄過去在NIO模式上的付出吧。純屬我的YY,不喜勿噴,哈哈。編程

smart-socket經歷了五個月的發展,並在開源中國平臺上發佈了四個版本,始終秉持着極簡、易用、高性能的原則。項目可從碼雲中下載:smart-socket,歡迎各位下載。接下來正式開始王婆賣瓜,自賣自詡。服務器

  • 極簡
    何爲「簡」,代碼量少即爲「簡」。smart-socket初期的實現僅用了11個文件514行代碼。這樣的一款框架應該極具吸引力了吧,意味着你只要理解這514行代碼,就能夠完全掌握AIO技術。不過隨後的版本中增長了一些輔助編解碼的工具類,致使代碼量有所增長,但仍是不到800行。
  • 易用
    何爲「易」,學之輕鬆,使之便捷即爲「易」。smart-socket只需熟悉三個接口(Filter、MessageProcessor、Protocol),三個類(AioSession、AioQuickServer、AioQuickClient)便可玩轉Socket。
  • 高性能
    參見《每秒處理 500W 條消息,人、機爲之顫抖》,很多朋友不承認這種測試方式。假設採用一樣的測試方式,Netty每秒處理400W,那smart-socket這500W的數據是否更有說服力。
    此處再提供一份某網友的測試數據,該網友測試的關注點在於smart-socket創建鏈接的性能:
    • 測試環境: CPU E3-1231 v3 @ 3.40GHz,8核,內存16G
    • 測試結果:每秒處理8000個長鏈接請求,服務器總鏈接數達18W(調整配置項後每秒創建鏈接數1W左右)

smart-socket的定位很純粹,僅僅負責協調數據讀寫資源,最大化的發揮系統性能,用戶只需關注協議編解碼以及消息的業務處理。smart-socket不會包攬通訊層面方方面面的功能,但願每個使用smart-socket的朋友,能夠經過它加深對socket的理解與認知。若是您是對Socket技術有濃厚興趣的朋友,很是歡迎體驗如下smart-socket。架構

相關文章
相關標籤/搜索