在進行分散式運算時如果是想發送至不同實體, 我們可直接發出請求並等待回傳結果,但這樣在等待回傳時的運算能力是被閒置的,故此聰明的我們可能會用 goroutine
將請求發送去,再利用 select channel
等待回傳結果。但大量使用 channel
的設計又較為複雜,維護較為困難,且依然有著請求對象沒有收到請求,或收到請求沒有回傳這樣不好處理的狀況。
為了處理上述一些在訊息傳遞交換過程所面臨的問題,我們除了在邏輯上,對服務進行切分成更小的服務顆粒,對於傳遞過程可能造成的錯誤與重試必須進行掌控。NSQ 實作了我們對于訊息交換的需求,特別是在自動重試這個部分,NSQ 幫助我們可以確保資訊是有被接受並處理的。
NSQ is a realtime distributed messaging platform designed to operate at scale, handling billions of messages per day.
NSQ 是一個即時分散式處理訊息平台,目的在於提供每日數以百億的訊息傳遞,且能夠自由的水平拓展節點。
依據官方敘述 NSQ 提供以下特色與承諾
以使用面來看的話,NSQ 我們僅需了解 3個實體與2個設定。Topic & Channel 用來決定發送出的訊息主題,與誰應該收到這則訊息。
幫大家準備好了 services & deployments,請下載範例並依照下面步驟,即可部署至 kubernetes。
> kubectl create -f service.yaml
> kubectl create -f deployment.yaml
> kubectl get pods
NAME READY STATUS RESTARTS AGE
nsqadmin-75bf9ccfcc-4ng5b 2/2 Running 0 4m33s
nsqd-7d9fbffc7c-dxx67 2/2 Running 0 4m33s
nsqlookupd-764bd76cf7-xxbm8 2/2 Running 0 4m33s
將 service port-forward 出來便可以使用 nsqadmin GUI (http://127.0.0.1:4171)
> kubectl port-forward svc/nsqadmin 4171:4171
簡單看一下設定
apiVersion: apps/v1
kind: Deployment
metadata:
name: nsqd
labels:
app: nsqd
spec:
replicas: 1
selector:
matchLabels:
app: nsqd
template:
metadata:
labels:
app: nsqd
spec:
containers:
- name: nsqd
image: nsqio/nsq
ports:
- name: tcp
containerPort: 4150
protocol: TCP
- name: http
containerPort: 4151
protocol: TCP
command: ["/nsqd"]
args: ["--lookupd-tcp-address=nsqlookupd:4160"]
NSQ 將三個實體都包在同一份 image 裏,當啟用時才利用不同 bin檔啟用不同實體。在啟用時 nsqd 與 nsqadmin 都需要知道 nsqlookupd 的位置,需給與參數告知其 address。
今天先簡單介紹至此,明天我們來看一下訊息實際傳遞的方式,並介紹一下 RDY
狀態,是如何確保訊息可以被大量且快速的交換,感謝大家今天的參與。