客户端消息发到IM服务器之后,IM服务器会给接收客户端发送MSG_SYNC_NOTIFY,然后让客户端再主动去拉,为啥不直接返回MSG_IM呢?
这样做的目的是严格控制消息顺序的,客户端接受到的消息顺序和服务端存储的顺序会一致。只有不持久化的消息才会即时发送到接收客户端。
我看代码中,只有CustomClient在处理消息时才会去判断MESSAGE_FLAG_UNPERSISTENT标志,如果该标志已经设置,那么就不会调用IMS的存储服务。
只有customer_client才支持消息的非持久化!
IMR扩缩容的话,IM必须修改对应的路由服务器地址配置,然后重启所有IM服务器。
IMS扩缩容的话,IM必须修改对应的存储服务器地址配置,然后重启所有IM服务器;同时,还必须迁移消息数据文件和消息索引文件!
目前看到的代码中包含两种RPC:
终端 <-> IM:custom
IM <-> IMR:custom
IM <-> IMS:gorpc
回答
因为终端和IM之间、IM与IMR之间需要维持长连接来保持状态。 IM终端服务器维护了连接到此服务器的各个终端的路由信息,当终端下线时,会删除路由信息中的相关条目。 IMR路由服务器维护了连接到此服务器的各个IM服务器的路由信息,当IM连接中断时,会删除路由信息中的相关条目。
但是,IMS也会与IM建立长连接的呀(im.go L516),为啥它不用自定义协议,而选择了gorpc呢?难道gorpc只能进行RPC调用,而接收不到连接建立事件或者连接断开事件吗?如果gorpc无法处理连接事件的话,肯定就无法维护相关路由信息了,肯定无法满足终端与IM、IM与IMR之间的RPC需求了;如果gorpc能处理此类连接事件的话,那么为什么还要自定义协议呢?