默认
打赏 发表评论 6
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
开源免费的实时信息推送服务器DDPush介绍
阅读(54071) | 评论(6 收藏4 淘帖1
微信扫一扫关注!

点评


一个对即时通讯系统很有见地的实现方案,可能对很多人不合适,但设计和实现思想可以借鉴和学习一下。
(移动端即时通讯/IM 学习和讨论QQ群:http://www.52im.net/portal.php?mod=topic&topicid=2

IM(Instant Messaging)即时通讯系统


IM(Instant Messaging)即时通讯系统,从1996年ICQ的出现,到国际巨头割据的今天,已经深刻地影响了互联网,甚至人类社会的变化。从移动互联网时代开始,即时通讯系统更是加剧演变进化,除了iOS和Android提供全世界范围的Push Notification Service,还形成了各种开放的云推送平台与服务,成为巨头厮杀圈地的战场。在可预见的物联网前景下,相信IM即时通讯系统将会进一步进化,成为物联智能时代的IT基础设施之一。

然而,到目前为止,即时通讯(包括其衍生的云推送平台与服务)一直被赋予高难度、高投入的标签,似乎成了强者的专属,普通开发者和中小型IT公司的业务大都依赖现有的第三方产品或服务,先不说可能面临高额的收费,从信息安全角度来说,把自己的客户与业务建立在第三方服务的基础上,也让很多人心存顾虑。虽然业界也有各种较流行的开源实现,但其普及程度还比较低。另外,由于目前的开源实现,普遍基于较高级的应用层面(例如:XMPP),所以其实现较为复杂,普通技术人员不容易掌控和二次开发,并且越高级的应用,其通用性往往越低。

DDPush的思路


DDPush的出发点,是绕过已有的各种门槛和障碍,寻求另外一种简单有效的方法,来尝试折衷地实现移动互联网、物联网时代IM系统需求。DDPush的目的是帮助中小型应用和个人开发者,较容易地跨过IM系统的基本门槛,而不是挑战和取代已有的业界标准和产品。DDPush,任意门推送服务器,只是另外一道门,也许能打开另外一个世界,但绝不是包含整个世界。

DDPush的思路,有点类似MQTT,重新定义了一套较简单和低级的网络通讯协议,来达到更小的流量、更高的效率、以及更好的通用性。而DDPush和MQTT的区别在于,DDPush更为简单,放弃了QoS,只实现极为简单的实时通讯需求,剩下的更多是交由应用层去控制。另外,DDPush实现并主推UDP方式,大为降低网络通信成本和服务器承载成本,提高了容量和效率。

这个特点是DDPush与其他方案一个区别所在。DDPush认为可靠性、完整性,更多是应该由应用层去控制的,而不是网络通信层。理由是在移动互联网、无线物联网的环境下,网络本身就是非常不稳定的因素(至少在很长一段时间内都会是这样),因此不能寄望其能完美地工作,需要应用层的保证。例如:当收到一封邮件的时候,应该是尝试发出一个通知告诉邮箱所有者有新邮件达到,即使通知失败了,也不影响直接登录邮箱查看新邮件,同时也应保留再次通知的可能。设想一下,如果仅仅因为实时通知失败了,就连新邮件都丢失的话,岂不是本末倒置?

DDPush的策略


因此,DDPush采取的策略是:不努力保证单次数据包的实时和必然到达,改为可能的多次通知直至终端主动确认,来提高“通知”的最终成功率。换句话说,DDPush牺牲部分的实时性,来换取更高的成功率,信息可能即时达到,也可能十几分钟后到达,甚至几天后到达(如果终端几天后上线的话),但一般总会到达。(当然,需要实时的时候还是可以实现的,因为DDPush的行为是可配置的,也支持TCP模式)

正因为如此,DDPush主推UDP协议,DDPush的通信协议格式就类似UDP协议,基于包的形式而不是流的形式,不依赖包的顺序。不过,DDPush同时也用TCP实现了相同的协议,有需要的情况下只要打开TCP模式即可。这里需要声明的是:UDP模式的服务器容量,是TCP的几十倍甚至上百倍,请使用者自行权衡。

注:在设计DDPush的早期,作者也曾考虑引入部分QoS的功能,例如重发次数、重发策略等。但最后作者决定放弃大部分QoS功能,把这些问题留给应用层去控制,将更精确更实用,也能大大简化DDPush的复杂度和提高容量与效率。毕竟,业务逻辑由应用层去控制,在线终端的数量由DDPush去保证,各司其职,应该是一种更恰当的方式。就好像邮件是否已读,应该由邮件系统控制,而不是新邮件提醒功能去完成。

不过,DDPush并不是完全没有QoS功能,只是采取了更简单的,和MQTT三种QoS级别都不一样的QoS功能:等待终端确认;外加应用层、终端实现的个性化配合手段,达到更大的自由度。

通用终端的支持


DDPush采取UDP协议的另外一个好处,是对终端设备的通用支持。对于常见操作系统(Windows、Android等)来说,网络操作的支持完全不是问题,只是程序通用性的问题。而对于很多嵌入式Linux系统、普通硬件设备来说,要实现完整的网络通信协议,特别是TCP这种高级应用层协议,是非常困难甚至有时候是不太可能的任务(与芯片、板卡的能力和成本有关),所以是本质的通用性问题。而对于UDP,普通硬件设备和嵌入式系统则能较好地支持,因为其复杂度、难度都低很多,各方面要求也相应降低。DDPush采用二进制网络通信协议,而不是文本协议,这也与很多硬件设备有更多的契合点。这些特点和MQTT很类似,不过目前MQTT协议是基于TCP协议而不是UDP。

使用DDPush的方式


对于XMPP等其他方式,很多开发者习惯直接使用其来传递信息内容。而DDPush提倡传递“控制信息”,类似FTP的工作模式。即:通过DDPush来传递命令和控制信息,真正的内容信息建议终端使用常见的HTTP GET或者新建TCP连接的方式,连接到应用服务器(而不是DDPush服务器)获取。这里还会涉及安全验证、内容有效性等方面的需求,而DDPush不致力于解决类似的问题(MQTT则包括安全验证等规则)。DDPush专注在“通知的下发和确认”方面。

事情其实很简单


DDPush不管是协议本身,还是代码实现,其实都是很简单的。因此,开发者很容易进行改造和二次开发,或者按照自己的需要重新改写。整个DDPush服务器的Java代码量很少,目前只有200K,编译后的二进制文件不到100k,对于大部分开发者来说要读懂,相信并不困难。这也是DDPush希望达到的效果,让即时通讯、推送成为家常菜,而不是满汉全席。

DDPush官网


http://www.ddpush.net

(原文链接:http://www.ddpush.net/overview

全站即时通讯技术资料分类


[1] 网络编程基础资料:
TCP/IP详解 - 第11章·UDP:用户数据报协议
TCP/IP详解 - 第17章·TCP:传输控制协议
TCP/IP详解 - 第18章·TCP连接的建立与终止
TCP/IP详解 - 第21章·TCP的超时与重传
理论经典:TCP协议的3次握手与4次挥手过程详解
理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程
计算机网络通讯协议关系图(中文珍藏版)
NAT详解:基本原理、穿越技术(P2P打洞)、端口老化等
UDP中一个包的大小最大能多大?
Java新一代网络编程模型AIO原理及Linux系统AIO介绍
NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
>> 更多同类文章 ……

[2] 有关IM/推送的通信格式、协议的选择:
为什么QQ用的是UDP协议而不是TCP协议?
移动端即时通讯协议选择:UDP还是TCP?
如何选择即时通讯应用的数据传输格式
强列建议将Protobuf作为你的即时通讯应用数据传输格式
移动端IM开发需要面对的技术问题(含通信协议选择)
简述移动端IM开发的那些坑:架构设计、通信协议和客户端
理论联系实际:一套典型的IM通信协议设计详解
58到家实时消息系统的协议设计等技术实践分享
>> 更多同类文章 ……

[3] 有关IM/推送的心跳保活处理:
Android进程保活详解:一篇文章解决你的所有疑问
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
为何基于TCP协议的移动端IM仍然需要心跳保活机制?
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)
微信团队原创分享:Android版微信后台保活实战分享(网络保活篇)
移动端IM实践:实现Android版微信的智能心跳机制
移动端IM实践:WhatsApp、Line、微信的心跳策略分析
>> 更多同类文章 ……

[4] 有关WEB端即时通讯开发:
新手入门贴:史上最全Web端即时通讯技术原理详解
Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
SSE技术详解:一种全新的HTML5服务器推送事件技术
Comet技术详解:基于HTTP长连接的Web端实时通信技术
WebSocket详解(一):初步认识WebSocket技术
socket.io实现消息推送的一点实践及思路
>> 更多同类文章 ……

[5] 有关IM架构设计:
浅谈IM系统的架构设计
简述移动端IM开发的那些坑:架构设计、通信协议和客户端
一套原创分布式即时通讯(IM)系统理论架构方案
从零到卓越:京东客服即时通讯系统的技术架构演进历程
蘑菇街即时通讯/IM服务器开发之架构选择
腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT
微信技术总监谈架构:微信之道——大道至简(演讲全文)
如何解读《微信技术总监谈架构:微信之道——大道至简》
快速裂变:见证微信强大后台架构从0到1的演进历程(一)
17年的实践:腾讯海量产品的技术方法论
>> 更多同类文章 ……

[6] 有关IM安全的文章:
即时通讯安全篇(一):正确地理解和使用Android端加密算法
即时通讯安全篇(二):探讨组合加密算法在IM中的应用
即时通讯安全篇(三):常用加解密算法与通讯安全讲解
即时通讯安全篇(四):实例分析Android中密钥硬编码的风险
传输层安全协议SSL/TLS的Java平台实现简介和Demo演示
理论联系实际:一套典型的IM通信协议设计详解(含安全层设计)
微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解
来自阿里OpenIM:打造安全可靠即时通讯服务的技术实践分享
>> 更多同类文章 ……

[7] 有关实时音视频开发:
即时通讯音视频开发(一):视频编解码之理论概述
即时通讯音视频开发(二):视频编解码之数字视频介绍
即时通讯音视频开发(三):视频编解码之编码基础
即时通讯音视频开发(四):视频编解码之预测技术介绍
即时通讯音视频开发(五):认识主流视频编码技术H.264
即时通讯音视频开发(六):如何开始音频编解码技术的学习
即时通讯音视频开发(七):音频基础及编码原理入门
即时通讯音视频开发(八):常见的实时语音通讯编码标准
即时通讯音视频开发(九):实时语音通讯的回音及回音消除概述
即时通讯音视频开发(十):实时语音通讯的回音消除技术详解
即时通讯音视频开发(十一):实时语音通讯丢包补偿技术详解
即时通讯音视频开发(十二):多人实时音视频聊天架构探讨
即时通讯音视频开发(十三):实时视频编码H.264的特点与优势
即时通讯音视频开发(十四):实时音视频数据传输协议介绍
即时通讯音视频开发(十五):聊聊P2P与实时音视频的应用情况
即时通讯音视频开发(十六):移动端实时音视频开发的几个建议
即时通讯音视频开发(十七):视频编码H.264、V8的前世今生
简述开源实时音视频技术WebRTC的优缺点
良心分享:WebRTC 零基础开发者教程(中文)
>> 更多同类文章 ……

[8] IM开发综合文章:
移动端IM开发需要面对的技术问题
开发IM是自己设计协议用字节流好还是字符流好?
请问有人知道语音留言聊天的主流实现方式吗?
IM系统中如何保证消息的可靠投递(即QoS机制)
谈谈移动端 IM 开发中登录请求的优化
完全自已开发的IM该如何设计“失败重试”机制?
微信对网络影响的技术试验及分析(论文全文)
即时通讯系统的原理、技术和应用(技术论文)
开源IM工程“蘑菇街TeamTalk”的现状:一场有始无终的开源秀
>> 更多同类文章 ……

[9] 开源移动端IM技术框架资料:
开源移动端IM技术框架MobileIMSDK:快速入门
开源移动端IM技术框架MobileIMSDK:常见问题解答
开源移动端IM技术框架MobileIMSDK:压力测试报告
开源移动端IM技术框架MobileIMSDK:Android版Demo使用帮助
开源移动端IM技术框架MobileIMSDK:Java版Demo使用帮助
开源移动端IM技术框架MobileIMSDK:iOS版Demo使用帮助
开源移动端IM技术框架MobileIMSDK:Android客户端开发指南
开源移动端IM技术框架MobileIMSDK:Java客户端开发指南
开源移动端IM技术框架MobileIMSDK:iOS客户端开发指南
开源移动端IM技术框架MobileIMSDK:Server端开发指南
>> 更多同类文章 ……

[10] 有关推送技术的文章:
iOS的推送服务APNs详解:设计思路、技术原理及缺陷等
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
扫盲贴:认识MQTT通信协议
一个基于MQTT通信协议的完整Android推送Demo
求教android消息推送:GCM、XMPP、MQTT三种方案的优劣
移动端实时消息推送技术浅析
扫盲贴:浅谈iOS和Android后台实时消息推送的原理和区别
绝对干货:基于Netty实现海量接入的推送服务技术要点
移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)
为何微信、QQ这样的IM工具不使用GCM服务推送消息?
>> 更多同类文章 ……

[11] 更多即时通讯技术好文分类:
http://www.52im.net/forum.php?mod=collection&op=all

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

下一篇:看京东推送的这是啥,短信居然能自动全屏显示?

本帖已收录至以下技术专辑

推荐方案
评论 6
我就在使用此套开源程序,非常不错,作者的开发思想非常好!
引用:dingshixing@163 发表于 2016-05-21 11:46
我就在使用此套开源程序,非常不错,作者的开发思想非常好!

抽空我也看看他写的源码,据说DDPush没有用到MINA、NETTY这样的成熟NIO框架,是自已干的
嗯,当初做推送时 androidpn,mqtt,第三方等都了解过,最后发现了ddpush,觉得很好用,也很简单。我是用.net开发,ddpush是java的,我不会,拿过来直接就用了,没改任何代码,到现在一直稳定运行着!
引用:dingshixing@163 发表于 2016-05-24 20:23
嗯,当初做推送时 androidpn,mqtt,第三方等都了解过,最后发现了ddpush,觉得很好用,也很简单。我是用.ne ...

真有这么神吗
引用:JackJiang 发表于 2016-05-24 20:52
真有这么神吗

到不是他的东西神,我想应该两个方面原因,一是他的这套系统简单,只关注推送出去,二是作者编程还是可以的,代码基本上没什么bug(或者我还没碰到)。我是用的tcp链接,只是发现他的cpu使用率有点高!我不是什么托,只因是用了人家的东西,而且还好用,觉得有必要说出来!
引用:dingshixing@163 发表于 2016-05-25 13:54
到不是他的东西神,我想应该两个方面原因,一是他的这套系统简单,只关注推送出去,二是作者编程还是可以 ...

多谢分享你的使用感受,其它人也可作为参考
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部