java - 面試題,10w臺設(shè)備要求查詢在線狀態(tài),應該用什么技術(shù)?
問題描述
對于高并發(fā)不太了解,這種應該怎么處理?高并發(fā)有什么入門書籍嗎
問題解答
回答1:直接用TCP 長連接~ 智能家居一般 MQTT 協(xié)議比較多~~長連接比輪詢省太多資源了~單機情況下還是可以實現(xiàn)的,當然,算上數(shù)據(jù)庫就另說了。
回答2:這里想考察你對分布式架構(gòu)的認識,就這個問題應該是想考察你對于服務發(fā)現(xiàn)(service discovery)的認識。分布式就是把一個大型項目進行模塊化拆分,然后各模塊在做集群部署,前端有一個路由服務器來對到達的請求進行分發(fā),把到達的請求路由到能夠提供服務的服務端,而哪臺服務器能夠提供服務這就是服務發(fā)現(xiàn)所要做的事情,而在集群環(huán)境下能夠提供相等服務的服務器肯定不止一臺,那到底該由那臺服務器對用戶的請求進行處理并響應呢?這就又引出了負載均衡,由負載均衡層通過特定的算法來判斷應該由那臺服務器提供服務,目的就是均勻的把請求分發(fā)給各個服務端。服務發(fā)現(xiàn)可以了解下Apache的zookeeper或者Netflix的Eureka。微服務這塊spring cloud提供了全套的解決方案,還有阿里的dubbo
回答3:分布式session管理
回答4:我出個簡單一點方案給設(shè)備安裝一個代理進程,設(shè)備啟動時啟動該進程,然后由進程主動定時向服務器上報設(shè)備狀態(tài),如果超過一定周期沒上報就認為該設(shè)備已經(jīng)離線
回答5:高并發(fā),異步通信。java 的話。。。 經(jīng)典的 netty ?個人意見,按目前的單機性能,100k并發(fā)單機能撐住,分布式處理不是必選項,當然要是算上數(shù)據(jù)庫存儲什么的就另說了。
回答6:假如不考慮長連接的話,有個思路 利用redis設(shè)置一個每個設(shè)備上線flag并設(shè)置其一個有效時間 客戶端每次做上行請求的時候刷新該有效時間 每次統(tǒng)計redis在線狀態(tài)設(shè)備數(shù)量就好了 這里關(guān)鍵是這個時間的長度怎么來定 因為一直是做后端的 不清楚這里客戶端不活躍的情況下能保持在線多久 是否有類似守護進程之類的
回答7:把數(shù)據(jù)存儲在redis里面,存取相對于db快
回答8:是我的話,我會這樣做:新建一個MySQL內(nèi)存表(ENGINE=MEMORY):online(user_id, update_time)用update_time記錄用戶最近訪問時間.比如可以假設(shè)在5分鐘以內(nèi)的用戶都認為在線.
回答9:可以分層實現(xiàn),舉個例子,比如10w臺機器,分別向10臺機器上報本機狀況,10w臺怎么對應10臺,可以通過hash映射的方式,然后這10臺機器再把出現(xiàn)故障的機器向一個固定的主機上報情況,大概意思就是10w-->10-->1,上述例子可能存在單點故障,可以通過改變上層機器數(shù)解決單點故障
相關(guān)文章:
