EMQ + 插件 + 性能优化

物联网开发 + IM通讯开发  showcode1024

研究如下问题:

DefaultLimitNPROC
DefaultLimitNOFILE
net.nf_conntrack_max
net.core.somaxconn是socket监听的最大backlog数,这个参数用于保护服务器不被太多的连接请求打满。
cat /proc/sys/net/ipv4/ip_local_port_range     https://blog.youkuaiyun.com/m0_55461869/article/details/131326219

EMQX压测工具emqtt_bench安装使用_emqx压力测试-优快云博客

centos安装

cd /home/ && mkdir -p max && cd /home/max && yum install -y wget openssl && wget https://www.emqx.com/zh/downloads/broker/4.4.19/emqx-4.4.19-otp24.3.4.2-1-el7-amd64.rpm && sudo yum install emqx-4.4.19-otp24.3.4.2-1-el7-amd64.rpm -y && sudo systemctl start emqx && systemctl status emqx

MQTTBox
原文出自:www.hangge.com  转载请保留原文链接:MQTT系列教程3(客户端工具MQTTBox的安装和使用)

如果用ws(websocket)连接,需要加/mqtt 

topic过滤器,通配符

单层通配符 ‘+’
直接看例子:
订阅客户端,订阅了:t/+ 这个主题。
发布客户端,发布了:t/1 这个主题的消息——A;t/a 这个主题的消息——B;t/1/1 这个主题的消息——C; t/1/a 这个主题的消息——D。
最终订阅客户端只接收到了A、B这两个消息。也就是只能接收到只有一个斜杠的主题的消息。(顾名思义,单层通配符)


通配符2——多层通配符 ‘#’
多层通配符单层相对应。还是上面的例子。
订阅客户端,改为订阅:t/# 这个主题。
发布客户端,发布的消息不变
最终订阅客户端会接收到A、B、C、D的消息。也就是只要开头是t的消息,不管后面有多少层都会匹配上。(顾名思义,多层通配符)

1.集群搭建

手动创建集群的时候: emqx_ctl cluster join emqx@192.168.153.128, 这里node节点的名字使用真实ip

EMQ X 支持多种节点发现策略,分布式集群 | EMQX 4.3 文档

注意开放集群发现端口的防火墙

JWT鉴权Golang 中使用 JWT 做用户认证

开启了auth.jwt.verify_claims = on之后,就要求在链接emq的时候,token中的playload信息username字段和链接时候设置的字段一致,否则返回失败

配置文件 /etc/emqx/emqx.conf

日志路径 log.dir = /var/log/emqx  emqx.log

多租户消息隔离

配置
编辑emqx.conf,打开zone.external.mountpoint , 如: zone.external.mountpoint = %u/

说明
不开启集群中开启zone,各个用户(设备)之间可以互相订阅消息
开启后,各个用户的设备之间不能发消息,同一个用户下各个设备直接能互相订阅消息

这个主题前缀对客户端是无感的,但是服务端所有对于主题的操作都应该加上(%u表示用户id)前缀
通过http接口对服务端 所有对于主题的操作都应该加上前缀
如: 让dev1订阅a这个topic就应该发送 xiaoli/a (提前创建了用户xiaoli)
curl -i --basic -u admin:public -X POST "http://139.198.170.111:8081/api/v4/mqtt/subscribe" -d '{"topics":"xiaoli/a","qos":1,"clientid":"dev1"}'

集群都开启mountpoint
如果集群开启zone,客户端往a主题发消息, 11883端口的订阅者要订阅 xiaoli/a 才能收到消息, 同一用户的不同设备(连接到1883端口)正常订阅a就能收到消息

集群部分开启mountpoint
假如集群中有node 128和129, 128开启zone.external.mountpoint,129不开启
dev2订阅129的11883端口的主题a, 如果客户端都是链接到129,向a写,那么dev2能够正常收到数据, dev2订阅xiaoli/a收不到消息
如果其他客户端链接到128,向主题a发送消息, dev2还是链接129的11883端口,需要订阅 xiaoli/a 这样的主题才能收到消息 ,其他链接到129(1883端口)的设备,需要订阅 用户名/a才能收到数据

nginx做负载均衡

安装最新版本nginx,  vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

yum install nginx

编辑/etc/nginx/

stream{
    upstream emqx_cluster {
        server 192.168.3.233:1883;
        server 192.168.3.234:1883;
        server 192.168.3.235:1883;
    }
 
    server{
       listen  18084 so_keepalive=on;
       proxy_connect_timeout 10s;
       proxy_timeout 20s;
       proxy_pass emqx_cluster;
    }
}
 

retained消息

emqx_ctl retainer topics
emqx_ctl retainer clean quote/2

mqtt 之 last will(遗愿)

设置了之后,异常断链的时候会发送这个消息

设置为false 关闭匿名认证 (关闭之后,登陆必须要有一个auth插件是返回true的,才能正常登陆)

# etc/emqx.conf

## Value: true | false
allow_anonymous = true

在dashboard上查看topic收到的数据消息

 主题监控

压测工具安装

centos直接安装二进制文件, 注意选择对应的centos版本7或8,如果出现动态库依赖缺少,可以降低点版本

https://github.com/emqx/emqtt-bench/releases/tag/0.4.6

性能优化

1.我的系统已经设置了最大打开文件句柄数是2000000,但是emqx显示的是 1048576 ,因为

/usr/lib/systemd/system/emqx.service中的设置 LimitNOFILE=1048576

2.最大链接数限制

./emqtt_bench conn -h  ip   -c 25000 -R 1000  -k 300 -C false -p 1883

压测的时候,客户端不要和服务端都在一台ECS服务器上,多在几个客户端上启动客户端,目前看一个ECS的链路大概25000

会话超时时间

默认2小时超时,如果客户端频繁的创建会话并且客户端没有设置session_expiry_interval会话超时时间,则默认是2小时,这样服务器的会话保留数会增大,导致服务器的内存和CPU都会增加

修改emqx.conf  配置文件,减小会话时间,使得会话能够及时回收

## Default: 2h, 2 hours
zone.external.session_expiry_interval = 15m

### 关于 EMQX 5.0 插件文档和教程 对于 EMQX 5.0 的插件开发和支持,官方提供了详细的指南来帮助开发者理解和创建兼容此版本的插件EMQX 是一款分布式MQTT消息代理服务器,其插件机制允许扩展功能以满足不同场景的需求。 #### 官方资源链接 - **官方文档**: 访问 [EMQX 官网](https://www.emqx.io/docs/en/v5.0/) 可获取最权威的信息源。这里包含了关于如何安装、配置以及编写自定义插件的具体指导[^4]。 #### 主要特性概述 - 支持多种编程语言编写的插件,包括 Erlang 和 C++ 等; - 提供 API 接口用于实现业务逻辑处理; - 文档中还介绍了有关性能优化方面的建议; #### 开发流程概览 为了更好地理解整个过程,在开始之前应当熟悉以下几个方面: 1. 配置环境准备:确保本地已正确设置好Erlang/Elixir运行时环境,并下载对应版本的 EMQX 源码仓库。 2. 创建新项目结构:按照给定模板建立一个新的工程目录树。 3. 编写核心代码片段: ```erlang %% Example Plugin Code Snippet -module(emqx_plugin_example). -export([on_message_publish/2]). on_message_publish(Message, _Env) -> io:format("Message Published ~p~n", [Message]), {ok, Message}. ``` 4. 测试验证:利用内置工具集进行单元测试与集成测试,保证新增模块稳定可靠。 通过上述介绍可以了解到针对 EMQX 5.0 版本所涉及的相关资料和技术细节。希望这些信息能够为有兴趣深入了解该主题的人士提供有价值的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值