我的應用程序不是基於web的,只需要使用套接字來服務1000個客戶端。吞吐量和延遲對我而言至關重要。目前使用NIO的select()
,但考慮轉向NIO.2中的異步IO。什麼是異步I/O的主要用例
- 何時應該使用異步I/O?
- 異步I/O的主要用例是什麼?
我的應用程序不是基於web的,只需要使用套接字來服務1000個客戶端。吞吐量和延遲對我而言至關重要。目前使用NIO的select()
,但考慮轉向NIO.2中的異步IO。什麼是異步I/O的主要用例
如果您使用Infiniband網絡,我會建議看看異步IO。
Comparing Java 7 Async NIO with NIO.
但是,如果您使用的是常規的以太網,它只是作爲可能較慢更快。編碼比使用非阻塞IO更復雜,這比使用阻塞IO更復雜。
如果延遲是最重要的,我建議你看看使用像Solarflare這樣的內核旁路網絡適配器。但是,如果您能夠接受100微秒的延遲,則不太可能需要此功能。
在需要擴展以處理許多併發連接的情況下,異步IO非常適用。從歷史上看,這樣做的一種方式是每個連接專用一個線程,但這種方法的侷限性爲you can read about here。使用異步IO,您可以使用較少的線程更輕鬆地處理許多事情,從而實現更好的擴展。
取決於問題,它可能或可能不是正確的方法,因爲在延遲方面沒有任何東西可以擊敗單個線程。但是,這是一個非常極端的事情,意味着你關心的是微秒。在許多情況下,是延遲和吞吐量/可擴展性之間的折衷。
無論如何,這取決於你想要解決什麼,以及你的期望(數字)是什麼。異步IO很好,很多情況下都是同步的。還可能有其他一些你可能想要考慮的事情,例如協議。對相同數據感興趣的多個客戶端(流式傳輸)可能表明您想查看多播。如果每個客戶端的流量都是專用的,那麼這可能不是方法。
不知道您的延遲要求,但假設它們不在幾微秒內,我肯定會查看異步IO,只是讀取您擁有1000個客戶端。異步IO的速度並不慢,同步/單線程連接可能不適合您。
當CPU /線程需要等待某些硬件響應時使用異步 - 異步允許線程中的CPU週期在此時執行其他操作。如果CPU /線程正在忙於工作(這意味着您的瓶頸不是I/O),則這沒有用。 –