mqtt-proxy
Description
The plugin mqtt-proxy
only works in stream model, it help you to dynamic load balance by client_id
of MQTT.
And this plugin both support MQTT protocol 3.1.* and 5.0.
Attributes
Name | Type | Requirement | Default | Valid | Description |
---|---|---|---|---|---|
protocol_name | string | required | Name of protocol, should be MQTT in normal. | ||
protocol_level | integer | required | Level of protocol, it should be 4 for MQTT 3.1.* . it should be 5 for MQTT 5.0 . | ||
upstream | object | deprecated | Use separate upstream in the route instead. | ||
upstream.host | string | required | the IP or host of upstream, will forward current request to. | ||
upstream.ip | string | deprecated | Use “host” instead. IP address of upstream, will forward current request to. | ||
upstream.port | number | required | Port of upstream, will forward current request to. |
How To Enable
To enable this plugin, we need to enable the stream_proxy configuration in conf/config.yaml
first. For example, the following configuration represents listening on the 9100 TCP port.
...
router:
http: 'radixtree_uri'
ssl: 'radixtree_sni'
stream_proxy: # TCP/UDP proxy
only: false # needed if HTTP and Stream Proxy should be enabled
tcp: # TCP proxy port list
- 9100
dns_resolver:
...
Then send the MQTT request to port 9100.
Creates a stream route, and enable plugin mqtt-proxy
.
curl http://127.0.0.1:9080/apisix/admin/stream_routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"mqtt-proxy": {
"protocol_name": "MQTT",
"protocol_level": 4
}
},
"upstream": {
"type": "roundrobin",
"nodes": [{
"host": "127.0.0.1",
"port": 1980,
"weight": 1
}]
}
}'
In case Docker is used in combination with MacOS host.docker.internal
is the right parameter for host
.
This plugin exposes a variable mqtt_client_id
, and we can use it to load balance via the client id. For example:
curl http://127.0.0.1:9080/apisix/admin/stream_routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"mqtt-proxy": {
"protocol_name": "MQTT",
"protocol_level": 4
}
},
"upstream": {
"type": "chash",
"key": "mqtt_client_id",
"nodes": [
{
"host": "127.0.0.1",
"port": 1995,
"weight": 1
},
{
"host": "127.0.0.2",
"port": 1995,
"weight": 1
}
]
}
}'
MQTT connections with different client ID will be forwarded to different node via the consistent hash algorithm. If the client ID is missing, we will balance via client IP instead.
Delete Plugin
$ curl http://127.0.0.1:9080/apisix/admin/stream_routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X DELETE
The mqtt-proxy
plugin has been deleted now.