首页 > 采用mqtt协议实现即时通讯, 该如何设计topic?

采用mqtt协议实现即时通讯, 该如何设计topic?

一. 以下是我的逻辑, 请各位前辈,哥哥们帮忙看看. 是否可行. 有没有更好的方案?

  1. 点对点聊天, 可以让每个用户都有一个属于自己的topic. 每个用户上线了都订阅自己的topic.
    下面假设有用户A,B 分别订阅topicA, topicB

场景: 用户A打开手机, 查看页面上的诸多联系人, 发起聊天,发送一条消息给用户B.

具体操作: 这时候, 该用户会publish一条消息到服务器, 而该消息携带的topic里 一定要包含B的标识的东西如B的uid, 这里的uid可以是请求页面的时候就带下来的, 这时候topic 可以为client/uid_A/to/uid_B , 约定好,服务器端能解析出来谁发的, 发给谁的, 内容是什么即可. 这时候, 就可以封装好这条消息, 通过publish到topicB上. 反之同理,当然以上是没有考虑, 对方不在线的情况. 如果接收方B, 不在线. 而此时可以根据消息的qos等级, 决定是否持久化. 从而待用户B上线时, 一块推送

  1. 群组聊天.

场景需求: 我发一条语音, 希望本城市的所有的商家用户都能收到.(比较奇葩,想不到好的例子)

具体操作: 这时候, 我可以约定一个固定的分类, 用于群聊
topic 格式可能就是: group/城市代码, 这样让所有商家一上线就根据自己城市代码订阅topic, 这时候, 当一个用户publish消息, 这时候在客户端的时候具体的topic就应该清晰了, 城市代码可以在初始化页面也可以另外发一个http请求给服务器接口获取, 这样, 消息到达服务器之后, 可以直接推送给那个订阅那个topic的所有商家. 同样, 可以根据商家对这个topic的消息的服务质量情况,决定是否持久化, 让没有在线的商家上线后也可以收到.

二 .
我用的是netty + mqtt 实现上述功能.
有个细节就是, netty 提供了ChannelGroup可以管理channel,
比如我用map管理了所有的topic

Map<String,ChannelGroup> groups = new ConcurrentHashMap<String, Channegoup>();

这个map的键就是topicName.
由此带来两个问题:

  1. 我上面群聊的topic都是应用启动的时候从服务器读取并初始化了, 这样导致固定的topic就有几千个, 如果用户能上万的话, 每个用户都有一个自己的topic, 这个map 会不会有性能问题

  2. 正是由于我固定存在的topic都是应用启动时初始化的, 那么我要想加一个固定的topic, 岂不是要重新启动?

三.
以上不管是点对点聊天, 还是群聊, topic我都是让他固定的, 但是我看群里有人讨论, 订阅者可以在主体不存在的情况下, 创建一个, 这又是用在什么地方呢?

最后, 第一次提这么久长的问题, 有点啰嗦. 一直对netty 比较感兴趣. 加上碰巧毕业设计可以用上. 就想netty + mqtt实现一个简单的即时通讯功能. 仅仅是个人爱好. 如果是工作需要的话, 我肯定用第三方了.哈哈. 感谢大家的指点

【热门文章】
【热门文章】