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
目录
相关文章
|
3月前
|
安全 测试技术 Go
第十五章 Golang单元测试
第十五章 Golang单元测试
31 2
|
3月前
|
传感器 监控 物联网
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
271 3
|
3月前
|
网络协议 Go 数据安全/隐私保护
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
364 2
|
12天前
|
测试技术 Go
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
|
3月前
|
安全 测试技术 网络架构
【专栏】编写网络设备割接方案的七个步骤,包括明确割接目标、收集信息、制定计划、设计流程、风险评估、准备测试环境和编写文档。
【4月更文挑战第28天】本文介绍了编写网络设备割接方案的七个步骤,包括明确割接目标、收集信息、制定计划、设计流程、风险评估、准备测试环境和编写文档。通过实际案例分析,展示了如何成功完成割接,确保业务连续性和稳定性。遵循这些步骤,可提高割接成功率,为公司的网络性能和安全提供保障。
506 0
|
20天前
|
开发框架 前端开发 JavaScript
ABP框架测试信息---Winform端、动态网站、Vue&Element管理后端等
ABP框架测试信息---Winform端、动态网站、Vue&Element管理后端等
|
27天前
|
消息中间件 运维 RocketMQ
MetaQ/RocketMQ 原理问题之slave broker是从master同步信息的问题如何解决
MetaQ/RocketMQ 原理问题之slave broker是从master同步信息的问题如何解决
|
27天前
|
运维 监控 测试技术
Golang质量生态建设问题之接入并使用Go单元测试插件的问题如何解决
Golang质量生态建设问题之接入并使用Go单元测试插件的问题如何解决
|
27天前
|
测试技术 Shell Go
Golang质量生态建设问题之单元测试在卓越工程中的问题如何解决
Golang质量生态建设问题之单元测试在卓越工程中的问题如何解决
|
27天前
|
测试技术 Shell Go
Golang质量生态建设问题之Go语言的单元测试的问题如何解决
Golang质量生态建设问题之Go语言的单元测试的问题如何解决