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

2,471 views

Published on

第三回マイクロサービスアーキテクチャの資料です。
イベントページはこちら https://architect-club.doorkeeper.jp/events/48267

Published in: Engineering
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,471
On SlideShare
0
From Embeds
0
Number of Embeds
1,341
Actions
Shares
0
Downloads
8
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

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

  1. 1. 第3回MSA読書会(後半) #MSA読書会
  2. 2. こんにちは! しょぼちむ (@syobochim)
  3. 3. 後半のもくじ 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク 4.12 参照によるアクセス 4.13 バージョニング 4.14 ユーザインターフェース 4.15 サードパーティーソフトウェアとの統合 4.16 まとめ
  4. 4. 後半のもくじ 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク 4.12 参照によるアクセス 4.13 バージョニング 4.14 ユーザインターフェース 4.15 サードパーティーソフトウェアとの統合 4.16 まとめ ⇦ここからいくよ!
  5. 5. 4.16 まとめ 4章で言いたいこと •いかなる代償を払ってもデータベース統合を避けます •RESTとRPCとの間のトレードオフを理解し、RESTをリクエス ト / レスポンス統合の優れた出発点と積極的にみなします •オーケストレーションよりもコレオグラフィを選びます •ポステルの法則を理解して耐性のあるリーダー(Tolerant Readers)をつかって破壊的変更を避け、バージョンが必要 ないようにします •ユーザインターフェースを合成レイヤと考えます
  6. 6. 4.16 まとめ 4章で言いたいこと •いかなる代償を払ってもデータベース統合を避けます •RESTとRPCとの間のトレードオフを理解し、RESTをリクエス ト / レスポンス統合の優れた出発点と積極的にみなします •オーケストレーションよりもコレオグラフィを選びます •ポステルの法則を理解して耐性のあるリーダー(Tolerant Readers)をつかって破壊的変更を避け、バージョンが必要 ないようにします •ユーザインターフェースを合成レイヤと考えます こっちは前半部分
  7. 7. 4.16 まとめ 4章で言いたいこと •いかなる代償を払ってもデータベース統合を避けます •RESTとRPCとの間のトレードオフを理解し、RESTをリクエス ト / レスポンス統合の優れた出発点と積極的にみなします •オーケストレーションよりもコレオグラフィを選びます •ポステルの法則を理解して耐性のあるリーダー(Tolerant Readers)をつかって破壊的変更を避け、バージョンが必要 ないようにします •ユーザインターフェースを合成レイヤと考えます このふたつについてまず説明していきます!
  8. 8. 4.16 まとめ 4章で言いたいこと •いかなる代償を払ってもデータベース統合を避けます •RESTとRPCとの間のトレードオフを理解し、RESTをリクエス ト / レスポンス統合の優れた出発点と積極的にみなします •オーケストレーションよりもコレオグラフィを選びます •ポステルの法則を理解して耐性のあるリーダー(Tolerant Readers)をつかって破壊的変更を避け、バージョンが必要 ないようにします •ユーザインターフェースを合成レイヤと考えます 4.13 バージョニング 4.14 ユーザインターフェース
  9. 9. 後半のもくじ 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク 4.12 参照によるアクセス 4.13 バージョニング 4.14 ユーザインターフェース 4.15 サードパーティーソフトウェアとの統合 4.16 まとめ このあたりは最後に時間があれば
  10. 10. 4.16 まとめ 4章で言いたいこと •いかなる代償を払ってもデータベース統合を避けます •RESTとRPCとの間のトレードオフを理解し、RESTをリクエス ト / レスポンス統合の優れた出発点と積極的にみなします •オーケストレーションよりもコレオグラフィを選びます •ポステルの法則を理解して耐性のあるリーダー(Tolerant Readers)をつかって破壊的変更を避け、バージョンが必要 ないようにします •ユーザインターフェースを合成レイヤと考えます
  11. 11. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします
  12. 12. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします について書いてあるのが
  13. 13. 後半のもくじ 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク 4.12 参照によるアクセス 4.13 バージョニング 4.14 ユーザインターフェース 4.15 サードパーティーソフトウェアとの統合 4.16 まとめ
  14. 14. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13 バージョニング P73 マイクロサービスに関して話すたびに バージョニングをどのように行うかを 訊かれました。 人々は「いつかはサービスのインターフェースを 変更しなければならない」という当然の心配をし 変更の管理方法を理解したいと思っている。
  15. 15. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13 バージョニング この問題を分割し、対策を説明していきます。 •コンシューマ(クライアント)の心持ち •サービスの心持ち •バージョンの意味付け •サービスのバージョンアップ方法
  16. 16. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り 「サービス側の変更に影響されないように 気をつけましょう」 というコンシューマ側の心持ちのはなし
  17. 17. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り 「サービス側の変更に影響されないように 気をつけましょう」 というコンシューマ側の心持ちのはなし 影響されない=バージョンが必要ない
  18. 18. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り 最初から破壊的な変更を避けることが、 破壊的変更の影響を減らす最善の方法です。 クライアントに優れた振る舞いを推奨し、 そもそもサービスと密結合にならないように しましょう。
  19. 19. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り たとえば、メールサービスが➡のレスポンスを おくってくるとき <customer>
 <firstName>Sam</firstName>
 <lastName>Newman</lastName>
 <email>sam@magpiebrain.com</email>
 <telephoneNumber>555-1234-5678</telephoneNumber>
 </customer>
  20. 20. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り telephoneNumberをつかわないコンシューマーが、こんな クラスを作っていて、リクエストに来ている項目をそのま まバインディングするソースを書いちゃうと。。。 public class Customer {
 public String firstName;
 public String lastName;
 public String email;
 public String telephoneNumber;
 }
  21. 21. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り メールサービス「メール送信にtelephoneNumberって使っ てないよね?消します。」 <customer>
 <firstName>Sam</firstName>
 <lastName>Newman</lastName>
 <email>sam@magpiebrain.com</email>
 <telephoneNumber>555-1234-5678</telephoneNumber>
 </customer>
  22. 22. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り メールサービス「メール送信にtelephoneNumberって使っ てないよね?消します。」 「えっ」 <customer>
 <firstName>Sam</firstName>
 <lastName>Newman</lastName>
 <email>sam@magpiebrain.com</email>
 <telephoneNumber>555-1234-5678</telephoneNumber>
 </customer>
  23. 23. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り メールサービス「メール送信にtelephoneNumberって使って ないよね?消します。」 「えっ」➡ クラス修正が必要 (telephoneNumberを消すことがコンシューマの破壊的変更 になっちゃう。) public class Customer {
 public String firstName;
 public String lastName;
 public String email;
 public String telephoneNumber;
 }
  24. 24. ポステルの法則を理解して耐性のあるリーダー (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;
 }
  25. 25. ポステルの法則を理解して耐性のあるリーダー (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>
  26. 26. ポステルの法則を理解して耐性のあるリーダー (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>
  27. 27. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り メールサービス「項目増えてきたから階層構造にしてみた わー。」 「えっ」 ➡ クラス修正が必要 (項目名は変わってないのに。。。) public class Customer {
 public Naming naming;
 public String email;
 } public class Naming {
 public String firstName;
 public String lastName;
 … }
  28. 28. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り 必要な項目のみ定義する、や、フィールドの場所(構造) を曖昧にしておく、など、サービスとコンシューマの結合 を小さくすれば、リーダー(Reader)が関心のない変更を無 視することができる!!!
  29. 29. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り 必要な項目のみ定義する、や、フィールドの場所(構造) を曖昧にしておく、など、サービスとコンシューマの結合 を小さくすれば、リーダー(Reader)が関心のない変更を無 視することができる!!! 耐性のあるリーダー(by Martin Fowler) •http://martinfowler.com/bliki/TolerantReader.html •https://uramoto.wordpress.com/2015/09/21/マイクロサー ビスのデザインパターン/
  30. 30. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り 必要な項目のみ定義する、や、フィールドの場所(構造) を曖昧にしておく、など、サービスとコンシューマの結合 を小さくすれば、リーダー(Reader)が関心のない変更を無 視することができる!!! XPath •https://msdn.microsoft.com/ja-jp/library/ ms256086(v=vs.120).aspx
  31. 31. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り ポステルの法則 https://ja.wikipedia.org/wiki/ジョン・ポステル 「送信するものに関しては厳密に、受信するものに関して は寛大に」 「人にやさしく、自分にきびしく」
  32. 32. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.1 最大限の見送り 「サービス側の変更に影響されないように 気をつけましょう」 というコンシューマ側の心持ちのはなし
  33. 33. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.2 破壊的変更の早期の把握 「コンシューマへの変更の影響を出す前に 検知しましょう」 というサービス側の心持ちのはなし
  34. 34. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.2 破壊的変更の早期の把握 「コンシューマへの変更の影響を出す前に 検知しましょう」 というサービス側の心持ちのはなし 影響を出さない=バージョンが必要ない
  35. 35. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.2 破壊的変更の早期の把握 コンシューマ駆動契約 で 問題を早期に検出する
  36. 36. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.2 破壊的変更の早期の把握 コンシューマ駆動契約の詳しいはなしは 7章を発表する人にお任せしますが。。。
  37. 37. こんポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.2 破壊的変更の早期の把握 コンシューマー(ヘルプデスク)が期待する動作を 顧客サービスがテストとして書いて動作を保証する。 そのテストが、コンシューマーとの契約になる。 ヘルプデスクの コンシューマ駆動契約の テスト範囲
  38. 38. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.2 破壊的変更の早期の把握 サービスやライブラリをテストすることで、 この動きはまずいぞ! (契約違反だぞ!すなわち破壊的変更!!) というのを検知することができる。 ※テストを書いているので、 破壊的変更の特定も簡単!!
  39. 39. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.2 破壊的変更の早期の把握 破壊的変更が入ったら、 •顧客サービスが破壊的変更を回避する •破壊的変更を受け入れてコンシューマの担当者たちと相 談する
  40. 40. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.2 破壊的変更の早期の把握 「コンシューマへの変更の影響を出す前に 検知しましょう」 というサービス側の心持ちのはなし
  41. 41. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします このあたりが、 「バージョンが必要ないようにします」 という話でした。 それでもコンシューマが サービスの破壊的なバージョニングに 対応しなきゃいけないことが 絶対にある じゃあ、どう運用していけば いいんだろう?
  42. 42. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.3 セマンティックバージョニングの利用 コンシューマとサービス間で 「変更の種類をわかりやすいようにしましょう」 というルールを作るはなし
  43. 43. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.3 セマンティックバージョニングの利用 変更の種類をわかりやすくする手段のひとつが セマンティックバージョニング http://semver.org/lang/ja/
  44. 44. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.3 セマンティックバージョニングの利用 MAJOR.MINOR.PATCH •MAJOR:後方互換性のない変更 •MINOR:後方互換性のある新機能の追加 •PATCH:既存機能にバグ修正が行われた場合 ※他にも細かいルールがサイトには書いてあるよ。
  45. 45. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.3 セマンティックバージョニングの利用 使っている側はバージョンを見るだけで、変更に どの程度の影響があるのかを判断できる。 明確なルールがあることで、 サービスを提供する側と受け取る側の情報交換の プロセスを簡略化することもできる。
  46. 46. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.3 セマンティックバージョニングの利用 コンシューマとサービス間で 「変更の種類をわかりやすいようにしましょう」 というルールを作るはなし
  47. 47. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 異なるエンドポイントの共存 サービス側の変更によって コンシューマーになるべく変更を 与えないようにしましょう (影響を制限する)
  48. 48. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 異なるエンドポイントの共存 •独立してリリースできるようにしたい。 •コンシューマーに同時アップグレードを強要し たくない。
  49. 49. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 異なるエンドポイントの共存 •独立してリリースできるようにしたい。 •コンシューマーに同時アップグレードを強要し たくない。 そうだ!エンドポイントの新旧両方のバージョン を公開すればいいんだ!!!
  50. 50. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 異なるエンドポイントの共存 •提供する機能のエンドポイントを拡張して新旧両方をサポート! •コンシューマの移行が済んだらAPIを縮小して古い機能を取り除 く!
  51. 51. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 異なるエンドポイントの共存 •新しいインターフェースをできる限り早く公開できる •コンシューマに移行する時間を与える
  52. 52. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 異なるエンドポイントの共存 ルーティングする手段 •リクエストヘッダのバージョン番号 ‣URIが不透明になるので、クライアントにURI テンプレートをハードコードしなくて済む •URIのバージョン番号(/v1/customer と /v2/ customer) ‣物事が非常に明確になり、リクエストのルー ティングを簡素化できる
  53. 53. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 異なるエンドポイントの共存 ただし、バージョンが3つ以上になると辛い エンドポイントに合わせた コードとテストを用意しなきゃいけないので メンテが大変になっちゃう。
  54. 54. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 異なるエンドポイントの共存 サービス側の変更によって コンシューマーになるべく変更を 与えないようにしましょう (影響を制限する)
  55. 55. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.5 複数のサービスバージョンの同時使用 「わざわざエンドポイントを 分けるってめんどくさくない? 二つのバージョンのサービスを 用意しておけばいいじゃん 時間が出来たら移行しよう」
  56. 56. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.5 複数のサービスバージョンの同時使用
  57. 57. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.5 複数のサービスバージョンの同時使用 古いコンシューマのトラフィックを 旧バージョンにルーティングし 新しいバージョンのトラフィックを 新バージョンにルーティングする
  58. 58. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.5 複数のサービスバージョンの同時使用 でも これはアンチパターン
  59. 59. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.5 複数のサービスバージョンの同時使用 サービス内の内部のバグを修正する必要があると 2つを直さなくちゃいけなくて大変 振る舞いをミドルウェアのどこかか 一連のnginxスクリプトに 配置しなければいけなくなるので システムの振る舞いを検証するのが大変 データが旧バージョンと新バージョンの どちらで作られたものかがわからない
  60. 60. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.5 複数のサービスバージョンの同時使用 サービス内の内部のバグを修正する必要があると 2つを直さなくちゃいけなくて大変 振る舞いをミドルウェアのどこかか 一連のnginxスクリプトに 配置しなければいけなくなるので システムの振る舞いを検証するのが大変 データが旧バージョンと新バージョンの どちらで作られたものかがわからない コードベースを 分岐させるのはやめよう。 (http://12factor.net/ja/)
  61. 61. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.5 複数のサービスバージョンの同時使用 サービス内の内部のバグを修正する必要があると 2つを直さなくちゃいけなくて大変 振る舞いをミドルウェアのどこかか 一連のnginxスクリプトに 配置しなければいけなくなるので システムの振る舞いを検証するのが大変 データが旧バージョンと新バージョンの どちらで作られたものかがわからない
  62. 62. ポステルの法則を理解して耐性のあるリーダー (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
  63. 63. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.5 複数のサービスバージョンの同時使用 ローリングメンテナンス http://www.itmedia.co.jp/im/articles/ 0701/26/news124.html みたいに、数分や数時間だけバージョンを 共存させることはありますよね。
  64. 64. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.5 複数のサービスバージョンの同時使用 Netflixでも古いコンシューマを変更するコスト が高すぎる場合、特にレガシーデバイスがまだ APIの旧バージョンに縛られている場合に備えて 「慎重に」利用している。
  65. 65. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 と 4.13.5を比べてみよう 4.13.4
  66. 66. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 と 4.13.5を比べてみよう 4.13.4 エンドポイントは 複数のバージョンに対応しているが、 裏のロジックは1つ。 古いバージョンのリクエストを受け取ったエンド ポイントは、新しいバージョンの形式に変換して から裏のロジックに流す。
  67. 67. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 と 4.13.5を比べてみよう 4.13.5
  68. 68. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13.4 と 4.13.5を比べてみよう 4.13.5 エンドポイントのみならず、 裏のロジックも新旧存在する。 つまり、アプリケーションそのものが 2つある状態。
  69. 69. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします バージョンのお話はここまで!
  70. 70. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします 4.13 バージョニング 説明したこと •コンシューマ(クライアント)の心持ち •サービスの心持ち •バージョンの意味付け •サービスのバージョンアップ方法
  71. 71. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします ディスカッションします?
  72. 72. ポステルの法則を理解して耐性のあるリーダー (Tolerant Readers)をつかって破壊的変更を避け、 バージョンが必要ないようにします •現場で「バージョンが必要ないように」って実 現してますか? •まだしてないひとは、どうすればいいと思いま すか? •サービスとコンシューマ間の情報共有で何か工 夫してますか?
  73. 73. 4.16 まとめ 4章で言いたいこと •いかなる代償を払ってもデータベース統合を避けます •RESTとRPCとの間のトレードオフを理解し、RESTをリクエス ト / レスポンス統合の優れた出発点と積極的にみなします •オーケストレーションよりもコレオグラフィを選びます •ポステルの法則を理解して耐性のあるリーダー(Tolerant Readers)をつかって破壊的変更を避け、バージョンが必要 ないようにします •ユーザインターフェースを合成レイヤと考えます
  74. 74. ユーザインターフェースを合成レイヤと考えます について書いてあるのが
  75. 75. 後半のもくじ 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク 4.12 参照によるアクセス 4.13 バージョニング 4.14 ユーザインターフェース 4.15 サードパーティーソフトウェアとの統合 4.16 まとめ
  76. 76. ユーザインターフェースを合成レイヤと考えます 4.14 ユーザインターフェース すべてのマイクロサービスを 顧客が理解できるものにまとめる場所
  77. 77. ユーザインターフェースを合成レイヤと考えます 4.14 ユーザインターフェース 前まで GET / POST経由でサーバ側で処理。 サーバ側プログラムがページ全体を描画して クライアントブラウザに送信。 クライアントブラウザは少しの処理しかしない。
  78. 78. ユーザインターフェースを合成レイヤと考えます 4.14 ユーザインターフェース 最近 JavaScriptがもろもろやってくれる。
  79. 79. ユーザインターフェースを合成レイヤと考えます 4.14.1 デジタルへ向けて 最近は、 Web・モバイル・デスクトップアプリケーション・ ウェアラブル端末など、 いろんな媒体でWebサイトが見られている。
  80. 80. ユーザインターフェースを合成レイヤと考えます 4.14.1 デジタルへ向けて 顧客がどのように対話するか 正確には予測できない かつ デバイスによって 見たいコンテンツも違う
  81. 81. ユーザインターフェースを合成レイヤと考えます 4.14.1 デジタルへ向けて そこで、ユーザインターフェースを 合成レイヤだと考える。 提供するさまざまな機能を 組み合わせる場所
  82. 82. ユーザインターフェースを合成レイヤと考えます 4.14.1 デジタルへ向けて そこで、ユーザインターフェースを 合成レイヤだと考える。 提供するさまざまな機能を 組み合わせる場所
  83. 83. ユーザインターフェースを合成レイヤと考えます 4.14.2 制約 でも、ユーザインターフェースって いろんな種類があるから、 ただまとめればいいわけでもないですよね?
  84. 84. ユーザインターフェースを合成レイヤと考えます 4.14.2 制約 たとえば、それぞれのデバイスの使い方は タブレットでは右クリックできない スマホでは親指だけで操作したい みたいに。
  85. 85. ユーザインターフェースを合成レイヤと考えます 4.14.2 制約 たとえば、それぞれのデバイスの使い方は タブレットでは右クリックできない スマホでは親指だけで操作したい みたいに。
  86. 86. ユーザインターフェースを合成レイヤと考えます 4.14.2 制約 中核のサービスは同じでも それぞれのインターフェースがもつ制約に サービスを適用させる必要がある。
  87. 87. ユーザインターフェースを合成レイヤと考えます じゃあ、どういう風に webサイトを作っていけば いいんでしょう?
  88. 88. ユーザインターフェースを合成レイヤと考えます じゃあ、どういう風に webサイトを作っていけば いいんでしょう? ※いろんなサイトを例に出したりしますが 「そうじゃないぞ!!!」 という方(中の人とか)がいたら 教えてください。。。
  89. 89. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 まずはよくあるサイトの作り方 UIにAPI呼び出しを行わせて すべてをUIコントロールにマッピングする
  90. 90. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成
  91. 91. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  92. 92. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない P81 段落1つめ
  93. 93. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない P81 段落2つめ
  94. 94. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない P81 段落3つめ
  95. 95. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  96. 96. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない。 •小さな変更でも、複数のチームに変更リクエストをお こなわないといけなくなる。 •サービスの担当者たちはサービスのユーザへの見せ方 に関わらない。
  97. 97. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「サービス変更したからUI もあわせて変更して!」 UI担当者「はーい」
  98. 98. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「サービス変更したからUI もあわせて変更して!」 UI担当者「はーい」 レコメンデーションサービス担当者「サービス 変更したからUIもあわせて変更して!」
  99. 99. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「サービス変更したからUI もあわせて変更して!」 UI担当者「はーい」 レコメンデーションサービス担当者「サービス 変更したからUIもあわせて変更して!」 UI担当者「いま顧客サービスの方を修正してい るから。。。」
  100. 100. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「サービス変更したからUI もあわせて変更して!」 UI担当者「はーい」 レコメンデーションサービス担当者「サービス 変更したからUIもあわせて変更して!」 UI担当者「いま顧客サービスの方を修正してい るから。。。」 レコメンデーションサービス担当者「こっちの 方が急いでるんだけど…。」
  101. 101. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「サービス変更したからUI もあわせて変更して!」 UI担当者「はーい」 レコメンデーションサービス担当者「サービス 変更したからUIもあわせて変更して!」 UI担当者「いま顧客サービスの方を修正してい るから。。。」 レコメンデーションサービス担当者「こっちの 方が急いでるんだけど…。」
  102. 102. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 つらい
  103. 103. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「この項目の桁数を変えよ うと思う。画面への影響ないか確認して。」
  104. 104. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「この項目の桁数を変えよ うと思う。画面への影響ないか確認して。」 web UI担当者「わかったよ。」 モバイル UI担当者「わかったよ。」
  105. 105. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「この項目の桁数を変えよ うと思う。画面への影響ないか確認して。」 web UI担当者「わかったよ。」 モバイル UI担当者「わかったよ。」 顧客サービス担当者「リリースしたいんだけど 確認おわった?」
  106. 106. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「この項目の桁数を変えよ うと思う。画面への影響ないか確認して。」 web UI担当者「わかったよ。」 モバイル UI担当者「わかったよ。」 顧客サービス担当者「リリースしたいんだけど 確認おわった?」 web UI担当者「終わった」 モバイル UI担当者「まだだよ。」
  107. 107. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「この項目の桁数を変えよ うと思う。画面への影響ないか確認して。」 web UI担当者「わかったよ。」 モバイル UI担当者「わかったよ。」 顧客サービス担当者「リリースしたいんだけど 確認おわった?」 web UI担当者「終わった」 モバイル UI担当者「まだだよ。」 リリースできない
  108. 108. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 顧客サービス担当者「この項目の桁数を変えよ うと思う。画面への影響ないか確認して。」 web UI担当者「わかったよ。」 モバイル UI担当者「わかったよ。」 顧客サービス担当者「リリースしたいんだけど 確認おわった?」 web UI担当者「終わった」 モバイル UI担当者「まだだよ。」
  109. 109. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 つらい
  110. 110. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成
  111. 111. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  112. 112. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない。
  113. 113. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成
  114. 114. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 1つの画面を表示するために 3つのサービスを 呼び出さないといけない ❶ ❷ ❸
  115. 115. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  116. 116. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  117. 117. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 たとえば(1) ヘルプデスクアプリではWeb画面で見る 顧客記録を全部見たい 移動店舗ではモバイルアプリで見る 店舗で買ったことがある顧客記録だけ見たい
  118. 118. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 たとえば(2) http://qiita.com/api/v2/docs#ユーザ レスポンスでいろんな情報が返ってくる web画面で見るならいいけど スマホで見るときはここまで情報はいらないかも
  119. 119. ユーザインターフェースを合成レイヤと考えます 4.14.3 API合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  120. 120. ユーザインターフェースを合成レイヤと考えます では、欠点を補うためには どうしていけばいいでしょう
  121. 121. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  122. 122. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 サービスにUIの部品を直接提供させ その部品を集めてUIを作成する
  123. 123. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 UIコンポーネント
  124. 124. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 たとえば http://syobochim.hatenablog.com/ twitterのところがwidgetになっている
  125. 125. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 たとえば http://syobochim.hatenablog.com/ twitterのところがwidgetになっている 急遽つけたので、 かなり雑です。。。
  126. 126. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 たとえば http://syobochim.hatenablog.com/ twitterのところがwidgetになっている デザインを決めているのは ブログの管理者でもはてなさんでもなく twitter!
  127. 127. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 たとえば http://syobochim.hatenablog.com/ twitterのところがwidgetになっている デザインを決めているのは ブログの管理者でもはてなさんでもなく twitter! widget系が多い。 このモデルを適用しているサイトは少ない
  128. 128. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 サービスを変更するチームが UI部品の変更も行う
  129. 129. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 サービスを変更するチームが UI部品の変更も行う ➡ 変更をすぐに公開できる
  130. 130. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 ただし、注意があります
  131. 131. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 ユーザエクスペリエンス(ユーザ体験)を 他のサービスと一貫させないと 使いにくくなっちゃう。
  132. 132. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 ユーザエクスペリエンス(ユーザ体験)を 他のサービスと一貫させないと 使いにくくなっちゃう。 「えっ、この部品は更新するために 下にスクロールすればいいのに、 こっちの部品は更新ボタンを押すのか。。。」
  133. 133. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 ユーザエクスペリエンス(ユーザ体験)を 他のサービスと一貫させないと 使いにくくなっちゃう。 「えっ、この部品は更新するために 下にスクロールすればいいのに、 こっちの部品は更新ボタンを押すのか。。。」 わかりにくい!!!!
  134. 134. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 そういうのを回避するために リビングスタイルガイド を作りましょう
  135. 135. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 そういうのを回避するために リビングスタイルガイド を作りましょう HTMLやCSS、画像といった資産を共有してある程 度の一貫性を持たせる http://getbootstrap.com/javascript/ 動くものがあると簡単にイメージを共有できる
  136. 136. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 解決できるか確信が持てない大きな課題
  137. 137. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 解決できるか確信が持てない大きな課題 サービスが提供する機能が ウィジェットやページに きちんと収まらないことがある。
  138. 138. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 解決できるか確信が持てない大きな課題 サービスが提供する機能が ウィジェットやページに きちんと収まらないことがある。 対話の形式が横断的になるほど このモデルが当てはまる場合が少なくなり 単なるAPI呼び出しに戻る場合がある
  139. 139. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 こういうことが苦手 ゼクシィは 需要がタブごとに別れている http://zexy.net/ (タブを各サービスとする)
  140. 140. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 こういうことが苦手 ゼクシィは 需要がタブごとに別れている http://zexy.net/ (タブを各サービスとする) サイトの右上の検索機能を使うと 各サービスを混合した結果が出てくる (対話の形式が横断的)
  141. 141. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  142. 142. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  143. 143. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  144. 144. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない でもこのふたつは 解消できていない
  145. 145. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない 『4.14.5 フロントエンド向けのバック エンド(BFF)』はここの二つの話
  146. 146. ユーザインターフェースを合成レイヤと考えます 4.13.4 UI部品合成 この方法の3つの欠点 •サービスの作成者とユーザインターフェース の作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  147. 147. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) サーバ側集約エンドポイントの APIゲートウェイを用意する! https://www.ogis-ri.co.jp/otc/hiroba/ others/SilliconValley5/
  148. 148. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF)
  149. 149. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) APIゲートウェイで サービスを順番に呼び出して 結果を組み合わせる
  150. 150. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) APIゲートウェイで サービスを順番に呼び出して 結果を組み合わせる サーバとの通信が一回で済む
  151. 151. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) https://twitter.com/kawasima/status/ 753483914954485761 APIゲートウェイで サービスを順番に呼び出して 結果を組み合わせる サーバとの通信が一回で済む
  152. 152. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) AWSにも API Gateway管理サービスがある http://docs.aws.amazon.com/ja_jp/ apigateway/latest/developerguide/ welcome.html
  153. 153. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) でも サーバ側エンドポイントの振る舞いが 多くなりすぎたとき 大惨事になることがある
  154. 154. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) でも サーバ側エンドポイントの振る舞いが 多くなりすぎたとき 大惨事になることがある 全てのサービス向けの 1つの巨大なレイヤをもつのは 影響が大きくなりすぎるので問題
  155. 155. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) たとえば 一つのサービスに破壊的変更があったとき ブラウザもモバイルもネイティブアプリも すべてのクライアントに影響が出ちゃう APIゲートウェイ自体が死んだ時の影響も すごく大きい
  156. 156. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) この方法の3つの欠点 •サービスの作成者とユーザインターフェースの 作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  157. 157. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) この方法の3つの欠点 •サービスの作成者とユーザインターフェースの 作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  158. 158. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) この方法の3つの欠点 •サービスの作成者とユーザインターフェースの 作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  159. 159. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) この方法の3つの欠点 •サービスの作成者とユーザインターフェースの 作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  160. 160. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) BFF(フロントエンド向けのバックエンド) Backends For Frontends http://samnewman.io/patterns/architectural/ bff/
  161. 161. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF)
  162. 162. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) ここが分かれた
  163. 163. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) サーバーに組み込まれた ユーザインターフェースの部品
  164. 164. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) 各デバイスごとの表示を 細かくわけましょう!
  165. 165. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) デバイスごとに表示を変えることができる たとえばGoogle
  166. 166. ユーザインターフェースを合成レイヤと考えます
  167. 167. ユーザインターフェースを合成レイヤと考えます
  168. 168. ユーザインターフェースを合成レイヤと考えます
  169. 169. ユーザインターフェースを合成レイヤと考えます
  170. 170. ユーザインターフェースを合成レイヤと考えます 検索結果がwebとスマホで 少し違う
  171. 171. ユーザインターフェースを合成レイヤと考えます 検索結果がwebとスマホで 少し違う ➡ 「スマホ対応」のサイトを優先
  172. 172. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) 特定のユーザエクスペリエンスの提供に 特化した振る舞いだけを管理すること。 さもないと 入り込むべきではないロジックが 入り込む恐れがある。
  173. 173. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) この方法の3つの欠点 •サービスの作成者とユーザインターフェースの 作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  174. 174. ユーザインターフェースを合成レイヤと考えます 4.14.5 フロントエンド向けのバックエンド(BFF) この方法の3つの欠点 •サービスの作成者とユーザインターフェースの 作成者が違う •通信が多くなる可能性がある •デバイスごとにレスポンスを調整できない
  175. 175. ユーザインターフェースを合成レイヤと考えます 4.14.6 ハイブリッド手法 Webサイトは部品ベースの組み立てをして モバイルアプリケーションはBFFを使う という企業もある。 ユーザに提供する基盤となる機能の 凝集性を維持することが必要
  176. 176. ユーザインターフェースを合成レイヤと考えます 4.14.6 ハイブリッド手法 https://www.thoughtworks.com/insights/blog/ bff-soundcloud ちなみに 「4.15.5 ストラングラー(絞め殺し)パターン」 についても書いてる
  177. 177. ユーザインターフェースを合成レイヤと考えます 4.14.6 ハイブリッド手法 4.15.5 ストラングラー(絞め殺し)パターン http://bliki-ja.github.io/ StranglerApplication/
  178. 178. ユーザインターフェースを合成レイヤと考えます 4.14.6 ハイブリッド手法 4.15.5 ストラングラー(絞め殺し)パターン http://bliki-ja.github.io/ StranglerApplication/ 昔からやっている 「古いシステムを徐々に新しいシステムに 移行していきましょうね」 のかっこいい言い方
  179. 179. ユーザインターフェースを合成レイヤと考えます 4.14.6 ハイブリッド手法 4.15.5 ストラングラー(絞め殺し)パターン 古いシステムへの呼び出しを インターセプトする。 呼び出しを既存のシステムに ルーティングするか 自分で記述した新しいコードに向けるかを 判断できる。
  180. 180. ユーザインターフェースを合成レイヤと考えます 4.14.6 ハイブリッド手法 でも、ハイブリッドよりも。。。 BFFで作った層とクライアントで 同じ言語、同じ実装で動かす isomorphic https://speakerdeck.com/koichik/isomorphic- survival-guide
  181. 181. ユーザインターフェースを合成レイヤと考えます 4.14 ユーザインターフェース おはなししたこと •API合成 •UI部品合成 •APIゲートウェイ •BFF(フロントエンド向けのバックエンド) •ハイブリッド手法 •isomorphic
  182. 182. ユーザインターフェースを合成レイヤと考えます 4.14 ユーザインターフェース ではディスカッションタイム! •いま紹介した手法のどれかをつかっていますか? •いま業務で作っているサービスはどの手法を当 てはめればいいと思いますか?
  183. 183. 4.16 まとめ 4章で言いたいこと •いかなる代償を払ってもデータベース統合を避けます •RESTとRPCとの間のトレードオフを理解し、RESTをリクエス ト / レスポンス統合の優れた出発点と積極的にみなします •オーケストレーションよりもコレオグラフィを選びます •ポステルの法則を理解して耐性のあるリーダー(Tolerant Readers)をつかって破壊的変更を避け、バージョンが必要 ないようにします •ユーザインターフェースを合成レイヤと考えます
  184. 184. 4.16 まとめ まとめに関する説明が終わったのですが ここ話してないです。 •4.11 マイクロサービスの世界におけるDRY とコード再利用性のリスク •4.12 参照によるアクセス •4.15 サードパーティソフトウェアとの統合 (4.15.5 ストラングラーパターンは話しましたが…)
  185. 185. 4.16 まとめ まとめに関する説明が終わったのですが ここ話してないです。 •4.11 マイクロサービスの世界におけるDRY とコード再利用性のリスク •4.12 参照によるアクセス •4.15 サードパーティソフトウェアとの統合 それぞれ、さらっと話ていきます!
  186. 186. 4.16 まとめ •4.11 マイクロサービスの世界におけるDRY とコード再利用性のリスク •4.12 参照によるアクセス •4.15 サードパーティソフトウェアとの統合
  187. 187. 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク DRY (Don't Repeat Yourself) コードの重複を避けるようにすること
  188. 188. 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク DRY (Don't Repeat Yourself) コードの重複を避けるようにすること システムの振る舞いと 知識の重複を回避すること
  189. 189. 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク 重複コードを抽象化して 複数の箇所から呼び出すような 共通ライブラリを作成する
  190. 190. 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク マイクロサービスとコンシューマを 過度に結合すると危険! マイクロサービスの小さな変更が コンシューマへの不要な変更を 引き起こしてしまうかも…!
  191. 191. 変更したよ!
  192. 192. 変更したよ! やったー!
  193. 193. 変更したよ! やったー! えっ えっ えっ
  194. 194. 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク 共有コードをサービス境界外で使うと 結合の可能性を招きます ログライブラリなど、 外部から見えないものはOK
  195. 195. 4.11 マイクロサービスの世界における DRYとコードの再利用のリスク 一つのマイクロサービス内ではDRYを やぶらないけど すべてのサービスに渡るDRYの違反には 寛大になろう!!! DRY違反よりもサービス間の結合の方が 害があるよ
  196. 196. 4.11.1 クライアントライブラリ ただし、一部の共通的な処理は それぞれのサービスで実装するのではなく クライアントライブラリで共通化すると 制御が簡単になることもある。
  197. 197. 4.11.1 クライアントライブラリ Netflixのクライアントライブラリ https://github.com/Netflix/ribbon サービスの検出・故障モード・ロギング など 実際のサービス自体の性質とは 関係ないところに対処する
  198. 198. 4.16 まとめ •4.11 マイクロサービスの世界におけるDRY とコード再利用性のリスク •4.12 参照によるアクセス •4.15 サードパーティソフトウェアとの統合
  199. 199. 4.12 参照によるアクセス ドメインエンティティに関する情報を 渡す方法について
  200. 200. 4.12 参照によるアクセス
  201. 201. 4.12 参照によるアクセス
  202. 202. 4.12 参照によるアクセス あるタイミングの 顧客データ
  203. 203. 4.12 参照によるアクセス
  204. 204. 4.12 参照によるアクセス ここの 顧客データは 最新なの?
  205. 205. 4.12 参照によるアクセス 他のサービスから 更新されているかも
  206. 206. 4.12 参照によるアクセス じゃあどうすればいいの?
  207. 207. 4.12 参照によるアクセス
  208. 208. 4.12 参照によるアクセス
  209. 209. 4.12 参照によるアクセス 実際に使う タイミングで 情報をとる
  210. 210. 4.12 参照によるアクセス
  211. 211. 4.12 参照によるアクセス 変更が入っても 平気!
  212. 212. 4.12 参照によるアクセス 常に顧客サービスにアクセスして 特定のCustomerに関連する情報を 調べていると 顧客サービスの負荷が大きくなりすぎる 情報が新しいと考えられる期間を知らせると キャッシングを大いに活用して 負荷を減らせる
  213. 213. 4.16 まとめ •4.11 マイクロサービスの世界におけるDRY とコード再利用性のリスク •4.12 参照によるアクセス •4.15 サードパーティソフトウェアとの統合
  214. 214. 4.15 サードパーティソフトウェアとの統合 自分では制御できないシステムに 対する統合
  215. 215. 4.15 サードパーティソフトウェアとの統合 自分では制御できないシステムに 対する統合 •Excel(オフィス生産性ツール) •OS •給与システム など わざわざ構築するのはしんどい
  216. 216. 4.15 サードパーティソフトウェアとの統合 4.15.1 制御の欠如 ツールの拡張に使えるプログラミング言語は 提供ベンダによる 統合とカスタマイズの作業を チームに取り戻すことが大切
  217. 217. 4.15 サードパーティソフトウェアとの統合 4.15.2 カスタマイズ カスタマイズが可能なツールもある でも カスタマイズのコストは 新規に構築するよりも 高くなってしまう場合があるので注意
  218. 218. 4.15 サードパーティソフトウェアとの統合 4.15.2 カスタマイズ 複雑なカスタマイズをするよりも 組織のやり方を変更する方が 理にかなっている
  219. 219. 4.15 サードパーティソフトウェアとの統合 4.15.3 統合スパゲティ ツールとの統合方法も課題 サービス間の統合方法を 入念に検討することが重要
  220. 220. 4.15 サードパーティソフトウェアとの統合 4.15.4 思い通りにする 自分が制御するプラットフォーム上で 全てのカスタマイズを行い ツール自体を使うコンシューマの数を 制限することで 状況を自分の思い通りにする
  221. 221. 持ってないひとは是非!
  222. 222. ありがとうございました

×