Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Sidekiq을 깔끔하게 확장

연초에 우리는 전용 서버 호스팅 시설에서 AWS로 마이그레이션했으며 그렇게 해서 매우 기쁩니다. 그런 식으로 서버를 만지작거리며 보내는 시간이 줄어들기 때문에 많은 자동화가 구현되어 기쁩니다. :) 이 게시물은 처리를 하는 오류 알림의 양이 변경되었을 때 인프라에서 어떤 일이 발생하는지 설명합니다.

확장 방법

우리의 처리 파이프라인은 우리에게 매우 견고한 Sidekiq에 크게 의존합니다. 파이프라인 작업의 대부분은 Autoscaling 그룹에 속한 인스턴스에서 처리됩니다. Sidekiqbacklog가 증가하면 CloudWatch 경보가 트리거되어 이 그룹에서 새 인스턴스가 시작됩니다. 트래픽이 가라앉고 백로그가 사라지면 인스턴스가 종료됩니다.

스타일로 확장하는 방법

이 설정의 유일한 걸림돌은 인스턴스가 종료되기 전에 Sidekiqworkers가 모든 작업을 완료하도록 하려는 것입니다. Sidekiq은 완료되기 전에 종료되는 작업 일정 조정을 지원하지만 가능하면 이를 피하는 것을 선호합니다. 일정을 다시 잡고 다시 시작하는 것보다 작업을 완료하는 데 몇 초 정도 더 걸리는 것이 좋습니다. 다행히도 Sidekiq에는 현재 작업이 완료된 후 새 작업 수락을 중지하도록 작업자 프로세스에 알리는 방법이 있어 해고를 준비하는 작업자를 쉽게 고갈시킬 수 있습니다. 비결은 이러한 작업자에게 드레이닝을 시작해야 한다는 것을 알리는 것입니다. 이를 위해 Lifecycle Hooks, CloudWatch Events + Lambda, EC2 Simple Systems Manager 및 약간의 코드를 조합하여 사용합니다.

이 게시물의 나머지 부분에서는 우리의 설정을 좋은 밤으로 부드럽게 넘어가는 getinstance에 복사하는 방법을 보여줍니다.

전제조건

당연히 사용자가 정의한 일부 규칙에 따라 인스턴스를 종료하는 조정 정책이 있는 Autoscaling 그룹이 필요합니다. 그 외에도 SSM 에이전트를 실행하고 SSM 액세스 권한이 있는 역할에서 실행하도록 인스턴스를 구성해야 합니다. 이러한 인스턴스에는 자동 크기 조정 API와 상호 작용할 수 있는 권한도 있어야 합니다. 다음은 인스턴스 역할에 대한 정책 문서입니다.

코드

해당 항목이 제자리에 있으면 조각을 함께 연결할 수 있습니다. 인스턴스에 존재하고 Sidekiq 드레이닝을 처리할 스크립트인 프로세스의 끝 부분에서 시작하고 거꾸로 작업할 것입니다. 첫째, 작업자를 조용하게 하고 작업이 완료될 때까지 기다리는 Ruby 코드:

Sidekiq API를 통해 현재 인스턴스에서 실행 중인 Sidekiq 프로세스 목록을 가져오고 새 작업 수락을 중지한 다음 모든 프로세스에 활성 작업이 없을 때까지 기다리라고 합니다.

다음은 인스턴스를 종료할 때 해당 스크립트를 트리거하는 셸 스크립트입니다.

해야 할 설정이 많지만 이 스크립트의 핵심은 8행에서 시작됩니다. 먼저 수명 주기 후크에서 작업 중임을 자동 확장 그룹에 알립니다. 이것은 가드가 되는 부작용이 있습니다. 이 인스턴스가 autoscalinggroup에 의해 종료되도록 예약되지 않은 경우 이 명령은 실패하고 작업자 종료 스크립트가 호출되지 않습니다. 이 스크립트는 인스턴스가 종료되도록 예약되어 있지 않는 한 호출하면 안 되지만 약간 방어적인 것이 나쁠 것은 없습니다. :) 앞으로 진행한다고 가정하고 작업자를 종료한 다음 자동 크기 조정 그룹에 종료를 진행하도록 지시합니다. 해당 API 호출을 수행하지 않으면 인스턴스는 후크의 시간 초과가 만료될 때까지 계속 실행됩니다. (잠시 후에 이에 대해 알아보겠습니다).

SSM 문서

이제 이 셸 스크립트를 트리거할 무언가가 필요합니다. 그것이 SSM 에이전트가 들어오는 곳입니다. 백그라운드에서 행복하게 실행 중이며 문서가 SendCommand를 통해 표시되어 무엇을 해야 하는지 알려줄 때까지 기다립니다. OurDocument는 에이전트가 종료 스크립트를 실행하도록 지시합니다.

문서를 클릭하여 문서를 만들 수 있습니다. EC2 콘솔의 시스템 관리자 공유 리소스 섹션(사이드바 하단 근처)에 있는 링크에서 문서 만들기를 클릭합니다. 버튼을 클릭하고 해당 JSON을 콘텐츠 상자에 드롭합니다.

람다 함수

문서가 준비된 상태에서 인스턴스를 종료할 때가 되면 대상 인스턴스에서 실행할 Lambda 함수를 생성합니다. 다음은 이에 대한 몇 가지 코드입니다.

PrepInstanceForTermination을 대체해야 합니다. 문서에 대해 선택한 이름이 무엇이든 간에 이 코드는 복사하여 붙여넣기만 하면 됩니다.

이 Lambda 함수에는 몇 가지 권한(일반적인 Lambda 권한 외에)이 필요하며 이에 대한 IAM 정책 문서는 다음과 같습니다.

다시 말하지만 문서 이름을 바꿔야 할 수도 있습니다.

후크 및 이벤트 규칙

잠시만 기다리세요. 거의 다 왔습니다! Cloudwatch Event와 Lifecycle Hook 생성이라는 두 가지 작업이 남았습니다. 첫째, 이벤트:

CloudWatch 관리 콘솔에서 이벤트를 클릭합니다. 사이드바에서 규칙 만들기를 클릭합니다. 단추. 이것이 방금 생성한 Lambda 함수를 트리거하는 것입니다.

Sidekiq을 깔끔하게 확장

왼쪽에서 보고 싶은 이벤트와 해당 이벤트에 대한 추가 특성(예:이 이벤트를 트리거할 자동 크기 조정 그룹 제한)을 선택하고 오른쪽에서 규칙의 대상을 선택합니다(이 경우 이전에 생성한 Lambda 함수). Lambda 함수 대상의 기본값을 변경할 필요가 없습니다.

완료되면 EC2 관리 콘솔로 돌아가 관리하려는 인스턴스가 있는 Autoscaling 그룹으로 이동합니다. Lifecycle Hooks를 클릭한 후 탭에서 후크를 만들 수 있습니다. 우리의 것은 다음과 같습니다.

Sidekiq을 깔끔하게 확장

Terminate는 우리가 관심을 갖고 있는 전환이며 어떤 이유로 600초(Heartbeat Timeout)가 경과한 후에도 API 호출이 셸 스크립트에서 발생하지 않으면 종료를 진행하고 싶습니다(기본 결과:CONTINUE). 이로 인해 Sidekiq 작업자가 완료되지 않은 경우에도 10분 후에 인스턴스가 어떤 식으로든 종료됩니다.

랩입니다

네가 해냈어! 이제 인도적인 방식으로 itsSidekiq 인스턴스를 종료할 수 있는 자동 크기 조정 그룹이 생겼습니다. 즐기세요!

추신:이러한 조각 중 일부를 함께 제공하는 매우 유용한 자습서에 대한 크레딧은 awslabs로 이동합니다.