2017-08-12 95 views
0

我正在製作一個應用程序,用戶要與之交互以收集各種數據(以各種方式編譯來自多個物理設備的數據)。關於構建單客戶端服務器應用程序的建議

爲此,我決定使用基於Web的用戶界面,因此大部分應用程序都在控制設備的「服務器」上運行,並使用websockets與此UI進行通信。我已使用Autobahn(在用於處理設備的各種其他軟件包中)在Python中編寫了此服務器。

應用自然有很多狀態:何時收集數據,收集哪些數據,把它放在哪裏,等等

不顧一切爲設備代碼,主服務器佈局像:

. 
├── handlers 
│   ├── handler1.py 
│   └── handler2.py 
├── router.py 
└── server.py 

現在我有主服務器的對象(AutobahnWebSocketServerFactory),該公司擁有國家作爲一個枚舉。它還擁有一臺路由器,它將來自客戶端的消息傳遞給它。路由器將這些消息路由到正確的處理程序,該處理程序對消息作出反應併發送響應。

處理程序需要訪問服務器的狀態,並且還能夠更改它。然而,給每個處理程序提供一個服務器對象的引用感覺就像是糟糕的形式(例如,如果我想在處理程序中導入服務器以執行靜態類型檢查,那麼我會得到循環導入:server -> router -> handler1 -> server)。

什麼是結構良好的方式來處理這種良好的形式?我在這裏應該試圖遵循的有用的設計模式,我明顯忽略了嗎?

可能注意到:爲了讓服​​務器控制各種設備,我使用的是發佈/訂閱系統。這使得各種處理程序(以及我正在使用的類來收集和存儲我想要的數據)很容易簡單地訂閱來自設備的數據流。

回答

0

整個服務器的全局狀態是一個非常糟糕的主意。想象一下你有100個客戶,他們同時發送不同的請求。服務器狀態的競爭條件會導致在最壞的情況下以最好或無法回答的方式拒絕服務。所以你需要以某種方式重新考慮請求路由和服務器行爲。如果可能的話,服務器應該將請求發送到處理程序,或者放入隊列一段時間或拒絕請求。

作爲一個可能的解決方案,路由器將收集類似的請求,然後發送給處理批量的工作,路由器開關內部狀態,然後得到的結果,更新其狀態和數據返回到服務器 服務器(解析請求) - >路由器(有狀態) - >處理器1 - >路由器(有狀態) - >服務器(準備響應)

更新我只注意到你有單個客戶端。

無論如何,我建議服務器不應該有狀態和路由器(aka控制器)調度處理程序denepnding在其內部狀態

相關問題