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

简介: 开发语言: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
相关实践学习
5分钟轻松打造应对流量洪峰的稳定商城交易系统
本实验通过SAE极速部署一个微服务电商商城,同时结合RocketMQ异步解耦、削峰填谷的能力,带大家体验面对流量洪峰仍旧稳定可靠的商城交易系统!
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
10月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
11月前
|
Java Go 调度
GO 协程
GO 协程
74 0
|
NoSQL 关系型数据库 MySQL
涉及rocketMQ,jemeter等性能测试服务器的安装记录
涉及rocketMQ,jemeter等性能测试服务器的安装记录
114 1
EMQ
|
JSON Linux 网络性能优化
MQTT 5.0 报文解析 02:PUBLISH 与 PUBACK
本文将介绍在 MQTT 中用于传递应用消息的 PUBLISH 报文以及它的响应报文。不管是客户端向服务端发布消息,还是服务端向订阅端转发消息,都需要使用 PUBLISH 报文。决定消息流向的主题、消息的实际内容和 QoS 等级,都包含在 PUBLISH 报文中。
EMQ
722 40
MQTT 5.0 报文解析 02:PUBLISH 与 PUBACK
|
8月前
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
8月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
135 1
|
10月前
|
测试技术 Go
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
|
11月前
|
开发框架 前端开发 JavaScript
ABP框架测试信息---Winform端、动态网站、Vue&Element管理后端等
ABP框架测试信息---Winform端、动态网站、Vue&Element管理后端等
|
11月前
|
运维 监控 测试技术
Golang质量生态建设问题之接入并使用Go单元测试插件的问题如何解决
Golang质量生态建设问题之接入并使用Go单元测试插件的问题如何解决
|
11月前
|
测试技术 Shell Go
Golang质量生态建设问题之单元测试在卓越工程中的问题如何解决
Golang质量生态建设问题之单元测试在卓越工程中的问题如何解决

推荐镜像

更多