先說場景,當前有一臺服務器,和400臺客戶端。
客戶端需要時時上報設備資訊(電量、充電狀態、任務進度等資訊)。
服務端也有一定可能下發任務(或許控制某一臺設備重啟,或者控制某一個設備關機之類的)。
……
當前的解決方案是,服務端寫了一個asp.net api介面,客戶端時時上報。
原本呢,我是每秒鐘上報一次的。。負荷太大了,最后降低為10秒上報一次。。。后來改成了30秒上報一次。
而照成的后果,就是服務端下發命令變得不再及時,比如我看到設備的某個頁面,需要截圖,
這時候服務端下發個截圖命令,運氣不好,30秒后,螢屏畫面早就變更了。
……
這時候我就想,有其他方案么,socket可以么,應該是實時的吧。
這個我接觸的不多,只有學習的時候,做過幾個tcp和udp的demo,不是太了解在負荷方面的情況。
……
寫到這里,突然感覺問題有些歪了,額,socket的負荷,應該和客戶端上報資料的頻率有關系吧。
我假設,socket客戶端上報資料的頻率和http一致。
更準確的說,我保持長鏈接,只希望達到兩個目的:(1、心跳,監控設備是否存活。2、命令的及時下發)。
我不了解socket保持長鏈接的機制,不知道這樣一直連接在一起,會不會一直有資料交流,會不會加大負荷,所以來詢問一個問題。
如果有因為不懂而問的比較傻的,還請見諒。。。唉。
uj5u.com熱心網友回復:
WebSocketuj5u.com熱心網友回復:
這種場景是需要一個tcp服務器,而不是http服務器如果由于其他原因一定要http的話,也可以采用websocket
幾百個長連接對服務器來說根本不是什么事
uj5u.com熱心網友回復:
任務給個優先級,實時任務優先級高,優先執行。常規任務有空在執行。現實也是如此,“客戶投訴優先處理,常規開發延后”
也可以跟現實一樣,把投訴和開發分開,一般公司也是這么做,有開發做開發的,做支持先應付投訴
so,新建“支持組”---------redis,etcd,consel都行,你們“投訴”的(也就是你說常規資訊上報)直接走這邊。
需要實時控制的,另外走。sokect,kafaka,mq,websockect,rpc都成。個人建議kafaka,mq,因為還是“分開”思路,網路復雜,最好不要直連,分開處理。當然這是異步的,這個其實沒啥辦法,畢竟網路在那里,延遲在那里,你就是用teamview遠程管理,一樣會延遲,網路不好,teamview延遲30秒不也是非常正常的
uj5u.com熱心網友回復:
電量、充電狀態 ------就屬于常規,高頻,可拋棄的資料,系統需要,但是有不一定非要嚴格執行。10秒前的電量重要么,其實不重要,所以就算10秒前那個電量我沒收到也沒問題,只有你現在最新的電量我收到了。當然如果2分鐘我都沒收到最新的,我就要問一下,你還在不在了uj5u.com熱心網友回復:
同上, 你這是在做運控嘛?個人建議 搭建tcp服務器
uj5u.com熱心網友回復:
了解一下websocket你就會知道ajax輪訓和http長連接多不好用了
uj5u.com熱心網友回復:
你這個需求 就需要 服務器推送了, 但是http 沒有推送, 可以采用 websocket 或者 寫個 tcp的服務端吧uj5u.com熱心網友回復:
1.tcp自帶live機制,不過據說有坑,所以,最保險的方法,就是自己實作心跳包,實際上就是定時發一個小包就行了,這樣你就能及時知道設備是否在在線,因為有時候,可能是網路故障,或者設備故障,可能性很多,你后臺只需要監聽客戶端的包即可,超過一個時間,比如2S沒有收到資料,就可以認為設備下線了.2,對于一個tcpserver來說,400個同時連接是小意思了
所以,考慮你的需求,別用http協議了,直接用tcp協議吧,直接用c/s做個tcpserver就可以了
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/124811.html
標籤:ASP.NET
上一篇:API函式呼叫 易語言
下一篇:C#關于抓拍機的問題
