如何设计Mqtt的Retain?
在opmq中,结构体如下
服务 srv
订阅的 sub
连接client_conn
topic树, ut
父子关系,左边是父亲: srv <- sub <- ut <- client_conn
client_conn <- srv
其中的clinet_conn任务管道 job
对于client_conn 的retain
千万不能通用现成的chan
一定要用队列list
对于添加topic函数: addt 。是在ut树下进行节点拷贝,但是断开连接,gc时候肯定会吧任务管道加上。对于这个连接结构体,无法判断神魔时候到底不用,这个交给了go本身的垃圾回收,如果管道没处理好,就是灾难,还是把retain用list,不用管道
注意
因为这个opmq实现了掉线重连,这个client_conn是从上到下的参数,贯穿始终,除了断开连接,无法判断用了多少次