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

发布于 2022-09-04 22:33:20 字数 182 浏览 28 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

遗弃M 2022-09-11 22:33:20

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

map[client_id] = socket_fd

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

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

原谅过去的我 2022-09-11 22:33:20

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

仲春光 2022-09-11 22:33:20

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文