野火IM 社区版IM Server集群部署思路

野火IM 免费版 集群部署思路

单机版本改造成集群版本需要解决的问题

  1. 集群缓存同步
  2. Session同步
  3. MQTT 连接状态同步
  4. nginx配置

集群缓存同步方案

1.将hazelcast切换成 jetcache 二级缓存 或 多级缓存,我使用的是三级缓存 Caffeine + Redis + DB,因为hazelcast使用到了MapStore功能,所以我添加了DB作为三级缓存

2.使用 mq 来用作集群缓存状态变更通知,使每台机器上的 jetcache 缓存值一致

 

Session同步

类似于web项目中的session状态都放在redis中,但是此处不可以,如果放入redis 需要更改项目实体,我的解决方案是

  1. session 发生变更则发送MQ 消息
  2. 其他机器收到session变更消息后,刷新本地session缓存

 

MQTT 连接状态同步方案

除了缓存之外,还有 MQTT 连接,例如

A 连接到 192.168.0.1 服务器

B 连接到 192.168.0.2 服务器

A 发送消息给 B,B 需要收到消息通知后再去拉取消息

但是 B 和 A 不在同一台服务器上,这个之后就要将消息通知到 192.168.0.2 服务去发送给 B

我的方案是:

如果判断接收方是否在当前服务器,

如果在则发送,

不在则发送 MQ 消息,通知所有服务器去发送消息,消费服务器发现接收方不在当前服务器则跳过,存在则发送

 

Nginx配置

  1. Im-server MQTT(1883端口) 域名配置,见文章最后nginx.conf参考
  2. Im-server 80 端口服务配置,broker 文件夹下的nginx 配置就可直接使用,可以通过 nginx 端口转发 换掉 80 端口,本地测试最好使用 80 端口,使用 nginx 转发可以换成其他端口
  3. Im-server 18080 端口 Admin API 服务配置,参考broker 文件夹下的nginx

 

MQTT nginx 配置参考

stream {
    log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time';
  
    access_log /www/wwwlogs/tcp-access.log tcp_format;
    error_log /www/wwwlogs/tcp-error.log;
    include /www/server/panel/vhost/nginx/tcp/*.conf;
    
    upstream mqttserver{
        server 192.168.0.179:1883; 
    }
    
    
#MQTT nginx 配置 server{ listen 1883; proxy_pass mqttserver; }
   }

 

posted @ 2022-10-26 09:52  bookc  阅读(976)  评论(0编辑  收藏  举报