基础知识
本文适合运维人员和服务端研发人员阅读。假定读者对运维知识有一定的了解。目的是通过阅读本文章,能够正确地运行野火IM专业版。
1. 服务说明
野火即时通讯系统需要一系列的服务,包括如下一些类型:
- 中间件服务,包括MySQL(或其他支持的关系型数据库)、Nginx、TurnServer、MongoDB等。这些服务隶属于第三方,需要客户需要自行处理部署和运维工作。
- 野火提供的示例级别服务,包括应用服务、推送服务、组织架构服务、开放平台服务、机器人服务、频道(公众号)服务等。这些服务属于野火提供的Demo,需要客户研发进一步二开,需要客户自己来处理部署和运维等工作。
- 野火提供的闭源服务,包括Janus服务和Minio服务等。这些服务是野火提供的,野火对应项目文档上有完整的部署文档。可以按照文档来部署和运维工作。
- 野火提供的专业版IM服务。这个是最核心的服务,也是最复杂的服务,本文目的就在解决部署和运维的问题。
2. 系统架构图
3. IM服务与其他组件的交互
IM服务与其他组件的交互包括下面3部分: 1,野火IM服务与数据库的交互。 2,野火IM服务其他服务的交互。 3,野火IM服务与客户端的交互。
3.1. 野火IM服务与数据库的交互
野火IM服务需要把消息、用户信息、群组信息等数据保存到数据库中。可以只选择一个关系型数据库(MySQL或者其他支持的关系型数据库),也可以选择关系型数据库+MongoDB。当选择关系型数据库+MongoDB时,消息相关数据会保存到MongoDB中,其他数据保存在关系型数据库中。
3.2. 野火IM服务与其他服务的交互
包括野火IM服务回调其他服务和其他服务调用野火IM服务。
3.2.1. 其他服务调用野火IM服务
野火IM服务提供3类接口供应其他服务调用:
- Server API,这类接口拥有最高优先级,业务服务调用IM服务的18080端口进行发送消息、创建用户、创建群组等工作。可以以任何人的身份进行操作。这类接口建议只能通过内网调用,不能把服务端口暴露和泄漏服务密钥。
- Robot API,以某个机器人的身份进行业务处理,调用IM服务的80端口,可以内网中调用也可以在外网调用,可以把机器人ID和机器人密钥提供给第三方开发应用。
- Channel API,以某个频道的身份进行业务处理,调用IM服务的80端口,可以内网中调用也可以在外网调用,也可以把频道ID和机器人密钥提供给第三方开发应用。
3.2.2. 野火IM服务回调其他服务
在野火IM服务配置文件中,有很多回调地址配置,当配置之后,对应的事件会回调到这个地址去,包括如下:
- 推送请求回调
- 用户在线状态变更回调
- 用户关系变更回调
- 用户信息变更回调
- 发送消息回调
- 频道相关回调
- 敏感词消息回调
- 消息撤回回调
- 群组相关的回调
- 聊天室相关回调
- 会议相关的回调
3.3. 野火IM服务与客户端的交互
客户端分为2种类型,一种是基于JS协议栈的客户端,包括Web和小程序客户端;另外一种是基于C++的客户端,包括移动端(包括原生、Uniapp和Flutter)和PC客户端。
野火IM服务属于有状态的服务,当野火IM服务集群部署时,每个客户端会被固定到某一个节点上去,客户端只能连接属于他的节点。如果连接到不属于他的节点则会出现错误导致断开连接。
所有客户端都会先HTTP调用IM服务,这个请求到IM服务后,IM服务会把属于这个客户端的配置信息,包括他应该连接的服务的地址信息,还有一些配置,返回给客户端。客户端拿到这些信息后,再与IM服务建立长连接。
如上图,客户端HTTP调用到IM服务的一个节点,经过计算此客户端属于另外一个节点,把属于这个客户端的网络信息和配置返回给客户端,客户端直接连接属于他的节点。
在长连接时JS协议栈和C++协议栈是不同的,JS协议栈使用的是websocket,C++协议栈使用的是tcp。此外C++协议栈还支持长短连接,除了长连接外,还可以支持短连接(HTTP),当业务繁忙长连接处理不过来时,C++协议栈还可能HTTP直接调用属于他的节点。
3.4. 长短连接
长短连接是微信mars库的一个重要特性。客户端维护一条与服务的长连接,是基于TCP的,可以长时间保持,并能够双向发送请求。因为长连接任务是串行的,所以当任务很多时需要时间较长,为了解决这个问题mars就引入了短链接的概念,是基于HTTP的,是客户端到IM服务单向的,客户端可以把瞬间大量任务中的大部分通过HTTP并发请求出去,这样提高了大量业务时的响应时间,提供用户体验。
常见的问题是没有处理好短链接,在一般使用时无法发现,当某些大量更新的场景下,比如首次登录,或者被拉进多个群组后的第一次登录,就会发现有些用户信息或者群组信息无法更新成功,导致一直显示ID。后面的部署说明中会有如何检查短链接是否配置正确的方法。
关于长短连接更多的内容请去mars项目上查找,或者互联网上搜索。