アーキテクチャスタイルとは何か
アーキテクチャスタイルとは、システム全体を部品に分けて、つなぐときの基本の型です。よく使う型は、レイヤー、サービス、イベントの3つです。
型の選び方で、変更のしやすさや、動かす手間が変わります。このレッスンでは、必要なことから、型を選べるようになります。
このレッスンのゴール
メモ
必要なことに合わせて、レイヤー、サービス、イベントを選べる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| アーキテクチャ | システム全体の、部品への分け方とつなぎ方 | |
| レイヤー | 上から下へ重ねた層。上の層は、すぐ下の層だけを使う | 画面、ルール、データ |
| サービス | 単独で動き、自分のデータを持つ小さなシステム | |
| イベント | 「何かが起きた」という知らせ | 注文が入った |
| トレードオフ | 一方をよくすると、他方が悪くなる関係 |
学生が入力するセルは、このプレビューでは空白です。
レイヤーは層を重ねて分ける
レイヤーは、仕事を層に分けて重ねます。画面の層、ルールの層、データの層です。上の層は、すぐ下の層だけを使います。
決まりが単純で、作りやすいのが利点です。小さなチームが、1つのシステムを作るときに向きます。
サービスは小さなシステムに分ける
サービスは、仕事ごとに別々に動くシステムです。各サービスは自分のデータを持ち、ネットワーク越しに呼び合います。
チームが別々に動け、重い所だけ増やせます。代わりに、動かす物が増え、呼び出しの失敗も考える必要があります。
イベントは起きたことを知らせる
イベントを使う型では、部品は「注文が入った」という事実を記録に書きます。知りたい部品が、それを読んで、自分の仕事をします。
書く側は、誰が読むかを知りません。新しい読み手を足しやすい一方、全体の流れは追いにくくなります。
例: 必要なことと選ぶ型
| 必要なこと | 向く型 | 理由 |
|---|---|---|
| チームは1つ。作る物は1つ | レイヤー | 決まりが単純で、すぐ作れる |
| チームが4つに分かれる | サービス | 各チームが別々に作って動かせる |
| 検索だけが、とても混む | サービス | 検索だけを増やせる |
| 1つの出来事に、多くの部品が反応する | イベント | 読み手を足しても、書く側を直さない |
学生が入力するセルは、このプレビューでは空白です。
ラボ自身が、層とイベントの見本
ラボを使う側から見ると、アプリは API を通して、データベースを使います。API が間に入る形は、レイヤーの見本です。
最後の3つの Run は、起きたことを記録に足し、順に読みます。イベントの型の、いちばん小さな見本です。
注文の表と記録の表を作る
PGPASSWORD=shop psql -h db -U shop -c "drop table if exists orders, order_events; create table orders (id serial primary key, item text not null, qty int not null); create table order_events (id serial primary key, kind text not null, order_id int not null); insert into orders (item, qty) values ('Notebook', 2), ('Pen', 5), ('Eraser', 1); notify pgrst, 'reload schema'"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
データベースで件数を数える
PGPASSWORD=shop psql -h db -U shop -At -c "select count(*) from orders"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
API で同じ注文を読む
curl -s -w "\n" "http://api:3000/orders?select=id&order=id"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
「注文が入った」を記録する
curl -s -o /dev/null -w "%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"kind":"ordered","order_id":1}' "http://api:3000/order_events"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
「箱に詰めた」を記録する
curl -s -o /dev/null -w "%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"kind":"packed","order_id":1}' "http://api:3000/order_events"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
1番の注文の記録を、順に読む
curl -s -w "\n" "http://api:3000/order_events?order_id=eq.1&order=id"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
新しい型ほど、よい型だと考えがちです。サービスやイベントは、動かす物と追う手間が増えます。小さなシステムなら、レイヤーで十分なことが多くあります。
例: Run が見せたもの
| Run | 返ってきたもの | 見せた型 |
|---|---|---|
| データベースで数える | 3 | 3層の一番下 |
| API で読む | 3件の注文 | API が間に入る |
| 記録を順に読む | 2件。起きた順 | イベントの記録 |
学生が入力するセルは、このプレビューでは空白です。