Golang使用协程进行mqtt的publish信息性能测试

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 开发语言:golang目的:并发10000个mqtt连接,循环发送publish信息,当时间戳小于某个值的时候,中止循环,退出连接publish内容是json格式的,未设置时,有默认值,可以通过golang代码修改json内容登录信息存取在csv文件中,csv文件有多少列,就并发多少个设备连接

需求

开发语言:golang

目的:并发10000个mqtt连接,循环发送publish信息,当时间戳小于某个值的时候,中止循环,退出连接

publish内容是json格式的,未设置时,有默认值,可以通过golang代码修改json内容

登录信息存取在csv文件中,csv文件有多少列,就并发多少个设备连接

话不多说,直接上代码

main.go

package main
import (
  "encoding/csv"
  "encoding/json"
  "fmt"
  "os"
  "strconv"
  "time"
  mqtt "github.com/eclipse/paho.mqtt.golang"
)
var total int
// 读取csv文件里的第3列数据,存入一个string数组里
func readcsv(filename string) []string {
  var userNameList []string
  f, _ := os.Open(filename)
  defer f.Close()
  w := csv.NewReader(f)
  data, err := w.ReadAll()
  if err != nil {
    fmt.Println(err)
  }
  for i := range data {
    userNameList = append(userNameList, data[i][2])
  }
  return userNameList
}
func mqttDevice(username string, end_number chan int) {
  // mqtt设备连接,设置IP地址
  opts := mqtt.NewClientOptions().AddBroker("localhost:1883")
  // 设置连接的用户名密码
  opts.SetUsername(username)
  // 使用连接信息进行连接
  client := mqtt.NewClient(opts)
  if token := client.Connect(); token.Wait() && token.Error() != nil {
    panic(token.Error())
  }
  time.Sleep(1 * time.Second)
  fmt.Println("connect success:" + username)
  // 读取json文件,json文件里的是默认参数
  fileReader, _ := os.Open("test.json")
  var eiopJsonMap map[string]interface{}
  json.NewDecoder(fileReader).Decode(&eiopJsonMap)
  // 设置一个开始时间戳和结束时间戳
  startTime := 1598167852000
  endTime := 1598167852000
  // 循环发送遥测,每次遥测间隔时间戳为15分钟
  for ; startTime < endTime; startTime = startTime + 900000 {
    // 定义一个ep的初始值为1,每循环一次就+1
    var ep int
    ep++
    eiopJsonMap["ts"] = startTime
    eiopJsonMap["values"].(map[string]interface{})["ep"] = ep
    // 把修改过的json内容从map转换为json格式
    eiopJsonText, _ := json.Marshal(eiopJsonMap)
    fmt.Println(string(eiopJsonText))
    // 发送遥测,发完之后休眠1秒
    result := client.Publish("topic", 0, true, eiopJsonText)
    result.Wait()
    time.Sleep(1 * time.Second)
  }
  // 发送完信息之后,退出连接
  fmt.Println("disconnect:" + username)
  client.Disconnect(250)
  total++
  end_number <- total
}
func main() {
  userNameList := readcsv("connect_info.csv")
  endNumber := make(chan int, len(userNameList))
  // 变量所有的username,通过go关键字并发多个设备
  for _, userName := range userNameList {
    go mqttDevice(userName, endNumber)
  }
  // 当所有的设备都发送完毕后,关闭程序
  for i := range endNumber {
    fmt.Println("已经有" + strconv.Itoa(i) + "个设备发送完毕")
    if i == len(userNameList) {
      return
    }
  }
}

test.json

{
  "ts": 1603088274000,
  "values": {
    "ep": 12
  }
}

connect_info.csv

localhost,1883,XecUwSmMGiYJp2BspMK2
localhost,1883,GqVqoPP2wblDjS2P9pQ9
相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
2月前
|
安全 测试技术 Go
第十五章 Golang单元测试
第十五章 Golang单元测试
28 2
|
2月前
|
传感器 监控 物联网
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
247 3
|
2月前
|
物联网 Go 网络性能优化
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式【1月更文挑战第21天】【1月更文挑战第104篇】
245 1
|
2月前
|
网络协议 Go 数据安全/隐私保护
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
334 2
|
26天前
|
Go
如何在Go中进行文件操作以及如何使用协程来实现并发编程
如何在Go中进行文件操作以及如何使用协程来实现并发编程
18 2
|
2月前
|
安全 Go 调度
|
2月前
|
监控 负载均衡 算法
Golang深入浅出之-Go语言中的协程池设计与实现
【5月更文挑战第3天】本文探讨了Go语言中的协程池设计,用于管理goroutine并优化并发性能。协程池通过限制同时运行的goroutine数量防止资源耗尽,包括任务队列和工作协程两部分。基本实现思路涉及使用channel作为任务队列,固定数量的工作协程处理任务。文章还列举了一个简单的协程池实现示例,并讨论了常见问题如任务队列溢出、协程泄露和任务调度不均,提出了解决方案。通过合理设置缓冲区大小、确保资源释放、优化任务调度以及监控与调试,可以避免这些问题,提升系统性能和稳定性。
74 6
|
2月前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
37 1
|
2月前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
2月前
|
算法 物联网 网络安全
MQTT常见问题之使用MQTTSendMessage2MQTT.py测试报错如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总: