SlideShare a Scribd company logo
1 of 222
Download to read offline
第3回MSA読書会(後半)
#MSA読書会
こんにちは!
しょぼちむ
(@syobochim)
後半のもくじ
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
4.12 参照によるアクセス
4.13 バージョニング
4.14 ユーザインターフェース
4.15 サードパーティーソフトウェアとの統合
4.16 まとめ
後半のもくじ
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
4.12 参照によるアクセス
4.13 バージョニング
4.14 ユーザインターフェース
4.15 サードパーティーソフトウェアとの統合
4.16 まとめ ⇦ここからいくよ!
4.16 まとめ
4章で言いたいこと
•いかなる代償を払ってもデータベース統合を避けます
•RESTとRPCとの間のトレードオフを理解し、RESTをリクエス
ト / レスポンス統合の優れた出発点と積極的にみなします
•オーケストレーションよりもコレオグラフィを選びます
•ポステルの法則を理解して耐性のあるリーダー(Tolerant
Readers)をつかって破壊的変更を避け、バージョンが必要
ないようにします
•ユーザインターフェースを合成レイヤと考えます
4.16 まとめ
4章で言いたいこと
•いかなる代償を払ってもデータベース統合を避けます
•RESTとRPCとの間のトレードオフを理解し、RESTをリクエス
ト / レスポンス統合の優れた出発点と積極的にみなします
•オーケストレーションよりもコレオグラフィを選びます
•ポステルの法則を理解して耐性のあるリーダー(Tolerant
Readers)をつかって破壊的変更を避け、バージョンが必要
ないようにします
•ユーザインターフェースを合成レイヤと考えます
こっちは前半部分
4.16 まとめ
4章で言いたいこと
•いかなる代償を払ってもデータベース統合を避けます
•RESTとRPCとの間のトレードオフを理解し、RESTをリクエス
ト / レスポンス統合の優れた出発点と積極的にみなします
•オーケストレーションよりもコレオグラフィを選びます
•ポステルの法則を理解して耐性のあるリーダー(Tolerant
Readers)をつかって破壊的変更を避け、バージョンが必要
ないようにします
•ユーザインターフェースを合成レイヤと考えます
このふたつについてまず説明していきます!
4.16 まとめ
4章で言いたいこと
•いかなる代償を払ってもデータベース統合を避けます
•RESTとRPCとの間のトレードオフを理解し、RESTをリクエス
ト / レスポンス統合の優れた出発点と積極的にみなします
•オーケストレーションよりもコレオグラフィを選びます
•ポステルの法則を理解して耐性のあるリーダー(Tolerant
Readers)をつかって破壊的変更を避け、バージョンが必要
ないようにします
•ユーザインターフェースを合成レイヤと考えます
4.13 バージョニング
4.14 ユーザインターフェース
後半のもくじ
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
4.12 参照によるアクセス
4.13 バージョニング
4.14 ユーザインターフェース
4.15 サードパーティーソフトウェアとの統合
4.16 まとめ
このあたりは最後に時間があれば
4.16 まとめ
4章で言いたいこと
•いかなる代償を払ってもデータベース統合を避けます
•RESTとRPCとの間のトレードオフを理解し、RESTをリクエス
ト / レスポンス統合の優れた出発点と積極的にみなします
•オーケストレーションよりもコレオグラフィを選びます
•ポステルの法則を理解して耐性のあるリーダー(Tolerant
Readers)をつかって破壊的変更を避け、バージョンが必要
ないようにします
•ユーザインターフェースを合成レイヤと考えます
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
について書いてあるのが
後半のもくじ
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
4.12 参照によるアクセス
4.13 バージョニング
4.14 ユーザインターフェース
4.15 サードパーティーソフトウェアとの統合
4.16 まとめ
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13 バージョニング
P73
マイクロサービスに関して話すたびに
バージョニングをどのように行うかを
訊かれました。
人々は「いつかはサービスのインターフェースを
変更しなければならない」という当然の心配をし
変更の管理方法を理解したいと思っている。
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13 バージョニング
この問題を分割し、対策を説明していきます。
•コンシューマ(クライアント)の心持ち
•サービスの心持ち
•バージョンの意味付け
•サービスのバージョンアップ方法
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
「サービス側の変更に影響されないように
気をつけましょう」
というコンシューマ側の心持ちのはなし
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
「サービス側の変更に影響されないように
気をつけましょう」
というコンシューマ側の心持ちのはなし
影響されない=バージョンが必要ない
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
最初から破壊的な変更を避けることが、
破壊的変更の影響を減らす最善の方法です。
クライアントに優れた振る舞いを推奨し、
そもそもサービスと密結合にならないように
しましょう。
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
たとえば、メールサービスが➡のレスポンスを
おくってくるとき
<customer>

<firstName>Sam</firstName>

<lastName>Newman</lastName>

<email>sam@magpiebrain.com</email>

<telephoneNumber>555-1234-5678</telephoneNumber>

</customer>
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
telephoneNumberをつかわないコンシューマーが、こんな
クラスを作っていて、リクエストに来ている項目をそのま
まバインディングするソースを書いちゃうと。。。
public class Customer {

public String firstName;

public String lastName;

public String email;

public String telephoneNumber;

}
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
メールサービス「メール送信にtelephoneNumberって使っ
てないよね?消します。」
<customer>

<firstName>Sam</firstName>

<lastName>Newman</lastName>

<email>sam@magpiebrain.com</email>

<telephoneNumber>555-1234-5678</telephoneNumber>

</customer>
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
メールサービス「メール送信にtelephoneNumberって使っ
てないよね?消します。」
「えっ」
<customer>

<firstName>Sam</firstName>

<lastName>Newman</lastName>

<email>sam@magpiebrain.com</email>

<telephoneNumber>555-1234-5678</telephoneNumber>

</customer>
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
メールサービス「メール送信にtelephoneNumberって使って
ないよね?消します。」
「えっ」➡ クラス修正が必要
(telephoneNumberを消すことがコンシューマの破壊的変更
になっちゃう。)
public class Customer {

public String firstName;

public String lastName;

public String email;

public String telephoneNumber;

}
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
たとえばfirstNameとlastNameの階層構造を明確に推測し
ている場合
『customer > firstName』『customer > lastName』
『customer > email』
public class Customer {

public String firstName;

public String lastName;

public String email;

}
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
メールサービス「項目増えてきたから階層構造にしてみた
わー。」
<customer>

<naming>

<firstName>Sam</firstName>

<lastName>Newman</lastName>

<nickName>Magpiebrain</nickName>
<fullName>Magpiebrain</fullName>
</naming>
<email>sam@magpiebrain.com</email>

</customer>
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
メールサービス「項目増えてきたから階層構造にしてみた
わー。」
「えっ」
<customer>

<naming>

<firstName>Sam</firstName>

<lastName>Newman</lastName>

<nickName>Magpiebrain</nickName>
<fullName>Magpiebrain</fullName>
</naming>
<email>sam@magpiebrain.com</email>

</customer>
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
メールサービス「項目増えてきたから階層構造にしてみた
わー。」
「えっ」 ➡ クラス修正が必要
(項目名は変わってないのに。。。)
public class Customer {

public Naming naming;

public String email;

}
public class Naming {

public String firstName;

public String lastName;

…
}
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
必要な項目のみ定義する、や、フィールドの場所(構造)
を曖昧にしておく、など、サービスとコンシューマの結合
を小さくすれば、リーダー(Reader)が関心のない変更を無
視することができる!!!
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
必要な項目のみ定義する、や、フィールドの場所(構造)
を曖昧にしておく、など、サービスとコンシューマの結合
を小さくすれば、リーダー(Reader)が関心のない変更を無
視することができる!!!
耐性のあるリーダー(by Martin Fowler)
•http://martinfowler.com/bliki/TolerantReader.html
•https://uramoto.wordpress.com/2015/09/21/マイクロサー
ビスのデザインパターン/
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
必要な項目のみ定義する、や、フィールドの場所(構造)
を曖昧にしておく、など、サービスとコンシューマの結合
を小さくすれば、リーダー(Reader)が関心のない変更を無
視することができる!!!
XPath
•https://msdn.microsoft.com/ja-jp/library/
ms256086(v=vs.120).aspx
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
ポステルの法則
https://ja.wikipedia.org/wiki/ジョン・ポステル
「送信するものに関しては厳密に、受信するものに関して
は寛大に」
「人にやさしく、自分にきびしく」
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.1 最大限の見送り
「サービス側の変更に影響されないように
気をつけましょう」
というコンシューマ側の心持ちのはなし
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.2 破壊的変更の早期の把握
「コンシューマへの変更の影響を出す前に
検知しましょう」
というサービス側の心持ちのはなし
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.2 破壊的変更の早期の把握
「コンシューマへの変更の影響を出す前に
検知しましょう」
というサービス側の心持ちのはなし
影響を出さない=バージョンが必要ない
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.2 破壊的変更の早期の把握
コンシューマ駆動契約
で
問題を早期に検出する
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.2 破壊的変更の早期の把握
コンシューマ駆動契約の詳しいはなしは
7章を発表する人にお任せしますが。。。
こんポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.2 破壊的変更の早期の把握
コンシューマー(ヘルプデスク)が期待する動作を
顧客サービスがテストとして書いて動作を保証する。
そのテストが、コンシューマーとの契約になる。
ヘルプデスクの
コンシューマ駆動契約の
テスト範囲
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.2 破壊的変更の早期の把握
サービスやライブラリをテストすることで、
この動きはまずいぞ!
(契約違反だぞ!すなわち破壊的変更!!)
というのを検知することができる。
※テストを書いているので、
破壊的変更の特定も簡単!!
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.2 破壊的変更の早期の把握
破壊的変更が入ったら、
•顧客サービスが破壊的変更を回避する
•破壊的変更を受け入れてコンシューマの担当者たちと相
談する
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.2 破壊的変更の早期の把握
「コンシューマへの変更の影響を出す前に
検知しましょう」
というサービス側の心持ちのはなし
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
このあたりが、
「バージョンが必要ないようにします」
という話でした。
それでもコンシューマが
サービスの破壊的なバージョニングに
対応しなきゃいけないことが
絶対にある
じゃあ、どう運用していけば
いいんだろう?
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.3 セマンティックバージョニングの利用
コンシューマとサービス間で
「変更の種類をわかりやすいようにしましょう」
というルールを作るはなし
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.3 セマンティックバージョニングの利用
変更の種類をわかりやすくする手段のひとつが
セマンティックバージョニング
http://semver.org/lang/ja/
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.3 セマンティックバージョニングの利用
MAJOR.MINOR.PATCH
•MAJOR:後方互換性のない変更
•MINOR:後方互換性のある新機能の追加
•PATCH:既存機能にバグ修正が行われた場合
※他にも細かいルールがサイトには書いてあるよ。
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.3 セマンティックバージョニングの利用
使っている側はバージョンを見るだけで、変更に
どの程度の影響があるのかを判断できる。
明確なルールがあることで、
サービスを提供する側と受け取る側の情報交換の
プロセスを簡略化することもできる。
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.3 セマンティックバージョニングの利用
コンシューマとサービス間で
「変更の種類をわかりやすいようにしましょう」
というルールを作るはなし
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 異なるエンドポイントの共存
サービス側の変更によって
コンシューマーになるべく変更を
与えないようにしましょう
(影響を制限する)
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 異なるエンドポイントの共存
•独立してリリースできるようにしたい。
•コンシューマーに同時アップグレードを強要し
たくない。
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 異なるエンドポイントの共存
•独立してリリースできるようにしたい。
•コンシューマーに同時アップグレードを強要し
たくない。
そうだ!エンドポイントの新旧両方のバージョン
を公開すればいいんだ!!!
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 異なるエンドポイントの共存
•提供する機能のエンドポイントを拡張して新旧両方をサポート!
•コンシューマの移行が済んだらAPIを縮小して古い機能を取り除
く!
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 異なるエンドポイントの共存
•新しいインターフェースをできる限り早く公開できる
•コンシューマに移行する時間を与える
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 異なるエンドポイントの共存
ルーティングする手段
•リクエストヘッダのバージョン番号
‣URIが不透明になるので、クライアントにURI
テンプレートをハードコードしなくて済む
•URIのバージョン番号(/v1/customer と /v2/
customer)
‣物事が非常に明確になり、リクエストのルー
ティングを簡素化できる
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 異なるエンドポイントの共存
ただし、バージョンが3つ以上になると辛い
エンドポイントに合わせた
コードとテストを用意しなきゃいけないので
メンテが大変になっちゃう。
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 異なるエンドポイントの共存
サービス側の変更によって
コンシューマーになるべく変更を
与えないようにしましょう
(影響を制限する)
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.5 複数のサービスバージョンの同時使用
「わざわざエンドポイントを
分けるってめんどくさくない?
二つのバージョンのサービスを
用意しておけばいいじゃん
時間が出来たら移行しよう」
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.5 複数のサービスバージョンの同時使用
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.5 複数のサービスバージョンの同時使用
古いコンシューマのトラフィックを
旧バージョンにルーティングし
新しいバージョンのトラフィックを
新バージョンにルーティングする
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.5 複数のサービスバージョンの同時使用
でも
これはアンチパターン
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.5 複数のサービスバージョンの同時使用
サービス内の内部のバグを修正する必要があると
2つを直さなくちゃいけなくて大変
振る舞いをミドルウェアのどこかか
一連のnginxスクリプトに
配置しなければいけなくなるので
システムの振る舞いを検証するのが大変
データが旧バージョンと新バージョンの
どちらで作られたものかがわからない
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.5 複数のサービスバージョンの同時使用
サービス内の内部のバグを修正する必要があると
2つを直さなくちゃいけなくて大変
振る舞いをミドルウェアのどこかか
一連のnginxスクリプトに
配置しなければいけなくなるので
システムの振る舞いを検証するのが大変
データが旧バージョンと新バージョンの
どちらで作られたものかがわからない
コードベースを
分岐させるのはやめよう。
(http://12factor.net/ja/)
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.5 複数のサービスバージョンの同時使用
サービス内の内部のバグを修正する必要があると
2つを直さなくちゃいけなくて大変
振る舞いをミドルウェアのどこかか
一連のnginxスクリプトに
配置しなければいけなくなるので
システムの振る舞いを検証するのが大変
データが旧バージョンと新バージョンの
どちらで作られたものかがわからない
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.5 複数のサービスバージョンの同時使用
短期間だけこの方法をとるのはいいよ。
ブルーグリーンデプロイや
カナリアリリースなどをする場合はOK
(詳しくは7章を担当する人が話してくれます。)
ブルーグリーンデプロイ
http://www.atmarkit.co.jp/ait/articles/1312/03/news033_2.html
カナリアリリース
http://www.nttdata.com/jp/ja/insights/trend_keyword/
2013061301.html
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.5 複数のサービスバージョンの同時使用
ローリングメンテナンス
http://www.itmedia.co.jp/im/articles/
0701/26/news124.html
みたいに、数分や数時間だけバージョンを
共存させることはありますよね。
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.5 複数のサービスバージョンの同時使用
Netflixでも古いコンシューマを変更するコスト
が高すぎる場合、特にレガシーデバイスがまだ
APIの旧バージョンに縛られている場合に備えて
「慎重に」利用している。
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 と 4.13.5を比べてみよう
4.13.4
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 と 4.13.5を比べてみよう
4.13.4
エンドポイントは
複数のバージョンに対応しているが、
裏のロジックは1つ。
古いバージョンのリクエストを受け取ったエンド
ポイントは、新しいバージョンの形式に変換して
から裏のロジックに流す。
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 と 4.13.5を比べてみよう
4.13.5
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13.4 と 4.13.5を比べてみよう
4.13.5
エンドポイントのみならず、
裏のロジックも新旧存在する。
つまり、アプリケーションそのものが
2つある状態。
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
バージョンのお話はここまで!
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
4.13 バージョニング
説明したこと
•コンシューマ(クライアント)の心持ち
•サービスの心持ち
•バージョンの意味付け
•サービスのバージョンアップ方法
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
ディスカッションします?
ポステルの法則を理解して耐性のあるリーダー
(Tolerant Readers)をつかって破壊的変更を避け、
バージョンが必要ないようにします
•現場で「バージョンが必要ないように」って実
現してますか?
•まだしてないひとは、どうすればいいと思いま
すか?
•サービスとコンシューマ間の情報共有で何か工
夫してますか?
4.16 まとめ
4章で言いたいこと
•いかなる代償を払ってもデータベース統合を避けます
•RESTとRPCとの間のトレードオフを理解し、RESTをリクエス
ト / レスポンス統合の優れた出発点と積極的にみなします
•オーケストレーションよりもコレオグラフィを選びます
•ポステルの法則を理解して耐性のあるリーダー(Tolerant
Readers)をつかって破壊的変更を避け、バージョンが必要
ないようにします
•ユーザインターフェースを合成レイヤと考えます
ユーザインターフェースを合成レイヤと考えます
について書いてあるのが
後半のもくじ
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
4.12 参照によるアクセス
4.13 バージョニング
4.14 ユーザインターフェース
4.15 サードパーティーソフトウェアとの統合
4.16 まとめ
ユーザインターフェースを合成レイヤと考えます
4.14 ユーザインターフェース
すべてのマイクロサービスを
顧客が理解できるものにまとめる場所
ユーザインターフェースを合成レイヤと考えます
4.14 ユーザインターフェース
前まで
GET / POST経由でサーバ側で処理。
サーバ側プログラムがページ全体を描画して
クライアントブラウザに送信。
クライアントブラウザは少しの処理しかしない。
ユーザインターフェースを合成レイヤと考えます
4.14 ユーザインターフェース
最近
JavaScriptがもろもろやってくれる。
ユーザインターフェースを合成レイヤと考えます
4.14.1 デジタルへ向けて
最近は、
Web・モバイル・デスクトップアプリケーション・
ウェアラブル端末など、
いろんな媒体でWebサイトが見られている。
ユーザインターフェースを合成レイヤと考えます
4.14.1 デジタルへ向けて
顧客がどのように対話するか
正確には予測できない
かつ
デバイスによって
見たいコンテンツも違う
ユーザインターフェースを合成レイヤと考えます
4.14.1 デジタルへ向けて
そこで、ユーザインターフェースを
合成レイヤだと考える。
提供するさまざまな機能を
組み合わせる場所
ユーザインターフェースを合成レイヤと考えます
4.14.1 デジタルへ向けて
そこで、ユーザインターフェースを
合成レイヤだと考える。
提供するさまざまな機能を
組み合わせる場所
ユーザインターフェースを合成レイヤと考えます
4.14.2 制約
でも、ユーザインターフェースって
いろんな種類があるから、
ただまとめればいいわけでもないですよね?
ユーザインターフェースを合成レイヤと考えます
4.14.2 制約
たとえば、それぞれのデバイスの使い方は
タブレットでは右クリックできない
スマホでは親指だけで操作したい
みたいに。
ユーザインターフェースを合成レイヤと考えます
4.14.2 制約
たとえば、それぞれのデバイスの使い方は
タブレットでは右クリックできない
スマホでは親指だけで操作したい
みたいに。
ユーザインターフェースを合成レイヤと考えます
4.14.2 制約
中核のサービスは同じでも
それぞれのインターフェースがもつ制約に
サービスを適用させる必要がある。
ユーザインターフェースを合成レイヤと考えます
じゃあ、どういう風に
webサイトを作っていけば
いいんでしょう?
ユーザインターフェースを合成レイヤと考えます
じゃあ、どういう風に
webサイトを作っていけば
いいんでしょう?
※いろんなサイトを例に出したりしますが
「そうじゃないぞ!!!」
という方(中の人とか)がいたら
教えてください。。。
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
まずはよくあるサイトの作り方
UIにAPI呼び出しを行わせて
すべてをUIコントロールにマッピングする
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
P81 段落1つめ
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
P81 段落2つめ
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
P81 段落3つめ
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない。
•小さな変更でも、複数のチームに変更リクエストをお
こなわないといけなくなる。
•サービスの担当者たちはサービスのユーザへの見せ方
に関わらない。
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「サービス変更したからUI
もあわせて変更して!」
UI担当者「はーい」
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「サービス変更したからUI
もあわせて変更して!」
UI担当者「はーい」
レコメンデーションサービス担当者「サービス
変更したからUIもあわせて変更して!」
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「サービス変更したからUI
もあわせて変更して!」
UI担当者「はーい」
レコメンデーションサービス担当者「サービス
変更したからUIもあわせて変更して!」
UI担当者「いま顧客サービスの方を修正してい
るから。。。」
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「サービス変更したからUI
もあわせて変更して!」
UI担当者「はーい」
レコメンデーションサービス担当者「サービス
変更したからUIもあわせて変更して!」
UI担当者「いま顧客サービスの方を修正してい
るから。。。」
レコメンデーションサービス担当者「こっちの
方が急いでるんだけど…。」
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「サービス変更したからUI
もあわせて変更して!」
UI担当者「はーい」
レコメンデーションサービス担当者「サービス
変更したからUIもあわせて変更して!」
UI担当者「いま顧客サービスの方を修正してい
るから。。。」
レコメンデーションサービス担当者「こっちの
方が急いでるんだけど…。」
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
つらい
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「この項目の桁数を変えよ
うと思う。画面への影響ないか確認して。」
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「この項目の桁数を変えよ
うと思う。画面への影響ないか確認して。」
web UI担当者「わかったよ。」
モバイル UI担当者「わかったよ。」
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「この項目の桁数を変えよ
うと思う。画面への影響ないか確認して。」
web UI担当者「わかったよ。」
モバイル UI担当者「わかったよ。」
顧客サービス担当者「リリースしたいんだけど
確認おわった?」
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「この項目の桁数を変えよ
うと思う。画面への影響ないか確認して。」
web UI担当者「わかったよ。」
モバイル UI担当者「わかったよ。」
顧客サービス担当者「リリースしたいんだけど
確認おわった?」
web UI担当者「終わった」
モバイル UI担当者「まだだよ。」
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「この項目の桁数を変えよ
うと思う。画面への影響ないか確認して。」
web UI担当者「わかったよ。」
モバイル UI担当者「わかったよ。」
顧客サービス担当者「リリースしたいんだけど
確認おわった?」
web UI担当者「終わった」
モバイル UI担当者「まだだよ。」
リリースできない
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
顧客サービス担当者「この項目の桁数を変えよ
うと思う。画面への影響ないか確認して。」
web UI担当者「わかったよ。」
モバイル UI担当者「わかったよ。」
顧客サービス担当者「リリースしたいんだけど
確認おわった?」
web UI担当者「終わった」
モバイル UI担当者「まだだよ。」
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
つらい
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない。
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
1つの画面を表示するために
3つのサービスを
呼び出さないといけない
❶ ❷
❸
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
たとえば(1)
ヘルプデスクアプリではWeb画面で見る
顧客記録を全部見たい
移動店舗ではモバイルアプリで見る
店舗で買ったことがある顧客記録だけ見たい
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
たとえば(2)
http://qiita.com/api/v2/docs#ユーザ
レスポンスでいろんな情報が返ってくる
web画面で見るならいいけど
スマホで見るときはここまで情報はいらないかも
ユーザインターフェースを合成レイヤと考えます
4.14.3 API合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
では、欠点を補うためには
どうしていけばいいでしょう
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
サービスにUIの部品を直接提供させ
その部品を集めてUIを作成する
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
UIコンポーネント
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
たとえば
http://syobochim.hatenablog.com/
twitterのところがwidgetになっている
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
たとえば
http://syobochim.hatenablog.com/
twitterのところがwidgetになっている
急遽つけたので、
かなり雑です。。。
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
たとえば
http://syobochim.hatenablog.com/
twitterのところがwidgetになっている
デザインを決めているのは
ブログの管理者でもはてなさんでもなく
twitter!
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
たとえば
http://syobochim.hatenablog.com/
twitterのところがwidgetになっている
デザインを決めているのは
ブログの管理者でもはてなさんでもなく
twitter!
widget系が多い。
このモデルを適用しているサイトは少ない
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
サービスを変更するチームが
UI部品の変更も行う
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
サービスを変更するチームが
UI部品の変更も行う
➡
変更をすぐに公開できる
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
ただし、注意があります
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
ユーザエクスペリエンス(ユーザ体験)を
他のサービスと一貫させないと
使いにくくなっちゃう。
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
ユーザエクスペリエンス(ユーザ体験)を
他のサービスと一貫させないと
使いにくくなっちゃう。
「えっ、この部品は更新するために
下にスクロールすればいいのに、
こっちの部品は更新ボタンを押すのか。。。」
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
ユーザエクスペリエンス(ユーザ体験)を
他のサービスと一貫させないと
使いにくくなっちゃう。
「えっ、この部品は更新するために
下にスクロールすればいいのに、
こっちの部品は更新ボタンを押すのか。。。」
わかりにくい!!!!
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
そういうのを回避するために
リビングスタイルガイド
を作りましょう
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
そういうのを回避するために
リビングスタイルガイド
を作りましょう
HTMLやCSS、画像といった資産を共有してある程
度の一貫性を持たせる
http://getbootstrap.com/javascript/
動くものがあると簡単にイメージを共有できる
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
解決できるか確信が持てない大きな課題
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
解決できるか確信が持てない大きな課題
サービスが提供する機能が
ウィジェットやページに
きちんと収まらないことがある。
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
解決できるか確信が持てない大きな課題
サービスが提供する機能が
ウィジェットやページに
きちんと収まらないことがある。
対話の形式が横断的になるほど
このモデルが当てはまる場合が少なくなり
単なるAPI呼び出しに戻る場合がある
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
こういうことが苦手
ゼクシィは
需要がタブごとに別れている
http://zexy.net/
(タブを各サービスとする)
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
こういうことが苦手
ゼクシィは
需要がタブごとに別れている
http://zexy.net/
(タブを各サービスとする)
サイトの右上の検索機能を使うと
各サービスを混合した結果が出てくる
(対話の形式が横断的)
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
でもこのふたつは
解消できていない
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
『4.14.5 フロントエンド向けのバック
エンド(BFF)』はここの二つの話
ユーザインターフェースを合成レイヤと考えます
4.13.4 UI部品合成
この方法の3つの欠点
•サービスの作成者とユーザインターフェース
の作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
サーバ側集約エンドポイントの
APIゲートウェイを用意する!
https://www.ogis-ri.co.jp/otc/hiroba/
others/SilliconValley5/
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
APIゲートウェイで
サービスを順番に呼び出して
結果を組み合わせる
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
APIゲートウェイで
サービスを順番に呼び出して
結果を組み合わせる
サーバとの通信が一回で済む
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
https://twitter.com/kawasima/status/
753483914954485761
APIゲートウェイで
サービスを順番に呼び出して
結果を組み合わせる
サーバとの通信が一回で済む
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
AWSにも
API Gateway管理サービスがある
http://docs.aws.amazon.com/ja_jp/
apigateway/latest/developerguide/
welcome.html
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
でも
サーバ側エンドポイントの振る舞いが
多くなりすぎたとき
大惨事になることがある
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
でも
サーバ側エンドポイントの振る舞いが
多くなりすぎたとき
大惨事になることがある
全てのサービス向けの
1つの巨大なレイヤをもつのは
影響が大きくなりすぎるので問題
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
たとえば
一つのサービスに破壊的変更があったとき
ブラウザもモバイルもネイティブアプリも
すべてのクライアントに影響が出ちゃう
APIゲートウェイ自体が死んだ時の影響も
すごく大きい
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
この方法の3つの欠点
•サービスの作成者とユーザインターフェースの
作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
この方法の3つの欠点
•サービスの作成者とユーザインターフェースの
作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
この方法の3つの欠点
•サービスの作成者とユーザインターフェースの
作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
この方法の3つの欠点
•サービスの作成者とユーザインターフェースの
作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
BFF(フロントエンド向けのバックエンド)
Backends For Frontends
http://samnewman.io/patterns/architectural/
bff/
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
ここが分かれた
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
サーバーに組み込まれた
ユーザインターフェースの部品
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
各デバイスごとの表示を
細かくわけましょう!
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
デバイスごとに表示を変えることができる
たとえばGoogle
ユーザインターフェースを合成レイヤと考えます
ユーザインターフェースを合成レイヤと考えます
ユーザインターフェースを合成レイヤと考えます
ユーザインターフェースを合成レイヤと考えます
ユーザインターフェースを合成レイヤと考えます
検索結果がwebとスマホで
少し違う
ユーザインターフェースを合成レイヤと考えます
検索結果がwebとスマホで
少し違う
➡
「スマホ対応」のサイトを優先
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
特定のユーザエクスペリエンスの提供に
特化した振る舞いだけを管理すること。
さもないと
入り込むべきではないロジックが
入り込む恐れがある。
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
この方法の3つの欠点
•サービスの作成者とユーザインターフェースの
作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.5 フロントエンド向けのバックエンド(BFF)
この方法の3つの欠点
•サービスの作成者とユーザインターフェースの
作成者が違う
•通信が多くなる可能性がある
•デバイスごとにレスポンスを調整できない
ユーザインターフェースを合成レイヤと考えます
4.14.6 ハイブリッド手法
Webサイトは部品ベースの組み立てをして
モバイルアプリケーションはBFFを使う
という企業もある。
ユーザに提供する基盤となる機能の
凝集性を維持することが必要
ユーザインターフェースを合成レイヤと考えます
4.14.6 ハイブリッド手法
https://www.thoughtworks.com/insights/blog/
bff-soundcloud
ちなみに
「4.15.5 ストラングラー(絞め殺し)パターン」
についても書いてる
ユーザインターフェースを合成レイヤと考えます
4.14.6 ハイブリッド手法
4.15.5 ストラングラー(絞め殺し)パターン
http://bliki-ja.github.io/
StranglerApplication/
ユーザインターフェースを合成レイヤと考えます
4.14.6 ハイブリッド手法
4.15.5 ストラングラー(絞め殺し)パターン
http://bliki-ja.github.io/
StranglerApplication/
昔からやっている
「古いシステムを徐々に新しいシステムに
移行していきましょうね」
のかっこいい言い方
ユーザインターフェースを合成レイヤと考えます
4.14.6 ハイブリッド手法
4.15.5 ストラングラー(絞め殺し)パターン
古いシステムへの呼び出しを
インターセプトする。
呼び出しを既存のシステムに
ルーティングするか
自分で記述した新しいコードに向けるかを
判断できる。
ユーザインターフェースを合成レイヤと考えます
4.14.6 ハイブリッド手法
でも、ハイブリッドよりも。。。
BFFで作った層とクライアントで
同じ言語、同じ実装で動かす
isomorphic
https://speakerdeck.com/koichik/isomorphic-
survival-guide
ユーザインターフェースを合成レイヤと考えます
4.14 ユーザインターフェース
おはなししたこと
•API合成
•UI部品合成
•APIゲートウェイ
•BFF(フロントエンド向けのバックエンド)
•ハイブリッド手法
•isomorphic
ユーザインターフェースを合成レイヤと考えます
4.14 ユーザインターフェース
ではディスカッションタイム!
•いま紹介した手法のどれかをつかっていますか?
•いま業務で作っているサービスはどの手法を当
てはめればいいと思いますか?
4.16 まとめ
4章で言いたいこと
•いかなる代償を払ってもデータベース統合を避けます
•RESTとRPCとの間のトレードオフを理解し、RESTをリクエス
ト / レスポンス統合の優れた出発点と積極的にみなします
•オーケストレーションよりもコレオグラフィを選びます
•ポステルの法則を理解して耐性のあるリーダー(Tolerant
Readers)をつかって破壊的変更を避け、バージョンが必要
ないようにします
•ユーザインターフェースを合成レイヤと考えます
4.16 まとめ
まとめに関する説明が終わったのですが
ここ話してないです。
•4.11 マイクロサービスの世界におけるDRY
とコード再利用性のリスク
•4.12 参照によるアクセス
•4.15 サードパーティソフトウェアとの統合
(4.15.5 ストラングラーパターンは話しましたが…)
4.16 まとめ
まとめに関する説明が終わったのですが
ここ話してないです。
•4.11 マイクロサービスの世界におけるDRY
とコード再利用性のリスク
•4.12 参照によるアクセス
•4.15 サードパーティソフトウェアとの統合
それぞれ、さらっと話ていきます!
4.16 まとめ
•4.11 マイクロサービスの世界におけるDRY
とコード再利用性のリスク
•4.12 参照によるアクセス
•4.15 サードパーティソフトウェアとの統合
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
DRY (Don't Repeat Yourself)
コードの重複を避けるようにすること
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
DRY (Don't Repeat Yourself)
コードの重複を避けるようにすること
システムの振る舞いと
知識の重複を回避すること
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
重複コードを抽象化して
複数の箇所から呼び出すような
共通ライブラリを作成する
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
マイクロサービスとコンシューマを
過度に結合すると危険!
マイクロサービスの小さな変更が
コンシューマへの不要な変更を
引き起こしてしまうかも…!
変更したよ!
変更したよ!
やったー!
変更したよ!
やったー! えっ
えっ えっ
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
共有コードをサービス境界外で使うと
結合の可能性を招きます
ログライブラリなど、
外部から見えないものはOK
4.11 マイクロサービスの世界における
DRYとコードの再利用のリスク
一つのマイクロサービス内ではDRYを
やぶらないけど
すべてのサービスに渡るDRYの違反には
寛大になろう!!!
DRY違反よりもサービス間の結合の方が
害があるよ
4.11.1 クライアントライブラリ
ただし、一部の共通的な処理は
それぞれのサービスで実装するのではなく
クライアントライブラリで共通化すると
制御が簡単になることもある。
4.11.1 クライアントライブラリ
Netflixのクライアントライブラリ
https://github.com/Netflix/ribbon
サービスの検出・故障モード・ロギング
など
実際のサービス自体の性質とは
関係ないところに対処する
4.16 まとめ
•4.11 マイクロサービスの世界におけるDRY
とコード再利用性のリスク
•4.12 参照によるアクセス
•4.15 サードパーティソフトウェアとの統合
4.12 参照によるアクセス
ドメインエンティティに関する情報を
渡す方法について
4.12 参照によるアクセス
4.12 参照によるアクセス
4.12 参照によるアクセス
あるタイミングの
顧客データ
4.12 参照によるアクセス
4.12 参照によるアクセス
ここの
顧客データは
最新なの?
4.12 参照によるアクセス
他のサービスから
更新されているかも
4.12 参照によるアクセス
じゃあどうすればいいの?
4.12 参照によるアクセス
4.12 参照によるアクセス
4.12 参照によるアクセス
実際に使う
タイミングで
情報をとる
4.12 参照によるアクセス
4.12 参照によるアクセス
変更が入っても
平気!
4.12 参照によるアクセス
常に顧客サービスにアクセスして
特定のCustomerに関連する情報を
調べていると
顧客サービスの負荷が大きくなりすぎる
情報が新しいと考えられる期間を知らせると
キャッシングを大いに活用して
負荷を減らせる
4.16 まとめ
•4.11 マイクロサービスの世界におけるDRY
とコード再利用性のリスク
•4.12 参照によるアクセス
•4.15 サードパーティソフトウェアとの統合
4.15 サードパーティソフトウェアとの統合
自分では制御できないシステムに
対する統合
4.15 サードパーティソフトウェアとの統合
自分では制御できないシステムに
対する統合
•Excel(オフィス生産性ツール)
•OS
•給与システム
など
わざわざ構築するのはしんどい
4.15 サードパーティソフトウェアとの統合
4.15.1 制御の欠如
ツールの拡張に使えるプログラミング言語は
提供ベンダによる
統合とカスタマイズの作業を
チームに取り戻すことが大切
4.15 サードパーティソフトウェアとの統合
4.15.2 カスタマイズ
カスタマイズが可能なツールもある
でも
カスタマイズのコストは
新規に構築するよりも
高くなってしまう場合があるので注意
4.15 サードパーティソフトウェアとの統合
4.15.2 カスタマイズ
複雑なカスタマイズをするよりも
組織のやり方を変更する方が
理にかなっている
4.15 サードパーティソフトウェアとの統合
4.15.3 統合スパゲティ
ツールとの統合方法も課題
サービス間の統合方法を
入念に検討することが重要
4.15 サードパーティソフトウェアとの統合
4.15.4 思い通りにする
自分が制御するプラットフォーム上で
全てのカスタマイズを行い
ツール自体を使うコンシューマの数を
制限することで
状況を自分の思い通りにする
持ってないひとは是非!
ありがとうございました

More Related Content

Viewers also liked

組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 
事業成長にコミットするエンジニア組織への道のり
事業成長にコミットするエンジニア組織への道のり事業成長にコミットするエンジニア組織への道のり
事業成長にコミットするエンジニア組織への道のりRecruit Lifestyle Co., Ltd.
 
図解gitworkflows(7)
図解gitworkflows(7)図解gitworkflows(7)
図解gitworkflows(7)ktateish
 
Python3 プログラミング勉強会
Python3 プログラミング勉強会Python3 プログラミング勉強会
Python3 プログラミング勉強会Tetsuya Morimoto
 
REST with Spring Boot #jqfk
REST with Spring Boot #jqfkREST with Spring Boot #jqfk
REST with Spring Boot #jqfkToshiaki Maki
 
徹底比較!! Heliosearch vs Solr
徹底比較!! Heliosearch vs Solr徹底比較!! Heliosearch vs Solr
徹底比較!! Heliosearch vs SolrEbisawa Shinobu
 
Amazon API Gateway を活用したゲームサーバー構築
Amazon API Gateway を活用したゲームサーバー構築Amazon API Gateway を活用したゲームサーバー構築
Amazon API Gateway を活用したゲームサーバー構築崇之 清水
 
Microserviceなんて最初からやるもんじゃ無かった
Microserviceなんて最初からやるもんじゃ無かったMicroserviceなんて最初からやるもんじゃ無かった
Microserviceなんて最初からやるもんじゃ無かったAkira Miki
 
類義語検索と類義語ハイライト
類義語検索と類義語ハイライト類義語検索と類義語ハイライト
類義語検索と類義語ハイライトShinichiro Abe
 
20120830 DBリファクタリング読書会第三回
20120830 DBリファクタリング読書会第三回20120830 DBリファクタリング読書会第三回
20120830 DBリファクタリング読書会第三回都元ダイスケ Miyamoto
 
WooCommerce & Apple TV
WooCommerce & Apple TVWooCommerce & Apple TV
WooCommerce & Apple TVMarko Heijnen
 
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグ
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグアジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグ
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグDai FUJIHARA
 
第4章 自動比較
第4章 自動比較第4章 自動比較
第4章 自動比較toku toku
 
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章aomori ringo
 
テスト自動化読書会 第3章 20150523
テスト自動化読書会 第3章 20150523テスト自動化読書会 第3章 20150523
テスト自動化読書会 第3章 20150523dnoguchi
 
Tapl 5
Tapl 5Tapl 5
Tapl 5rf0444
 
システムテスト自動化標準ガイド第7章
システムテスト自動化標準ガイド第7章システムテスト自動化標準ガイド第7章
システムテスト自動化標準ガイド第7章nihon buson
 
[デブサミ2015] スクラムならうまくいく? 〜グリーのネイティブゲーム作りの歴史をひもとく、 そして未来へ〜
[デブサミ2015] スクラムならうまくいく?〜グリーのネイティブゲーム作りの歴史をひもとく、そして未来へ〜[デブサミ2015] スクラムならうまくいく?〜グリーのネイティブゲーム作りの歴史をひもとく、そして未来へ〜
[デブサミ2015] スクラムならうまくいく? 〜グリーのネイティブゲーム作りの歴史をひもとく、 そして未来へ〜gree_tech
 

Viewers also liked (20)

組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
事業成長にコミットするエンジニア組織への道のり
事業成長にコミットするエンジニア組織への道のり事業成長にコミットするエンジニア組織への道のり
事業成長にコミットするエンジニア組織への道のり
 
Agile meets BABOK
Agile meets BABOKAgile meets BABOK
Agile meets BABOK
 
Cqrs api v2
Cqrs api v2Cqrs api v2
Cqrs api v2
 
図解gitworkflows(7)
図解gitworkflows(7)図解gitworkflows(7)
図解gitworkflows(7)
 
Python3 プログラミング勉強会
Python3 プログラミング勉強会Python3 プログラミング勉強会
Python3 プログラミング勉強会
 
REST with Spring Boot #jqfk
REST with Spring Boot #jqfkREST with Spring Boot #jqfk
REST with Spring Boot #jqfk
 
徹底比較!! Heliosearch vs Solr
徹底比較!! Heliosearch vs Solr徹底比較!! Heliosearch vs Solr
徹底比較!! Heliosearch vs Solr
 
Amazon API Gateway を活用したゲームサーバー構築
Amazon API Gateway を活用したゲームサーバー構築Amazon API Gateway を活用したゲームサーバー構築
Amazon API Gateway を活用したゲームサーバー構築
 
Microserviceなんて最初からやるもんじゃ無かった
Microserviceなんて最初からやるもんじゃ無かったMicroserviceなんて最初からやるもんじゃ無かった
Microserviceなんて最初からやるもんじゃ無かった
 
類義語検索と類義語ハイライト
類義語検索と類義語ハイライト類義語検索と類義語ハイライト
類義語検索と類義語ハイライト
 
20120830 DBリファクタリング読書会第三回
20120830 DBリファクタリング読書会第三回20120830 DBリファクタリング読書会第三回
20120830 DBリファクタリング読書会第三回
 
WooCommerce & Apple TV
WooCommerce & Apple TVWooCommerce & Apple TV
WooCommerce & Apple TV
 
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグ
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグアジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグ
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグ
 
第4章 自動比較
第4章 自動比較第4章 自動比較
第4章 自動比較
 
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章
 
テスト自動化読書会 第3章 20150523
テスト自動化読書会 第3章 20150523テスト自動化読書会 第3章 20150523
テスト自動化読書会 第3章 20150523
 
Tapl 5
Tapl 5Tapl 5
Tapl 5
 
システムテスト自動化標準ガイド第7章
システムテスト自動化標準ガイド第7章システムテスト自動化標準ガイド第7章
システムテスト自動化標準ガイド第7章
 
[デブサミ2015] スクラムならうまくいく? 〜グリーのネイティブゲーム作りの歴史をひもとく、 そして未来へ〜
[デブサミ2015] スクラムならうまくいく?〜グリーのネイティブゲーム作りの歴史をひもとく、そして未来へ〜[デブサミ2015] スクラムならうまくいく?〜グリーのネイティブゲーム作りの歴史をひもとく、そして未来へ〜
[デブサミ2015] スクラムならうまくいく? 〜グリーのネイティブゲーム作りの歴史をひもとく、 そして未来へ〜
 

Similar to 第三回マイクロサービスアーキテクチャ読書会(後半)

IoT向け通信プラットフォームSORACOMとは? / SORACOM UG 九州 #9
IoT向け通信プラットフォームSORACOMとは? / SORACOM UG 九州 #9IoT向け通信プラットフォームSORACOMとは? / SORACOM UG 九州 #9
IoT向け通信プラットフォームSORACOMとは? / SORACOM UG 九州 #9SORACOM,INC
 
LPWA 勉強会 #4 | 事例から見る LPWA と実装の現場 〜SORACOM プラットフォームの活用方法 〜
LPWA 勉強会 #4 | 事例から見る LPWA と実装の現場 〜SORACOM プラットフォームの活用方法 〜LPWA 勉強会 #4 | 事例から見る LPWA と実装の現場 〜SORACOM プラットフォームの活用方法 〜
LPWA 勉強会 #4 | 事例から見る LPWA と実装の現場 〜SORACOM プラットフォームの活用方法 〜SORACOM,INC
 
130522 00
130522 00130522 00
130522 00openrtm
 
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能Takuya Iwatsuka
 
これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)
これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)
これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)v6app
 
160608 01
160608 01160608 01
160608 01openrtm
 

Similar to 第三回マイクロサービスアーキテクチャ読書会(後半) (6)

IoT向け通信プラットフォームSORACOMとは? / SORACOM UG 九州 #9
IoT向け通信プラットフォームSORACOMとは? / SORACOM UG 九州 #9IoT向け通信プラットフォームSORACOMとは? / SORACOM UG 九州 #9
IoT向け通信プラットフォームSORACOMとは? / SORACOM UG 九州 #9
 
LPWA 勉強会 #4 | 事例から見る LPWA と実装の現場 〜SORACOM プラットフォームの活用方法 〜
LPWA 勉強会 #4 | 事例から見る LPWA と実装の現場 〜SORACOM プラットフォームの活用方法 〜LPWA 勉強会 #4 | 事例から見る LPWA と実装の現場 〜SORACOM プラットフォームの活用方法 〜
LPWA 勉強会 #4 | 事例から見る LPWA と実装の現場 〜SORACOM プラットフォームの活用方法 〜
 
130522 00
130522 00130522 00
130522 00
 
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
 
これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)
これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)
これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)
 
160608 01
160608 01160608 01
160608 01
 

第三回マイクロサービスアーキテクチャ読書会(後半)