iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 26
0
Software Development

Go Distributed & Go Consistently系列 第 26

Day26 NSQ (Features & Install)

在進行分散式運算時如果是想發送至不同實體, 我們可直接發出請求並等待回傳結果,但這樣在等待回傳時的運算能力是被閒置的,故此聰明的我們可能會用 goroutine 將請求發送去,再利用 select channel 等待回傳結果。但大量使用 channel 的設計又較為複雜,維護較為困難,且依然有著請求對象沒有收到請求,或收到請求沒有回傳這樣不好處理的狀況。

為了處理上述一些在訊息傳遞交換過程所面臨的問題,我們除了在邏輯上,對服務進行切分成更小的服務顆粒,對於傳遞過程可能造成的錯誤與重試必須進行掌控。NSQ 實作了我們對于訊息交換的需求,特別是在自動重試這個部分,NSQ 幫助我們可以確保資訊是有被接受並處理的。

What is NSQ

NSQ is a realtime distributed messaging platform designed to operate at scale, handling billions of messages per day.

NSQ 是一個即時分散式處理訊息平台,目的在於提供每日數以百億的訊息傳遞,且能夠自由的水平拓展節點。

依據官方敘述 NSQ 提供以下特色與承諾

  • 特色
    • 防止單點錯誤
    • 水平拓展
    • 低延遲
    • 可自由選擇負載平衡或廣播式發送訊息
    • In-memory (主要放在記憶體中使用)
    • 服務發現 (nsqlookupd)
    • 傳輸加密協議 (TLS)
    • TCP 傳遞可支援多語言
    • GUI 管理介面 (nsqadmin)
  • 承諾限制
    • 訊息非持久性
    • 訊息至少被傳遞一次
    • 訊息非有序性傳遞
    • Consumer 最終可以找到所有 Producers

NSQ Design

以使用面來看的話,NSQ 我們僅需了解 3個實體與2個設定。Topic & Channel 用來決定發送出的訊息主題,與誰應該收到這則訊息。

  • Topic:訊息主題,訊息送至 topic 後會發送給其下所有 channels
  • Channel:接收端所用的管道,一個 channel 可由有多個服務實體共用

nsq

  • Nsqd : 佇列實際所在位置,topics 與其所屬 channels 都儲存於 nsqd 中
  • Nsqlookupd:服務發現用,nsqd 可以向其註冊,以便 consumer 直接向 nsqlookupd 取得所有 nsqd 位置
  • Nsqadmin:GUI 方便維護與觀察訊息堆積

Install

幫大家準備好了 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

nsqadmin

簡單看一下設定

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"]
  • nsqlookupd : 預設使用 tcp port 4160 & http port 4161,故 deploment & service 都要暴露該ports
  • nsqd : 預設使用 tcp port 4150 & http port 4151,故 deploment & service 都要暴露該ports
  • nsqadmin : 預設使用 http port 4171,故 deploment & service 都要暴露該ports

NSQ 將三個實體都包在同一份 image 裏,當啟用時才利用不同 bin檔啟用不同實體。在啟用時 nsqd 與 nsqadmin 都需要知道 nsqlookupd 的位置,需給與參數告知其 address。

今天先簡單介紹至此,明天我們來看一下訊息實際傳遞的方式,並介紹一下 RDY 狀態,是如何確保訊息可以被大量且快速的交換,感謝大家今天的參與/images/emoticon/emoticon29.gif


上一篇
Day25 Istio (Load Balance gRPC)
下一篇
Day27 NSQ (Client Usage & RDY)
系列文
Go Distributed & Go Consistently30

尚未有邦友留言

立即登入留言