物联网开发 + 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