主要是服务端订阅情况下怎么部署
从并发角度应该是rabbitmq消息队列方式部署的,因为智能设备总是在线的,对传统电商行业来讲是高并发场景,在电商中涉及到库存和订单重复支付等问题,对设备来讲存在控制命令结果是否正确的问题。
1-设备上报压力测试工具
package mainimport ("encoding/json""fmt"mqtt "github.com/eclipse/paho.mqtt.golang""sync")var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())}var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {fmt.Println("Connected")}var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {fmt.Printf("Connect lost: %v", err)}func main() {var broker = "xxxxx.mqtt.iothub.aliyuncs.com"var port = 1883opts := mqtt.NewClientOptions()opts.AddBroker(fmt.Sprintf("tcp://%s:%d", broker, port))opts.SetClientID(" ")opts.SetUsername(" ")opts.SetPassword("")opts.SetDefaultPublishHandler(messagePubHandler)opts.OnConnect = connectHandleropts.OnConnectionLost = connectLostHandlerclient := mqtt.NewClient(opts)if token := client.Connect(); token.Wait() && token.Error() != nil {panic(token.Error())}data := make(map[string]interface{})detail := make(map[string]interface{})detail["asset_id"] = "xxx"detail["event_time"] = "xxx"detail["client_sn"] = ""detail["result"] = "xxx"data["method"] = "thing.event.display_event.post"data["params"] = detailnum := 2000dataStr, _ := json.Marshal(data)var wg sync.WaitGroupfor i := 0; i < num; i++ {wg.Add(1)go func() {defer wg.Done()//qos=0不用等待mqtt server回复是否接收到 只管往里面推token := client.Publish("/sys/xxx/xxxx/thing/event/display_event/post", 0, false, dataStr)_ = token.Wait() // Can also use '<-t.Done()' in releases > 1.2.0if token.Error() != nil {fmt.Println(token.Error())} else {fmt.Println("发布消息成功!")}}()}wg.Wait()}
go模拟设备上报。利用go协程实现并发可以压力测试mqtt server或者模拟线上设备并发的脚本
