AWS Summit Tokyo 2016 / 聴講メモ / クラウド時代のソフトウェアアーキテクチャ

## ■概要
* クラウドネイティブで検討すべき、現実的に検討可能なソフトウェアアーキテクチャについて

## ■登壇者
* 西谷 圭介さん（アマゾン ウェブ サービス ジャパン株式会社 技術本部 ソリューションアーキテクト）
	* [AWSで実現するクラウドネイティブなアプリ開発のポイント](http://www.slideshare.net/keisuke69/aws-58452190) の方

## ■クラウド時代とは？
* 今まで
	* これまで通りでもおk
	* 既存を持ってくること自体は難しくない
* でも
	* クラウドの価値を活かせてない
	* スケーラビリティの恩恵
	* そのままでは享受できない
* 特徴は？
	* 障害を前提としたデザイン
	* etc...

## ■The Twelve-Factor App
* モダンなWebアプリ開発のための方法論
* 「クラウド」とは直接的に関連しないが一読を
* 概要
	* Codebase: バージョン管理されているコードベースと1対1であるべき
	* Dependency: 依存関係を明示的に宣言し分離する。環境に依存しない
	* Config: OSレベルの環境変数で設定すべき
	* ...
	* Process: ステートレスなプロセスとして実行する。プロセス間で何も共有しない
	* Concurrency: スケールの単位はプロセスであるべき。スレッドダメ
	* ...
	* Disposability; 破棄容易性: 高速起動とグレースフルシャットダウン
	* Dev/prod parity: 開発、ステージング、本番環境をできるだけ一致させた状況を保つ

## ■Microservice
* クラウドと相性が良い
* Hexagonal Architecture
	* Port & Adapters
		* 特定のポートに届いたイベントをアダプター etc ... (ry
		* e.g.
			* DBのアダプター: モックに入れ替え容易
* Microservice: 9つのポイント
	* サービスを単一のアプリケーションではなく、小さなサービスの組み合わせで構築する
	* 各サービスは独立、単一でデプロイと実行が可能
	* 技術的な境界で分割するのではなく、ビジネスの遂行能力で分割する
	* サービスとビジネスの境界を一致させる(技術の観点ではない
	* サービス間のコミュニケーションは軽量な手段を利用する(REST)
* Microservice: 利点
	* Monolithicなシステムからの解放
	* 単体でデプロイ・実行可能であるため、ここのサービスで自由にスケールすることが可能
	* パラレルな開発とデプロイ
	* 各サービスで独立性の高い実装が可能(言語、DBなど全てで同じものを使う必要がない。最適化すればよい(Polyglot Persistance
	* サービス間は独立しているため、個々の可用性の問題が全体に影響しない
	* ビジネス上の境界とより密接にアラインされる
* Polyglot Persistance
	* 例
		* 検索 => Elasticsearch / solr
		* ソーシャルデータ => グラフDB

## ■開発サイクル
* Monolithicな開発サイクル
	* developers - services が delivery pipelineでシリアライズされてしまう
* Tow Pizza Rule: チームの単位はピザ2枚分くらいが良い
	* 作るものに対する全てを負う
		* 開発計画(ロードマップ)
		* 開発
		* 運用
		* サポート
	* You build it, you run it.
	* DevOps
* Microserviceな開発サイクル
	* developers - services - delivery pipelineがパラレル

## ■アプリケーションの実装パターン
* いつくかの典型パターンがある
* どのやりかたが許容できるかはチームで考えること
* 最初に選んだやり方を最後まで貫く必要はない
* それは
	* Graceful Degradation
		* 500エラーは返さない
		* 一部に障害やエラーがあっても全体の停止を引き起こさせず、その他の機能は有効に機能させる
		* 最悪な例
			* "Error establishing a database connetion."
	* Throttling
		* 内部サービスによる偶発的なDoSが引き起こされるこはよくある問題
		* リクエストに対するスロットリングが基本的な防御方法
		* (ry
	* Fail Silently
		* エラーを内部的に処理した上で、ユーザには成功を示すレスポンスを返す
			* (ry
	* Static Fallback
		* エラー時には何かの静的なコンテンツを返す
	* Retry
		* 失敗は一時的なものが多いのでシンプルにリトライすることで成功することが多い
		* (ry
		* Exponetial back off もしくはフィボナッチ数列を利用したりリトライの間隔を調整する
	* Caching
		* サービス呼び出し...(ry
	* Circuit Breaker
		* 発生したエラー数を記録し、閾値を超えたときにフォールバックプランを実行する
		* (ry
	* Concurrency
		* (ry
	* Smooth Internal Traffic
		* キューの利用
		* スパイク的な負荷を吸収

## ■Microserviceの考慮点
* Microserviceの考慮点
	* 分散した複数のコンポーネントを扱うことの難しさ
	* コンポーネント間のメッセージの増加によるレイテンシ増
	* トランザクションの取り扱い: プロダクトが小さいフェーズはモノリシックが良いかも
	* (ry
* トランザクション
	* MicroserviceではかくサービスがそれぞれDBを保つ
	* (ry
* イベントベースなアーキテクチャ
	* いわゆる「結果整合性」の導入
	* 各サービスは状態の変化に合わせてイベントを発行する
	* (ry
* Event Sourcing
	* 「状態」を記録するのではく状態の変更という「イベント」を記録する
		* 「イベント」は追加のいmで普遍
	* (ry
* CQRS
	* コマンドクエリ責務分離
		* システムの更新処理と参照処理の明確に分離
		* 更新処理 = 副作用あり、参照処理 = 副作用なし
* RESTful な API
	* リソース思考
		* 時間、条件によって「状態」は変わるがその意味は変わらない「東京の天気」
	* URIによるリソース識別
	* ステートレス
		* リクエストの全て。。
		* ハンバーガーショップの例
			* 冗長になるが、スケーラブル(店員が変わっても良い)
	* HTTPメソッドによる...
* HTTPステータスコード
	* 意味のあるコードを必ず返す

## ■AWSではどうなる？
* 4パターンのモデル
* インフラはなんでも良い
* 満たすべき重要な要素、自動化、自動化のためのAPI

## ■まとめ
* とにかくスケーラブルに
* 方法論は適宜選択すること
* Microserviceはオーバヘッドなどをよく検討すること
* アーキテクチャの話であるが、Microserviceはビジネスや組織と切り離せない

---
※当日の生メモです(ほぼ校正していませんm(_ _)m
※登壇者の方の情報など一部 http://www.awssummit.tokyo/devcon/index.html から引用させて頂きました