Computer >> Máy Tính >  >> Lập trình >> Ruby

Sạch sẽ mở rộng quy mô Sidekiq

Đầu năm, chúng tôi đã chuyển từ cơ sở lưu trữ máy chủ chuyên dụng sang AWS và chúng tôi rất vui vì đã làm được điều đó. Chúng tôi rất vui khi có một loạt quyền sử dụng, vì chúng tôi có thể dành ít thời gian hơn với cách giao bóng theo cách đó. :) Bài đăng này mô tả những gì xảy ra trong cơ sở hạ tầng của chúng tôi khi chúng tôi có những thay đổi về khối lượng thông báo lỗi được xử lý.

Cách chúng tôi mở rộng quy mô

Hệ thống xử lý của chúng tôi chủ yếu dựa vào Sidekiq, một công cụ rất vững chắc đối với chúng tôi. Phần lớn công việc trong đường dẫn được xử lý bởi các phiên bản thuộc nhóm tự động phân hạng. Khi Sidekiqbacklog tăng lên, một cảnh báo CloudWatch sẽ kích hoạt, khiến các phiên bản mới bắt đầu trong nhóm này. Khi lưu lượng truy cập giảm xuống và tồn đọng xuất hiện, các phiên bản sẽ bị chấm dứt.

Cách chúng tôi mở rộng quy mô, với phong cách

Điểm khó khăn duy nhất trong thiết lập này là chúng tôi muốn đảm bảo Sidekiqworkers hoàn thành tất cả công việc của họ trước khi một phiên bản kết thúc. Mặc dù Sidekiq hỗ trợ lên lịch lại các công việc bị kết thúc trước khi hoàn thành, chúng tôi muốn tránh điều đó khi có thể— tốt hơn là bạn nên dành thêm vài giây để hoàn thành công việc hơn là lên lịch lại và khởi động lại. May mắn thay, về sự tuyệt vời của nó, Sidekiq có một phương pháp để yêu cầu các quy trình của nhân viên ngừng nhận công việc mới sau khi công việc hiện tại hoàn thành, giúp dễ dàng tiêu hao công nhân trong quá trình chuẩn bị cho việc chấm dứt. Bí quyết là cho những người lao động đó biết rằng họ cần bắt đầu rút cạn nước - và để làm được điều đó, chúng tôi sử dụng tổ hợp Vòng đời kết hợp, Sự kiện CloudWatch + Lambda, Trình quản lý hệ thống đơn giản EC2 và một chút mã.

Phần còn lại của bài đăng này sẽ chỉ cho bạn cách bạn có thể sao chép thiết lập của chúng tôi sang các vùng địa lý để giúp bạn có một đêm tốt lành.

Điều kiện tiên quyết

Đương nhiên, bạn sẽ cần một nhóm tự động thay đổi tỷ lệ có chính sách mở rộng quy mô kết thúc các phiên bản dựa trên một số quy tắc bạn xác định. Ngoài ra, bạn sẽ cần phải định cấu hình các phiên bản của mình để chạy SSM Agent và chạy ở một vai trò có quyền truy cập SSM. Đây là tài liệu chính sách cho vai trò mẫu:

Sau khi các mục đó ở đúng vị trí, bạn có thể bắt đầu kết nối các mối liên kết với nhau. Chúng tôi sẽ bắt đầu ở phần cuối của quá trình - các tập lệnh của chúng tôi sẽ tồn tại trên phiên bản và xử lý việc thoát Sidekiq - và chúng tôi sẽ làm việc theo cách của bạn ngược lại. Đầu tiên, mã Ruby sẽ khiến công nhân yên lặng và chờ họ hoàn thành công việc:

Chúng tôi nhận được danh sách các quy trình Sidekiq đang chạy trên hiện tại thông qua API Sidekiq, yêu cầu họ ngừng chấp nhận công việc mới, sau đó chờ cho đến khi tất cả các quy trình không còn công việc nào đang hoạt động.

Đây là tập lệnh shell sẽ kích hoạt tập lệnh đó khi đến lúc hủy bỏ phiên bản:

Có rất nhiều thiết lập phải làm, nhưng phần lớn của tập lệnh này bắt đầu ở dòng 8. Đầu tiên, chúng tôi báo hiệu cho nhóm tự động phân hạng rằng chúng tôi đang làm việc trên móc vòng tuần hoàn. Điều này có tác dụng phụ của việc bảo vệ - nếu phiên bản này không được lên lịch kết thúc bởi nhóm autoscaling, thì lệnh này sẽ không thành công và tập lệnh tắt máy công nhân sẽ không được gọi. Tập lệnh này không nên được gọi trừ khi phiên bản đã được lên lịch để kết thúc, nhưng nó không có hại gì nếu bạn phải trả một khoản tiền nhỏ. :) Giả sử chúng ta đang tiến về phía trước, chúng ta tắt các worker và sau đó chúng ta yêu cầu nhóm autoscaling tiếp tục chấm dứt. Nếu chúng ta không thực hiện lệnh gọi API đó, thì phiên bản sẽ vẫn chạy cho đến khi hết thời gian chờ của hook (chúng ta sẽ giải quyết vấn đề đó sau một chút).

Tài liệu SSM

Bây giờ chúng ta cần một cái gì đó sẽ kích hoạt tập lệnh shell này. Đó là nơi tác nhân SSM xuất hiện. Nó rất vui khi chạy ở chế độ nền, chờ một Tài liệu hiển thị qua SendCommand để cho nó biết phải làm gì. OurDocument hướng dẫn tác nhân chạy tập lệnh chấm dứt:

Bạn có thể tạo Tài liệu của mình bằng cách nhấp vào Tài liệu trong phần Tài nguyên được chia sẻ của Trình quản lý Hệ thống của bảng điều khiển EC2 (gần phần cuối của thanh bên), nhấp vào Tạo tài liệu và đưa JSON đó vào hộp Nội dung.

Hàm Lambda

Với Tài liệu của bạn tại chỗ, hãy tạo một hàm Lambda sẽ chạy nó trên phiên bản đích khi đến lúc kết thúc một phiên bản. Đây là đoạn mã hữu ích cho việc đó:

Bạn sẽ cần thay thế PrepInstanceForTermination với bất kỳ tên nào bạn đã chọn cho Tài liệu của mình, nhưng nếu không thì mã này chỉ là bản sao và dán.

Hàm Lambda này cần một vài quyền (ngoài các quyền Lambda thông thường) và đây là tài liệu chính sách IAM cho điều đó:

Một lần nữa, bạn có thể cần phải thay thế tên Tài liệu.

Móc và Quy tắc Sự kiện

Cố gắng ở đó - chúng ta sắp hoàn tất! Bạn còn hai việc phải làm:tạo Sự kiện Cloudwatch và Móc vòng đời. Đầu tiên, Sự kiện:

Trong bảng điều khiển quản lý CloudWatch, nhấp vào Sự kiện trong thanh bên, sau đó nhấp vào Tạo quy tắc cái nút. Đây là thứ sẽ kích hoạt chức năng Lambda function mà bạn vừa tạo.

Sạch sẽ mở rộng quy mô Sidekiq

Ở bên trái, bạn chọn sự kiện bạn muốn xem và bất kỳ đặc điểm bổ sung nào về sự kiện đó (như giới hạn nhóm tự động phân vùng sẽ kích hoạt sự kiện này) và ở bên phải, bạn chọn mục tiêu của sự kiện - trong trường hợp của chúng tôi là hàm Lambda mà chúng tôi đã tạo trước đó. Bạn không cần phải thay đổi bất kỳ giá trị mặc định nào cho mục tiêu hàm Lambda.

Sau khi hoàn tất, hãy quay lại bảng điều khiển quản lý EC2 và điều hướng đến nhóm tự động thay đổi tỷ lệ có các phiên bản bạn muốn quản lý. Sau khi nhấp vào Móc vòng đời , bạn sẽ có thể tạo một hook. của chúng ta trông giống như sau:

Sạch sẽ mở rộng quy mô Sidekiq

Chấm dứt là quá trình chuyển đổi mà chúng tôi quan tâm và chúng tôi muốn quá trình hủy tiếp tục diễn ra (Kết quả mặc định:TIẾP TỤC) nếu vì một số tiếp tục, lệnh gọi API không xảy ra trong tập lệnh shell của chúng tôi sau 600 giây (Heartbeat Timeout) đã trôi qua. Điều này sẽ dẫn đến việc các phiên bản của chúng tôi bị chấm dứt theo cách này hay cách khác, ngay cả khi nhân viên của Sidekiq không đến, sau 10 phút.

Đó là một kết thúc

Bạn đã thực hiện nó! Bây giờ bạn có một nhóm tự động phân hạng có thể kết thúc các phiên bảnSidekiq của nó theo cách nhân đạo. Hãy tận hưởng!

Tái bút:Tín dụng dành cho awslabs để có một hướng dẫn siêu hữu ích về cách ghép một số phần này lại với nhau.