針對一些可能遇到的問題或需求,跟大家分享一下須注意的地方或處裡的方式。
backoff +1
,表示下一次重新處理的時間將延後,預設延遲為指數性成長(ex 2, 4, 16 ...)當首次建立 NSQ 時可能會發生一個特殊的狀況,且容易發生在首次建立時。當 nsqd 已經被建立且 producer 首次向 topic publish message,假設此時監聽此 topic 的 channel 應有 3個,但由於應對此 topic 監聽的 channel 啟用順序不一,導致先啟用的 channel 一接上便把此 topic 的 message 消化掉。
雖然以我們的角度來說,channel 可能是幾乎同時啟用的,但若有些微的時間差就可能產生部分 channel 沒收到訊息的假象。故使用上,當 channel 尚未建立完成時,應暫停 TOPIC 的訊息傳送,待完全建立完成後再開放。
即使是在同一個 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)