前言
做个一个经常使用MQTT的小菜鸡,在日常开发中常用的MQTT虽然已经很方便了, 但是老是感觉有些差人强意, 所以我准备重新构建一个新的MQTT, 我叫TA为Open-MQTT, 意思嘛就是开放式的MQTT, 很好理解对吧。 不过嘛要写自己的代码都要准备一些的, 所以我就参考了一些市面上已经有的庞然大物<真牛逼><确实>, RocketMQ的源码, 以及RabbitMQ的使用, 我发现两个的使用都是处于我不太习惯的方法, 尤其是RabbitMQ的注解方式... 这里必须说一下, 越看越不得劲<个人意见哈~>, 所有的集中了MQTT的一些缺点, 实现了自己的方式。 缺点呢如下, 也是我的个人意见, 如果大家觉得不符合, 请不要骂我!!!, 哈哈哈当是照顾照顾菜鸡~~~
- 在SpringBoot中如何合理的扩展。
- 如何完善MQTT的连接、收发消息等。
- 如何在关闭项目时,合理的释放当前资源。
- 优化发送消息。
- 断线重连后的重订阅等等。
MQTT图形化
如果说一个文章没有图片的话, 我觉得确实无趣,但是吧我自己这个水平吧又有点尴尬, 但是最后我还是使用工具画了这几个图为大家参考一下, 如果有不足,请大家合理的指出~
优化点
通过上面的图, 心里想(其实看不出来啥, 擦凸(艹皿艹 )), 哈哈哈, 建议大家如果要使用MQTT可以先用Spring下整合的实例进行实验一下。 好了好了不多少了, 我们直接说吧!! 还是如下几条:
- MQTTClient无法避免一些错误的参数。
- 重连会导致话题订阅的丢失, 以及半个代码洁癖不希望重连操作的频繁。
- 消息接收后的消息转发需要切换线程。
- QPS配置的不稳定。
- 内容序列化,接收消息序列化等
Open-MQTT使用
使用MQTT非常简单,只有两部分内容, 完成YML中的配置, 完成接口的继承!!
YML配置
这里UP菜菜的暂时使用enable的方式去管理Open-MQTT的关闭与开启。 其次这里的参数是最低最少要求参数, UP不想写另外的一些参数,如果想要了解请看下方的MqttProperties配置。
继承接口
继承TopicDispense接口
- 如果你想直接序列化, 请在泛化下指定你的序列化类型,UP这里的例子就是使用的泛化序列化。
- 内容绑定, 添加你想要的话题, 以及话题对应的QPS
- 消息的处理receiveContent(), 有两个参数Topic话题, message的泛化后的消息
~~ 是不是感觉很简单, 但是缺点其实也很多。 不过接下来我们先了解一下我们的基本结构内容吧!
Open-MQTT介绍
对于Open-MQTT, 我实现了MqttTemplate类继承MqttClient参数的问题,实现了TopicDispense对订阅话题分配的处理, 实现了Config参数配置, 当MQTT掉线时自动重连订阅的能力, 实现了泛型完成消息接收的自动序列化问题。 以及正在处理的等等。 下面我来针对于代码进行完全的讲解:
1、MqttTemplate
继承MqttClient 销毁DisposableBean, 经常将MqttClient注册成Bean的玩家应该都知道, 如果我们没有在关闭时合理的释放掉MQTT资源, 会弹出<客户端已连接的内容>,当我们使用MqttTemplate进行扩展时, 就是对自己进行一个合理的释放了。
2、MqttProperties
Open-MQTT的一些优化以及方向
项目中还有一些需要实现的地方, 但是由于个人时间分配或代码能力不足, 尚未实现, 带实现功能如下:
- 强制话题, 解释:当多个继承类的话题相同时, 会优化掉相同的话题。 我个人在bind()方法中存在topicForce参数, 绑定强行绑定该话题。
- 重连复位, 解释:当前重连的频繁度, 以及超出了我个人的预测, 为此我实现了次数延长, 次数 * 时间 = 延长连接
- 内容切片, 解释:当发送的内容无法直接进行序列化时, 我们需要进行一个内容切片处理, 将内容切片后发送至receiveContent()
- ..........等等等
目前作者对于MQTT正在优化的顺序
- 强制话题无法强制, 本人暂时使用Key-Value方式进行处理话题分配进每一个接口的实现类,当话题匹配完成后不会以及往后匹配,这样就不会完成强制要求多个实现类的接口接收话题的内容。
- 重连复位无法延时, 正在排查, 目前想要通过ThreadLocal去解决连接频繁的问题, 为什么用ThreaLocal呢<因为UP没用过......, 想学习一下........>。
- 内容切片无法确认传参、返参, 正在排查该问题, 对于首次发送的内容我们可能需要进行切片后进行处理或反序列化, 但是对于切片的方法我暂时没有想到一个合适的传参,返参的格式, 所以该内容可以会搁置很长一段时间。
- 无法再启动后进行话题订阅分配, 当前我们的订阅分配给实现类都是在程序启动时,现在如果我们以及在运行中了我需要给一个实现类进行话题的添加, 我们应该如何添加,这个作业也在做哦~~~
- MQTTClient的实现并没有全部实现, UP太懒了, 其实我是真没想到MqttClient里面有这么多实现的类, 现在自己写一个东西才发现一个项目,真的作者真的很用心。
- 序列化使用的时FASTJSON, 这个我一个人真不好做, 所以我觉得6号的FASTJSON序列化问题最多是换一个实现比如ObjectMapper等。 当前内容优化为: 2 -> 1 -> 3 -> 4 -> 5 -> 6
一些无能为力的点
因为Maven的缘故, 我没有上传Jar, 所以我会直接在项目地址中定期更新最新Jar包, 如果不合适的话, 可以将项目拉下来自己打。