首頁  >  問答  >  主體

nginx - 怎麼做到服務端收到http資料後主動通知socket客戶端?

是這樣的,我要操作一個智慧燈泡,目前是這樣做的,我在網頁上操作,然後把資料透過http提交存到資料庫,有一個客戶端發起一個socket連接,連接到服務端,服務端是死循環地從資料庫裡面取出資料給客戶端,每次操作後休眠一下,如果客戶端很多,例如10萬,我每秒就要查詢資料庫10W次,所以想改進,服務端收到http資料後,就立刻給客戶端,不需要存資料庫了。

PHP中文网PHP中文网2734 天前616

全部回覆(3)我來回復

  • 世界只因有你

    世界只因有你2017-05-16 17:08:59

    try yi try “websocket”
    另外,不建議每次查詢都操作資料庫。你可以唸出來放到cache裡,每次查詢都直接從cache裡讀。 然後另外一個程序監控到該值發生變化以後,修改資料庫的同時,更新一下cache。

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-16 17:08:59

    可以考慮記憶體資料庫redis,然後定時持久化,也就是記憶體。

    回覆
    0
  • 某草草

    某草草2017-05-16 17:08:59

    客戶端很多,為什麼要讀10w次?客戶端和伺服器長連,服務端記憶體中保存一個映射:

    map[client_id] = socket_fd
    

    http提交存到資料庫,服務端死循環讀取資料庫信息,如果是發給某一個客戶端的,訊息中應該包含客戶端的client_id,從map找到socket_fd,訊息發送出去就好了,如果是廣播到所有客戶端,遍歷map發送也就可以了。讀幾次資料庫,只跟訊息數量有關係,跟多少個客戶端沒關係吧。

    上面說的資料庫,完全可以採用redis或nsq之類的訊息佇列實現,服務端開多個執行緒或協程並發處理就好了,如果部入庫,直接拿到資料send出去,如果你的服務端crash,數據不就丟了?可靠性沒辦法保證。

    回覆
    0
  • 取消回覆