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

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


问题回放

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

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

3000客户端

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

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

iot-worker消费截图

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

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

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

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

问题排查

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

//获取消息处理器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发来的消息了。

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

题外话

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

总结

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

你可能感兴趣的:(emqx速度)