全部產品
Search
文件中心

Simple Message Queue (formerly MNS):Go SDK

更新時間:Jul 02, 2024

本文介紹Go SDK的版本說明、使用說明和範例程式碼。

Version 1.0.3

  • 更新日期

    2024-05-31

    SDK 下載

  • 更新內容

    • 支援自訂HTTP Transport配置。

    • 用戶端資訊增加版本號碼和作業系統資訊。

    • 新增用戶端初始化方法,支援從環境變數中擷取配置資訊。

Version 1.0.2

  • 更新日期

    2021-03-05

    SDK 下載

  • 更新內容

    支援OpenService介面。

Version 1.0.1

  • 更新日期

    2021-01-15

    SDK 下載

  • 更新內容

    • 支援設定逾時。

    • 在返回中添加Request ID。

Version 1.0.0

  • 更新日期

    2019-04-30

    SDK 下載

  • 更新內容

    • 支援隊列模型的相關操作:

      • 建立、修改、擷取和刪除隊列。

      • 發送、查看、消費和刪除隊列訊息,以及修改隊列訊息的下次可消費時間。

    • 支援主題模型的相關操作:

      • 建立、修改和刪除主題。

      • 建立和刪除訂閱。

      • 發送主題訊息。

使用說明

  1. 下載最新版Go SDK,解壓後進入aliyun-mns-go-sdk-master目錄。

  2. 修改app.conf.example檔案,配置urlaccess_key_idaccess_key_secret

  3. 進入example目錄,後續使用的指令碼都在該目錄。

範例程式碼

隊列模型

本樣本包括建立隊列、發送訊息、接收和刪除訊息、以及刪除隊列等操作。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    _ "net/http/pprof"
    "time"

    "github.com/gogap/logs"
    "github.com/aliyun/aliyun-mns-go-sdk"
)

type appConf struct {
    Url             string `json:"url"`
    AccessKeyId     string `json:"access_key_id"`
    AccessKeySecret string `json:"access_key_secret"`
}

func main() {
    go func() {
        log.Println(http.ListenAndServe("localhost:8080", nil))
    }()

    conf := appConf{}

    if bFile, e := ioutil.ReadFile("app.conf.example"); e != nil {
        panic(e)
    } else {
        if e := json.Unmarshal(bFile, &conf); e != nil {
            panic(e)
        }
    }

    client := ali_mns.NewAliMNSClient(conf.Url,
        conf.AccessKeyId,
        conf.AccessKeySecret)
    queueManager := ali_mns.NewMNSQueueManager(client)
    // 建立隊列,隊列名稱為test。
    err := queueManager.CreateQueue("test", 0, 65536, 345600, 30, 0, 3)

    time.Sleep(time.Duration(2) * time.Second)

    if err != nil && !ali_mns.ERR_MNS_QUEUE_ALREADY_EXIST_AND_HAVE_SAME_ATTR.IsEqual(err) {
        fmt.Println(err)
        return
    }
    msg := ali_mns.MessageSendRequest{
        MessageBody:  "hello <\"aliyun-mns-go-sdk\">",
        DelaySeconds: 0,
        Priority:     8}
    queue := ali_mns.NewMNSQueue("test", client)
    // 發送訊息。
    for i := 1; i < 10000; i++ {
        ret, err := queue.SendMessage(msg)

        go func() {
            fmt.Println(queue.QPSMonitor().QPS())
        }()

        if err != nil {
            fmt.Println(err)
        } else {
            logs.Pretty("response:", ret)
        }

        endChan := make(chan int)
        respChan := make(chan ali_mns.MessageReceiveResponse)
        errChan := make(chan error)
        go func() {
            select {
            case resp := <-respChan:
                {
                    logs.Pretty("response:", resp)
                    logs.Debug("change the visibility: ", resp.ReceiptHandle)
                    if ret, e := queue.ChangeMessageVisibility(resp.ReceiptHandle, 5); e != nil {
                        fmt.Println(e)
                    } else {
                        logs.Pretty("visibility changed", ret)
                        logs.Debug("delete it now: ", ret.ReceiptHandle)
                        if e := queue.DeleteMessage(ret.ReceiptHandle); e != nil {
                            fmt.Println(e)
                        }
                        endChan <- 1
                    }
                }
            case err := <-errChan:
                {
                    fmt.Println(err)
                    endChan <- 1
                }
            }
        }()
        //接收訊息。
        queue.ReceiveMessage(respChan, errChan, 30)
        <-endChan
    }
}

主題模型

本樣本包括建立隊列、建立主題、訂閱主題和發布訊息等操作。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "time"

    "github.com/gogap/logs"
    "github.com/aliyun/aliyun-mns-go-sdk"
)

type appConf struct {
    Url             string `json:"url"`
    AccessKeyId     string `json:"access_key_id"`
    AccessKeySecret string `json:"access_key_secret"`
}

func main() {
    conf := appConf{}

    if bFile, e := ioutil.ReadFile("app.conf.example"); e != nil {
        panic(e)
    } else {
        if e := json.Unmarshal(bFile, &conf); e != nil {
            panic(e)
        }
    }

    client := ali_mns.NewAliMNSClient(conf.Url,
        conf.AccessKeyId,
        conf.AccessKeySecret)

    // 建立隊列,隊列名稱為testQueue。
    queueManager := ali_mns.NewMNSQueueManager(client)
    err := queueManager.CreateSimpleQueue("testQueue")
    if err != nil && !ali_mns.ERR_MNS_QUEUE_ALREADY_EXIST_AND_HAVE_SAME_ATTR.IsEqual(err) {
        fmt.Println(err)
        return
    }

    // 建立主題,主題名稱為testTopic。
    topicManager := ali_mns.NewMNSTopicManager(client)
    // topicManager.DeleteTopic("testTopic")
    err = topicManager.CreateSimpleTopic("testTopic")
    if err != nil && !ali_mns.ERR_MNS_TOPIC_ALREADY_EXIST_AND_HAVE_SAME_ATTR.IsEqual(err) {
        fmt.Println(err)
        return
    }

    // 訂閱主題,本樣本中的endpoint設定為隊列名稱。
    topic := ali_mns.NewMNSTopic("testTopic", client)
    sub := ali_mns.MessageSubsribeRequest{
        Endpoint: topic.GenerateQueueEndpoint("testQueue"),
        NotifyContentFormat: ali_mns.SIMPLIFIED,
    }

    // topic.Unsubscribe("SubscriptionNameA")
    err = topic.Subscribe("SubscriptionNameA", sub)
    if err != nil && !ali_mns.ERR_MNS_SUBSCRIPTION_ALREADY_EXIST_AND_HAVE_SAME_ATTR.IsEqual(err) {
        fmt.Println(err)
        return
    }

    time.Sleep(time.Duration(2) * time.Second)

    // 發布訊息。
    msg := ali_mns.MessagePublishRequest{
        MessageBody: "hello topic <\"aliyun-mns-go-sdk\">",
    }
    _, err = topic.PublishMessage(msg)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 從隊列中接收訊息。
    queue := ali_mns.NewMNSQueue("testQueue", client)

    endChan := make(chan int)
    respChan := make(chan ali_mns.MessageReceiveResponse)
    errChan := make(chan error)
    go func() {
        select {
        case resp := <-respChan:
            {
                logs.Pretty("response:", resp)
                fmt.Println("change the visibility: ", resp.ReceiptHandle)
                if ret, e := queue.ChangeMessageVisibility(resp.ReceiptHandle, 5); e != nil {
                    fmt.Println(e)
                } else {
                    logs.Pretty("visibility changed", ret)
                    fmt.Println("delete it now: ", ret.ReceiptHandle)
                    if e := queue.DeleteMessage(ret.ReceiptHandle); e != nil {
                        fmt.Println(e)
                    }
                    endChan <- 1
                }
            }
        case err := <-errChan:
            {
                fmt.Println(err)
                endChan <- 1
            }
        }
    }()

    queue.ReceiveMessage(respChan, errChan, 30)
    <-endChan
}