细数移动IM开发中的那些坑

访客:17084  发表于:2015-04-14 13:49:02


移动互联网时代的来临促使我们所有的开发者都要从用户视角出发,基于某一特定场景来创建应用,满足用户需求。通常,在这些应用中,沟通环节都是必不可少的。这就要求创业者不仅要花时间和精力来琢磨用户在某一特定场景下有何痛点需求,琢磨如何解决这一需求,并且可能还要花费更多的精力和时间来解决产品中“沟通”这一技术节点。而要解决沟通问题,就需要一套IM系统,这并不容易。当然,假设你有100个用户,什么都是容易的,但是假设你有了100万、1000万甚至1亿的用户,再简单的技术节点解决不好,都会成为灾难,何况IM系统还是存在许多技术难点和坑点的。今天,我们就来梳理一下IM开发中那些可能遇到的难点及坑点。

首先,来看服务端需要考虑的问题。

1.连接器的设计:连接器主要用来管理客户端的长连接。目前最好的连接器单台8G8核的服务器可以做到70万—100万的连接,而某些开发者只能做到4000左右的连接,相差好几个数量级。这里的奥妙在哪里呢?

2.中间件的设计:是否采用通讯中间件?通讯中间件的好处有哪些?如果不采用中间件,连接器和逻辑服务器的连接关系如何管理呢?

3.逻辑服务器:逻辑服务器通常简单一点,主要是根据业务逻辑进行最小粒度的划分即可。但是即便如此,还是有很多的开发者把看似相关实则不相关的逻辑放在一起,如把鉴权和message服务器放在一起。

4.状态服务器:状态服务器主要管理用户在线、离线的相关状态,需要采取中心节点的方案,否则状态就会不同步。这里主要需要考虑状态服务器所对应的数据存储机制,如何进行写操作,如何进行读操作?以便最大的提高状态服务器的处理能力和响应速度。

5.数据库的设计:数据库的设计是最难的,也是做大的瓶颈。因为无论对于sql(关系型)数据库还是nosql(非关系型)数据库,都有读写处理的极限,那就需要考虑数据库如何分区(根据什么原则、什么操作、哪些用户访问哪个节点上的数据库)。同时又需要考虑每个原子操作(如登陆)需要读哪些库,写哪些库。只有这些指标明确了,你才能在假设有100万并发用户,100万条并发消息的情况下,准确评估服务端需要多少台服务器,如何部署。

6.其他:还有设备推送的处理,何种机制能够保证不丢消息,离线消息如何处理,等等。这些都是必备而又非常复杂的功能点和技术要求,都需要采取正确的架构和策略才能实现。

其次,我们再看一下IM 协议如何选型。通常IM采取的协议有xmpp、mqtt和私有协议,我们来逐一分析他们的优缺点。


  1. xmpp协议:


  a)优点:基于xml协议,容易理解,使用广泛,易于扩展。


  b)缺点:流量大,在移动终端也耗电。交互过程复杂。多被pc时代的产品使用,不适合移动时代的IM产品,即使我们基于xmpp进行改进,简化握手过程,改进文件传输机制,但是它的基因决定了如何改进,他都不适合移动互联网时代的IM产品。就像凤姐无论怎么整容,也变成不了高圆圆一样。


  2.mqtt协议:


  a)优点:适配多平台。


  b)缺点:协议简单,但是需要自己扩展好友,群组等功能。


  3. 私有协议:


  a)优点:随心所欲,自己定义,流量小。


  b)缺点:工作量巨大,扩展性差,需要考虑全面。


  4.protbuf协议:


  a)优点:非常小,非常快,非常简单。


  b)缺点:不能表示复杂的数据结构,但是对于IM来讲,已经足够。强烈推荐此协议。


  最后,我们再来了解一下移动端有哪些难点需要解决。


  1.流量:采取哪种协议、图片缩略图、附件的压缩三点决定了流量的大小。


  2.耗电:(1)流量越小,耗电越低。(2)心跳策略,减少心跳次数,耗电量就会降低。


  3.心跳时长:wifi,2G,3G,4G,移动、电信、联通,不同网络,不同运行商,NAT失效时间不一样,因此心跳的时间也就不一样。


  4.网络连接:cmnet和cmwap下连接处理机制。


  5.网络不稳定:移动端最大的特点就是网络不稳定,在不稳定的网络状态下,如何保证消息以最快的速度到达?如何避免重联风暴?这些既需要从整体架构考虑,也需要在移动端采取巧妙的策略加以避免。


这些难点写下来只不过千把字,耗时三十几分钟,但是真正要解决这些难点却要不知道花费多少日日夜夜,敲下多少行代码。因此,对于那些在某一场景下需要沟通能力的产品——O2O,互联网教育,互联网医疗、游戏…建议这些创业者把精力和资源都放在自己的核心能力上,而沟通就放心的交给我们容联云通讯IM吧——因为那些难点,我们都已经完美的干掉了他们。

还不了解云通讯IM?那就在4月21日,来参加云通讯开发者俱乐部第二期线上公开课吧,主讲人云通讯IM产品线总监张靖宇,届时会为开发者详细讲解云通讯IM,开发者也可互相探讨自己在开发过程中遇到的其他问题。

来源/CIO时代网



评论(0)

您可以在评论框内@您的好友一起参与讨论!

<--script type="text/javascript">BAIDU_CLB_fillSlot("927898");