CapyDB Knight/Valkyrie

K/V

データのすぐ隣で、独立したセルの中で動くキーバリューストアとレートリミッターです。データベースがなくても問題なく使えます。

01どこにあるか

データのすぐ隣に

ストアはセルであり、データベースがセルであるのと同じように、同一ノード上で動きます。アプリからはデータベースと同じ 1 ホップで届き、リクエストが着いてからストアが応答するまではミリ秒未満です。

01どこにあるか
awaiting signal

02何をするか

3 つ通し、あとは待たせる

レート制限は、多くの人がキーバリューストアを求める理由であり、コードだけでは最も想像しにくい動きです。ウィンドウ内の 3 件は通り、4 件目は通りません。どちらもデータベースには触れていません。

02何をするか
awaiting signal

03導入コスト

環境変数 2 つ

ストアはクライアントがすでに話すプロトコルを話すため、上のリミッターは一切変わりません。違うのは認証情報の出どころだけで、それは環境変数 2 行です。

03導入コスト
awaiting signal

01

K/V とは

プロジェクトごとに 1 つ用意されるマネージドのキーバリューストアで、独自のセルの中で動きます。プロセスもメモリ上限もストレージも専用です。Valkey を利用し、HTTPS 上の Upstash REST プロトコルと TLS 上の RESP という 2 つのプロトコルを話すため、すでにお持ちのクライアントがそのまま使えます。REST クライアントは既定の設定のまま、RESP クライアントはホスト名を TLS サーバー名として送れば動作します。

テーブルではなくカウンターが向いている仕事のためのものです。レート制限、セッション、キュー、フィーチャーフラグ、短命なキャッシュなどが該当します。Postgres でもすべて実現できますが、これほど安価にはできません。

02

レート制限

これが統合のすべてです。環境変数 2 つと、フレームワークがすでに想定しているリミッターだけです。認証情報の出どころ以外に CapyDB 固有のものはありません。

import { Ratelimit } from '@upstash/ratelimit'
import { Redis } from '@upstash/redis'

const ratelimit = new Ratelimit({
  redis: new Redis({
    url: process.env.CAPYKV_REST_URL!,
    token: process.env.CAPYKV_REST_TOKEN!,
  }),
  limiter: Ratelimit.slidingWindow(10, '10 s'),
})

export async function POST(request: Request) {
  const { success } = await ratelimit.limit(userIdFrom(request))
  if (!success) return new Response('Too many requests', { status: 429 })
  // ...
}

03

単体で使う

K/V はデータベースに付け足された機能ではなく、それ自体で完結した機能です。ストアを追加したうえで、隣のデータベースを一度も開かないという使い方ができます。設計するスキーマも、つなぐ接続文字列も、実行するマイグレーションもありません。レートリミッターだけがほしいアプリケーションは数多くあり、それも CapyDB の完結した使い方です。

それでもストアはプロジェクトに属します。課金、アクセス、リージョンを区切る単位がプロジェクトだからです。プロジェクトにはデータベースセルが残りますが、無視してかまいません。プロジェクトを本番以外にしておけば、使われないセルは自動的に一時停止し、何も消費しません。

04

分離

K/V ストアはセルであり、データベースが得るのと同じランタイムの原始要素です。共有サーバー内の名前空間を言い換えたものではありません。

  • -専用のプロセスを持ち、メモリ上限と CPU の取り分はカーネルが強制します。隣の利用者があなたのメモリを使い切ることはできません。
  • -ストレージも認証情報もソケットも専用です。共有インスタンスも、衝突しうる共通のキー空間もありません。
  • -到達できるのは認証済みエンドポイント経由のみです。ストア自体はインターネットにも、あなたのデータベースにも経路を持ちません。

05

互換性

いずれも標準の 2 つのプロトコルに対応しているため、移行は URL とトークンを差し替えるだけです。

  • -Upstash の REST プロトコル。パイプライン、トランザクション、base64 エンコードを含み、@upstash/redis と @upstash/ratelimit が既定の設定のまま動作します。
  • -TLS 上の RESP。ioredis、node-redis、redis-py、go-redis、redis-cli といった一般的な Redis® OSS クライアント向けで、ブロッキングコマンドと Pub/Sub にも対応します。エンドポイントは TLS サーバー名(SNI)で振り分けます。redis-py と go-redis は自動で送り、ioredis には tls.servername、redis-cli には --sni が必要です。
  • -Valkey を利用しています。Redis は Redis Ltd. の登録商標です。CapyDB は Redis Ltd. と提携しておらず、同社の推奨も受けていません。

06

容量

K/V はすべてのプランに、そのプランの容量で含まれます。K/V 単独のサブスクリプションも、コマンドごとの課金もありません。以下の数値がストアに保存できる量です。

  • -CapyDB Vibe: 32 MB
  • -CapyDB Ship: 128 MB
  • -CapyDB Business: 512 MB

07

永続性について正直に

K/V ストアは定期的なスナップショットを保持するため再起動には耐えますが、データベースではありません。バックアップも、ポイントインタイムリカバリも、レプリカもありません。ストアが満杯になれば、退避ポリシーがキーを破棄します。

高速で使い捨ての状態として扱ってください。カウンター、セッション、キャッシュ、ロックなどが向いています。失って困るものは、バックアップとポイントインタイムリカバリを備えた隣のデータベースセルに置いてください。

08

はじめかた

ダッシュボードでプロジェクトの K/V タブからストアを追加してください。数秒でプロビジョニングされ、エンドポイントとトークンが一度だけ表示されます。トークンはハッシュとしてのみ保存されるため、その場でコピーしてください。