想象一下,我有一臺服務器可以以每秒10000條消息的速度生成消息。但是我的客戶端每秒最多隻能接收1000條消息。套接字,消息速率限制器Java
系統1 如果我的系統在1毫秒內發送1000條消息,然後對剩下的999毫秒不做任何處理。
系統2 我的系統每毫秒發送1條消息,因此在1000毫秒(1秒)內它將發送1000條消息。
Q1)考慮到客戶端每秒最多可處理500條消息,哪個系統更好?
Q2)系統1對客戶端的影響是什麼?它會壓倒客戶嗎?
感謝
想象一下,我有一臺服務器可以以每秒10000條消息的速度生成消息。但是我的客戶端每秒最多隻能接收1000條消息。套接字,消息速率限制器Java
系統1 如果我的系統在1毫秒內發送1000條消息,然後對剩下的999毫秒不做任何處理。
系統2 我的系統每毫秒發送1條消息,因此在1000毫秒(1秒)內它將發送1000條消息。
Q1)考慮到客戶端每秒最多可處理500條消息,哪個系統更好?
Q2)系統1對客戶端的影響是什麼?它會壓倒客戶嗎?
感謝
威爾它壓倒客戶端:這取決於你的消息的大小,和插座緩衝區大小。發送者發送的消息被緩衝。如果客戶端因緩衝區已滿而無法使用,則發件人正在使用的輸出流將被阻止。當客戶端消費了一些消息時,發件人可以繼續寫入,因爲他的OutputStream被解鎖。
Windows系統上的典型緩衝區大小爲8192字節,但OS的大小可能因操作系統和OS中的設置而異。
所以系統1不會壓倒客戶端,它會在某個時刻阻塞。
什麼是最好的方法僅取決於您的應用程序的設計。
例如:在通過USB寫入Arduino(不是套接字客戶端,但其他問題相同)時,我遇到了類似的問題。在我的問題中,緩衝的消息出現問題,因爲它是面部跟蹤相機的位置。當Arduino讀取它們時,緩衝位置不再相關,但它必須處理它們,因爲這樣的緩衝區是一個隊列,並且如果讀出舊緩衝區,則只能得到最近的緩衝區。 Arduino永遠無法跟上產生的消息,因爲當新的位置到達Arduino代碼時,它已經過時了。所以這是一個「壓倒性的」。
我通過使用雙向通信解決了這個問題。 Arduino會發送一條消息給製作人說:READY(接收消息)。然後製片人會發送一個(最新)臉部追蹤位置。然後Arduino重新定位相機並請求一條新消息。這樣,有一種流量控制,阻止生產者溢出Arduino。