wakuwaku

インストール

Rust ツールチェーンを用意し、適切なフィーチャーフラグで wakuwaku を追加して、各フィーチャーが接続するインフラを準備します。

Rust ツールチェーン

wakuwaku は Rust edition 2024 で書かれているため、Rust 1.85 以上が必要です。さらに依存クレートによって下限が引き上げられます。wakuwaku 1.0.0-rc3 でロックされているバージョンでは、有効にするフィーチャーごとに次のとおりです。

フィーチャー必要な Rust引き上げている依存
デフォルト (grpc、proof)1.88tonic 0.14
redis1.88redis 1.x
meilisearch1.89uuid (meilisearch-sdk 経由)
sqlx-pg、sqlx-mysql1.94sqlx 0.9
iggy1.95iggy 0.11

これらの依存の新しいリリースでさらに下限が上がる可能性があるため、最新の stable ツールチェーンを使ってください。

rustup update stable

gRPC のコード生成には、Protocol Buffers コンパイラ protoc が PATH 上に必要です。ビルドスクリプトは クイックスタート で紹介します。

wakuwaku を追加する

必要なフィーチャーを指定して wakuwaku を追加し、ランタイム用に tokio も追加します。

[dependencies]
wakuwaku = "1.0.0-rc3" # デフォルト: grpc, proof
tokio = { version = "1.53", features = ["full"] }

entity は sqlx-pg、sqlx-mysql、redis、meilisearch のどれかを有効にすると自動で有効になります。entity だけを有効にするのは、データソースなしでクエリやケイパビリティの型だけを使いたい場合 (たとえばインメモリストア向けのクエリを定義するクレート) に限られます。

リリース候補について

"1.0.0-rc3" という指定は、以降のリリース候補や 1.0.0 自体も受け入れます。次の候補版へ移るタイミングを自分で決めたい場合は "=1.0.0-rc3" と書いてください。

wakuwaku::deps を使う理由

あるクレートのあるバージョンの型は、別バージョンの同じアイテムとは別の型です。サービスが sqlx 0.8 に依存し、wakuwaku が sqlx 0.9 を使っていると、自分で作ったプールは wakuwaku::entity が受け取るプールとは別物になり、読み解きにくい型の不一致エラーになります。

wakuwaku は、公開 API に現れるサードパーティのクレートをすべて再エクスポートすることでこの問題を避けています。

パスフィーチャー
wakuwaku::deps::kanau常に有効
wakuwaku::deps::tonicgrpc
wakuwaku::deps::iggyiggy
wakuwaku::deps::sqlxsqlx-pg または sqlx-mysql
wakuwaku::deps::redisredis
wakuwaku::deps::meilisearch_sdkmeilisearch

これらのクレートを自分で追加する代わりに、次のパスからインポートします。

use wakuwaku::deps::kanau::processor::Processor;
use wakuwaku::deps::sqlx::PgPool;
use wakuwaku::deps::tonic::{Request, Response, Status};

直接の依存が必要になる場合

次の 2 つの場合は、それでも直接の依存が必要です。どちらの場合も wakuwaku が使うバージョンと互換性のあるバージョン指定にしてください。そうすれば Cargo がクレートを 1 つにまとめ、型も同一になります。

クレートをパスで参照する生成コードと derive マクロ。 tonic-prost-build が生成するコードは tonic、tonic_prost、prost を参照し、kanau の JSON 用 derive は ::kanau::... というパスに展開されます。これらは wakuwaku::deps 経由のパスでは解決できません。

[dependencies]
# tonic-prost-build が生成するコードが必要とします (クイックスタート参照)
tonic = "0.14"
tonic-prost = "0.14"
prost = "0.14"

# イベントやキャッシュの本体に付ける #[derive(JsonMessageSer, JsonMessageDe)] が必要とします
kanau = { version = "0.6", features = ["serde_json"] }
serde = { version = "1", features = ["derive"] }

[build-dependencies]
tonic-prost-build = "0.14"

メッセージ本体のシリアライズについては イベントの定義 で説明しています。

再エクスポートされたクレートの追加フィーチャー。 wakuwaku は sqlx と redis をデフォルトフィーチャーなしでビルドします。sqlx に入るのは Tokio ランタイムとデータベースドライバーだけ、redis に入るのは Tokio 用の接続とスクリプトのサポートだけで、どちらにも TLS は含まれません。フィーチャーを追加したい場合は、同じメジャーバージョンでそのクレートを追加し、必要なフィーチャーだけを指定します。Cargo はフィーチャーを、wakuwaku も使っている 1 つのクレートに統合します。

[dependencies]
wakuwaku = { version = "1.0.0-rc3", features = ["sqlx-pg", "redis"] }
sqlx = { version = "0.9", default-features = false, features = ["tls-rustls", "migrate", "uuid"] }
redis = { version = "1", default-features = false, features = ["tokio-rustls-comp"] }

このとき sqlx::PgPool と wakuwaku::deps::sqlx::PgPool は同じ型になります。

Tokio ランタイム

wakuwaku は Tokio 上で動きます。cron ジョブ、イベントコンシューマー、gRPC サーバーは Tokio のタスクとして起動され、Tokio ランタイムの外で cron ジョブを開始すると panic します。wakuwaku 自身が Tokio の full フィーチャーを有効にしているので、features = ["full"] で tokio を追加しても余計なコストはかかりません。#[tokio::main]、#[tokio::test]、tokio::signal を使うために直接の依存が必要です。

インフラ

各フィーチャーは、自分で運用するサーバーに接続します。

フィーチャー必要なもの補足
grpcなしサービス自身がサーバーです。
iggyApache Iggy サーバーサンプルは iggy://iggy:iggy@localhost:8090 で接続します。コンシューマーを起動する前に、ストリームと各メイントピックを作成してください。トピック名はパーティションキーのスーパーパーティション名です。コンシューマーが作成するのはリトライ用トピック retry_<topic> だけです。
sqlx-pgPostgreSQLマイグレーションは、プールをラップする前にそのプールで実行します。
sqlx-mysqlMySQL (InnoDB)PostgreSQL と同様です。
redisRedisマルチプレックス接続で接続します。クローンは 1 本のソケットを共有します。
meilisearchMeilisearchインデックスは、別の場所にあるデータの射影です。

詳しいセットアップは各フィーチャーのページで説明しています: イベント、sqlx、Redis、Meilisearch。

セットアップを確認する

一度ビルドして、依存を取得・コンパイルします。

cargo build

一部の検査は、コードを完全にコンパイルしたときにだけ実行されます。たとえば間隔が 0 の cron ジョブは cargo check を通過し、cargo build で失敗します。CI では cargo build か cargo test を使ってください。

目次