Hướng dẫn mở rộng quy mô nhân lực với RabbitMQ trên Kubernetes
Bạn đã biết cách sử dụng RabbitMQ để mở rộng quy mô nhân lực trên Kubernetes chưa? Hãy cùng với Bizfly Cloud đi tìm hiểu cách mở rộng quy mô nhân lực với RabbitMQ trên Kubernetes nhanh nhất qua bài viết này.
Trong Kubernetes, bạn có thể mở rộng các phiên bản ứng dụng của mình bằng Trình tự động cân bằng khối ngang (HPA). Ngoài ra, bạn còn có thể định cấu hình Bộ định mức tự động Pod ngang (HPA) để tăng và giảm số lượng bản sao dựa trên các chỉ số như CPU và bộ nhớ.
Tạo báo cáo dài hạn
Hãy xem xét ứng dụng web sau với hai điểm cuối:
- Điểm /report cuối kích hoạt tạo báo cáo. Ứng dụng mất 60 giây để hoàn thành một báo cáo.
- Một /report/<id> điểm cuối để tìm nạp trạng thái của báo cáo. Trạng thái có thể đang tiến hành hoặc đã hoàn thành.
Mỗi khi người dùng yêu cầu báo cáo, nhiệm vụ sẽ được gửi đến Celery.
Celery sắp xếp và phân phối nhiệm vụ bằng cách sử dụng hai thành phần:
- RabbitMQ hoạt động như một nhà môi giới tin nhắn (được sử dụng để phân phối các thông điệp cho người lao động)
- Postgresql để lưu trữ trạng thái của các nhiệm vụ ( giúp theo dõi những công việc đã hoàn thành hoặc đang tiến hành)
Vì vậy, toàn bộ quá trình tạo báo cáo dài hạn chính là:
- Người dùng yêu cầu một báo cáo cho ứng dụng Flask.
- Ứng dụng Flask gửi nhiệm vụ vào hàng đợi. Công việc được ghi lại trong cơ sở dữ liệu.
- Ứng dụng cũng trả lời người dùng với id của nhiệm vụ.
- Một công nhân nhận công việc và chạy nó đến khi hoàn thành.
- Công việc được đánh dấu là hoàn thành trong cơ sở dữ liệu.
- Người dùng truy xuất báo cáo. Báo cáo đã sẵn sàng.
Thử nghiệm ứng dụng với Locust
Hiện nay có rất nhiều công cụ có sẵn để tải các ứng dụng kiểm tra như: ab , k6 , BlazeMeter , v.v. Tuy nhiên trong bài viết này chúng ta sẽ sử dụng Locust - một công cụ kiểm tra tải mã nguồn mở.
Locust thuận tiện cho người dùng vì hai lý do:
- Có một bảng điều khiển nơi bạn có thể kiểm tra lưu lượng truy cập được tạo ra.
- Bạn có thể tạo tải bằng cách sử dụng một tập lệnh.
Tập lệnh sau dùng để tạo (và kiểm tra) các báo cáo trên ứng dụng:
class reportService(HttpUser):
wait_time = constant(1)
def _do_async_handler(self, timeout=600):
# Request for a report
post_resp = requests.post(self.host + 'report')
if not post_resp.status_code == 200:
return
id = post_resp.json()['report_id']
# Poll for completed report
start_time = time.monotonic()
end_time = start_time + timeout
while time.monotonic() < end_time:
r = requests.get(self.host + 'report/' + id)
if r.status_code == 200 and r.json()['result'] != None:
async_success('POST /report/ID - async', start_time, post_resp)
return
time.sleep(1)
async_failure('POST /report/ID - async', start_time, post_resp,
'Failed - timed out after %s seconds' % timeout)
@task
def async_test(self):
gevent.spawn(self._do_async_handler)
Nếu bạn lưu tệp cục bộ, bạn có thể khởi động Locust bằng cách:
docker run -p 8089:8089 \
-v $PWD:/mnt/locust \
locustio/locust -f /mnt/locust/complete_flow_load_test.py
Khi khởi động, vùng chứa liên kết trên cổng 8089 trên máy tính của bạn.
Bạn có thể mở trình duyệt của mình trên http: // localhost: 8089 để truy cập giao diện web.
API số liệu Kubernetes
Tính năng Tự động tính toán khối ngang (HPA) trong Kubernetes không hoạt động tốt. Và phải đưa ra các quyết định về thời điểm thêm hoặc xóa các bản sao dựa trên dữ liệu thực.
Có một sự thật là Kubernetes không thu thập và tổng hợp các số liệu mà thay vào đó Kubernetes xác định API Metrics và để nó cho phần mềm khác để triển khai thực tế.
API được chia thành ba loại:
- Số liệu tài nguyên.
- Chỉ số tùy chỉnh.
- Chỉ số bên ngoài.
Các API này nhằm phục vụ các loại chỉ số khác nhau:
- Các Resource Metrics API được thiết kế cho các số liệu sử dụng tài nguyên được xác định trước của Pods và nút.
- Các Chỉ số tùy chỉnh API là để dành cho chỉ số tùy chỉnh cấp ứng dụng liên kết với một đối tượng Kubernetes.
- Các External Metrics API được thiết kế cho các số liệu cấp ứng dụng tùy chỉnh mà không liên quan đến một đối tượng Kubernetes.
Cần lưu ý những gì khi tự động mở rộng quy mô nhân lực
Như đã nói ở trên, bạn có thể mở rộng quy mô nhân lực với RabbitMQ. Tuy nhiên, sẽ có một vài vấn đề liên quan đến các Pod tự động điều chỉnh tỷ lệ. Vì HPA (Horizontal Pod Autoscaler) chia tỷ lệ các bản sao lên và xuống dựa trên các chỉ số, nên có khả năng HPA có thể giết một nhóm khi nó đang xử lý một nhiệm vụ.
Vậy cách để giải quyết vấn đề này là thay đổi cài đặt Celery và đảm bảo rằng công việc được ghi nhận và đánh dấu là "hoàn thành" khi hoàn thành.
Kết luận
Việc thiết kế các ứng dụng ở quy mô lớn đòi hỏi bạn phải có một kế hoạch cụ thể và thử nghiệm trước để tránh gặp phải sự cố đáng tiếc. Ngoài ra, khi bạn triển khai các tập lệnh của mình hãy cố gắng tận dụng một bộ điều phối vùng chứa như Kubernetes và kết hợp nó với KEDA để triển khai và mở rộng các ứng dụng của bạn một cách tự động sẽ dễ dàng hơn.
>> Có thể bạn quan tâm: Phần 2 - Cách etcd hoạt động khi có và không có Kubernetes