timzaak / blog

8 stars 1 forks source link

IM 的难点与实现 #93

Closed timzaak closed 2 years ago

timzaak commented 2 years ago

难点

  1. 网络不可靠
  2. 消息 at least once + 幂等
  3. 消息落盘 + 拉取(同步)
  4. 服务器端并发
  5. 离线推送

    解决

    1,2问题可以通过购买第三方解决。3看具体业务场景,做好消息唯一性Id,都好解决。4暂不考虑,基本是长连接集群+路由网管。5涉及大量的第三方对接和消息分类,需要细化每个渠道的边际case,即使有对接第三方,也要花大量时间搞(国外的还好搞,国内的自建太多,且又是限额又是分类,十分麻烦)。

目前找到的靠谱方案(解决1,2问题)是:https://shop143012492.taobao.com/, 价格: Java 后端(TCP/UDP/WebSocket) 349 Android 客户端 (TCP/UDP)249 iOS 客户端 (TCP/UDP)249 WebH5 客户端(WebSocket) 399 RainbowAV(音视) C++ 后端: 799 RainbowAV(音视) Android 后端: 749, 无 iOS 版本。 以上除了 Web H5 只有收费的版本外,其他皆有闭源免费版本,对一般客户来讲,起步只需要 Web399 + Java后端 349,约 750元,就可以了。 以上可解决网络稳定性和消息推送问题。 这个方案提供商在此基础上也提供了IM的完整实现,价格为: RainbowChat 18000,含 后台/Android (音视)源码(iOS端好像不包含源码) RainbowChat-Web 12000

现状

我基于 WebSocket 简单实现了下, 发现 Flutter 的 WebSocket 对网络可靠/延迟不敏感,无法依靠其API来快速判断网络状态,依旧需要开发ACK + 重试投递逻辑。 至于消息落盘+拉取(同步), 主要是看消息同步机制,若是轻量化客户端的做法,消息必然要全量在服务器端,客户端无落盘需求,只需解决最新消息和未读消息数的展示即可。至于多端登录,就看要做到什么程度了,主要看服务器端如何处理用户上线后的逻辑。