# SI-MQTT **Repository Path**: joeyliao/si-mqtt ## Basic Information - **Project Name**: SI-MQTT - **Description**: golang mqtt服务器,v5协议版,集群通讯采用getty+自定义编解码,目前集群初始版功能,努力完善中。v5客户端:https://gitee.com/Ljolan/siui - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: dev-cluster-v1 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 13 - **Created**: 2021-09-20 - **Last Updated**: 2021-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # gitee.com/Ljolan/si-mqtt #### 介绍 golang mqtt服务器,集群版【设计中】 #### 使用说明 - core 包为核心包 - 项目基础配置在core/config/config.toml里面 - 添加环境变量 SI_CFG_PATH = "配置文件路径" ,如果不配置,则默认使用core/config/config.toml配置 - 以package方式 运行 main.go即可 #### 设计可能选择的方案 1. mysql集群设计 2. zk+redis+自定义节点通讯 3. 静态配置启动【当前实现方案】 #### 待优化实现 1. ~~发送给客户端的pkid应该专属,不能用上发来的那个旧pkid~~ 2. 释放出栈消息的两个阶段可以添加批量删除,不然一个一个删除太慢了 3. ~~session从数据库初始化的消息拉取~~ 4. 断线后状态变更,是否需要丢弃内存中那份,每次都从数据库中获取? > --- 当前节点先不删,等到了过期时间再系统自动删除,当节点在其它节点连接时, 其它节点会通知这边删除旧session,其他节点那边从数据库获取再初始化, 如果又在自己这个节点上连接,则会继续使用这个session。需要注意qos=0的消息 5. ~~断开连接后,需要处理完输入缓冲区内收到的消息~~ 6. 消息过期间隔 7. ~~session过期间隔,disconnect中可以重新设置过期时间~~ 8. Request/Response 模式 ---(客户端处理) 9. ~~订阅标识符~~ 10. ~~订阅选项 NoLocal、Retain As Publish、Retain Handling处理~~ 11. ~~主题别名(Topic Alias)处理~~ 12. 流控 13. Receive Maximum 属性 14. 补充Reason string 15. Maximum Packet Size处理 16. 遗嘱延迟发生处理 17. ... #### 设计思路 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0903/231523_cbe216ec_3048600.png "客户端消息处理.excalidraw.png") ![输入图片说明](https://images.gitee.com/uploads/images/2021/0903/232740_351967e7_3048600.png "共享订阅集群通知.excalidraw.png") #### 系统领域uml设计 [uml图、不同包中方法调用图](https://gitee.com/Ljolan/si-mqtt/tree/dev-cluster-v1/image)