使用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擴充套件的使用者任務屬性套件
- 圖片處理擴充套件 Grafika 的簡單使用套件
- 如何擴充套件Kubernetes API?套件API
- 圖片處理擴充套件 Intervention/image 的簡單使用套件
- 使用aggregation API擴充套件你的kubernetes APIAPI套件
- [外掛擴充套件]計劃任務外掛套件
- 如何使用訊息佇列、Spring Boot和Kubernetes擴充套件微服務佇列Spring Boot套件微服務
- 工業和消費者HMI系統中的擴充套件記憶體套件記憶體
- Kubernetes Extended Resource 擴充套件資源使用簡介套件
- 使用KEDA和Kafka在 Kubernetes 上自動擴充套件 - PiotrKafka套件
- 使用 Kubernetes 擴充套件專用遊戲伺服器套件遊戲伺服器
- MySQL - 擴充套件性 2 擴充套件策略:氪金氪腦任君選MySql套件
- Kotlin的裝飾者模式與原始碼擴充套件Kotlin模式原始碼套件
- 3 種擴充套件 Kubernetes 能力的方式套件
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- PHP CLI 模式多子程式任務處理PHP模式
- 一個簡單的 PHP 時間處理擴充套件PHP套件
- DoorDash使用 Kafka 和 Flink 構建可擴充套件的實時事件處理Kafka套件事件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 可擴充套件的使用者表設計套件
- django 2.0 擴充套件使用者欄位 示例Django套件
- Swift---協議和擴充套件、 錯誤處理、泛型Swift協議套件泛型
- .NET 開源 EF Core 批處理擴充套件工具,真好用套件
- 03 Windows批處理的作用域和延遲擴充套件Windows套件
- 使用 .NET Core 構建可擴充套件的實時資料處理系統套件
- 使用Kafka分割槽擴充套件Spring Batch大資料排程批處理 – ArnoldKafka套件SpringBAT大資料
- Grammarly For Chrome擴充套件任意使用者劫持漏洞分析Chrome套件
- Kubernetes可擴充套件Admission進入Beta階段套件
- Source insight擴充套件宏使用套件
- 使用ctypes來擴充套件Python套件Python
- 使用cython擴充套件python庫套件Python
- Kafka中消費者延遲處理訊息Kafka
- 微服務架構擴充套件FreeStyle微服務架構套件
- 擴充套件我們的分析處理服務(Smartly.io):使用 Citus 對 PostgreSQL 資料庫進行分片套件SQL資料庫
- PHP 7.3.8 安裝 ext-Redis 擴充套件 報錯處理方案PHPRedis套件
- 對xxl-job進行simpleTrigger並動態建立任務擴充套件套件
- 生產者消費者模式模式
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式