gpt4 book ai didi

azure - 使用 Go 中的 Azure Functions 在 Azure 存储队列中存储 JSON 消息时出现重复数据问题

转载 作者:行者123 更新时间:2023-12-03 03:22:23 25 4
gpt4 key购买 nike

现在我正在尝试使用 Azure Functions 和 Go 并利用自定义处理程序来开发应用程序。我的应用程序的架构是这样的。

image

问题似乎在于将 JSON 消息存储在 Azure 存储队列中。队列中存储的消息的“data”和“metadata”中有重复的数据。

我的函数 1 是这样的,它由 Slack 的 HTTP 响应触发,并将消息排入队列。

func function1(c *gin.Context) {
log.Printf(“Start enqueueMessage”)

// I use a JSON string here instead of an actual HTTP Request for an easy understanding
stri := "{\"aaa\" : \"aaa\"}"
base64BodyString := base64.StdEncoding.EncodeToString(stri)

_ulr, err := url.Parse(fmt.Sprintf(“https://%s.queue.core.windows.net/%s”, accountName, queueName))
if err != nil {
log.Fatal(“Error parsing url: “, err)
}

credential, err := azqueue.NewSharedKeyCredential(accountName, accountKey)
if err != nil {
log.Fatal(“Error creating shared key credential: “, err)
}

queueUrl := azqueue.NewQueueURL(*_ulr, azqueue.NewPipeline(credential, azqueue.PipelineOptions{}))
ctx := context.TODO()

messageUrl := queueUrl.NewMessagesURL()
_, err = messageUrl.Enqueue(ctx, base64BodyString, 0, 0)
if err != nil {
log.Fatal(“Error enqueueing message: “, err)
}
log.Printf(“Message enqueued successfully”)
}

然后,我的函数 2 是这样的,它由队列触发器触发并处理从队列中出队的消息。

func function2(c *gin.Context) {

log.Printf(“Start function”)

type QueueMessage struct {
Data struct {
MyQueueItem string `json:"myQueueItem"`
} `json:"data"`
Metadata map[string]interface{}
}

var queueMessage QueueMessage
err := c.BindJSON(&queueMessage)
if err != nil {
log.Printf(“Failed to bind request body: %v”, err)
return
}

log.Printf(“Queue message : %v”, queueMessage)
}

输出数据是这样的。

{
"message": "{\"token\": \"aaa\"}",
"metadata": {
"DequeueCount": 1,
"ExpirationTime": "2023-08-01T13:25:29+00:00",
"Id": "e2b5f133-cc27-46d5-92a8-0305251e65e7",
"InsertionTime": "2023-07-25T13:25:29+00:00",
"NextVisibleTime": "2023-07-25T13:35:31+00:00",
"PopReceipt": "AgAAAAMAAAAAAAAAifLM4fy+2QE=",
"sys": {
"MethodName": "function2",
"RandGuid": "9cdd85fc-9522-437a-8b2c-cc4ac4919ad4",
"UtcNow": "2023-07-25T13:25:31.364779Z"
},
"token": "aaa"
}
}

当我存储“hoge”这样的消息而不是 JSON 消息时,它不包含重复数据。

有人知道如何解决这个问题吗?

我想在 Azure 存储队列中存储一条没有重复数据的消息。

最佳答案

Azure 存储队列消息是由您在将 JSON 有效负载排入队列之前对 JSON 负载进行编码以及对 JSON 字符串进行 Base64 编码,然后将其作为消息正文传递的方式引起的,消息将出列并进行处理,我们将其绑定(bind)到 QueueMessage 结构,它需要一个带有 datametadata 字段的特定结构。

func function1(c *gin.Context) {
log.Printf("Start enqueueMessage")

payload := map[string]string{
"myQueueItem": "aaa",
}

payloadBytes, err := json.Marshal(payload)
if err != nil {
log.Fatal("Error marshaling JSON: ", err)
}

base64BodyString := base64.StdEncoding.EncodeToString(payloadBytes)

_url, err := url.Parse(fmt.Sprintf("https://%s.queue.core.windows.net/%s", accountName, queueName))
if err != nil {
log.Fatal("Error parsing url: ", err)
}

credential, err := azqueue.NewSharedKeyCredential(accountName, accountKey)
if err != nil {
log.Fatal("Error creating shared key credential: ", err)
}

queueUrl := azqueue.NewQueueURL(*_url, azqueue.NewPipeline(credential, azqueue.PipelineOptions{}))
ctx := context.TODO()

messageUrl := queueUrl.NewMessagesURL()
_, err = messageUrl.Enqueue(ctx, base64BodyString, 0, 0)
if err != nil {
log.Fatal("Error enqueueing message: ", err)
}

log.Printf("Message enqueued successfully")
}


func function2(c *gin.Context) {
log.Printf("Start function")

type QueueMessage struct {
MyQueueItem string `json:"myQueueItem"`
}

var queueMessage QueueMessage
err := c.BindJSON(&queueMessage)
if err != nil {
log.Printf("Failed to bind request body: %v", err)
return
}

log.Printf("Queue message : %v", queueMessage)
}
  • 消息中的重复数据实际上是由 Azure Functions 在处理传入请求并将其存储在 Azure 存储队列中时引入的。当您直接将“hoge”等简单字符串存储为消息内容时,Azure Functions 不会添加任何其他元数据,因此不会出现重复项。

  • 消息中的重复数据实际上是由 Azure Functions 在处理传入请求并将其存储在 Azure 存储队列中时引入的。当您直接将“hoge”等简单字符串存储为消息内容时,Azure Functions 不会添加任何其他元数据,因此不会出现重复项。

  • 为了避免出现重复数据,您可以修改 function1 以将消息排入队列,而不使用 Azure Function 的内置响应序列化

  • 有关更多详细信息 Azure 存储队列 go

关于azure - 使用 Go 中的 Azure Functions 在 Azure 存储队列中存储 JSON 消息时出现重复数据问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76768141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com