私有 TCP 协议
EMQ X 提供 emqx-tcp 插件,插件作为一个靠近端侧的一个接入模块,按照其功能逻辑和整个系统的关系,将整个消息交换的过程可以分成三个部分:终端侧,平台侧和其它侧:
|<-- Terminal -->|<--------- Broker Side --------->|<--- Others --->|
|<- Sid e ->| |<-- Side -->|
+---+ PUB +-----------+
| D | INCOMING +----------+ PUB +---------+ -->| subscriber|
| E |----------->| |----------->| |--/ +-----------+
| V | | emqx-tcp | | EMQ X |
| I |<-----------| |<-----------| |<-- +-----------+
| C | OUTGOING +----------+ PUB +---------+ \--| publisher |
| E | PUB +-----------+
+---+
- 终端侧,通过本插件定义的 TCP 私有协议进行接入,然后实现数据的上报,或者接收下行的消息。
- 平台侧,主体是 emqx-tcp 插件和 EMQ X 系统。emqx-tcp 负责报文的编解码,代理订阅下行主题。实现将上行消息转为 EMQ X 系统中的 MQTT 消息 PUBLISH 到整个系统中;将下行的 MQTT 消息转化为 TCP 私有协议的报文结构,下发到终端。
- 其它侧,可以对 2 中出现的上行的 PUBLISH 消息的主题进行订阅,以接收上行消息。或对发布消息到具体的下行的主题,以发送数据到终端侧。
配置说明
协议层
## 闲置时间。超过该时间未收到 CONNECT 帧, 将
## 直接关闭该 TCP 连接
tcp.proto.idle_timeout = 1s
## 上行主题。上行消息到 EMQ 系统中的消息主题
##
## 占位符:
## - %c: 接入客户端的 ClientId
## - %u: 接入客户端的 Username
tcp.proto.up_topic = tcp/%c/up
## 下行主题。客户端接入成功后, emqx-tcp 会订阅
## 该主题,以接收 EMQ 系统向该类型的客户端下
## 发的消息。
##
## 占位符:(同上)
tcp.proto.dn_topic = tcp/%c/dn
## 最大处理的单个 TCP 私有协议报文大小
tcp.proto.max_packet_size = 65535
## 开启状态统计。开启后,emqx-tcp 会定期更新
## 连接信息, 并检测连接的健康状态
tcp.proto.enable_stats = on
## 强制 GC, 当进程已处理 1000 消息或发送数据超过 1M
tcp.proto.force_gc_policy = 1000|1MB
## 强制关闭连接, 当进程堆积 8000 消息或堆栈内存超过 800M
tcp.proto.force_shutdown_policy = 8000|800MB
监听器
监听器配置比较广泛,在此仅列举部分常用部分:
## 配置监听的端口
tcp.listener.external = 0.0.0.0:8090
## 配置监听池大小。影响 TCP 建链的并发速率。
tcp.listener.external.acceptors = 8
## 最大连接数
tcp.listener.external.max_connections = 1024000
## 每秒支持的最大并发连接数
tcp.listener.external.max_conn_rate = 1000