是這樣的,我要操作一個智慧燈泡,目前是這樣做的,我在網(wǎng)頁上操作,然後把資料透過http提交存到資料庫,有一個客戶端發(fā)起一個socket連接,連接到服務(wù)端,服務(wù)端是死循環(huán)地從資料庫裡面取出資料給客戶端,每次操作後休眠一下,如果客戶端很多,例如10萬,我每秒就要查詢資料庫10W次,所以想改進(jìn),服務(wù)端收到http資料後,就立刻給客戶端,不需要存資料庫了。
認(rèn)證高級PHP講師
try yi try “websocket”
另外,不建議每次查詢都操作資料庫。你可以唸出來放到cache裡,每次查詢都直接從cache裡讀。 然後另外一個程序監(jiān)控到該值發(fā)生變化以後,修改資料庫的同時,更新一下cache。
客戶端很多,為什麼要讀10w次?客戶端和伺服器長連,服務(wù)端記憶體中保存一個映射:
map[client_id] = socket_fd
http提交存到資料庫,服務(wù)端死循環(huán)讀取資料庫信息,如果是發(fā)給某一個客戶端的,訊息中應(yīng)該包含客戶端的client_id,從map找到socket_fd,訊息發(fā)送出去就好了,如果是廣播到所有客戶端,遍歷map發(fā)送也就可以了。讀幾次資料庫,只跟訊息數(shù)量有關(guān)係,跟多少個客戶端沒關(guān)係吧。
上面說的資料庫,完全可以採用redis或nsq之類的訊息佇列實現(xiàn),服務(wù)端開多個執(zhí)行緒或協(xié)程並發(fā)處理就好了,如果部入庫,直接拿到資料send出去,如果你的服務(wù)端crash,數(shù)據(jù)不就丟了?可靠性沒辦法保證。