一直一来都在使用淘宝的消息推送业务,感觉很好用,前一段时间QQ2012也实现了消息推送的业务,另外一些安卓软件也实现了消息推送,我感觉消息推送这种技术或架构以后会在很长时间内流行。
引用淘宝开放平台对于消息推送的解释:
主动通知(Stream api)是数据推送api,即数据主动推送服务,把淘宝产生的数据实时的推送给外部,app通过订阅可接受这些实时消息。
消息推送业务说的简单点:
服务端-----》》》启动。
客户端-----》》》启动。
客户端-----》》》连接服务端,并建立TCP长连接。
服务端-----》》》得到信息源(来源可能是别的系统的消息通知或自己在循环扫描)。
服务端-----》》》把这条信息放入一个队列中,这个队列一般用内存实现。
服务端-----》》》把这条信息推送到客户端。
客户端-----》》》接收到这条消息,并异步做处理。
这个只是一个大概的构架,其中会有很多问题。
1、如何保证服务端正常运行?
答:在服务端开一个监控服务,用来监控这个服务端正常运行,如果服务端异常,强制重启,并通知管理员。
2、如何保证客户端与服务端的连接不中断?
答:服务端每25秒给客户端发送一个特定消息包(淘宝称为“心跳”),如果客户端收到这个心跳,就说明连接是正常的,如果收不到这个包就说明连接已经中断,这个时候客户端应该放一个监控程序,强制重启客户端,并再次与服务端进行连接。
3、如何保证服务端与客户端之间通信所传送的数据的完整性?
答:两端之间用json格式进行传输,然后在对方得到数据后进行反序列化解析,如果格式不正确则丢弃。
4、数据传输过程中如果数据丢失了怎么办?
答:服务端增加一个功能,每15分钟检查一次,如果用户没有获取信息,那就说明客户端掉了,在下次连接后,那这个时间段发给客户端。
淘宝是用java开发的,腾讯是用C++开发的,安卓也是用java开发的。我想用C#去开发一个自己实用的消息推送系统,并在开发完成后应用在公司的项目上面。
主要用到的技术:
1、多线程(可以确定)
2、Socket(可以确定)
3、Task(正在考虑中)
Socket中需要使用的协议:TCP
经过与一个大牛的交谈,觉得上面的实现可能存在两个问题:
1、心跳时间不能定下来,要根据具体的网络环境来定。需要反复测试,换个网络环境也有可能需要有改动。
2、协议有两种可选的,TCP和HTTP,我暂定TCP,如果后期发现TCP协议有问题的话,我考虑使用HTTP协议。
另外,多线程需要使用线程池技术。