2011-06-01 35 views
14

我已經閱讀了幾乎所有可以在WebSockets上找到的指南和教程,但其中沒有一篇介紹瞭如何有效地使用它們。使用WebSockets ...高效?

有沒有人有任何形式的指導如何做到這一點?我很擔心單個連接可能佔用的帶寬量,特別是當應用程序打開連接時。

+0

其實我認爲主人會做得很好,以保持這些幼犬排隊,或ISP會。 – jcolebrand 2011-06-01 19:31:06

+1

可能,但是一點優化不會傷害,特別是在網絡延遲是一個巨大因素的應用中。 – Alexander 2011-06-01 19:34:23

+1

所以你想爲websockets提供QoS ......或者究竟是什麼?它們的全球最大值?你擔心客戶端還是服務器? – jcolebrand 2011-06-01 19:36:10

回答

26

WebSocket中的效率取決於處理它們的Web服務器的實現和體系結構。與每個Ajax請求中發送的所有不同的HTTP header fieldsHTTP cookies相比,WebSocket是一個非常高效的協議,僅有2字節(!)開銷。

通常,一個高效的websocket網絡服務器應該是事件驅動的(見下面的例子)。相反,實現Web服務器的傳統方式是每個請求產生一個新的線程。但是線程分配很多內存,例如每個線程256MB。因此,如果您的服務器上有1GB內存,則無法同時處理很多請求。但是如果你的服務器是事件驅動的,你的內存使用率將幾乎不變,因爲沒有創建新線程。另請參見Technically why is processes in Erlang more efficient than OS threads?

您可以在WebSocket中發送任何數據。如果客戶端是Web瀏覽器,或者可能是typed arrays,JSON是有效的。如果您的客戶端是自定義應用程序,則可以使用Protocol Buffers。另請參閱Google Wave Client-Server Protocol Whitepaper

您可以使用Twisted(Python)或Netty(Java)實現高效的websocket服務器。 Play Framework是在Netty上實現的Java和Scala的高效Web框架。另一個有效的替代方法是Yaws Web服務器(Erlang)或Node.js + Socket.io(JavaScript)。

作爲應用程序開發人員,您發送的數據越少,服務器上的效率越高(流量越少)和負載越少。

+0

您可以擴展線程可能會耗用256MB的情況嗎?這是否與WebSocket技術有關? – 2016-12-28 05:14:07

+0

線程內存取決於操作系統和技術。通常,64位字節系統上的JVM的線程1024k的內存,而不是256 MB。線程是一個輕量級的進程,而不是整個操作系統。 – user3000951 2016-12-28 03:46:43