跳到主要內容

PubSub入門

Cloud PubSub是Google Cloud Platform上的一個Publish Subscriber的服務,讓使用者可以透過API將資料放到PubSub上,並且透過建立Subscriber讓其他的城市可以讀取該資料做進一步的處理...

PubSub的特性如下:
  • 作爲應用程式服務的中介,供連接異質性來源的系統作為資料傳遞之用
  • 支援Push與Pull兩種方式,其中Push可以讓使用者設定Push URL,讓系統可以直接再接收到訊息時,呼叫push url
  • 提供“at least once” delivery的送達保證,並且資料在傳輸過程中均有加密保護
  • PubSub是一個全球化的服務,並且會依照使用者之彈性需求自動調整資源
pubsub push vs pull model概念上,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會收到一樣的訊息。

參考

留言

這個網誌中的熱門文章

透過Google Apps Script結合Google Form做即時郵件通知

體驗過Google Apps Script的功能後,也發現他結合GmailApps的模組 GmailApps的應用可以用在表單填寫完成後,做發信的通知 例如您開立了一個訂購的表單,為了要在第一時間通知商家有訂單進入 就可以直接呼叫Gmail做發信的通知,讓手持Smart Phone的我們可以很快的知道生意上門了! 下面規劃三個function,其中: onCommit():為form commit時候觸發的function,需要掛載於form commit trigger上 jsonArrToTable():目的將json array解析成為一個Table getLastRowTable():目的將整個table的回傳過濾為剩下第一筆(表頭,含有Form的欄位說明)與最後一筆(原則上就是剛剛送出的那一筆表單) 完整程式碼如下: function onCommit(){   var sheet = SpreadsheetApp.getActiveSheet();   var rows = sheet.getDataRange();   var numRows = rows.getNumRows();   var values = rows.getValues();   var content = getLastRowTable(values);   var htmlBody = "Hi Admin: <br/><br/>有訂單拉,檢查一下吧! <br/><br/>" + content + '<br/><br/>Send by Google Apps';   GmailApp.sendEmail(     " your-email-address@gmail.com ",      "Order Confirm Notice",      htmlBody,      {from: ' from-email-...

Share a chrome plugin for manage google cloud platform

好玩意兒報報.... 同事的新作,把Google Project List在Chrome Plugin中! 對一次管理多個專案的人來說,真得超方便的拉! 下載: https://chrome.google.com/webstore/detail/gdclauncher/bicgkglnnilldakpenngnblekooejnpg 使用說明: 1. Use browser url bar to quick search: Type "gdcl" in browser Press "TAB" to start search Type the project id key word then select the search result... 2. Using quick launch bar... You can search by keyword or click project name to go to the project or gae link to go to gae or go to billing page....

Cloud Monitor嚐鮮

GCP上,我們非常想要的一個功能,終於問世.... Cloud Monitor來了!