Cloud PubSub是Google Cloud Platform上的一個Publish Subscriber的服務,讓使用者可以透過API將資料放到PubSub上,並且透過建立Subscriber讓其他的城市可以讀取該資料做進一步的處理...
PubSub的特性如下:
- 作爲應用程式服務的中介,供連接異質性來源的系統作為資料傳遞之用
- 支援Push與Pull兩種方式,其中Push可以讓使用者設定Push URL,讓系統可以直接再接收到訊息時,呼叫push url
- 提供“at least once” delivery的送達保證,並且資料在傳輸過程中均有加密保護
- PubSub是一個全球化的服務,並且會依照使用者之彈性需求自動調整資源
概念上,topic是讓您放您資料的位置,然後需要在該topic下面建立subscriber,讓程式可以在該subscriber下讀取到放置在該topic的資料,再透過ACK這個動作回覆系統,確認已經被讀取...
建立topic
$ gcloud --format=json alpha pubsub topics create my-topic
[
{
"reason": "",
"success": true,
"topicId": "projects/sunny-573/topics/my-topic"
}
]
列表topics
$ gcloud alpha pubsub topics list
---
topic: projects/sunny-573/topics/my-topic
topicId: my-topic
...
Push訊息到pubsub
$ gcloud alpha pubsub topics publish my-topic '{"aaa":123,"bbb":223}'
為topic建立一個subscriber
$ gcloud alpha pubsub subscriptions create sub002 --topic my-topic
---
ackDeadlineSeconds: 10
pushEndpoint: null
reason: ''
subscriptionId: projects/sunny-573/subscriptions/sub002
success: true
topic: projects/sunny-573/topics/my-topic
type: push
列表subscriber
$ gcloud alpha pubsub subscriptions list
┌───────────┬──────────────┬──────────┬──────┬──────────────┐
│ PROJECT │ SUBSCRIPTION │ TOPIC │ TYPE │ ACK_DEADLINE │
├───────────┼──────────────┼──────────┼──────┼──────────────┤
│ sunny-573 │ sub001 │ my-topic │ PULL │ 10 │
│ sunny-573 │ sub002 │ my-topic │ PULL │ 10 │
│ sunny-573 │ sub01 │ test01 │ PUSH │ 10 │
│ sunny-573 │ sunny │ sunny │ PULL │ 10 │
└───────────┴──────────────┴──────────┴──────┴──────────────┘
從subscribers取資料
取資料可以分成兩個動作:讀取、回覆ACK,當只有讀取動作時,其他針對同subscriber的查詢,仍可以查詢得到資料... 其中,該筆訊息會帶ack_id,可以讓未來針對該ack_id來做回覆ack的動作。
$ gcloud alpha pubsub subscriptions pull sub001
┌───────────────────────┬────────────────┬────────────┬────────────────────────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │ ACK_ID │
├───────────────────────┼────────────────┼────────────┼────────────────────────────────┤
│ {"aaa":123,"bbb":223} │ 43961024144056 │ │ MTJFQV5AEkw6...4cqZhg9XxJLLD5- │
└───────────────────────┴────────────────┴────────────┴────────────────────────────────┘
下面是針對ack_id做回覆的動作:
$ gcloud alpha pubsub subscriptions ack sub001 MkVBXkASTDo...JLLD5-MQ
ackIds:
- MkVBXkASTDo...JLLD5-MQ
subscriptionId: projects/sunny-573/subscriptions/sub001
如果嫌麻煩... 在gcloud指令有支援--auto-ack,可以針對request data時候,直接在request完成回覆ack,也就是告訴該subscriber這筆資料已經接收,其他人就無法在讀取該筆資料... 下面是針對subscriber加上auto-ack的結果,原則上ack完之後,ack_id將會消失。
$ gcloud alpha pubsub subscriptions pull sub001 --auto-ack
┌───────────────────────┬────────────────┬────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │
├───────────────────────┼────────────────┼────────────┤
│ {"aaa":123,"bbb":423} │ 43961235494393 │ │
└───────────────────────┴────────────────┴────────────┘
刪除測試資源
在測試完成後,建議就順手將建立的資源刪除,下面是刪除subscriber與topic的指令:
刪除subscriber:
$ gcloud --format=json alpha pubsub subscriptions delete sub002
[
[
"projects/sunny-573/subscriptions/sub002"
],
[]
]
刪除topic:
$ gcloud --format=json alpha pubsub topics delete my-topic
[
{
"reason": "",
"success": true,
"topicId": "projects/sunny-573/topics/my-topic"
}
]
注意事項
- 由於pubsub服務的特性是保證至少一次獨取,因此不排除會發生最終同步前重複獨取料的問題。如果擔心這類問題,建議透過中介服務來擷取pubsub資料,然後再做第二層的分派處理。
- 由於pubsub支援一對多的應用,如果在一個topic中設定一個以上的subscriber時候,則每個subscriber會收到一樣的訊息。
參考
- PubSub簡介:https://cloud.google.com/pubsub/
- PubSub SLA: https://cloud.google.com/pubsub/sla
留言
張貼留言