使用Kubernetes競爭消費者模式擴充套件任務處理 - vinsguru
在分散式系統中,我們透過透過服務匯流排/訊息佇列傳遞訊息來實現系統之間的鬆散耦合。有時,當訊息的傳送量很高時(即每單位時間傳入的訊息數大於每單位時間處理的訊息數),佇列最終將容納無限數量的訊息。訊息佇列最終可能會由於記憶體不足錯誤而失敗,並且客戶端可能永遠不會收到其已傳送訊息的響應!為避免這種情況,我們通常以最多流量來計劃N臺伺服器,但是如果這麼多伺服器很少接收處理任何訊息,則最終需要為這些未使用的伺服器付費。
具有成本效益的解決方案將是自動縮放!這個概念並不新鮮。在本文中,我們將基於Kubernetes叢集中的CPU使用率來擴充套件/擴充套件訊息消費者。這樣,當1臺伺服器努力處理所有訊息時,我們帶來了更多伺服器以加快處理速度,以減少單臺伺服器上的負載並平衡工作量。
案例
將重用我們之前在這裡使用過的應用程式。checkout出來以更好地理解。
- 我們的應用程式將在請求到達時將一些任務放入訊息佇列中。
- 任務將在斐波那契數列中找到第N個位置!我將使用2 ^ N演算法使過程非常緩慢。
- 將有一些類別,如低,高,緊急來對任務進行優先順序排序。顯然,應該首先執行緊急任務!
- 任務執行器是使用訊息的訊息處理器。預設情況下,我們將有1個訊息處理器啟動並始終執行。
- 但是有時1個節點可能還不夠。
- 根據CPU利用率,我們的自動縮放器會彈出更多Pod。
優點:
這種方法有幾個優點。
- 生產者和消費者之間的鬆散耦合。
- 我們可以根據需求動態擴充套件或擴充套件。(在本文中,我們使用CPU利用率。我們也可以根據佇列中的訊息計數使用)
- 可靠
- 負載均衡。單個伺服器不負責處理所有訊息。負載分佈在多個訊息處理器/消費者之間。
Kubernetes資源
- 我們將建立如圖所示的資源。
- 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利用率的訊息使用方自動擴充套件,以實現負載均衡,松耦合和加速訊息處理。
相關文章
- Activiti擴充套件的使用者任務屬性套件
- Competing Consumers Pattern (競爭消費者模式)模式
- Slack是如何實現分散式任務處理的擴充套件?分散式套件
- 谷歌與蘋果的競爭擴充套件到汽車領域谷歌蘋果套件
- Enq : HW-contention高水位線的擴充套件競爭ENQ套件
- 圖片處理擴充套件 Grafika 的簡單使用套件
- 工業和消費者HMI系統中的擴充套件記憶體套件記憶體
- [外掛擴充套件]計劃任務外掛套件
- 圖片處理擴充套件 Intervention/image 的簡單使用套件
- 如何擴充套件Kubernetes API?套件API
- 如何擴充套件Django使用者模組套件Django
- Sql最佳化(十) 程式的可擴充套件性—sequence上的競爭SQL套件
- MySQL - 擴充套件性 2 擴充套件策略:氪金氪腦任君選MySql套件
- 表空間無法擴充套件問題處理套件
- 使用 Kubernetes 擴充套件專用遊戲伺服器套件遊戲伺服器
- Kubernetes Extended Resource 擴充套件資源使用簡介套件
- 如何使用訊息佇列、Spring Boot和Kubernetes擴充套件微服務佇列Spring Boot套件微服務
- PHP CLI 模式多子程式任務處理PHP模式
- 新消費 新格局:成熟企業如何敏捷競爭中國消費市場敏捷
- 生產者消費者模式模式
- 服務的擴充套件性套件
- 可擴充套件的使用者表設計套件
- django 2.0 擴充套件使用者欄位 示例Django套件
- chrome擴充套件推薦:無法無天的圖片內文書處理擴充套件 --- Project NapthaChrome套件ProjectAPT
- Kotlin的裝飾者模式與原始碼擴充套件Kotlin模式原始碼套件
- Kafka中消費者延遲處理訊息Kafka
- 一個簡單的 PHP 時間處理擴充套件PHP套件
- Mysqli擴充套件庫增強—–預處理技術mysqlistmtMySql套件
- 使用KEDA和Kafka在 Kubernetes 上自動擴充套件 - PiotrKafka套件
- 使用aggregation API擴充套件你的kubernetes APIAPI套件
- 生產消費者模式模式
- PDF 擴充套件包使用套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 案例研究:亞馬遜廣告使用 PyTorch 和 Amazon Inferentia 擴充套件廣告處理模型亞馬遜PyTorch套件模型
- 使用BlockQueue實現生產者和消費者模式BloC模式
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- 3 種擴充套件 Kubernetes 能力的方式套件
- Grammarly For Chrome擴充套件任意使用者劫持漏洞分析Chrome套件