亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

發布/訂閱應用程序的升級策略

發布/訂閱應用程序的升級策略

Go
慕娘9325324 2022-08-24 16:54:06
我很好奇如何處理應用程序使用來自Google Pub / Sub的消息的升級/重新啟動情況。例如,我對開發一個Golang應用程序特別感興趣,該應用程序部署在運行多個 pod 的 Kubernetes 中,并使用來自 Google Pub/Sub 的消息。我關心的是,如何確保在升級 Pod 時不會遺漏任何消息(或處理兩次)。我知道應用程序會從訂閱中讀取消息,然后必須確認它已收到它。我覺得在確認消息和 Pod 關閉以進行升級之間可能存在爭用條件?我知道使用Dataflow作業可以執行類似操作,因為您可以停止流式處理作業并發出信號以清空消息。我假設必須有某種方式可以優雅地處理這個問題,或者這真的是數據流更適合的情況嗎?
查看完整描述

1 回答

?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

Kubernetes 使用 SIGTERM,等待 30 秒,然后是 SIGKILL。這會在完全終止應用程序之前為應用程序提供適當的時間,如果 30 秒的默認值不夠,則可以使用該字段進行調整(鏈接 1)。terminationGracePeriodSeconds: 60

然后,您需要在 Golang 中添加邏輯以接收 SIGTERM 信號(鏈接 2)。

最后,假設你的隊列在這里是兔子(但其他隊列將具有類似的功能),在收到SIGTERM時,你可以將邏輯寫入A)停止接收新消息,然后B)(這是可選的,你可以讓他們完成)返回一個NACK和重新排隊信號,用于Pod當前已確認但未完成的所有消息, 將消息放回原處(鏈接 3 和 4)。

如果您可以避免實現 NACK/Requeue,只需通過關閉隊列偵聽器并完成當前保留消息的其余部分來處理 SIGTERM(并說 30 或 60 秒就足夠了),那就簡單多了,建議這樣做。

  1. https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-grace

  2. 戈朗捕捉信號

  3. 兔子MQ中的Ack或Nack

  4. https://www.rabbitmq.com/nack.html

** 編輯 **

對于谷歌云發布/訂閱,您還可以發送Nack。

https://pkg.go.dev/cloud.google.com/go/pubsub#Message

“Ack 表示成功處理消息。如果消息確認失敗,將重新傳遞消息。Nack 表示客戶端不會或無法處理消息。Nack 將導致消息被重新傳遞的速度比允許它過期時更快。


查看完整回答
反對 回復 2022-08-24
  • 1 回答
  • 0 關注
  • 96 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號