iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 28
0
Software Development

Go Distributed & Go Consistently系列 第 28

Day28 NSQ (Tips)

針對一些可能遇到的問題或需求,跟大家分享一下須注意的地方或處裡的方式。

Config Options

  • MaxAttempts : NSQ consumer 嘗試處理訊息次數,並非無限的,預設 5次,可透過 max_attempts 進行變更
  • BackoffStrategy : 每次重新嘗試處理訊息時,會對 backoff +1 ,表示下一次重新處理的時間將延後,預設延遲為指數性成長(ex 2, 4, 16 ...)
  • MsgTimeout : 可設置訊息若堆積過久,沒有被送到 client 端時,自動失效

Initialize Order

當首次建立 NSQ 時可能會發生一個特殊的狀況,且容易發生在首次建立時。當 nsqd 已經被建立且 producer 首次向 topic publish message,假設此時監聽此 topic 的 channel 應有 3個,但由於應對此 topic 監聽的 channel 啟用順序不一,導致先啟用的 channel 一接上便把此 topic 的 message 消化掉。

雖然以我們的角度來說,channel 可能是幾乎同時啟用的,但若有些微的時間差就可能產生部分 channel 沒收到訊息的假象。故使用上,當 channel 尚未建立完成時,應暫停 TOPIC 的訊息傳送,待完全建立完成後再開放。

Broadcast

即使是在同一個 ReplicaSet 也是可以把 NSQ 當作 broadcast 使用的,我們所要做的只是調整一下 channel 的使用方式,僅須確保每個 consumer 使用的 channel 不重複,便可以使每獨立的 channel 同時收到訊息。

在 kubernetes 簡單的實作方式可使用 podIP,利用其唯一性建立不重複 channel。

env:
- name: POD_IP
  valueFrom:
    fieldRef:
      fieldPath: status.podIP
podID := os.Getenv("POD_IP")
c, _ := nsq.NewConsumer("MY_TOPIC", "BC_" + podID, config)

Learn more


上一篇
Day27 NSQ (Client Usage & RDY)
下一篇
Day29 Drone (Install & Usage)
系列文
Go Distributed & Go Consistently30

尚未有邦友留言

立即登入留言