2012-10-19 22 views
23

所以我使用node.js和socket.io。我有這個小程序將文本框的內容發送到node.js服務器。然後,服務器將其中繼到其他連接的客戶端。有點像聊天服務,但不完全。我可以通過socket.emit發送多少數據?

無論如何,如果用戶輸入2-10k價值的文本並嘗試發送該文件呢?我知道我可以嘗試一下,看看自己,但我正在尋找一個實用的最佳實踐限制,即可以通過發射完成多少數據。

+2

您可以根據需要發送儘可能多的數據。即使是大視頻文件。這裏唯一的問題是可擴展性,即您想要廣播多少用戶?但是無論如何你會遇到這些問題。 – freakish

+0

當我發射20Mb文件數據作爲base64encoded字符串,然後在房間內的其他人能夠接收,但如果它是多於23MB文件數據不能夠接收..有沒有我的任何解決方案 –

回答

59

節點和socket.io沒有任何內置的限制。你不必擔心的是消息大小,每秒發送的消息數量,連接的客戶端數量以及服務器可用的帶寬之間的關係,換句話說,沒有簡單的答案。

讓我們考慮一個10 kB的消息。當有10個客戶端連接時,這相當於服務器必須推出的100 kB數據,這是完全合理的。添加更多的客戶端,並且事情變得更加苛刻:10 kB * 5,000客戶端= 50 MB。當然,你還必須考慮協議開銷的數量:每個數據包,TCP增加20個字節,IP增加20個字節,以太網增加14個字節,總共54個字節。假設一個1500字節的MTU,你看每個客戶端8個數據包(不考慮重傳)。這意味着您將通過線路爲每個客戶端發送8 * 54 = 432字節的開銷+ 10 kB有效負載= 10,672字節。

10.4 kB * 5000 clients = 50.8 MB。

在100 Mbps鏈接,你看理論最小值4.3一秒鐘來傳送10KB的消息,5000個客戶,如果你能鏈接飽和。當然,在現實世界中丟棄的數據包和損壞的數據需要重新發送,這將需要更長的時間。

即使發送10 kB到5000個客戶端的時間非常保守,估計時間爲8秒,但在每隔10-20秒發送一次消息的聊天室中,這可能就沒有問題。

因此,其實可以歸結爲幾個問題,按重要性順序:

  1. 多少帶寬將您的服務器(S)有可用?
  2. 將同時連接多少個用戶?
  3. 每分鐘發送多少封郵件?

回答這些問題時,您可以確定您的基礎結構將支持的最大消息大小。

+1

這是一個很棒的答案。感謝您在較低的層面解釋它。但是,每個客戶端的8個數據包來自哪裏?另外,出於某種原因,我在考慮有512字節的限制或類似的套接字。不知道我在哪裏。大聲笑。謝謝 – cbmeeks

+1

使用1500 B的以太網[MTU](http://en.wikipedia.org/wiki/Maximum_transmission_unit),每個數據包的最大有效負載大小爲1500 B - 40 B(TCP + IP開銷)= 1460 B.要發送10,240B數據,必須發送至少8個數據包(1460 * 7 = 10220 - 不夠;還有20個字節要發送,1460 * 8 = 11,680)。 – josh3736

+0

太棒了。這8個數據包是同時發送還是串行發送?或者以某種隨機順序?我知道這是一個小故事,但我很欣賞答案。 :-) – cbmeeks

2

2-10k很好,沒有任何強制性的限制或任何東西,它只是歸結爲帶寬和實用性。10k雖然在事物的宏偉計劃中很小,所以如果這有點兒上限爲你。

+2

CPU也可能是一個瓶頸。我假設每個人都忽略了CPU,因爲他的信息非常大而且很少。導致網絡瓶頸先出現... –