这个问题比较典型,应该有不少同学都会有这个问题,在这里我做个简单介绍。先说结论:Django是可以做实时消息推送的,详解如下。
以下的内容分两个部分,我们先来了解消息推送模型的通用设计,再来了解Django怎么样可以实现消息推送。
首先是消息推送模型的设计:
消息推送模型分为推送端和接收端,这里的推送端则是我们通常说的后台服务,比如这里的Django服务;而接收端呢主要是用户可达的客户端,比如app和网站等等。
对于接收端来说,消息推送模型分为Pull模型和Push模型,我们来逐一了解。
什么是Pull模型:
Pull,也就是拉取,指的是客户端主动拉取消息,此时,后台要实现相关的消息接口,客户端定时向后台发起消息更新的查询请求,以此来达到消息及时推送的功能,通信协议比较简单,可以直接使用无状态的HTTP协议。
什么是Push模型:
Push,也就是推送,指的是服务端后台主动向客户端推送消息。这里有个问题,那就是服务端怎么知道客户端的IP和地址?一般而言,客户端都会有服务端的地址,因为服务端的地址相对固定,并且频繁使用,但是服务端一般不会主动保存客户端的地址。所以Push模型一般是对于在线客户端而言的,也就是服务端和客户端之间保持网络连接,并通过心跳保活,连接断开由客户端主动重连。在这种保持连接的状态下,服务端就可以主动向客户端推送消息了,通信协议一般基于TCP连接的基础上自己实现。
哪种模型比较好?
关于Pull模型和Push模型的好坏,在此不做结论,两种模型在消息队列等框架下都有广泛使用,各有千秋,合适的才是最好的。
接下来是第二个部分,Django怎么实现消息推送。
对于Pull模型:
Django实现Pull模型的服务端部分很简单,对外主要是实现一个HTTP接口即可,供客户端主动请求查询,在内部需要维护一个消息队列,用于存储待推送的消息和标记没推送的用户,简单工程可以使用Python的线程安全队列;大工程一般结合Kafka、RabbitMQ等消息队列进行服务解耦。
对于Push模型:
Push模型在网络连接上可以基于WebSocket进行通信,Django上可以使用已有组件实现WebSocket或者可以依赖第三方库,这里WebSocket保证了双方通信的连接,在连接之上,还需要定义通信协议。通信协议怎么理解呢?简单而言,就是需要服务端和客户端协商好通信报文的结构体是怎么样的,在协商好结构体后辅以序列化手段比如json、protobuf等。
希望对你有所帮助。