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

QStash: 서버리스 런타임을 위한 메시지 큐 및 스케줄러

드디어 QStash를 공개하게 되어 기쁘고 설레는 마음으로 소개합니다! 🔥🔥🔥

공식적으로 QStash는 서버리스 런타임을 위해 설계된 메시지 큐이자 작업 스케줄러입니다. 좀 더 쉽게 표현하자면, QStash는 여러분의 서버리스 함수들을 연결해주는 '접착제'라고 할 수 있습니다.

예전에는 서버리스가 간단한 작업에만 적합하다는 인식이 있었습니다. 하지만 이제는 상황이 달라졌습니다. 많은 개발자들이 서버리스 스택만으로 강력한 시스템을 구축하고 있습니다. 강력한 시스템은 여러 컴포넌트로 구성되며, 이들 간의 통신은 중요한 엔지니어링 과제입니다. 이미 훌륭한 솔루션들이 존재하지만, 기존 솔루션들은 서버리스 환경에는 잘 맞지 않습니다. 너무 복잡하거나, 상태를 저장하지 않는(stateless) 런타임과 함께 동작하도록 설계되지 않았기 때문입니다.

그래서 우리는 다음과 같은 조건을 만족하는 솔루션을 원했습니다:

  • 서버리스와 엣지(Edge) 환경을 포함해 어디에서나 동작할 것
  • 사용자가 백엔드를 직접 운영할 필요 없는 메시징 서비스일 것
  • 가볍고 이해하기 쉬우며, 배워야 할 것이 거의 없을 것
  • 사용량이 없으면 비용도 0으로 수렴하는 가격 정책일 것

실제 사례로 살펴보기

간단한 예시를 들어보겠습니다. 이커머스 앱에서 구매가 발생할 때마다 안내 이메일을 보내고 싶다고 가정해봅시다. 신규 구매를 처리하는 서비스(newPurchase)와 이메일 및 알림을 전송하는 서비스(sendEmail) 두 가지가 있습니다.

newPurchase 서비스에서 sendEmail 서비스를 직접 호출할 수 있습니다. 하지만 호출이 실패하면 어떻게 될까요? 응답을 기다렸다가 재시도해야 할까요? 호출이 몰려 sendEmail 서비스가 제시간에 응답하지 못한다면? 이런 모든 경우를 newPurchase 서비스에서 직접 처리해야 합니다. 게다가 sendEmail 서비스의 계약(인터페이스)이 변경되면 newPurchase 서비스도 함께 수정해야 합니다.

반면 QStash를 사용하면 이야기가 달라집니다. newPurchase 서비스는 단순히 QStash로 요청을 보내기만 하면 됩니다. QStash가 요청을 큐에 담아 sendEmail 서비스를 호출하고, 응답이 없으면 백오프(backoff) 전략에 따라 자동으로 재시도합니다. sendEmail 서비스의 지연이 newPurchase 서비스에 영향을 주지 않습니다. 응답을 기다리지 않기 때문입니다. QStash는 두 서비스를 완전히 분리(decouple)해주며, 메시지 형식만 호환된다면 각 서비스를 독립적으로 업데이트할 수 있습니다.

또한 QStash를 사용하면 요청에 지연(delays)을 추가할 수 있습니다. 예를 들어 배송 3일 후 고객에게 리뷰 작성을 요청하는 이메일을 보낼 수 있습니다. 작업 스케줄링도 가능합니다. CRON 표현식과 함께 요청을 보내면 반복적으로 실행됩니다.

QStash: 서버리스 런타임을 위한 메시지 큐 및 스케줄러

이제 QStash의 주요 기능을 살펴보겠습니다.

어디에서나 동작합니다

큐에서 메시지를 가져오려면 오래 실행되는 프로세스가 필요한 기존의 폴링(pull) 방식과 달리, QStash는 메시지를 여러분의 API로 푸시(push)합니다. 덕분에 서버리스 함수로 메시지를 처리할 수 있습니다. 재시도, 사용자 지정 지연, 스케줄링은 모두 QStash가 대신 처리해줍니다. 필요한 것은 공개적으로 접근 가능한 HTTP API 하나뿐입니다.

비용은 0까지 확장됩니다

QStash의 가격은 요청 10만 건당 $1입니다. 최소 결제 금액이나 고정 비용이 없으며, 사용한 만큼만 지불하면 됩니다. 수백만 건 이상의 요청이 예상된다면, 요청당 단가가 더 낮은 엔터프라이즈 플랜도 제공됩니다.

업데이트 - 2022년 9월

QStash 가격을 요청 10만 건당 $1로 인하했습니다. 최신 가격 정보는 QStash 가격 페이지에서 확인하세요.

엔드포인트와 토픽

메시지와 함께 엔드포인트를 지정하면 QStash가 해당 엔드포인트로 메시지를 전송합니다. 또한 하나 이상의 엔드포인트를 하나의 네임스페이스로 묶는 토픽(topic)을 정의할 수도 있습니다. 토픽 추상화 덕분에 백엔드 구현을 수정하지 않고도 엔드포인트를 변경할 수 있습니다. 아래 예시는 user-apis 토픽으로 요청을 보내며, 메시지 사본이 각 엔드포인트에 모두 전달됩니다.

엔드포인트로 전송하기

curl -XPOST \
 "https://qstash.upstash.io/v1/publish/https://example.com" \
 -H "Authorization: Bearer XXX" \
 -H "Content-Type: application/json" \
 -d "{ \"hello\" : \"world\" }"

토픽으로 전송하기

curl -XPOST \
 "https://qstash.upstash.io/v1/publish/user-apis" \
 -H "Authorization: Bearer XXX" \
 -H "Content-Type: application/json" \
 -d "{ \"hello\" : \"world\" }"

스케줄

QStash는 설정한 일정에 따라 작업을 반복 실행할 수 있습니다. 헤더의 Upstash-Cron 값에 CRON 표현식을 지정하면 됩니다. 아래 예시는 매분마다 API를 호출하도록 QStash에 지시합니다.

curl -XPOST \
 'https://qstash.upstash.io/v1/publish/https://example.com' \
 -H 'Authorization: Bearer XXX' \
 -H "Content-type: application/json" \
 -H "Upstash-Cron: * * * * *" \
 -d '{ "hello": "world" }'

그 외 기능들

  • 재시도(Retries): API가 성공 상태 코드로 응답하지 않으면, 모든 메시지가 확실히 전달되도록 QStash가 자동으로 재시도합니다.
  • 지연(Delays): 메시지 전송을 최대 90일까지 미룰 수 있습니다.
  • 중복 제거(Deduplication): Deduplication-Id를 사용하거나 내용 기반 자동 중복 제거로 중복 메시지를 방지할 수 있습니다.
  • 요청 서명(Request signing): API는 공개되어야 하므로, 시그니처 검증을 통해 들어오는 각 요청의 진위 여부를 확인할 수 있습니다.
  • JS/TS SDK: REST API도 간단하지만, JS/TS로 개발한다면 SDK를 사용하면 더욱 간편합니다.

마치며

QStash는 서버리스 세계에 최고의 메시징 서비스를 제공하는 것을 목표로 합니다. 첫 출시인 만큼 여러분의 피드백과 기여가 큰 힘이 됩니다. QStash 문서를 확인해보시고, Discord와 Twitter를 통해 의견과 제안을 보내주세요.