RustとPythonでPub/Subを行います。
Rust側サーバーがパブリッシャーで、Python側がサブスクライバーになります
公式のtutorialを参考にします。
事前準備
gcloudコマンドをインストールする
https://cloud.google.com/sdk/docs/install?hl=ja
を元に行います。
mac(intel)なので次のコマンドで取ってきて解凍します。
1
2
3
4
| # 任意のdir直下で
wget "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-466.0.0-darwin-x86_64.tar.gz?hl=ja"
tar -zxvf "google-cloud-cli-466.0.0-darwin-x86_64.tar.gz?hl=ja"
|
tar.gzの解凍
gcloud の初期化とか
公式に従います。
1
| ./google-cloud-sdk/install.sh
|
筆者はfishを使っていますが、Pathの追加も問題なく行なってくれそうですね。
1
2
3
4
5
6
7
|
Enter a path to an rc file to update, or leave blank to use
[/Users/yuunag1/.config/fish/config.fish]:
Backing up [/Users/yuunag1/.config/fish/config.fish] to [/Users/yuunag1/.config/fish/config.fish.backup].
[/Users/yuunag1/.config/fish/config.fish] has been updated.
==> Start a new shell for the changes to take effect.
|
backupも撮ってくれるなんてなんて親切なんでしょう笑
1
2
3
4
5
6
7
8
9
| ❰yuunag1❙~/development❱✔≻ gcloud
fish: Unknown command: gcloud
❰yuunag1❙~/development❱✘≻ exec $SHELL
Darwin uehararyoujis-MacBook-Pro.local 23.3.0 x86_64
9:07 up 20 days, 6:48, 9 users, load averages: 6.57 8.39 6.36
❰yuunag1❙~/development❱✔≻ gcloud -h
Usage: gcloud [optional flags] <group | command>
group may be access-approval | access-context-manager |
active-directory | ai | ai-platform | alloydb |
|
一瞬Path通ってなさそうでしたが、再読み込みしたら問題なく入ってきてくれました。
初期化
するとなんかいくつか聞かれるので、それにしたがって進めます。
特に問題なく終わりました。
Pub/Sub API を有効にします。
1
| gcloud services enable pubsub.googleapis.com
|
Google アカウントのローカル認証情報を作成します。
1
| gcloud auth application-default login
|
1
2
3
4
5
| Credentials saved to file: [/Users/<user>/.config/gcloud/application_default_credentials.json]
These credentials will be used by any library that requests Application Default Credentials (ADC).
Quota project "gcp-may-sandbox" was added to ADC which can be used by Google client libraries for billing and quota. Note that some services may still bill the project owning the resource.
|
home直下の.configの中にローカル認証情報が作成されるようです
Google アカウントにロールを付与します。
1
2
3
| gcloud projects add-iam-policy-binding $PROJECT_ID --member="user:$EMAIL_ADDRESS" --role="roles/pubsub.publisher"
gcloud projects add-iam-policy-binding $PROJECT_ID --member="user:$EMAIL_ADDRESS" --role="roles/pubsub.subscriber"
|
$PROJECT_ID と、$EMAIL_ADDRESSはお使いのものに置き換えてください
Pub/Sub プロジェクトを設定する
Pub/Sub トピックの作成
1
| gcloud pubsub topics create <トピック名>
|
Pub/Sub サブスクリプションの作成
今回は一つだけsubscriptionが欲しいので一つだけ作成します。
種類は、ストリーミング Pull サブスクリプションです。
1
| gcloud pubsub subscriptions create sub_python --topic=$TOPIC
|
Rustとpythonで非同期なシステムを構築する。
ここでもう少し背景に突っ込んどきましょう。
さて、チュートリアルでは1対多のシステムを構築しています。
しかし、今回のシステムではそうではないです。
ではなぜPub/Subが必要なのでしょうか。
それは、Python側で行われる重い操作が完了する前にRust側からクライエントにResponseを返したいからです。
こういった目的のためには結構刺さるんじゃないかなと思っています。
参考のためにこれも置いときます
ちょっとこわいGoogle Cloud Pub/Sub によるFaaS アーキテクチャ
Rust側サーバーをパブリッシャーにする
ちなみに公式のライブラリはなさそうなんですよねえ。
しかし、めっちゃ古いながらも方法はあるっぽい感じでした。
https://github.com/x1-/rust-pubsub-example
依存してるライブラリはそれぞれメンテはされてるっぽい
- google-apis-rs
- yup-oauth2
うーん公式じゃないしメンテする覚悟しても良さそうな気がしたので、forkしてきました。
- フォークしたgoogle-apis-rs
- フォークしたyup-oauth2
では書いていきましょう
ライブラリをインストールする。
https://zenn.dev/booink/scraps/6d2a72a89448c9
cargo.tomlでGitHubリポジトリを参照するにはこうしたらいいらしい。
gitにcloneするときのurl指定してversionに。。。。ってtag切られてないじゃん。。
commit 指定でできるのかなあ。
いやアスタリスクで良さそう。
とりあえずサンプルを動かしたい
https://github.com/x1-/rust-pubsub-example
をlocalに持ってきた頃まあそうよねえって感じですが依存関係が荒れすぎて色々動かなくなりました。
とりあえずpackageを最新にしましょう。
予想通りですが、色々ぶっ壊れてますね。
https://crates.io/
でdependancyを検索してとりあえず最新のやつをとってきます。
1
2
3
4
5
6
7
|
[dependencies]
base64 = "*"
google-pubsub1 = "5.0.3+20230119"
hyper = "1.2.0"
hyper-rustls = "0.26.0"
yup-oauth2 = "8.3.2"
|
公式のrepoのREADMEにversion指定あるならそれを使おうと思ったのですがないっぽかったです。
色々ゴニョゴニョしましたが動かなかったので方針を変更。
https://github.com/u-na-gi/async-google-apis/blob/master/example_crates/gcs_example/src/main.rs
色々してたら良さそうなの発見。
原理的にはこれと似たような感じでclientを生成してpub/subもできそうな気がする。
-> 次回へ続く