suchen

Heim  >  Fragen und Antworten  >  Hauptteil

nginx - Wie kann der Server den Socket-Client proaktiv benachrichtigen, nachdem er HTTP-Daten empfangen hat?

Das ist es, ich möchte eine intelligente Glühbirne bedienen. So mache ich es derzeit auf der Webseite, übermittle dann die Daten und speichere sie über http und stellt eine Verbindung zum Server her. Er entnimmt in einer Endlosschleife Daten aus der Datenbank und schläft nach jedem Vorgang. Wenn es viele Clients gibt, z. B. 100.000, muss ich die Datenbank 100.000 Mal pro Sekunde abfragen. Deshalb möchte ich es verbessern, nachdem der Server die http-Daten erhalten hat, diese sofort an den Client übergeben werden und es nicht erforderlich ist, sie in der Datenbank zu speichern.

PHP中文网PHP中文网2753 Tage vor627

Antworte allen(3)Ich werde antworten

  • 世界只因有你

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

    try yi try “websocket”
    另外,不建议每次查询都操作数据库。你可以读出来放到cache里,每次查询直接从cache里读。 然后另外一个进程监控到该值发生变化以后,修改数据库的同时,更新一下cache。

    Antwort
    0
  • PHP中文网

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

    可以考虑内存数据库redis,然后定时持久化,即存盘。

    Antwort
    0
  • 某草草

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

    客户端很多,为什么要读10w次?客户端和服务器长连,服务端内存中保存一个映射:

    map[client_id] = socket_fd
    

    http提交存到数据库,服务端死循环读取数据库信息,如果是发给某一个客户端的,消息中应该包含客户端的client_id,从map中找到socket_fd,消息发送出去就好了,如果是广播到所有客户端,遍历map发送也就可以了。读多少次数据库,只和消息数量有关系,和多少个客户端没关系吧。

    上面说的数据库,完全可以采用redis或者nsq之类的消息队列实现,服务端开多个线程或者协程并发处理就好了,如果部入库,直接拿到数据send出去,如果你的服务端crash,数据不就丢了?可靠性没法保证。

    Antwort
    0
  • StornierenAntwort