HTTP机制有个缺陷,就是服务器无法主动向用户推送消息。
想实现下图这种场景的监控,节点1需要向全网发送告警信息,应该怎么实现呢?
最简单的方式是,每个节点的web页面定时向服务器发送请求,获取节点最新的状态信息。
但问题是,如果网络节点特别多,同时告警发生的概率很小的情况下,这种轮询的方式太浪费资源了。
怎么能让web服务实现主动的消息推送呢?
经过实践,我找到了一个适合本场景的架构。
首先用户向Django发送状态更新请求
然后用户再向socket.io服务器推送一个事件
socket.io服务器将该事件转发广播给全部节点
节点收到这个事件后,发起向Django的状态获取请求
Django返回最新的节点状态信息,实现了消息推送。
这个方法,实际上是利用了WebSocket技术,实现了服务器向用户推送信息的功能,弥补了Http的不足。
同时,状态信息仍然由Django来统一管理,避免了数据不一致的情况。
socket.io在这里代替了死板的定时器,而是按需触发请求,提高了计算效率。