仿微信服务器~ 打造分布式高并发IM即时通讯服务器。内附openfire的简短分析。以及微信服务器的分析

J2EE 码拜 8年前 (2017-04-21) 3958次浏览
本人想做JAVAEE的高手们,特别是写移动服务端的程序猿。都绕不开一个话题。即时通讯。大多数APP现在都内置即时通讯功能
===============  openfire简要分析 ================
本人想大部分朋友都是使用 openfire 搭一下万事大吉了吧。 但是不知道各位能否考虑过openfire用于公司生产环境时的劣势。
openfire 的协议是XMPP。XMPP协议的弊端就是传输数据量大。古老的XML为基础的协议(古老不太适合)。并且因其复杂的通讯过程,性能会大大的降低。现在互联网异构编程都是用的JSON。他的轻量相信不用再介绍了吧。
openfire 的核心是使用了mina . mina 的劣势这里也不说。正原因是创始人看到了mina的劣势,才会自立门户写出了netty和本人的东西竞争。哈哈 仿微信服务器~ 打造分布式高并发IM即时通讯服务器。内附openfire的简短分析。以及微信服务器的分析
============ 协议定型 =============
关于协议,这是个很重要的东西,可以说他直接决定性能和稳定性。一个轻量美好的自定义协议,能保证产品的稳定性。说到协议。我们不得不抛弃垃圾似的XMPP,去讨论讨论微信的协议。那是一个经过大考验的协议。
腾讯的协议是基于同步的。基于ActiveSync的修改版。取名叫同步协议Sync。这个协议的过程是怎样的,说清楚之后就好本人写本人创造了:
需求:
本人(A)要向(B) 对方发送一条信息:“你好世界”
过程:
1、本人向服务器POST数据 “你好世界”(只是普通的POST)。服务器返回给本人一个token:A1。
2、拿着token  向服务器发起TCP传输,推送数据 “A1”
3、服务器通过TCP 向B推送一个消息,“A1”,
4、B收到推送后,GET请求。 token=a1。拿回本人发的数据“你好世界”
5、B POST服务器。“本人已收到token为a1的消息,可以标记这个消息为已读。”
总结起来是
A POST要发送的数据 — > 走TCP协议。 通知服务器。本人发了一条新信息 — > B得到服务器的推送,得知有新消息要去取 –> B 用GET取消息 –> B用POST告诉服务器已经成功取回,该条数据可以作废。
以上就是腾讯微信的过程。各位好好看看是可以看懂的。基于同步的协议网上说的太高端化,太学术,难以理解。通俗的就是上面这些。
始终保持双方信息的一致。同步性。TCP在这里的功能并不是推送正常数据(例如“你好世界”) 而只是一个通知而已,不参与正常数据的传输。这样就保证了丢包率大大降低,效率大大提高,稳定性大大提高。具体为什么,本人画出普通的通讯图,画出基于同步的,对比一下就理解了。他是TCP+HTTP 配合的。优点互相补。
================= 技术架构定型  ===============
核心:netty4.x + spring4.x
SOA服务总线:Dubbo 淘宝的技术,很可靠。只说这么多。实现本IM分布式的核心。仿微信服务器~ 打造分布式高并发IM即时通讯服务器。内附openfire的简短分析。以及微信服务器的分析
消息队列:activeMQ 高速队列。整流作用。
底层数据库:Mongodb 目前网上说的缺点没发现。可能随着版本更新稳定很多了吧。假如业务复杂 推荐mysql+mongodb
mysql做业务还是很方便的。毋庸置疑。但不建议抛弃mongodb。
JSON 转化: fastjson 淘宝的东西。很不错。目前最高效的吧。
日志记录:logback 挺好。比Log4j好使。
====================  代码,本人还是希望各位朋友本人先看看上面的文字,本人一定可以写出来一个的。 ====
最后贴本人的联系方式。QQ631768417  假如实在对代码感兴趣的 请联系本人。
最后,本人技术不精。希望更厉害的老师能指点一二。
也希望研究JAVA 套接字编程的朋友们。能一起探讨。
目前本人对一个问题很纠结。jboss tomcat等是怎么样实现集群。希望有识之士能给予解答。
解决方案

20

你提出的方案比xmpp/openfire开销还要高
XMPP是长连接,登录后一直保持连接,大大减少了连接-断开的服务器开销。
XMPP是基于消息的,天然的是异步的。微信是同步传输是理解错误
json:xmpp消息的json编码  https://xmpp.org/extensions/xep-0295.html
spring框架:核心要实现交易控制,IM几乎不需要交易处理
activeMQ:,开销太高。消息传递是xmpp服务器基本功能,基本都是开发团队本人写,接收方不在线,就根据配置,丢弃或存入缓存
几十万用户:xmpp的 tigase开源实现足够满足要求,用户数上去了,你也有人力和资金去优化服务器。
推荐XMPP 的java 开源实现,tigase.org。还有可以关注其他语言的实现

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明仿微信服务器~ 打造分布式高并发IM即时通讯服务器。内附openfire的简短分析。以及微信服务器的分析
喜欢 (0)
[1034331897@qq.com]
分享 (0)