[英]Benefits of Netty over basic ServerSocket server?
我需要創建一個相對簡單的Java tcp / ip服務器,我在確定是否應該使用像Netty這樣的東西或只是堅持使用簡單的ServerSocket和InputStream / OutputStream時遇到一些麻煩。
我們真的只需要監聽請求,然后將新客戶端Socket傳遞給新線程中的某些處理代碼。 一旦處理完成並發送響應,該線程將終止。
我喜歡Netty中管道,解碼器等的想法,但對於這樣一個簡單的場景,似乎不值得增加前期開發時間。 對我們的初始要求來說似乎有點矯枉過正,但我有點緊張,有很多事情我不考慮。 如果有的話,Netty對這些簡單要求有什么好處? 我沒有考慮什么?
Netty的主要優點是簡單地使用流來讀取和寫入套接字是Netty支持非阻塞的異步I / O (使用Java的NIO API); 當您使用流來從套接字讀取和寫入時(並且為從ServerSocket
接受的每個連接啟動新線程),您正在使用阻塞的同步I / O.
Netty方法可以更好地擴展,如果您的系統需要能夠同時處理多個(數千個)連接,這一點非常重要。 如果您的系統不需要擴展到許多同時連接,那么使用像Netty這樣的框架可能不值得。
更多背景信息:線程是操作系統中相對昂貴的資源。 每個線程需要堆棧的內存(例如可以是2 MB的大小)。 當你創建數千個線程時,這將耗費大量內存; 此外,操作系統對可以創建的線程數量有限制。 因此,您不希望為每個接受的連接啟動新線程。 異步I / O的想法是將線程與連接分離(沒有一對一的關系)。 可以有多個連接而不是線程,並且每當某個連接上發生某些事件時(例如,接收到數據),就會臨時使用來自線程池的線程來處理該事件。
我認為使用netty的好處不是立竿見影的,但實際上在需求發生變化並且項目維護變得更加復雜時會更晚 。 Netty帶來了對HTTP協議的內在理解,因此您可以提供簡單的RESTful Web服務 。 此外,您還可以選擇使用netty作為框架提供的異步請求處理 ,以便您可以獲得更好的性能並提供幾個數量級的並發請求。
首先,編寫服務的邏輯,使其獨立於您的通信層。
正如Victor Sorokin所說,自己做這件事有一個學習優勢。 所以用套接字編寫它應該是值得的。 這將需要較少的努力才能開始,如果它運作良好,那么你將參加比賽。
如果您發現以后需要更高的可擴展性/健壯性,可以切換到netty。 只需編寫一個新的netty層,為您的服務邏輯層進行通信並將其交換出來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.