クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

アーキテクチャスタイルの選び方

このレッスンのあとで: 必要なことに合わせて、レイヤー、サービス、イベントを選べる。

55分のレッスンコマンド6件PostgreSQL と PostgREST のラボ:ブラウザーで学ぶデータベースと REST API

アーキテクチャスタイルとは何か

アーキテクチャスタイルとは、システム全体を部品に分けて、つなぐときの基本の型です。よく使う型は、レイヤー、サービス、イベントの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返ってきたもの見せた型
データベースで数える33層の一番下
API で読む3件の注文API が間に入る
記録を順に読む2件。起きた順イベントの記録

学生が入力するセルは、このプレビューでは空白です。

このラボとソースについて: PostgreSQL と PostgREST のラボ:ブラウザーで学ぶデータベースと REST API

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。