在项目场景中有一个移动门户的APP,除了提供门户功能外,还有用户之间能够聊天交流的需求。这个应用在整体架构中的定位可以理解为类似支付宝的一个APP,提供各种微应用的入口为主,聊天功能为辅。聊天应用的核心IM服务,如果团队精力和技术栈积累足够的话,自研当然是最好的方案。但是我们这个项目比较急,所以选择使用第三方或者开源的IM。
一.IM选型:
(1)开源IM
a)野火IM
指标 | 描述 |
功能性 | 单聊,群聊,敏感词检测(需自己增加)和第三方推送集成。 |
机器配置建议 | 单机2C4G能支撑10W以上长链接,1000条/秒以上的消息发送压力。 建议每10W在线用户使用4C16G服务资源 |
健壮性 | 社区版是单机模式,专业版支持集群模式部署。 |
数据库 | 社区版是单机模式,专业版支持集群模式部署。 |
缓存 | hazelcast |
b)StarTalk
指标 | 描述 |
功能性 | 单聊,群聊和推送集成。 |
机器配置建议 | CPU:24核2.6GHz 内存:64G 机器数量:2台部署程序,2台部署redis和数据库 |
健壮性 | 支持集群模式部署。 |
数据库 | postgresql |
缓存 | redis |
(2)商业IM---社区版(穷哭了.....)
厂商名称 | API限制 | 离线消息存储 | 历史聊天存储 | 用户数 | 消息撤回 | 敏感词检测 | 推送服务 |
环信 | 10次/秒 | 7天 单聊500条 群聊200条/群 | 3天 | 100 | 无 | 无 | 第三方 |
极光 | 600次/分钟 | 100条/15天 | 60天 | 无限制 | 有 | 100个 | 极光 |
网易云信 | 120次/分钟 (部分API) | 30天 | 30天 | 100 | 有 | 未找到说明 | 网易云信 |
腾讯云 | 有,API之间不同 | 7天 | 7天 | 100 | 有 | 未找到说明 | 第三方 |
首先在开源IM和商业IM之间进行选择。开源IM虽然可以自己进行二次开发,并且性能按照官方说明来看也很不错,但是实际上有以下几个问题:1.项目更新缓慢或停更,开源遗留下的问题难以解决。2.需要自己进行运维部署,增加工作量。3.从官方说明可以看出开源只是一些基础的功能,更强大的功能实际上还是需要付费的。而商业IM好像没有用钱解决不了的问题,虽然我们没有钱........在上面这些社区版的商业IM中,除了最重要的没有用户数限制这个制胜优势,极光IM还有其他几个优势:API限制比较宽松、文档可读性强、历史聊天记录存储久,而且极光IM和极光推送是同一个团队开发的,说是可以平滑的集成起来,简直是没钱首选。
二.架构设计:
从上面简易的架构图可以看出来如何通过集成商业IM来实现一个简单的聊天应用。因为IM本质就是个没有业务场景的、功能完整的及时聊天服务端,所以提供了完整的聊天应用所需要的服务接口。我们只需要在这之上补充业务数据相关的接口就好了。
(1)APP服务端:用户信息存储,群信息存储,提供用户注册和登录接口,提供业务数据。
(2)IM服务:及时聊天服务(用户消息,群消息),会话列表,推送微应用消息。
(3)推送服务:推送是通过设备号进行消息推送的,和IM的用户推送不同,可以用来推送需要广播的应用系统消息。
如何保证系统消息推送的及时性呢?
由于推送服务的送达率和及时性都不太好,我是推送和IM同时推送系统消息的,IM的及时性比较好,而推送服务可以保证用户登出的时候也可以收取到消息,不过这样就需要移动端进行消息去重。