マイクロサービスアーキテクチャを読んだ。
オライリージャパン
売り上げランキング: 5,636
所感としては、カバー範囲が意外と広範囲だったのと、日本で流行っているものとUSで流行っているものの違いのおかげか、知らないプロダクトや技法などについて書いてあって勉強になった。 パラパラと読んでしまったので、もう1度読んで深掘りしたいかもしれない。
以下、ハイライトしてた文章を引用。すでに自分が知ってたり、考えたことがあったものについてはハイライトしてない。
- いろいろな意味で、マイクロサービスに分解したい既存のコードベースがある方が、最初からマイクロサービスに取り組むよりはるかに簡単です。
- 組織に存在する境界づけられたコンテキストについて考える際、共有するデータの観点ではなく、そのコンテキストが残りのドメインに提供する機能について考えるべきです。
- データについて考えると、貧血症のCRUDベースのサービスとなるのを何度も見ています
- ドメインモデル貧血症: http://bliki-ja.github.io/AnemicDomainModel/
- 1つのマイクロサービス内ではDRYを破らないけれども、すべてのサービスにわたるDRYの違反には寛大に対処します。
- オーケストレーションでは、オーケストラの指揮者のように中枢部に頼ってプロセスを推進します。コレオグラフィでは、バレエで周りの動きに合わせて自分音動きを決めるダンサーのように、システムの各部分にジョブを知らせ、詳細に対処させます。
- コレオグラフィ手法では、代わりに顧客サービスに非同期でイベントを発行させ、「顧客を作成した」と通知することができます。それぞれのサービスはイベントをサブスクライブし、適切に対応します。この手法の方が大幅に分離されます。
- 一般に、コレグラフィ手法に向かう傾向が強いシステムの方が、疎結合で柔軟性があり、変更を受け入れることがわかっています。しかし、システム境界にまたがるプロセスの監視と追跡には追加の作業が必要です。最も重いオーケストレーション実装は極めて脆弱であり、変更のコストが高くなることがわかっています。その点を考慮して、私は断然コレオグラフィシステムを目指します。
- 一方、非同期のイベント連携はコレオグラフィ手法を採用にするのに役立ち、大幅に分離されたサービスを生み出せます。これは、サービスを独立して利リリースできるようにするために追求したい形態です。
- 多くのRPC実装は隠し過ぎています。最悪の例では、抽象化があまりにも不透明な場合、開発者がそうと知らずにリモート呼び出しを使っていることもあります。
- RESTで導入された、クライアントとサーバとの間の結合を避けるのに役立つ原則がもう1つあります。アプリケーション状態エンジンとしてのハイパーメディア(HATEOAS: Hypermedia As The Engine Of Application State)の概念です。
- 欠点としては、クライアントがリンクをたどって実行したい操作を探す必要があるため、コントロールの異動では呼び出しが多くなります。結局、これはトレードオフです。
- ワーカは競合コンシューマ(Competing Consumers)パターンを使い、処理するメッセージがなくなるまで各ワーカができるかぎり速くメッセージを取得していました。
- ワーカが停止すると、リクエストのロックがタイムアウトし、リクエストがキューに戻されます。結局、別のワーカがそのリクエストを引き受けて停止するだけです。これは Martin Flower が「壊滅的フェイルオーバー」(Catastrophic Failover) と読んだ典型的な例でした。
- 私が気に入っており、適切に機能しているのを見たことがあるモデルは、図4-10に示すようにこのようなバックエンドの仕様を特定のユーザインタフェースやアプリケーションに制限する方法です。このパターンは BFF: Backends for Frontends と呼ばれることもあります。
- 補足: APIゲートウェイについて語っていて、デバイスの種別ごとに(モバイル、ウェブなど)ゲートウェイを作るのが良いと言っている
- そもそもとしてゲートウェイが必要なのは、複数のAPIリクエストを1つに束ねるなどしたいため
- BFFには、特定のユーザエクスペリエンスの提供に特化した振る舞いだけを追加すべきです。
- バックエンドが使うさまざまな機能のビジネスロジックは、サービス自体の中にとどまるべきです。
- ファサードサービスを使って基盤となる大きく恐ろしいCRM(Salesforceのような)を隠す
- 基盤となるCRMを移行できるようにしておく
- ストラングラーアプリケーションパターン(絞め殺しアプリケーションパターン)が便利です。CMSシステムの手前に自らのコードを配置する例と同様に、ストラングラーでは古いシステムへの呼び出しを補足してインターセプトします。これにより、呼び出しのを既存のレガシーコードにルーティングするか、自分で記述した新しいコードに向けるかを判断できます。
- 合成監視
- 補足: ピタゴラスイッチ的なシステムの end-to-end な監視。テストジョブをエンキューして期待通りに最後まで処理が行くか
- フィーチャーチームとは、小規模なチームが一連の機能開発を推進し、たとえコンポーネント(さらにはサービス)境界を超えても、必要なすべての機能を実装するという考え方です。
- 複数の異なるチームにまたがる変更を調整するという課題を避けられます
- しかし、サービス管理者の役割はずっと複雑です。
- たとえ制御できたとしても、ほとんど制御できないキャッシュが1つあります。それはユーザのブラウザのキャッシュです。
- 補足: Expires: Never を食わせてしまい、URLを変えるしかなかった事案が紹介されていた
- サーキットブレーカー: 下流リソースへの特定の数のリクエストが失敗すると、サーキットブレーカーが落ちます。サーキットブレーカーが落ちている間は、すべてのリクエストがすぐに失敗します。特定の時間の経過後、クライアントはリクエスト送信して下流サービスが復旧しているかを確認し、十分に健全なレスポンスを得たら、サーキットブレーカーをリセットします。
- システムに分断耐性がなければ、ネットワーク上で動作できません。つまり、ローカルで動作する単一プロセスにならざるを得ません。CAシステムは分散システムでは存在しません。
- swaggerでサービスの文書化
- Consumer Driven Contract
- Chaos Monkey
- Suro
- Riemann - Distributed Monitoring System