title |
---|
mqtt-proxy |
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.
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. |
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.
$ 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.