使用Kubernetes競爭消費者模式擴充套件任務處理 - vinsguru

banq發表於2020-12-24

在分散式系統中,我們通過通過服務匯流排/訊息佇列傳遞訊息來實現系統之間的鬆散耦合。有時,當訊息的傳送量很高時(即每單位時間傳入的訊息數大於每單位時間處理的訊息數),佇列最終將容納無限數量的訊息。訊息佇列最終可能會由於記憶體不足錯誤而失敗,並且客戶端可能永遠不會收到其已傳送訊息的響應!為避免這種情況,我們通常以最多流量來計劃N臺伺服器,但是如果這麼多伺服器很少接收處理任何訊息,則最終需要為這些未使用的伺服器付費。

具有成本效益的解決方案將是自動縮放!這個概念並不新鮮。在本文中,我們將基於Kubernetes叢集中的CPU使用率來擴充套件/擴充套件訊息消費者。這樣,當1臺伺服器努力處理所有訊息時,我們帶來了更多伺服器以加快處理速度,以減少單臺伺服器上的負載並平衡工作量。

 

案例

將重用我們之前在這裡使用過的應用程式。checkout出來以更好地理解。

    • 我們的應用程式將在請求到達時將一些任務放入訊息佇列中。
    • 任務將在斐波那契數列中找到第N個位置!我將使用2 ^ N演算法使過程非常緩慢。
    • 將有一些類別,如低,高,緊急來對任務進行優先順序排序。顯然,應該首先執行緊急任務!
    • 任務執行器是使用訊息的訊息處理器。預設情況下,我們將有1個訊息處理器啟動並始終執行。

      • 但是有時1個節點可能還不夠。
      • 根據CPU利用率,我們的自動縮放器會彈出更多Pod。

使用Kubernetes競爭消費者模式擴充套件任務處理 - vinsguru

優點:

這種方法有幾個優點。

  • 生產者和消費者之間的鬆散耦合。
  • 我們可以根據需求動態擴充套件或擴充套件。(在本文中,我們使用CPU利用率。我們也可以根據佇列中的訊息計數使用)
  • 可靠
  • 負載均衡。單個伺服器不負責處理所有訊息。負載分佈在多個訊息處理器/消費者之間。

 

Kubernetes資源

  • 我們將建立如圖所示的資源。

 

使用Kubernetes競爭消費者模式擴充套件任務處理 - vinsguru

  • Redis配置:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: redis-master
      name: redis-master
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: redis-master
      template:
        metadata:
          labels:
            app: redis-master
        spec:
          containers:
          - image: redis
            name: redis-master
            ports:
            - containerPort: 6379
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: redis-master
      name: redis-master
    spec:
      ports:
      - name: redis-port
        port: 6379
        protocol: TCP
        targetPort: 6379
      selector:
        app: redis-master
      type: ClusterIP
    

  • 任務排程器

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: task-scheduler
      name: task-scheduler
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: task-scheduler
      template:
        metadata:
          labels:
            app: task-scheduler
        spec:
          containers:
          - image: vinsdocker/task-scheduler
            name: task-scheduler
            env:
            - name: REDIS_HOST
              value: redis-master
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: task-scheduler
      name: task-scheduler
    spec:
      ports:
      - name: task-scheduler
        port: 8080
        protocol: TCP
        targetPort: 8080
        nodePort: 32001
      selector:
        app: task-scheduler
      type: NodePort
    
  • 任務執行者

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: task-executor
      name: task-executor
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: task-executor
      template:
        metadata:
          labels:
            app: task-executor
        spec:
          containers:
          - image: vinsdocker/task-executor
            name: task-executor
            env:
            - name: REDIS_HOST
              value: redis-master
            resources:
              requests:
                cpu: 200m
                memory: 512Mi
    
  • 水平Pod自動縮放器(HPA):

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: task-executor
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: task-executor
      minReplicas: 1
      maxReplicas: 3
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
    

 

資源利用率:

  • 當沒有負載時,叢集的CPU /記憶體利用率或多或少是這樣的。

    NAME                              CPU(cores)   MEMORY(bytes)
    redis-master-65f7f8cf88-8tqxm     3m           2Mi
    task-executor-7dd8855487-2gzbf    4m           184Mi
    task-scheduler-86d64c5598-kd6sr   3m           192Mi
    
  • HPA輸出如下所示(kubectl get hpa)。

    NAME            REFERENCE                  TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    task-executor   Deployment/task-executor   3%/50%    1         3         1          5m
    
  • 我向任務計劃程式傳送了數百條訊息,並等待2分鐘。
  • 我可以看到CPU利用率增加,任務執行程式的數量從1增加到3。

    // kubectl get hpa
    
    NAME            REFERENCE                  TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
    task-executor   Deployment/task-executor   205%/50%    1         3         3          7m
    
    // kubectl top pods
    
    NAME                              CPU(cores)        MEMORY(bytes)
    redis-master-65f7f8cf88-8tqxm     5m                3Mi
    task-executor-7dd8855487-2gzbf    526m              176Mi
    task-executor-7dd8855487-5897f    489m              176Mi
    task-executor-7dd8855487-t8tbp    512m              179Mi
    task-scheduler-86d64c5598-kd6sr   3m                189Mi
    
  •  
  • 處理完訊息後,請等待5分鐘,然後kubernetes會擴充套件這些使用消費者。

成功演示基於CPU利用率的訊息使用方自動擴充套件,以實現負載均衡,鬆耦合和加速訊息處理。

相關文章