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

李林烜 2014-07-28 06:14:47
我想做JAVAEE的高手们,特别是写移动服务端的程序猿。都绕不开一个话题。即时通讯。大多数APP现在都内置即时通讯功能

=============== openfire简要分析 ================
我想大部分朋友都是使用 openfire 搭一下万事大吉了吧。 但是不知道各位是否考虑过openfire用于公司生产环境时的劣势。

openfire 的协议是XMPP。XMPP协议的弊端就是传输数据量大。古老的XML为基础的协议(古老不太适合)。并且因其复杂的通讯过程,性能会大大的降低。现在互联网异构编程都是用的JSON。他的轻量相信不用再介绍了吧。

openfire 的核心是使用了mina . mina 的劣势这里也不说。正因为创始人看到了mina的劣势,才会自立门户写出了netty和自己的东西竞争。哈哈

============ 协议定型 =============

关于协议,这是个很重要的东西,可以说他直接决定性能和稳定性。一个轻量美好的自定义协议,能保证产品的稳定性。说到协议。我们不得不抛弃垃圾似的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分布式的核心。

消息队列:activeMQ 高速队列。整流作用。

底层数据库:Mongodb 目前网上说的缺点没发现。可能随着版本更新稳定很多了吧。如果业务复杂 推荐mysql+mongodb
mysql做业务还是很方便的。毋庸置疑。但不建议抛弃mongodb。

JSON 转化: fastjson 淘宝的东西。很不错。目前最高效的吧。

日志记录:logback 挺好。比Log4j好使。

==================== 代码,我还是希望各位朋友自己先看看上面的文字,自己一定可以写出来一个的。 ====

最后贴我的联系方式。QQ631768417 如果实在对代码感兴趣的 请联系我。。
最后,鄙人技术不精。希望更厉害的老师能指点一二。
也希望研究JAVA 套接字编程的同僚们。能一起探讨。

目前我对一个问题很纠结。jboss tomcat等是如何实现集群。希望有识之士能给予解答。

...全文
32664 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
5iasp 2016-10-02
  • 打赏
  • 举报
回复
非常不错 的思路 学习一下
Just延续 2016-04-08
  • 打赏
  • 举报
回复
多谢分享
Ronrey 2016-04-07
  • 打赏
  • 举报
回复
哥们分析的有点道理,但是有实现么?
tianfang 2015-06-29
  • 打赏
  • 举报
回复
MQTT 另外一个主流消息协议,服务器可以看看activemq子项目中的实现
tianfang 2015-06-29
  • 打赏
  • 举报
回复
你提出的方案比xmpp/openfire开销还要高 XMPP是长连接,登录后一直保持连接,大大减少了连接-断开的服务器开销。 XMPP是基于消息的,天然的是异步的。微信是同步传输是理解错误 json:xmpp消息的json编码 https://xmpp.org/extensions/xep-0295.html spring框架:核心要实现交易控制,IM几乎不需要交易处理 activeMQ:,开销太高。消息传递是xmpp服务器基本功能,基本都是开发团队自己写,接收方不在线,就根据配置,丢弃或存入缓存 几十万用户:xmpp的 tigase开源实现足够满足要求,用户数上去了,你也有人力和资金去优化服务器。 推荐XMPP 的java 开源实现,tigase.org。还有可以关注其他语言的实现
小酌儿 2015-06-29
  • 打赏
  • 举报
回复
nginx +tomcat
「已注销」 2014-10-24
  • 打赏
  • 举报
回复
mark 一下, 希望多交流...

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧