bifromqio / bifromq

A Multi-Tenancy MQTT broker adopting Serverless architecture
https://bifromq.io
Apache License 2.0
619 stars 61 forks source link

集群在进行压测后无法连接。 #57

Closed dddddkkkkk closed 8 months ago

dddddkkkkk commented 8 months ago

Describe the bug image

前一日压测场景:10Topic_10P_10S_Qos0_Payload5120_Qps13030.2_cleanSession=True_Retain=false 压测工具:jmeter bifromq version: 2.1.0 ● 发压机: 云服务器 CentOS Linux release 7.9.2009 (Core) 8核 16GB ● 部署机: 云服务器 CentOS Linux release 7.9.2009 (Core) 8核 16GB * 3 ● 订阅机: 云服务器 CentOS Linux release 7.9.2009 (Core) 8核 16GB

nginx 配置 stream { upstream bifromq_cluster{ #least_conn; server 172.16.32.3:1883; server 172.16.32.4:1883; server 172.16.32.7:1883; #server bifromq-node1:1883; } server { listen 1884 so_keepalive=on; proxy_connect_timeout 60s; #proxy_timeout 60s; proxy_pass bifromq_cluster; tcp_nodelay on; # nginx 不限速 #limit_rate 50g; } }

standalone.yml 配置

image

bifromq-start.sh 配置 image

error 错误日志 de86ddda62dccd410c37664c9b5db55

dddddkkkkk commented 8 months ago

重新部署集群后,依然不可连接。 重启服务器后,连接正常。

mafei6827 commented 8 months ago

@dddddkkkkk 第一个问题,建议启动每台服务器后,检查下error.log以及标准输出里是否有错误,有时候会因为端口被占用的问题启动失败。

第二个问题,这种用法单个mqtt连接上的吞吐看起来太大了,这样很容易会引起消息阻塞进而导致应用内存过高,容易被系统层面kill掉,建议更换一种实现方式,比如用共享订阅代替。

dddddkkkkk commented 8 months ago

@mafei6827 感谢回复,排查发现确实是被系统kill掉进程了。由于我需要保障消息的顺序性,因此无法采用共享订阅的模式,不知是否有其他解决方案呢。

dddddkkkkk commented 8 months ago

在jvm层面限制内存使用量,是否可以保障服务不被杀死呢。

mafei6827 commented 8 months ago

@dddddkkkkk 可以的,BifroMQ启动脚本会根据系统内存情况设置jvm堆内存和Direct内存,可以通过更改bifromq-start.sh中的$MEM_LIMIT参数,限制一下BifroMQ可以使用的总内存。

dddddkkkkk commented 8 months ago

感谢回复,还有个问题需要请教一下,如果订阅节点需要考虑时序性,通过共享订阅方式有什么解决方案?

popduke commented 8 months ago

@dddddkkkkk bifromq支持一种sub client接收时保证按单个pub client发送顺序的共享订阅(使用"$oshare"作为订阅字符串开头);不用共享订阅的话你可以在topic设计时做些分组,然后用固定的sub client分别订阅这些分组topic,只要保证分组的消息吞吐不超过单个sub client的处理能力即可。