Browse Source

batch: 批量插入

Yi 3 months ago
parent
commit
e3cbc26e69
3 changed files with 61 additions and 16 deletions
  1. 1 1
      go.mod
  2. 4 0
      go.sum
  3. 56 15
      module/mqtt/sub.go

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-temporary-mqtt
 go 1.19
 
 require (
-	gitee.com/xuyiping_admin/pkg v0.0.0-20241010101255-0c6bd229b939
+	gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b
 	github.com/eclipse/paho.mqtt.golang v1.5.0
 	github.com/mitchellh/mapstructure v1.5.0
 	github.com/spf13/cobra v1.8.1

+ 4 - 0
go.sum

@@ -1,6 +1,9 @@
 gitee.com/xuyiping_admin/pkg v0.0.0-20241010101255-0c6bd229b939 h1:ubU0RZ/fiElF9NfDDaJh+czYryqKSoEiMd4ec1emtH8=
 gitee.com/xuyiping_admin/pkg v0.0.0-20241010101255-0c6bd229b939/go.mod h1:Fk4GYI/v0IK3XFrm1Gn+VkgCz5Y7mfswD5hsTJYOG6A=
+gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b h1:w05MxH7yqveRlaRbxHhbif5YjPrJFodRPfOjYhXn7Zk=
+gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b/go.mod h1:8tF25X6pE9WkFCczlNAC0K2mrjwKvhhp02I7o0HtDxY=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -86,6 +89,7 @@ go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/dig v1.15.0 h1:vq3YWr8zRj1eFGC7Gvf907hE0eRjPTZ1d3xHadD6liE=
 go.uber.org/dig v1.15.0/go.mod h1:pKHs0wMynzL6brANhB2hLMro+zalv1osARTviTcqHLM=
 go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
 go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
 go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=

+ 56 - 15
module/mqtt/sub.go

@@ -8,8 +8,12 @@ import (
 	"kpt-temporary-mqtt/config"
 	"kpt-temporary-mqtt/model"
 	"kpt-temporary-mqtt/util"
+	"os"
+	"os/signal"
 	"strconv"
 	"strings"
+	"sync"
+	"syscall"
 	"time"
 )
 
@@ -41,18 +45,59 @@ func (d *DataEventEntry) NewMqtt(configOption *config.AppConfig) golangMqtt.Clie
 	return client
 }
 
+type DataInsertSubMsgLog struct {
+	SubMsgLogList []*model.SubMsgLog
+	Mx            *sync.RWMutex
+}
+
 func (d *DataEventEntry) SubMsgLog(configOption *config.AppConfig, client golangMqtt.Client) {
 	var subMsgChan = make(chan []byte, configOption.WorkNumber)
 	client.Subscribe(configOption.SubTopName, 1, func(client golangMqtt.Client, msg golangMqtt.Message) {
 		subMsgChan <- msg.Payload()
 	})
 
+	DSMLog := DataInsertSubMsgLog{
+		SubMsgLogList: make([]*model.SubMsgLog, 0),
+		Mx:            &sync.RWMutex{},
+	}
+
+	batchSize := 5
+	batchList := make([]*model.SubMsgLog, 0, batchSize)
+
+	sc := make(chan os.Signal, 1)
+	signal.Notify(sc, os.Kill, os.Interrupt, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
+
 	//for i := 0; i < int(configOption.WorkNumber); i++ {
 	//go func() {
 	for {
 		select {
 		case msg := <-subMsgChan:
-			d.CreatMsgLog(msg)
+			subMsLog := d.CreatMsgLog(msg)
+			batchList = append(batchList, subMsLog)
+			if len(batchList) >= batchSize {
+				DSMLog.Mx.Lock()
+				DSMLog.SubMsgLogList = append(DSMLog.SubMsgLogList, batchList...)
+				if len(DSMLog.SubMsgLogList) >= 10 {
+					if err := d.DB.Create(DSMLog.SubMsgLogList).Error; err != nil {
+						zaplog.Error("subMsgChan-info", zap.Any("err", err), zap.Any("subMsgLog", DSMLog.SubMsgLogList))
+					}
+					DSMLog.SubMsgLogList = make([]*model.SubMsgLog, 0)
+				}
+				DSMLog.Mx.Unlock()
+				batchList = batchList[:0]
+			}
+		// 优雅退出
+		case <-sc:
+			if len(DSMLog.SubMsgLogList) > 0 {
+				DSMLog.Mx.Lock()
+				if err := d.DB.Create(DSMLog.SubMsgLogList).Error; err != nil {
+					zaplog.Error("subMsgChan-os", zap.Any("err", err), zap.Any("subMsgLog", DSMLog.SubMsgLogList))
+				}
+				zaplog.Info("subMsgChan-os", zap.Any("success", DSMLog.SubMsgLogList))
+				DSMLog.SubMsgLogList = make([]*model.SubMsgLog, 0)
+				DSMLog.Mx.Unlock()
+			}
+			close(subMsgChan)
 		}
 	}
 
@@ -60,29 +105,25 @@ func (d *DataEventEntry) SubMsgLog(configOption *config.AppConfig, client golang
 	//}
 }
 
-func (d *DataEventEntry) CreatMsgLog(msg []byte) {
+func (d *DataEventEntry) CreatMsgLog(msg []byte) *model.SubMsgLog {
+	defer func() {
+		if time.Now().Day()%15 == 0 {
+			d.DB.Model(new(model.SubMsgLog)).Where("created_at < ?", time.Now().AddDate(0, 0, -15).Unix()).Delete(new(model.SubMsgLog))
+			return
+		}
+	}()
 	subMsgLog, err := d.MsgDataFormat(msg)
 	if err != nil {
 		zaplog.Error("CreatMsgLog", zap.Any("err", err), zap.Any("msg", string(msg)))
 	}
 	if subMsgLog == nil {
-		return
+		return nil
 	}
 	if subMsgLog.Imei == "" {
 		zaplog.Info("CreatMsgLog", zap.Any("msg", string(msg)), zap.Any("subMsgLog", subMsgLog))
-		return
-	}
-
-	defer func() {
-		if time.Now().Day()%15 == 0 {
-			d.DB.Model(new(model.SubMsgLog)).Where("created_at < ?", time.Now().AddDate(0, 0, -15).Unix()).Delete(new(model.SubMsgLog))
-			return
-		}
-	}()
-
-	if err = d.DB.Table(new(model.SubMsgLog).TableName()).Create(subMsgLog).Error; err != nil {
-		zaplog.Error("CreatMsgLog", zap.Any("err", err), zap.Any("msg", string(msg)), zap.Any("subMsgLog", subMsgLog))
+		return nil
 	}
+	return subMsgLog
 }
 
 func (d *DataEventEntry) MsgDataFormat(msg []byte) (*model.SubMsgLog, error) {