コンテンツにスキップ

7. 通信方式を選ぶ: QUIC ブローカー

第 6 章では、別々に起動した juiz どうしを HTTP ブローカーでつなぎました。 juiz では、juiz どうしや外のプログラムとやりとりする通信の部分を ブローカー と呼び、設定ファイルで選べます。 この章では、HTTP の代わりに QUIC ブローカーを使って、第 6 章と同じように talker と listener をつなぎます。

QUIC は、UDP の上で動く通信方式で、暗号化された 1 つの接続の中で複数のやりとりを並行して行えます。 juiz の QUIC ブローカーは、QUIC の上でデータを MessagePack で送ります。ブローカーの種類名は qmp(QUIC + MessagePack)です。

HTTP ブローカーと比べると、次のような違いがあります。

HTTP ブローカー QUIC ブローカー
種類名(ID の先頭) http qmp
ポート 8000(TCP、使用中なら 8001, 8002, …) 設定ファイルで指定(UDP、使用中なら起動に失敗)
データの形式 JSON MessagePack
外のツールからの利用 Swagger UI や curl から呼べる juiz どうしで使う
juiz への組み込み 組み込み済み 組み込み済み(0.0.18 以降)

QUIC ブローカーは juiz コマンドに組み込まれているので、設定ファイルの brokers に書くだけで実体化できます。 サンプル集のルートに、次の 2 つのファイルを作ります。どの言語でも同じ内容です。

listener 用の listener_qmp.conf は、QUIC ブローカーを UDP の 5000 番で待ち受けさせます。

name: listener_qmp
brokers:
- type_name: qmp
name: qmp0
port: 5000

talker 用の talker_qmp.conf は、名前とポート番号だけが違います。HTTP ブローカーと違って、QUIC ブローカーはポートが使用中でも自動ではずれず、juiz の起動に失敗します。juiz ごとに別の番号を書いてください。

name: talker_qmp
brokers:
- type_name: qmp
name: qmp0
port: 5001

brokers の name は必須ですが、何でもかまいません。

ターミナル 3 で打つコマンドの側も、qmp:// の ID にはそのまま問い合わせられます。設定ファイルは要りません。

第 6 章と同じく、ターミナルを 3 つ使います。どれも、サンプル集のルートで開いておいてください(Python の場合は、どのターミナルでも venv を有効にしておきます)。

ターミナル 1 で、listener を起動します。第 6 章のコマンドに -f listener_qmp.conf を加えただけです。

ターミナルウィンドウ
juiz -f listener_qmp.conf --process ./target/debug/liblistener.so -1 -d

ターミナル 3 から、-s に qmp:// で始まるアドレスを指定して問い合わせます。

ターミナルウィンドウ
juiz -s qmp://127.0.0.1:5000 process list
# => ["qmp://127.0.0.1:5000/process/listener0::listener"]

ID の先頭が qmp:// になりました。この問い合わせは、QUIC ブローカーを通っています。

-d を付けて起動した juiz は、HTTP ブローカーも必ず起動します。そのため、この juiz には HTTP の 8000 番からも、これまでどおり問い合わせられます。

ターミナルウィンドウ
juiz process list
# => ["http://127.0.0.1:8000/process/listener0::listener"]

同じ listener に、http:// と qmp:// の 2 つの ID があります。1 つの juiz が 2 つのブローカーを持っていて、ID の先頭がどちらを通るかを表しています。

ターミナル 2 で、talker を起動します。こちらも、第 6 章のコマンドに -f talker_qmp.conf を加えただけです。

ターミナルウィンドウ
juiz -f talker_qmp.conf --process ./target/debug/libtalker.so -1 -r 1.0 -d

ターミナル 2 に、talker の表示が 1 秒ごとに出ます。ターミナル 3 から、5001 番に問い合わせて ID を確かめます。

ターミナルウィンドウ
juiz -s qmp://127.0.0.1:5001 process list
# => ["qmp://127.0.0.1:5001/process/talker0::talker"]

ターミナル 3 で、talker の出力を listener の引数 arg1 につなぎます。第 6 章のコマンドの ID を、qmp:// の ID に変えるだけです。

ターミナルウィンドウ
juiz connection create -t push \
"qmp://127.0.0.1:5001/process/talker0::talker" \
arg1 \
"qmp://127.0.0.1:5000/process/listener0::listener"

ターミナル 1 の listener が表示を始めます。つながりを持っている talker の側に問い合わせると、つなぐ先が qmp:// になっていることがわかります。

ターミナルウィンドウ
juiz -s qmp://127.0.0.1:5001 connection list
# => [ConnectionID(src=ProcessIdentifier(core://core/process/talker0::talker, arg=arg1, dst=ProcessIdentifier(qmp://127.0.0.1:5000/process/listener0::listener)]

talker の juiz は、つなぐ先の ID が qmp:// で始まるのを見て、listener に QUIC で値を届けています。

call も同じです。qmp:// の ID を指定すると、QUIC ブローカーを通って呼び出します。

ターミナルウィンドウ
juiz process call "qmp://127.0.0.1:5001/process/talker0::talker" '{}' -p
# => CapsulePtr((value:Value("Hello World"), option: []))
  • 第 6 章の talker_ec.conf に、talker_qmp.conf と同じ brokers を書き足して起動してみましょう。juiz -s qmp://127.0.0.1:5001 ec list で EC の ID を調べ、juiz -s qmp://127.0.0.1:5001 ec start <ID> で開始できます。
  • つなぐ先だけを http://127.0.0.1:8000/... の ID に変えてつないでみましょう。listener は 1 つの juiz の中で両方のブローカーを持っているので、どちらの ID でも値が届きます。
  • だれも待ち受けていないポートに juiz -s qmp://127.0.0.1:5002 process list と問い合わせてみましょう。QUIC は UDP なのでつながらないことがすぐにはわからず、しばらく待ってから connecting to qmp broker '127.0.0.1:5002' (127.0.0.1:5002) timed out というエラーになります。
  • juiz の通信の部分はブローカーで、HTTP ブローカーのほかに QUIC ブローカー(qmp)を選べます。どちらも juiz コマンドに組み込まれていて、設定ファイルの brokers で実体化します。
  • ID の先頭(http:// や qmp://)が、どのブローカーを通るかを表します。juiz connection create や juiz process call は、ID を変えるだけで QUIC を使います。
  • 1 つの juiz は複数のブローカーを同時に持てます。同じ Process に、ブローカーごとの ID があります。
  • Process のコードは、どのブローカーで呼ばれるのかを知りません。だから通信方式を変えても、Process はそのまま使えます。

これでチュートリアルは終わりです。やりたいことが決まっているときは、ガイド から逆引きで探してみてください。