wakuwaku

イントロダクション

wakuwaku は、gRPC サーバー・イベントハンドラー・cron ジョブをコンパイル時のレジストリひとつから組み立てる、Rust 向けの証明駆動マイクロサービスフレームワークです。

wakuwaku は Rust 向けの証明駆動 (proof-driven) マイクロサービスフレームワークです。Java における Spring のように、バックエンドサービスで日常的に必要になるものをひとつのフレームワークでまかない、しかもその検査の大半を Rust のコンパイラに任せることを目指しています。

wakuwaku のサービスは、ただの値を組み合わせて作ります。共有する依存 (コネクションプール、クライアント、設定の構造体など) を ServiceBuilder に登録します。gRPC サーバー、イベントハンドラー、cron ジョブといった各コンポーネントは、自分が組み立てられる元となる依存をひとつ宣言し、ビルダーがそれを使ってコンポーネントを生成します。依存の解決は実行時のコンテナではなくトレイトソルバーが行うため、登録していない依存を要求するコンポーネントはコンパイルが通りません。

実際の処理を担うクレートはフィーチャーフラグの裏で再エクスポートされているので、サービスが依存するのは wakuwaku ひとつだけです。

wakuwaku のアーキテクチャ: 1 つの ServiceBuilder が cron・gRPC・Iggy の各レジスタセンターに依存を供給し、その下にクレートの階層がある実行時の組み立てServiceBuilder共有する依存DB プール (sqlx)Redis 接続Arc<IggyClient>設定 などCronRegisterCenter.cron_job()CronRuntime.start()ジョブごとの Tokio タスクGrpcServiceRegisterCenter.grpc_service()tonic Router.into_router_fn()tonic で提供IggyConsumerRegisterCenter.iggy_consumer()ConsumerRuntime.start(client, config)コンシューマタスクDep を clone → create_service、または compose_*コンポーネントが使うwakuwaku::entitysqlx · Redis · Meilisearchwakuwaku::iggyPublisher でイベント発行wakuwaku::proofProven<T, P> で入力を検証クレートの階層あなたのサービス — 依存するのは wakuwaku だけwakuwakuServiceBuilder · cron_job · grpc_service · iggy_consumer · compose_* · depswakuwaku-entity→ wakuwaku::entity権限を型で表すデータアクセスwakuwaku-iggy→ wakuwaku::iggyApache Iggy 上の型付きイベントwakuwaku-proof→ wakuwaku::proof証明を伴う検証kanau · Processorサードパーティ: tokio · tonic · sqlx · redis · meilisearch-sdk · iggy
すべてのコンポーネントは 1 つの ServiceBuilder に登録された依存から作られます。1 つの依存を clone するか、ビルダー全体を借用する compose_* クロージャを使います。サブクレートは wakuwaku から再エクスポートされます。

証明駆動プログラミング

wakuwaku は正しさを 2 つに分けて扱います。

  • マクロな正しさ: コンポーネント同士がどう組み合わさるか。トレイトで証明し、コンパイラが検査します。依存が登録されていないコンポーネント、読み取り専用のデータベースハンドルを通した書き込みクエリ、間隔が 0 の cron ジョブは、いずれもビルドできません。
  • ミクロな正しさ: ひとつのコンポーネントが何をするか。ユニットテストで証明します。どのコンポーネントも kanau の Processor (またはその上に作られたトレイト) を実装したただの値なので、テストではサービスを起動せずにそれを生成して直接呼び出せます。

その結果、配線のミスはほとんどビルド時に見つかり、残るテストは小さく高速に保てます。考え方の詳細は 証明駆動プログラミング で説明しています。

クレート構成

クレートインポート方法提供するもの
wakuwakuwakuwakuServiceBuilder、gRPC の登録、cron ジョブ、Iggy コンシューマーの登録
wakuwaku-entitywakuwaku::entitysqlx・Redis・Meilisearch 上の、ケイパビリティで型付けされたクエリとトランザクション
wakuwaku-iggywakuwaku::iggyApache Iggy 上の型付きイベント (キーごとの順序保証と代数的なバッチ処理)
wakuwaku-proofwakuwaku::proof証明を伴うバリデーション

これらの API に現れるサードパーティのクレート (kanau、tonic、iggy、sqlx、redis、meilisearch_sdk) は wakuwaku::deps の下に再エクスポートされています。ここからインポートすれば、バージョンが常に wakuwaku のビルドに使われたものと一致します。

フィーチャーフラグ

フィーチャーデフォルト有効になるもの
grpc有効gRPC サーバーの登録、deps::tonic
proof有効wakuwaku::proof
iggy無効wakuwaku::iggy、Iggy コンシューマーの登録、deps::iggy
entity無効データソースなしの wakuwaku::entity
sqlx-pg無効sqlx 経由の PostgreSQL を含む entity、deps::sqlx
sqlx-mysql無効sqlx 経由の MySQL を含む entity、deps::sqlx
redis無効Redis を含む entity、deps::redis
meilisearch無効Meilisearch を含む entity、deps::meilisearch_sdk

cron ジョブと ServiceBuilder 自体は常に利用できます。よく使う組み合わせは インストール で紹介しています。

現在作れるもの

  • tonic が生成したサーバーから組み立てる gRPC サービス: gRPC サービス
  • 定数で宣言した間隔でプロセス内で動く cron ジョブ: cron ジョブ
  • キーごとの順序保証・バッチ処理・リトライを備えた、Apache Iggy 上の イベント駆動サービス: イベント
  • ハンドルの型によって触れてよい範囲が決まる、PostgreSQL・MySQL・Redis・Meilisearch への データアクセス: データアクセス
  • 結果が型になるため、未検証の入力が検証済みの入力を要求するコードに届かない バリデーション: バリデーション

バージョンの状況

現在のリリースはリリース候補の 1.0.0-rc3 です。API は 1.0.0 で出荷される予定のものですが、1.0.0 は実際のプロジェクトでの E2E テストに合格してからリリースされるため、細部はまだ変わる可能性があります。その先の計画は ロードマップ を参照してください。

各アイテムの API リファレンスは docs.rs にあります。このドキュメントでは、それを使って何をどう作るかを説明します。

次のステップ

目次