Elixirマイクロサービス①：マイクロサービス化／反マイクロサービス化に有利なElixir

この記事は、[Elixir Advent Calendar 2023 シリーズ11](https://qiita.com/advent-calendar/2023/elixir) の12日目です

昨日は、@GeekMasahiro さんで [「Elixir AtCoder用テンプレート」](https://qiita.com/GeekMasahiro/items/ab5e3fdc9488e6bb4e72) でした

---

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

[今年8月に開催した「ElixirImp#34：Elixirでマイクロサービス & エッジコンピューティング」](https://fukuokaex.connpass.com/event/288716/) の内容（下記スライド）をコラム化しつつ、Elixirでの実践も解説していくシリーズです

https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo

目次としては、こんな感じで、今回は「01」～「04」に触れつつ、Elixirのマイクロサービス化／反マイクロサービス化に使える機能を紹介したいと思います

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/0702528a-6209-22a6-3bc7-97b1b6be130c.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=8)

あと、このコラムが、面白かったり、役に立ったら、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/907a8695-4d83-1b5c-8052-d0ce52de5f66.png) をお願いします :bow:

# 改めてマイクロサービスとは？…なぜ流行ったのか？

マイクロサービスとは、小さなサービスを組合わせて1つのアプリケーションを開発するアプローチです

2013年に、アジャイルの始祖であるeXtreme Programmingを企業として初期に取り組んだThoughtWorks社のジェームス・ルイスが「Micro services - Java, the Unix Way」で初出し、2014年に、やはりアジャイル／eXtreme Programming界隈では超有名人の[マーティン・ファウラー（名著「リファクタリング」「PoEAA」の著者でもある）](https://bliki-ja.github.io/)と共著で「Microservices」にて提唱し、世に広まり始めました

ちなみにマーティン・ファウラーは個人的に22年前、eXtreme Programmingでケント・ベック（XP提唱者）やエリック・ガンマ（VScode／Junit／Eclipseコミッター）と共に彼に心酔し、私の4番目のプログラマ／エンジニア師匠と勝手に思っています :yum:

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/ae485a91-b47b-12eb-c8df-5053d8c327c8.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=14)

クラウドやスマホ、SPA、API、そしてスタートアップの普及が後押しし、マイクロサービスは広く流行ったと考えられます

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/792992a4-48a9-0f93-a1b5-af82b238e5ac.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=15)

# 最近、マイクロサービスの良い噂は聞かないが…

提唱から10年近く経った最近、マイクロサービスのメリットよりも、デメリットが強調されるシーンが増えてきました

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/51379f1b-ce9c-8a3e-c73c-bcb080a4cec7.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=19)

では、マイクロサービスは「使えない」のでしょうか？ … いえ、そうではありません

問題は、「マイクロサービスが本当に必要なシーン」で使えていなかったり、不必要にマイクロサービス化していることにあると考えます

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/096399f9-a0a6-3a10-0187-4184bc93d56d.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=16)

つまり、マイクロサービス自体の問題では無く、単に「選定ミス」や「雰囲気で導入した」という要素が、マイクロサービスの良い噂を聞かない背景の大半では無いかと捉えています

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/5df36d3f-b941-a93e-f640-a48fd733d5c9.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=20)

「選定ミス」の1つとして代表的なのが、共通基盤として構成すべき対象を、マイクロサービスとして構成したが故に、システムが複雑化した … というケースが世界的に発生しており、現在、そこに対するアンチテーゼとして、「反マイクロサービス（deMicroService）」や「アンチマイクロサービス」というムーブメントすら起こっているような状況です

国内でも、先駆者たるSTORESやクックパッド等でも、こうした動きが存在します

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/ca1422a2-cd74-691e-3077-a4db3221d53e.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=21)

何事も、大事なのは「正しく使う」ことであり、マイクロサービスも正しく使えば、サービスグロースの良き味方となります

# 「マイクロサービスパターン」とは？

[マイクロサービスパターン](https://www.amazon.co.jp/exec/obidos/ASIN/4295008583/onelinebiz-22)とは、マイクロサービスでの解決策やデザイン原則をまとめたものです

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/d1adcf7f-4e88-a78f-f535-366a581793b7.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=24)

[「Microservices.io」](https://microservices.io/patterns/index.html) が全体図を示してくれています

https://microservices.io/patterns/
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/091cb135-be8f-c5f7-1e59-26aed7657c6a.png)](https://microservices.io/patterns/)

マイクロサービスパターンには、カテゴリごとのプラクティスがあります（なお、最新のMicroservice.ioの方も更新されているため、スライド／本コラムと最新図にはギャップがあります）

- アーキテクチャの問題領域
  - Monolithic Architecture
  - Microservice Architecture
  - Database per Service
- サービス分割の問題領域
  - Decompose by Business Capability 業務毎に分割
  - Decompose by Subdomain…サブドメイン毎に分割
- メッセージングスタイルの問題領域
  - Remote Procedure Invocation … 同期RPC（REST、gRPC等）
  - Messaging … 非同期メッセージパッシング
- 信頼性の問題領域
  - Circuit Breaker … レスポンスにタイムアウトを設定
- サービス・ディスカバリーの問題領域
  - Self Registration … プロセス生成時に名前登録
  - Client-Side Discovery
  - 3rd party Registration … 代理で名前登録
  - Server-Side Discovery

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/673de668-42b1-4d3c-595e-a367fa1bc6f2.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=26)

- トランザクショナル・メッセージングの問題領域
  - Transactional Outbox
  - Polling Publisher
  - Transaction Log Tailing
- データ整合性の問題領域
  - Saga
- ビジネスロジックデザインの問題領域
  - Aggregate
  - Domain Event
  - Domain Model
  - Event Sourcing
  - Transaction Script
- クエリーの問題領域
  - API Composition
  - CQRS (Command Query Responsibility Segregation)
- 外部 API の問題領域
  - API Gateway
  - Backends for Front-Ends

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/100a6724-b489-635e-d253-7fbdbe0d80bd.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=27)

- 自動化テストの問題領域
  - Consumer-Driven Contract Test
  - Consumer-Side Contract Test
Service Component Test
- セキュリティの問題領域
  - Access Token
- 横断的関心事の問題領域
  - Externalized Configuration
  - Microservice Chassis
- 監視の問題領域
  - Health check API
  - Log Aggregation
  - Distributed Tracing
  - Application Metrics
  - Exception Tracking
  - Audit Logging

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/2485deff-8a7f-8042-85f8-29f29c449a44.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=28)

- デプロイの問題領域
  - Language-Specific Packaging Format
  - Single Service per Host
  - Deploy a Service as a VM
  - Deploy a Service as a Container
  - Sidecar
  - Serverless Deployment
  - Service Deployment Platform
  - Service Mesh
- リファクタリングの問題領域
  - Strangler Application
  - Anti-Corruption Layer

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/8cbfc3bb-296f-c77f-8ee5-a35c24994df0.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=29)

# マイクロサービス向きなElixirの特徴

Elixirは、言語仕様および言語ビルトインで、分散／並行・並列に特化した実行単位とメカニズムを揃えており、マイクロサービス構築／解体に重い腰を上げる必要が無い点が強みです

また、クラウド無しでもエッジコンピューティングが構成できるレベルの機能が標準搭載な点も強みです

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/cd8ace76-7e1c-add0-3ff3-f6966194f4c7.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=31)

スレッドセーフ対応が根本から不要なプロセス／メッセージパッシング構造（アクターモデル）であり、それがローカルマシン内だけで無く、リモートマシン間にも透過的に展開できる点も、Elixirの強力な強みです

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/db383528-3f84-4f23-de6a-5608d2609bec.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=33)

並行・並列環境下におけるデータ処理に特化された言語／FW仕様も、ユーザー数やデータ量がかさみやすいマイクロサービスに有利な点として挙げられます

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/7a3f8f74-ec59-5214-c779-1cac6b81a001.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=32)

# 大半がElixir標準搭載機能で賄える

具体的なElixir機能を挙げていくと、下記の通りです

①～④、⑥～⑧、⑩～⑪は言語標準搭載機能で、その他も、Elixir界隈では準標準急のメジャーなフレームワークになります

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/49db13a1-96d2-a447-61c0-37ee905cecd6.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=34)

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/91b3647f-c849-44e8-46fd-516c998e3c3e.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=35)

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/5aa45a2d-9537-7e30-38bc-e81d95cd5f3e.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=36)

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/5fe95350-426a-a253-bdc0-f82f8b6042ec.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=37)

# 終わりに

Elixirとマイクロサービスの相性の良さが、何となく雰囲気だけでも伝われば幸いです

次回は、下図のように、マイクロサービスパターンとElixir機能をマッピングした上で、具体的なマイクロサービス／反マイクロサービス構築について解説します
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/5bd17822-d35a-026d-5204-8855b1873964.png)](https://speakerdeck.com/piacerex/elixirdemaikurosabisupatan-qian-bian-aimltoetuzikonpiyuteingumo?slide=39)

---

明日は、@GeekMasahiro さんで [「ElixirでAtCoder 入力処理の高速化（ABC309 Eで試す）」](https://qiita.com/GeekMasahiro/items/6fb5bf571860e603cb8d) です

# p.s.このコラムが、面白かったり、役に立ったら…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/907a8695-4d83-1b5c-8052-d0ce52de5f66.png) にて、どうぞ応援よろしくお願いします :bow: