2017-07-31 30 views
-2

想象一下,我有一臺服務器可以以每秒10000條消息的速度生成消息。但是我的客戶端每秒最多隻能接收1000條消息。套接字,消息速率限制器Java

系統1 如果我的系統在1毫秒內發送1000條消息,然後對剩下的999毫秒不做任何處理。

系統2 我的系統每毫秒發送1條消息,因此在1000毫秒(1秒)內它將發送1000條消息。

Q1)考慮到客戶端每秒最多可處理500條消息,哪個系統更好?

Q2)系統1對客戶端的影響是什麼?它會壓倒客戶嗎?

感謝

回答

0

威爾它壓倒客戶端:這取決於你的消息的大小,和插座緩衝區大小。發送者發送的消息被緩衝。如果客戶端因緩衝區已滿而無法使用,則發件人正在使用的輸出流將被阻止。當客戶端消費了一些消息時,發件人可以繼續寫入,因爲他的OutputStream被解鎖。

Windows系統上的典型緩衝區大小爲8192字節,但OS的大小可能因操作系統和OS中的設置而異。

所以系統1不會壓倒客戶端,它會在某個時刻阻塞。

什麼是最好的方法僅取決於您的應用程序的設計。

例如:在通過USB寫入Arduino(不是套接字客戶端,但其他問題相同)時,我遇到了類似的問題。在我的問題中,緩衝的消息出現問題,因爲它是面部跟蹤相機的位置。當Arduino讀取它們時,緩衝位置不再相關,但它必須處理它們,因爲這樣的緩衝區是一個隊列,並且如果讀出舊緩衝區,則只能得到最近的緩衝區。 Arduino永遠無法跟上產生的消息,因爲當新的位置到達Arduino代碼時,它已經過時了。所以這是一個「壓倒性的」。

我通過使用雙向通信解決了這個問題。 Arduino會發送一條消息給製作人說:READY(接收消息)。然後製片人會發送一個(最新)臉部追蹤位置。然後Arduino重新定位相機並請求一條新消息。這樣,有一種流量控制,阻止生產者溢出Arduino。

0
  1. 兩者都不是更好。無論你自己做什麼,TCP都會改變實際流量。
  2. 也不會壓倒客戶。如果客戶端沒有跟上,它的套接字接收緩衝區將被填滿,因此請將你的套接字發送緩衝區,最終你會阻止發送,或者如果你處於非阻塞模式,就會得到EAGAIN/EWOULDBLOCK。