Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

이모지 하나로 Sidekiq의 모든 대기열 한 번에 비우는 방법

Honeybadger에서는 Sidekiq를 아주 많이 사용하는데, 정말 훌륭한 도구입니다. 그런데 개발하면서 자주 마주치는 골칫거리가 하나 있습니다.

바로 저는 평소 개발 환경에서는 Sidekiq를 실행하지 않는다는 점입니다. 그런데 수동 테스트 과정에서 수많은 잡(job)이 큐에 쌓이게 되죠. 그 결과, 다음에 Sidekiq를 실행하면 밀려 있던 모든 잡을 한꺼번에 처리하려고 들어 문제가 됩니다.

특정 Sidekiq 큐에서 잡을 삭제하는 코드 조각은 인터넷에서 쉽게 찾을 수 있습니다. 하지만 저희 서비스에는 수많은 큐가 존재하고, 저는 그 전부를 한 번에 비우고 싶었습니다. 조금 파고든 끝에 깔끔하게 동작하는 해결책을 찾았습니다. 보시죠!

# 원래는 더 길고 장황한 코드였지만,
# Sidekiq의 제작자 mperham이 올바른 방법을 알려주셨습니다 :)

Sidekiq::Queue.all.each(&:clear)

더 직접적인 방식도 물론 존재합니다. 하지만 이 방법은 오직 Sidekiq의 공개(public) API에 정의된 메서드만 사용하기 때문에, 내부 구현이 변경되더라도 계속해서 정상적으로 동작할 가능성이 높다는 장점이 있습니다.

이제 이모지를 더해볼까요? 💥

Sidekiq 소스 코드를 꼼꼼히 읽어본 사람이라면 눈치챘을 수도 있는데요, 무려 💣 이모지로 clear 메서드를 호출할 수 있습니다. 농담이 아니라 진짜입니다:

# https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/api.rb#L255

alias_method :💣, :clear

Ruby에서는 메서드 이름으로 유니코드 문자를 사용할 수 있기 때문에 이런 재미있는 트릭이 가능합니다. 덕분에 앞서 만든 "모든 큐 비우기" 코드를 다음과 같이 다시 쓸 수 있습니다:

Sidekiq::Stats.new.queues.each { |k, v| Sidekiq::Queue.new(k).💣 }

이모지가 이렇게 멋진 김에, 모든 큐를 대량으로 삭제하는 나만의 💀 메서드까지 만들어 볼 수 있습니다:

def 💀
  Sidekiq::Stats.new.queues.each { |queue_name, _| Sidekiq::Queue.new(queue_name).💣 }
end

이제 개발 중 쌓여버린 잡들이 걱정될 때마다 💀를 호출하기만 하면 됩니다. 짧고 직관적이면서도, 공개 API만 사용하기 때문에 안정성까지 챙긴 우아한 해결책입니다.