我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!
1 簡介
GCP的Pubsub是一種異步消息傳遞服務,可將生產事件的服務與處理事件的服務隔離開。消息隊列的作用就不多作介紹了,與Kafka、RabbitMQ等差不多。使用Pubsub一個重要原因是不用自己去管理整個中間件的運維,將專業的事交給專業的團隊去做。這樣,其實也是一種節約成本的方式。
GCP還提供了更低費用的Pubsub Lite,這里不多作介紹了。
2 概念
2.1 基本概念
一些重要的核心概念:
- 主題:生產者向其發送消息的資源;
- 訂閱:單個特定主題的消息流資源,任何一個訂閱都要從屬於某個主題,對哪個主題感興趣,就訂閱哪個主題;
- 消息:傳輸的數據和特性;
- 發布者:也叫生產者,負責將消息發到主題;
- 訂閱者:也叫消費者,負責將消息從訂閱中讀取。
他們的關系:發布者發消息到某個特定主題,而主題下有一個或多個訂閱,訂閱者從訂閱讀取消息。所以發布者和訂閱者的關系有如下:
- 一對一;
- 一對多;
- 多對一;
- 多對多。
如下圖所示:
2.2 消息傳遞過程
整個消息傳遞的流程大致如下:
(1)發布者向主題發送消息,消息包含要發送的數據和消息的特性;
(2)系統收到消息后,會存在GCP的系統中;
(3)系統將主題的消息轉發到訂閱中去;
(4)Pubsub將消息推送給訂閱者,或者訂閱者拉取消息;
(5)訂閱者收到信息后,返回Ack確認信息;
(6)Pubsub移除已確認的消息。
2.3 集成其它組件
整個GCP的Stack可以相互集成,其它組件如Pubsub集成如下:
3 Pubsub快速入門
3.1 使用gcloud命令行
使用SDK命令行工具gcloud的入門操作如下:
# 創建主題
$ gcloud pubsub topics create pkslow-topic
# 創建訂閱
$ gcloud pubsub subscriptions create pkslow-sub --topic=pkslow-topic
# 發布消息
$ gcloud pubsub topics publish pkslow-topic --message="www.pkslow.com"
# 接收消息
$ gcloud pubsub subscriptions pull pkslow-sub --auto-ack
3.2 使用客戶端庫
Pubsub支持的語言很豐富,包括Python、Java、C++、Go、Node.js、PHP等,一般項目都可以使用得上。之前的文章《整合Spring Cloud Stream Binder與GCP Pubsub進行消息發送與接收》講解了Java的整合,這里先不再展開講解。
4 消息排序
消息排序是一個很有用的特性,它能保證消息的順序,即發布者發的是消息A-B-C-D,接收就應該是A-B-C-D,而不是A-B-D-C或其它。Pubsub的消息排序需要發布者和訂閱者雙方配合:
(1)發布者必須在發消息時指定排序鍵(Ordering Key),這個Key不是告訴Pubsub按什么排序,而是告訴Pubsub我哪些消息要排序。排序都是按時間的,Key的作用是同一個Key的所有消息都要排序。不同Key的消息,沒有順序關系,不需要排序。所以,要為需要按時間順序的消息指定同一個Key。
(2)訂閱需要打開排序特性,不然即使消息有Ordering Key,也不會排序。
排序特性是很有用的,但會帶來性能的損傷。
遇到的一些難點:
(1)對於Java開發,Spring Cloud Stream還沒有支持Pubsub排序功能,所以需要使用Google的SDK來開發,或者對Spring Cloud Stream進行改造。
(2)對於多消費者的情況,Pubsub會盡量把同一個Key的消息分發到一個消息者中以保證有序性。這樣會造成在Auto Scale的情況下,有時難以讓其它消費者撿起消息來消費,這個可以通過配置Outstanding的大小來控制。
5 其它
5.1 監控
GCP有成熟的監控套件Cloud Monitoring,我們直接用就可以了。可以查看發送了多少消息、多少消息待消費等。
5.2 消費者自動擴容
如果消費者的處理速度太慢,可以增加它的數量來解決問題。方案是根據Pubsub滯留的消息數來自動擴容。可以有兩個方案,一個是利用Keda來做,另一個是利用Cloud Monitor來做。兩者都是類似的,獲取隊列的大小,然后通過Kubernetes的HPA進行彈性伸縮。
Keda的相關文章可以看:《Kubernetes使用Keda進行彈性伸縮,更合理利用資源》
6 總結
Pubsub使用起來還是挺簡單的,畢竟只用寫生產者和消費者即可。但細節也很多,有空再慢慢道來吧。
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...
多讀書,多分享;多寫作,多整理。