QStash:サーバーレス時代のメッセージキュー&タスクスケジューラ
私たちは、QStashのリリースを誇りに思うとともに、大きな興奮を感じています🔥🔥🔥
正式には、QStashはサーバーレスランタイム向けに設計されたメッセージキュー兼タスクスケジューラです。砕けて言えば、QStashはあなたのサーバーレス関数同士をつなぐ「糊(グルー)」のような存在です。
かつて「サーバーレスは単純なタスクにしか向かない」という見方が一般的でした。しかしそうではありません。今や人々はサーバーレススタックで強力なシステムを構築しています。強力なシステムは複数のコンポーネントで構成され、それらの間の通信は大きなエンジニアリング課題となります。この問題に対する優れたソリューションはすでに存在しますが、既存のものはサーバーレスの領域には適合しないと私たちは考えています。複雑すぎたり、ステートレスなランタイムでの動作を前提に設計されていなかったりするからです。そこで私たちが必要としたのは、次のようなソリューションでした。
- サーバーレスやエッジを含む、あらゆる環境で動作すること
- ユーザーがバックエンドを運用する必要のない、Messaging as a Service であること
- 軽量で理解しやすく、学習コストがほぼゼロであること
- 利用量がゼロなら料金もゼロになる、スケールトゥゼロの価格体系であること
実際のユースケースで見るQStash
身近な例を挙げましょう。ECアプリがあり、購入が完了するたびにお知らせメールを送りたいとします。ここで、新規購入を処理するサービス(APIルート)newPurchaseと、メールや通知を送信するsendEmailという2つのサービスがあるとします。newPurchaseから直接sendEmailを呼び出すことも可能ですが、呼び出しが失敗したらどうなるでしょうか?レスポンスを待ってリトライすべきでしょうか?大量の呼び出しでsendEmailが混雑し、時間内に応答できなくなったら?こうしたケースはすべてnewPurchase側でハンドリングする必要があります。さらに、sendEmailのインターフェースを変更する際には、newPurchase側も修正しなければなりません。
この例でQStashを使えば、newPurchaseからQStashへリクエストを送るだけで完了です。QStashがリクエストをキューイングし、sendEmailを呼び出します。相手が応答しない場合は、バックオフ戦略に従って自動的にリトライします。sendEmailからのレスポンスを待たないため、そのレイテンシがnewPurchaseに影響することはありません。つまりQStashは2つのサービスを疎結合にします。メッセージ形式の互換性さえ保てば、両方のサービスをそれぞれ独立して更新できるのです。
さらにQStashでは、リクエストにdelays(遅延)を設定できます。たとえば「出荷の3日後にメールを送り、レビュー投稿を促す」といった使い方が可能です。CRON式を指定してリクエストを送れば、定期的に繰り返し実行されるタスクのスケジューリングも実現できます。

それでは、QStashの主な機能を順番に見ていきましょう。
どこでも動作する
キューからメッセージを取り出すために常駐プロセスが必要な従来のプル型メッセージングとは異なり、QStashはメッセージをあなたのAPIへプッシュします。これにより、サーバーレス関数だけでメッセージ処理を完結できます。リトライ、カスタム遅延、スケジューリングはすべてQStashが担うため、必要なのは公開アクセス可能なHTTP APIだけです。
価格はゼロまでスケール
QStashの価格は10万リクエストあたり1ドルです。最低支払額や固定料金は一切なく、使った分だけお支払いいただきます。数百万規模のリクエストを見込む場合は、より低い単価のエンタープライズプランをご提案いたします。
2022年9月アップデート
QStashの価格を10万リクエストあたり1ドルに引き下げました。最新の価格情報については、QStashの価格ページをご確認ください。
エンドポイントとトピック
QStashに送るメッセージには宛先となるエンドポイントを含めます。QStashはそのエンドポイントへメッセージを配信します。また、1つ以上のエンドポイントを単一の名前空間にまとめる「トピック」を定義することもできます。このトピック抽象化のおかげで、バックエンドの実装に手を加えることなくエンドポイントを差し替えられます。以下はトピック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" }'
その他の便利な機能
- リトライ: APIが成功ステータスコードを返さない場合、すべてのメッセージが確実に配信されるようQStashが自動的に再試行します。
- 遅延配信: メッセージの配信を最大90日まで遅らせることができます。
- 重複排除:
Deduplication-Idの指定、あるいはコンテンツベースの自動重複排除により、重複メッセージを防止できます。 - リクエスト署名: 公開APIには必ず不正リクエストのリスクが伴います。署名を検証することで、各受信リクエストの真正性を確認できます。
- JS/TS SDK: REST API自体もシンプルですが、JS/TSで開発している方には、さらに扱いやすい公式SDKをご用意しています。
まとめ
QStashは、サーバーレスの世界に最高のメッセージング体験を提供することを目指しています。今回が初回リリースのため、皆さまからのフィードバックと貢献を心からお待ちしています。まずはQStashのドキュメントをご覧いただき、コメントやご提案があれば、DiscordやTwitterまでお気軽にお寄せください。
-
Nuxt 3とサーバーレスRedis(Upstash)で始めるページ訪問カウント実装
Nuxt 3とサーバーレスRedis(Upstash)で始めるページ訪問カウント実装 アプリケーションの利用状況を追跡したり、リソース利用を制限したり、キャッシュからデータを取得してパフォーマンスを向上させたりする必要がある場合、Redisがその答えとなります。Redisはインメモリのキー・バリュー型データベースであり、オープンソースで「Remote Dictionary Server」の略称です。 この記事では、サーバーレスRedisサービスであるUpstashと、Vue SSRフレームワークの最新ベータ版であるNuxt 3を組み合わせた基本的なアプリケーション構築を通じて、Redisの基礎
-
Next.jsアプリにフィードバックウィジェットを実装する方法(Upstash Redis連携)
ユーザーフィードバックは、製品の改善や開発の方向性を決めるうえで非常に重要な情報源です。本記事では、ユーザーから手軽にフィードバックを収集できるウィジェットをご紹介します。これはNext.jsのAPIをバックエンドとして呼び出すReactコンポーネントで、バックエンド側のAPIは受け取ったフィードバックデータをUpstash Redisデータベースへ送信するだけのシンプルな構成になっています。送信されたデータは、Upstashコンソールの「Integrations」ページからいつでも確認・管理できます。 このコンポーネントをNext.jsのページに追加すると、画面右下にアイコンが表示されます。