Ruby 请教,移动平台即时通讯 (im) 后台架构

kehao · 2013年02月21日 · 最后由 smallX 回复于 2015年01月14日 · 19590 次阅读

类似微信,但是同时在线人数要求并不太高(10 万人左右)

因为我一直是做 web 开发的,并不太了解移动开发的一些禁忌,看了些有关微信的架构,也是比较模糊,主要是我该选什么协议,如何同步状态。微信的文档里说

“微信的协议 里面提到了 XMPP 和类 Sync 的自定义协议,里面提到 XMPP 的缺点是流量大和消息不可靠。但是流量大并非 XMPP 主要矛盾,可以很简单将其映射成二进制协议。消息 ACK 也可以添加简单的扩展协议来实现。较繁琐的还是兼容 CMWAP 网关的设计。 使用 XMPP 或者简化的 XMPP 标准协议有很多好处,类似的场景有业界广泛使用的 open api 基本都使用 HTTP 及 JSON,并不是由于这两种协议优化或高效,而是其简洁并得到广泛的认知。一种标准协议的认知及扩展成本要比一个自定义协议小得多,XMPP 流量大的问题可以通过转换协议来实现,比如用 binary 1 代表 login 等全部协商协议,2 代表 message,消息增量获取也可以通过自定义扩展协议来实现。标准协议可以让团队内部及新人的认知成本降低,每一个参与者都很容易想到代码及架构改进建议。而且微信目前也在构建开放平台,自定义协议在开放方面必然具备一些局限。”

本来理所当然想到 xmpp,nginx,ejabberd,是否还适用在手机 im 后台的开发? 类 Sync 协议是指微软的 Direct Push 协议么?这个是否可行,可以用来开发 im 否? http://www.cnblogs.com/fox23/archive/2008/05/17/directpush-exchangeserver2007-overview.html

求熟悉手机开发的同学给点思路,thanks very much

我在做这个,用的 ejabberd, 主要是可以集群

XMPP 流量其实不大,本来即时消息就没多大流量。XMPP 最大的问题是默认每次登录都要拉一次联系人列表,往往这个才是流量的最大来源,而客户端是自己开发的话,这个明显是可以绕过的。所以没问题的。

#1 楼 @SharpX #2 楼 @bhuztez 谢谢,请问 XMPP 协议,客户端与服务端的连接是长连接,还是短连接? 就我所知,XMPP 是需要长连接的(正常情况)。不然的话就要轮询,用心跳包的方式,基于 socket 的长连接在移动平台会不会有什么问题,好像 iphone 和安卓只保持一个长连接

#3 楼 @kehao BOSH,同时支持 web

@bhuztez XMPP 流量大的地方在于它是用 XML 了...单个 STANZA 的数据量被 XML 扩大了好多倍...

是的,xml 的缺点是数据的有效载荷低和 pack/unpack 耗资源 随便打开一个 XML 文件,发现里面有用的数据都是被 tag 包围着的,不管这个数据的长短等等其他属性,它都要被包围,如果将 xml 在网络上传输,或者弄成数据流,显然数据的有效载荷就直接降低了。另外,tag 的使用,父 tag,子 tag 的分层,使得 xml 的 pack 和 unpack 都耗资源:包括 cpu 和内存。 #5 楼 @killyfreedom

@kehao 去年为一个牌子做路演的时候,用的 XMPP 搭了一个游戏服务器,用的是本地服务器..一台服务器接两个设备,一天走了 2G 的流量....还是那个游戏没什么人玩的时候....

我用的 sse 协议,使用短连接,感觉挺合适的,数据存 redis 服务器里,效率很高,也支持集群

#8 楼 @mjf429 sse 是咩?求教 orz.

#9 楼 @calebx w3c 的一个协议,html5 标准里的,去年 12 月才成为正式标准,全名 server sent events,我已经在正式项目里用了,效率很高,你可以好好看看协议的定义: http://dev.w3.org/html5/eventsource/

#10 楼 @mjf429 yoshi,阅读一下先。

#5 楼 @killyfreedom

从单个 message 看,overhead 是不大的,不然 HTTP 也别用了,单个请求的 overhead 远大于 XMPP 单个 message 的 overhead。

<message to="[email protected]">
  <body>
    <a href="http://xml.suc.ks">XML Sucks</a>
  </body>
</message>

@calebx 用这个协议的话可以考虑 Faye, 有这个协议的 Adapter

#11 楼 @calebx 注意下现在浏览器多半还不支持里面的 LAST_EVENT_ID,所以在自己的客户端或者自定义浏览器里使用是没有问题的,在通用浏览器里目前支持得还不是很好,不过做客户端比较 ok 了,要想 web 版全支持可能还得等待一段时间

#14 楼 @mjf429 #13 楼 @killyfreedom 多谢~ faye 过来 push 一些通知还是可以的,但是要自己定义复杂的协议就耗时太大了。 先搞搞客户端什么的。

@bhuztez XML 相对而 JSON 而言,构建一个层级的数据结构,会把原来的数据量扩大的更多,不是 XMPP 的问题,是 XML 的问题

#15 楼 @calebx SSE 的开发成本相比其它几个协议差不多是最低的了,我都研究过

#17 楼 @mjf429 这个只能做基于浏览器的聊天系统吧?

#17 楼 @mjf429 可以在手机自己的客户端里实现 EventSource?

#18 楼 @kehao 不是的,HTML5 的协议都是可以跨平台的。。。我在实际项目中就自己实现的 eventsource

#20 楼 @mjf429 恩,这个不错,规则简单,值得一试

#19 楼 @kehao 当然了,我在 ios 和 android 里都实现了

#13 楼 @killyfreedom Faye 的作者已经放弃了,他说既然有 sse 标准,Faye 的意义就不大了

@SharpX 纳尼....Faye 不是实现了 SSE 的 backend 么..sse 的标准和 Faye 有啥关系...不明白...

#22 楼 @mjf429 我觉得互联网 im 开发和移动 im 开发,主要的区别在于是不是要使用长链接,Jsonp,Comet 都是基于 http/https 长链接,而移动开发是不是尽量少使用长连接?ms 的 Direct Push 技术是使用 https 长连接的,“在动态调整 Direct Push‘心跳’技术中积聚了很多人的才智”,长连接在移动开发中能不能用?

#16 楼 @killyfreedom

看来你根本就没搞清楚问题。JSON 在这里并不比 XML 好...

XML 风格

<message to="[email protected]">
  <body>
    <a href="http://xml.suc.ks">XML Sucks</a>
  </body>
</message>

RFC2822 风格

To: [email protected]
Content-Length: XXX

<body>
  <a href="http://xml.suc.ks">XML Sucks</a>
</body>

JSON 风格

{"message": [{"to": "[email protected]"}, 
    "<body><a href=\"http://xml.suc.ks\">XML Sucks</a></body>"]}

#25 楼 @kehao 长连接产生的流量太大了。。。3G 流量费很贵的,如果是 wifi 还可以接受,还有长连接对服务器的负载能力要求太大,长连接的话 200 个你服务器就很受不了,短连接就不一样了,10000 个都很轻松,3 秒以内就搞定

#25 楼 @kehao 我觉得你一开始就乱了吧。XMPP 和 HTTP 没啥关系只是恰好有个 XMPP over HTTP 的叫 BOSH...

#29 楼 @bhuztez 我没有提到 XMPP 和 HTTP 有什么关系,我觉得在这用 xmpp 或者 http 都没什么大问题,之所以发这个贴子,是因为不清楚 ejabberd 里是不是有长连接,以及它的工作方式,xmpp 也是基于 tcp 的协议,http 也是基于 tcp 的,发起长连接的方式应该差不多,如果移动平台不适应使用长连接,那是不是不适合用 ejabberd 做为服务器,因为 ejabberd 毕竟不是针对移动平台开发的

#30 楼 @kehao 请问什么叫长连接...

#27 楼 @mjf429 #13 楼 @killyfreedom #23 楼 @SharpX #29 楼 @bhuztez #18 楼 @kehao

受教了~~ 看上去还是推送内容的划分比较复杂。

#31 楼 @bhuztez 我估计他说的是 http long-polling 模式

#33 楼 @SharpX tcp 长连接,不讨论了,开发过程中碰到具体问题再请教各位吧

我只想说:ejabberd 3.x 的主要目标就是为移动设备优化,你们可以去它的官网看看

#35 楼 @SharpX ok,我去看看

如果只限于移动,可以考虑下 websocket

推荐看下《RubyConfChina 2012 叶玎玎 -- "Real Time Web solutions with Ruby"》 http://railscasts-china.com/episodes/rubyconf-2012-yedingding

我们的 IM 产品就是采用的 XMPP 和 Ejabberd,非常不错。 我觉得选用通用的协议更好,像微博 Chat、Gtalk、人人 Chat 都是使用的 XMPP 不过我很不喜欢 XML,这点让 XMPP 的数据传输有些冗余,但是这个不重要,这个不会在你初步阶段成为障碍 移动终端,无论是 iOS 还是 Andriod,还是 Web 包装耗电量和流量消耗都完全是可以接受的。

weiboIM 是 openfire

#40 楼 @kehao MQTT 怎么样呢 节省流量 而且移动端不需要太管网络协议 需要用 http 的话 可以用 websocket 打包

#1 楼 @SharpX 你好,我现在也在用 ejabberd,但是感觉配置很麻烦的。mysql 数据库我已经配置好了。另外想请教下,你 ejabberd 配置{auth_method, ldap}吗?如果想支持 vcard 是不是要配置成 auth_method, ldap。谢谢!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号