マイクロサービスアーキテクチャってなんだろう

# はじめに
マイクロサービスアーキテクチャに関する話をよく聞くようになってきました。
名前からは大体想像できるが細かい部分までは知らない。
もっとこいつを知る必要がある。
そんな思いがふつふつと湧いてきたので調べて記事にまとめる事にしました。

# モノリシックサービスとマイクロサービス
まずはこの二つのサービスがよく対比されているので違いを抑えておきたい。

## モノリシックサービス
”一枚岩”を意味していて、単一の大規模サービスのことを言います。
複数機能で構成されている。
<img width="421" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f36396461396339382d623730642d346230352d623339372d3130333366653161363363622e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/688cba36-3df2-1c33-2d51-c084f28addf5.png">


## マイクロサービス
それぞれが協調して動作する自律的な小規模サービスのことを言います。
先ほどとは異なり、複数の機能がそれぞれ独自のサービスとして存在し、
各サービスの連携についてはAPIを通じて行っている。
<img width="349" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f38363830356362392d306439392d633931392d626434332d3864386563656363383836612e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/9235bb8f-4360-ac34-8e68-9b63196571dd.png">

# マイクロサービスアーキテクチャのメリットってな〜に〜
## サービスごとに異なる技術選択をする事ができる
モノリシックサービスの場合、新しい取り組みをしたいときの影響が大きくなりがち。
それに比べて複数サービスで構成されている場合は、新しい技術を試す場所の選択肢が複数存在するため、リスクの低減ができる。
<img width="533" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f64323133613435342d353666342d326530342d303763612d6131366332663366343532322e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/614955f6-c746-a919-411b-957d068f9584.png">


## 回復性を高めやすい
モノリシックサービス自体に障害が発生すると全停止してしまうため、
複数マシンで稼働させるなど冗長性を持たせて障害リスクを低減する必要がある。
マイクロサービスの場合は、全体障害を見据えて機能低下させながら稼働するシステムを構築できる。
<img width="386" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f34646233356336322d613832342d616563662d613765642d3566376132353734636234312e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/801117d5-3fe7-271d-6a15-ba9f7a1aa993.png">


## スケーリングが容易
モノリシックサービスの場合は全体をスケールさせる必要がある。
マイクロサービスの場合は必要箇所のみスケールさせる事ができる。
<img width="399" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f61653939666364332d323639612d383763322d343932392d6164363334313139353965392e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/5104e59b-e2b1-717e-72d1-1a57827dcd61.png">


## デプロイが容易
モノリシックサービスはたった１行の修正においても、
全てをデプロイする必要性があり影響が大きくリスクが伴う。
マイクロサービスは変更したサービスのみ独立してデプロイ出来、
問題のあるサービスの原因特定、ロールバックまでを迅速に行う事ができる。
<img width="376" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f64666331626339362d343461312d323764342d623864662d3766396364626330306263622e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/d3f29f2c-0f3a-c9ed-6b6c-e7c2ec767bf1.png">


## 組織の一致
モノリシックサービスは担当チームが複数分散している場合などに問題が起きやすい。
マイクロサービスはアーキテクチャを組織に一致させる事ができる。
１つのコードベースでの作業者を最小化し、チームの大きさと生産性を最適化する。
サービス毎に所有権をチームに移せるため、あるサービスの開発者たちを同じ場所に
配置させる事ができる。
<img width="466" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f66363238303837302d653933392d333234392d633233632d6635363863626665393464652e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/9e15964b-400d-a851-4e24-245302062f19.png">


## 交換コストが低い
個々のサービスが小さければ、置き換えや削除するコストも管理しやすい大きさになる。
そのため、サービス全体の書き換えや削除に対する障壁が低くなる。
<img width="341" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f33613062656236342d373832622d313938312d346235372d3330393261373738303434332e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/55914e7b-8087-b184-1cfe-8923dd6d3ed3.png">



# マイクロサービスのデメリットってな〜に〜
## サービス分割を綺麗に行うのが難しい
各機能の役割のついて理解度が低いと境界を見つけにくくなる。
サービス境界を誤ってしまうと、修正箇所が多くなり開発コストやリスクが増大してしまう。
新規サービスは機能の役割についての理解度だけでなく、まだ存在しない機能を視野に入れて
分割が必要となるため、まずはモノリシックサービスとして安定してからが望ましい。
<img width="503" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f36346537333562382d383933362d646234302d613465612d3734363034383263663137662e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/45351e9a-9760-8dff-25e6-923713b2bb96.png">


## 新たな障害ポイントが生まれる
各サービスはAPIで連携しているため、そこで障害が発生する可能性も増える。
<img width="508" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f35663931363965352d313930322d643436322d333933312d3761333662346364633037622e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/d6e724e7-1020-62f8-7510-18dc6371aa9c.png">


## 発生する障害を把握できていないと破滅する
他サービス間での連携が失敗もあり得る、という事実を理解しなければ連鎖的な障害が起きる。
<img width="344" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f32336663373033622d653335392d396333642d333934322d3163616138646364346430322e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/b892f54f-268d-04da-6ba6-0f21297e954b.png">

# 最後に
ここまででマイクロサービスとはなんだろうか、
そしてメリデメについて知る事ができたかと思います。
その他のもっと踏み込んだ話やモノリシックサービスを分解していく手法については、
参考文献を載せますのでぜひ読んでみてください。
<img width="264" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f62396463303630342d613832622d373965322d663637382d6462333334343838323037392e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/0ef13f65-b977-c221-af87-4573207f251b.png">


# 参考文献
こちらの記事を作るにあたりとてもお世話になりました。
<img width="460" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3531383932312f66343931303233302d613739382d353762632d613930642d3565363636366137363630322e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/cac2a67d-300d-5754-ef78-40a8692fdad9.png">