Thingsboard 基于netty的mqtt
什么是mqtt?
消息队列嵌入式传输端口(MQTT )构建在TCP/IP协议上,MQTT是一种基于1999年发布/订阅模式的轻量级通信协议,它的最大优点是较少作为低开销、低带宽的即时消息传递协议,MQTT广泛用于物联网、小型设备、移动APP应用等方面。
- 消息质量(QoS):至多一次、至少一次、只有一次
- MQTT的消息类型(Message Type):
- 遗言机制: Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接;Testament:遗嘱机制,功能类似于Last Will
Mqtt服务器主题
- 遥测 v1/devices/me/telemetry
- 属性 v1/devices/me/attributes
- 请求
- 响应
- Rpc
Mqtt消息类型
PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE,SUBACK,UNSUBSCIBE,UNSUBACK
什么是netty?
Netty骄傲的地方就是内存池的管理,从4.0版本开始经常变改,虽是直接内存IO框架的绝配,但直接内存的分配销毁不易,所以使用内存池能大幅提高性能,也告别了频繁的GC。
Netty里四种主力的ByteBuf:
UnpooledHeapByteBuf ,内部的byte[]能够依赖JVM GC自然回收,每次I/O读写都会创建一个新的UnpooledHeapByteBuf,频繁进行大内存分配和回收
UnpooledDirectByteBuf ,内部是DirectByteBuffer,但相比于堆内内存申请和释放,成本要高一些。
PooledHeapByteBuf ,必须要主动将用完的byte[]放回池里,否则内存就要爆掉。
PooledDirectByteBuf ,必须要主动将用完的ByteBuffer放回池里,否则内存就要爆掉。
Netty架构
netty是基于reactor模式的NIO框架
基于netty搭建mqtt服务
与TCP服务的区别:1 建立维护链接(session) 2 依据消息类型,做不同的处理(msg.fixedHeader().messageType()) 3 建立维护订阅列表 (topic-> sub)
serverBootstrap
MqttTransportServerInitializer
MqttTransportHandler