RustとPythonでPub/Subことはじめ1

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通ってなさそうでしたが、再読み込みしたら問題なく入ってきてくれました。


初期化

1
gcloud init

するとなんかいくつか聞かれるので、それにしたがって進めます。 特に問題なく終わりました。


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

依存してるライブラリはそれぞれメンテはされてるっぽい

  1. google-apis-rs
  2. yup-oauth2

うーん公式じゃないしメンテする覚悟しても良さそうな気がしたので、forkしてきました。

  1. フォークしたgoogle-apis-rs
  2. フォークした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もできそうな気がする。

-> 次回へ続く

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy