首页  >  问答  >  正文

nginx - 怎么做到服务端收到http数据后主动通知socket客户端?

是这样的,我要操作一个智能灯泡,目前是这样做的,我在网页上操作,然后把数据通过http提交存到数据库,有一个客户端发起一个socket连接,连接到服务端,服务端是死循环地从数据库里面取出数据给客户端,每次操作后休眠一下,如果客户端很多,比如10万,我每秒就要查询数据库10W次,所以想改进,服务端收到http数据后,就立马给客户端,不需要存数据库了。

PHP中文网PHP中文网2714 天前600

全部回复(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
  • 取消回复