7. 通信方式を選ぶ: QUIC ブローカー
第 6 章では、別々に起動した juiz どうしを HTTP ブローカーでつなぎました。 juiz では、juiz どうしや外のプログラムとやりとりする通信の部分を ブローカー と呼び、設定ファイルで選べます。 この章では、HTTP の代わりに QUIC ブローカーを使って、第 6 章と同じように talker と listener をつなぎます。
QUIC ブローカーとは
Section titled “QUIC ブローカーとは”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 以降) |
設定ファイルを用意する
Section titled “設定ファイルを用意する”QUIC ブローカーは juiz コマンドに組み込まれているので、設定ファイルの brokers に書くだけで実体化できます。
サンプル集のルートに、次の 2 つのファイルを作ります。どの言語でも同じ内容です。
listener 用の listener_qmp.conf は、QUIC ブローカーを UDP の 5000 番で待ち受けさせます。
name: listener_qmpbrokers: - type_name: qmp name: qmp0 port: 5000talker 用の talker_qmp.conf は、名前とポート番号だけが違います。HTTP ブローカーと違って、QUIC ブローカーはポートが使用中でも自動ではずれず、juiz の起動に失敗します。juiz ごとに別の番号を書いてください。
name: talker_qmpbrokers: - type_name: qmp name: qmp0 port: 5001brokers の name は必須ですが、何でもかまいません。
ターミナル 3 で打つコマンドの側も、qmp:// の ID にはそのまま問い合わせられます。設定ファイルは要りません。
listener を起動する
Section titled “listener を起動する”第 6 章と同じく、ターミナルを 3 つ使います。どれも、サンプル集のルートで開いておいてください(Python の場合は、どのターミナルでも venv を有効にしておきます)。
ターミナル 1 で、listener を起動します。第 6 章のコマンドに -f listener_qmp.conf を加えただけです。
juiz -f listener_qmp.conf --process ./target/debug/liblistener.so -1 -djuiz -f listener_qmp.conf --process ./process/listener_python.py -l python -1 -djuiz -f listener_qmp.conf --process ./build/plugins/liblistener_cpp.so -l cpp -1 -dターミナル 3 から、-s に qmp:// で始まるアドレスを指定して問い合わせます。
juiz -s qmp://127.0.0.1:5000 process list# => ["qmp://127.0.0.1:5000/process/listener0::listener"]juiz -s qmp://127.0.0.1:5000 process list# => ["qmp://127.0.0.1:5000/process/listener_python0::listener_python"]juiz -s qmp://127.0.0.1:5000 process list# => ["qmp://127.0.0.1:5000/process/listener_cpp0::listener_cpp"]ID の先頭が qmp:// になりました。この問い合わせは、QUIC ブローカーを通っています。
-d を付けて起動した juiz は、HTTP ブローカーも必ず起動します。そのため、この juiz には HTTP の 8000 番からも、これまでどおり問い合わせられます。
juiz process list# => ["http://127.0.0.1:8000/process/listener0::listener"]juiz process list# => ["http://127.0.0.1:8000/process/listener_python0::listener_python"]juiz process list# => ["http://127.0.0.1:8000/process/listener_cpp0::listener_cpp"]同じ listener に、http:// と qmp:// の 2 つの ID があります。1 つの juiz が 2 つのブローカーを持っていて、ID の先頭がどちらを通るかを表しています。
talker を起動する
Section titled “talker を起動する”ターミナル 2 で、talker を起動します。こちらも、第 6 章のコマンドに -f talker_qmp.conf を加えただけです。
juiz -f talker_qmp.conf --process ./target/debug/libtalker.so -1 -r 1.0 -djuiz -f talker_qmp.conf --process ./process/talker_python.py -l python -1 -r 1.0 -djuiz -f talker_qmp.conf --process ./build/plugins/libtalker_cpp.so -l cpp -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"]juiz -s qmp://127.0.0.1:5001 process list# => ["qmp://127.0.0.1:5001/process/talker_python0::talker_python"]juiz -s qmp://127.0.0.1:5001 process list# => ["qmp://127.0.0.1:5001/process/talker_cpp0::talker_cpp"]QUIC でつなぐ
Section titled “QUIC でつなぐ”ターミナル 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"juiz connection create -t push \ "qmp://127.0.0.1:5001/process/talker_python0::talker_python" \ arg1 \ "qmp://127.0.0.1:5000/process/listener_python0::listener_python"juiz connection create -t push \ "qmp://127.0.0.1:5001/process/talker_cpp0::talker_cpp" \ arg1 \ "qmp://127.0.0.1:5000/process/listener_cpp0::listener_cpp"ターミナル 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)]juiz -s qmp://127.0.0.1:5001 connection list# => [ConnectionID(src=ProcessIdentifier(core://core/process/talker_python0::talker_python, arg=arg1, dst=ProcessIdentifier(qmp://127.0.0.1:5000/process/listener_python0::listener_python)]juiz -s qmp://127.0.0.1:5001 connection list# => [ConnectionID(src=ProcessIdentifier(core://core/process/talker_cpp0::talker_cpp, arg=arg1, dst=ProcessIdentifier(qmp://127.0.0.1:5000/process/listener_cpp0::listener_cpp)]talker の juiz は、つなぐ先の ID が qmp:// で始まるのを見て、listener に QUIC で値を届けています。
QUIC で呼び出す
Section titled “QUIC で呼び出す”call も同じです。qmp:// の ID を指定すると、QUIC ブローカーを通って呼び出します。
juiz process call "qmp://127.0.0.1:5001/process/talker0::talker" '{}' -p# => CapsulePtr((value:Value("Hello World"), option: []))juiz process call "qmp://127.0.0.1:5001/process/talker_python0::talker_python" '{}' -p# => CapsulePtr((value:Value("Hello, World!"), option: []))juiz process call "qmp://127.0.0.1:5001/process/talker_cpp0::talker_cpp" '{}' -p# => CapsulePtr((value:Value("Hello, Juiz!"), option: []))やってみよう
Section titled “やってみよう”- 第 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 はそのまま使えます。
これでチュートリアルは終わりです。やりたいことが決まっているときは、ガイド から逆引きで探してみてください。