skillup

技術ブログ

アーキテクト設計全般

マイクロサービスについて

投稿日:2020年8月22日 更新日:

マイクロサービスについて勉強したので少しメモを。

参考文献

Software Design 「2020年1月」

マイクロサービスとは?

ものすごくざっくりいうと一つのアプリケーションを細かく分割することで、各機能を疎結合にし、保守性を向上させようという設計思想だと思います。

一般のアプリでもクラスを設計する際に、このような考え方(疎結合や分離)などをするかと思いますが、マイクロサービスとはアプリ自体を分割してしまうことですね。

Webアプリって基本的には機能がどんどん追加されるので、何も考えずにおくと機能がとんでもなく膨らんじゃうんですよね・・・

で、気付いた時には依存度が高くて、修正が行えなかったり、使わなくなっている機能とかが山のようにあったりします。

そのような場合にこのような設計思想があるとサービスの企画・開発・運用などをよりスピーディーに行うことができるようになります。

具体例

フロントエンドとバックエンド

一番わかりやすいのはフロントとバックエンド(サーバーサイド)の分離ですかね。昨年ぐらいの現場でよくあったのですが、サーバーサイドは基本的に全てRESTAPIをJSONで返し、フロントはそれをレンダリングするというパターンですね。

これも通常のMVCパターンで密結合なものを切り分けているという点でサービスの分離と言えるでしょう。このようにしておけば、バックエンド自体は別のサービスにも使えるので。

非同期的なキューがらみの処理

直近の現場でよく使っていた技術がこれです。後述しますが、非同期的なものというのはマイクロサービス化しやすい特徴があるかと思います。同期的なものでなければ非同期化することにより、サービスの結合度を弱めやすいという特徴があります。

マイクロサービス化しやすいもの

一般的には下記のような特徴を持つものがマイクロサービス化しやすいかと思われます。

  • 設計上分離がしやすいもの(フロントとサーバーサイド)
  • 非同期的な処理のもの
  • 処理の独立性が高いもの(理想を言えばDBなども独立しているものの方が良いようです)
  • その他、業務上の独立性が高いもの

マイクロサービスで使われやすい技術群

下記のような技術がよく使われているかとおもいます。

  • RESTAPI
  • Faas(AWS Lambdaなど)
  • メッセージ処理(AWS SNSなど)
  • キュー処理全般(AWS SQSなど)
  • 仮想化技術全般

メリット

各サービスが疎結合になる

もともとは1つのサービスのデメリット(結合度が高い)ことを減らせるのが一番大きなメリットかと思います。この疎結合というだけでいろんなメリットがあり、以下にあげるような部分に影響が出てきます。

サービス単位の拡張や修正がしやすい

他の部分への影響が少なくなるので、マイクロサービス自体の拡張などは楽になり、容易に修正ができるようになります。

テストがしやすい

分離されている分、マイクロサービス自体で完結してますのて、テストがしやすくなります。

開発を独立して進められる

仕様が決まっていることが当然ですが、ある部分が作られていないから開発できない・・・ということがなく、それ単独でのサービスの開発が可能になります。

別の技術に交換可能

例えばベースのWEBアプリはLaravelで作って、キュー的な処理を行うにはAWS Lambdaとかですね。新しい技術を試す場合、別サービスに切り分けているので簡単に別の技術を試すことが可能です。

デメリット

まあ、当然いいことばっかりじゃないですね。自分が携わった点であげられるデメリット(と対策)などを。

サービス自体が増えることで管理が煩雑になる

AWS関連とかだとインフラ管理でコード化することはできます。他のものも手の管理は難しいので、なるべくコード化する必要がありますね・・

共通のメソッドを結果的に複数のサービスに書くことになる

DBのアクセスとかロガーとかユーティリティー系ですね・・細かく分けると何度も同じものを書くことになります。

共通処理がある時点でマイクロサービスにするのが間違っているのかもしれませんが、現実的にはDB自体を分離するというのはかなり難しくなると思いますので、共通のものを使わざるをえないということが多いでしょう。

samとか使えば複数のLambdaを管理することができるので、他のソースの変更とかを取り込めるのでは・・・と妄想

各サービスのルール、統一化などが煩雑

似たようなLambdaを複数配置すると書く人によってバラバラになったりするんですよね・・・
対策は静的解析ツール、レビューをしっかりやる?などかな・・・

別サービスの開発遅延などの影響を受ける

開発上、一番ネックになるのはこれかもしれません。理想論としてはインターフェイスをしっかり決めておき(これがなかなか難しいですが・・)、完成するまでダミーデータなど(RESTだったらJSONのサンプル)でなんとか凌ぐしかないですね・・・

-アーキテクト設計全般
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

no image

型の意識について(ValueObjectの活用など)

現在の現場でコードレビューをしてもらう機会が増え、自分が弱かった型の意識について。 現在ではPHPでも型を記述してコーディングすることが一般的なため、静的言語と同じように型を意識することが増えてきたか …

no image

キャッシュの使い所とメリデメに関して(主に一覧系の処理に関して)

現在のプロジェクトがかなりの規模のECサイトになるため、正確性とパフォーマンスのトレードオフなどが先日議題にあがりました。 完全なトレードオフではないのかもしれませんが、比較的あちらをたてればこちらが …

no image

event-listenerについて

前回Observeパターンに触れましたが、少し似たパターンとしてevent-listenerを使ったパターンが存在します。 Model(Eloquentのフック)というのが大まかな共通項ですかね。 そ …

no image

テストコードの粒度に関して

テストコードを書いていることの悩みの1つにテストコードをどの粒度で書けばいいのか、ということがあります。 例えばバッチの場合、大きく分けると エントリーポイントのFeatureテスト Unitテスト( …

no image

オブジェクト指向 プレゼンテーション層

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。 本日はプレゼンテーション層、いわゆるMVCのViewにあたる部分。 Contents1 プレゼンテーション層の考え方1.1 要点1. …

アーカイブ