實作 Google Cloud Pub/Sub Publisher

學習如何透過 Golang 來撰寫 Google Cloud Pub/Sub Publisher

ta-ching chen

2 minute read

 文章目錄

Prerequisite 

Hands-On 

Clone Repo 

接下來就開始進入動手做的部分吧,Repo 內已經包含寫好的範例讓大家能快速上手。

# Clone repo and restore dependencies
$ git clone https://github.com/life1347/go-google-cloud-pubsub-exmaple.git \
  $GOPATH/src/tachingchen.com/googlePubSub

godep 復原相依套件

$ go get -u github.com/tools/godep
$ cd $GOPATH/src/tachingchen.com/googlePubSub && godep restore

Publisher 

開始進入程式碼前,先來看看如何執行會動的範例

IT’S ALIVE 

$ GOOGLE_CLOUD_PROJECT="<your google project name>" go run publisher.go
$ GOOGLE_CLOUD_PROJECT="test-project" go run publisher.go
2017/01/04 01:04:21 4d27aaba-e62b-49cf-8fd9-e784a99064d5 send
2017/01/04 01:04:22 48b04306-18de-44f2-b1b3-c0e736f52d32 send
2017/01/04 01:04:24 d395cd6b-02ef-4e7d-a6ec-a84d0cf27045 send
2017/01/04 01:04:25 a56991b0-b664-48d7-8901-de80783f182d send
2017/01/04 01:04:26 d0cebf2f-619c-4642-b51b-d5485fd072c2 send
2017/01/04 01:04:28 46d25e6d-0f6b-4dc9-be88-8133e2a011e1 send
2017/01/04 01:04:29 dc517460-dc5b-4f61-ab20-490c186360a9 send
2017/01/04 01:04:30 f1ed3359-125b-4931-b631-d251a2109dcd send
2017/01/04 01:04:31 eaf771ca-c8e3-40ef-a89e-429b6bf8f55a send
2017/01/04 01:04:32 fb8b201c-2856-4bed-ac1a-3fc27d51bdac send

會動一百分

從上面結果可以看到程式持續送出十個訊息,那到底實際上 Publisher 在啟動後會做些什麼呢?

正如前面 Pub/Sub Flow 提到的,在開始傳送訊息前首先需要註冊 Topic,因此在 Publisher 起來時會呼叫 CreateTopicIfNotExists,然後透過官方 pubsub package 的 CreateTopic 來創建 Topic。

// publisher.go
const topicName string = "example-topic"
topic := common.CreateTopicIfNotExists(client, topicName)
// common/functions.go
func CreateTopicIfNotExists(client *pubsub.Client, name string) *pubsub.Topic {
    ctx := context.Background()
    topic := client.Topic(name)
    isExist, err := topic.Exists(ctx)
    if err != nil {
        log.Fatal(err)
    }
    if isExist {
        return topic
    }
    
    topic, err = client.CreateTopic(ctx, name)
    if err != nil {
        log.Fatalf("Failed to create topic: %v", err)
    }
    return topic
}

創建成功後,你可以在 GCP PubSub 頁面](https://console.cloud.google.com/cloudpubsub/) 上看到新增的 Topic。

Pub/Sub Flow

由於 topic.PublishMessage.Data 型態為 []byte,假設想要傳送的訊息格式為 Json,因此我們先將訊息以 json.Marshal 後帶進去當成 Payload 送出。

// publisher.go
for i := 0; i < 10; i++ {
    msgUuid := uuid.NewV4().String()
    // message we want to send to subscriber
    session, _ := json.Marshal(&common.Session{
      SessionID: msgUuid,
      TimeStamp: time.Now().Unix(),
    })
    // publish message to Cloud Pub/Sub
    _, _ = topic.Publish(ctx, &pubsub.Message{
      Data: session,
    })
    log.Printf("%s send", msgUuid)
    time.Sleep(1 * time.Second)
}

如此簡單就完成 Publisher,接下來就來看看如何使用 Golang 來實作 Subscriber 吧

Further Readings 

Reference 

comments powered by Disqus