emqx速度_今天解决了订阅emqx无限重复消费的问题,记录一下

在使用Go语言设计物联网平台时遇到EMQX订阅导致的无限重复消费问题,通过代码排查和修改,发现因循环订阅导致。修复后性能表现良好,提醒开发者注意理解并谨慎复制代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我业余在用go语言重新设计和实现一个通用物联网平台,订阅emqx的时候,出现了无限重复消费的情况。昨天解决了,今天记录一下。


问题回放

压测3000连接,每个客户端1秒发送1条模拟数据。合计3000/s。

3217d71aaf423f0bf867f3aa448b44b2.png

3000客户端

奇怪的是,当我跑起订阅的程序后,消费的速度统计已经接近100000/s,明显不对。而且根本没停下来的意思。

41a0c697dcb3039d163c0e86fe73bb80.png

iot-worker消费截图

sent是代表emqx发送的数据量,可以看到是4453万+,received代表emqx接受到的数据量,可以看到是2812万+。因为我只有一个消费程序并只订阅了一个主题。emqx的发送的数据应该是等于received的,如果再考虑网络丢包的一些影响,也不可能差异这么大。

b8562181838fb360c961f3fd6aece5cc.png

为了确定是否重复消费了。我设置了随机msgId打印了日志。可以看到确实是重复消费了。而且是无限循环。

aaa72a3a3badaa05be7e08f891476f65.png

问题排查

我翻回自己修改前的代码。

//获取消息处理器messageHandler := getMessageHandler(operation)waitGroup.Add(1)go func(operation *Operation) {for {time.Sleep(time.Duration(10) * time.Millisecond)token := client.Subscribe(operation.Context.FromTopic, operation.Context.FromQos, messageHandler)token.Wait()}}(operation)

在看看修改后的代码。

//获取消息处理器messageHandler := getMessageHandler(operation)waitGroup.Add(1)go func(operation *Operation) {token := client.Subscribe(operation.Context.FromTopic, operation.Context.FromQos, messageHandler)token.Wait()if token.Error() != nil {log.Panicf("[Sub] mqtt connect error, taskId: %d, fail_nums: %d, error: %s ", clientId, 1, token.Error())}}(operation)

各位有没有发现哪里不一样?请忽略日志打印的代码。

func里面多了个循环。也就是循环发起订阅了。这个效果约等于各位:
打开头条,看本文章,然后退出...

打开头条,看本文章,然后退出...

打开头条,看本文章,然后退出...

代码修改后

消费正常了。而且停止了压测程序,马上就没有接收到eqmx发来的消息了。

99131400b63283a6daed893375eaa2c1.png

题外话

至于为什么会写出这样的代码,原谅我吧,我也是从网上抄下来的,至于哪个家伙分享的博客就找不回来了,一开始也很疑惑为啥需要循环,直到出问题才知道被坑了。

总结

  1. 抄代码要理解透彻,否则被坑是常有的事。
  2. emqx性能还可以的。最重要的是消耗低。
  3. 欢迎大家评论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值