Slide 1

Slide 1 text

アクターモデルによる 効率的な分散システム設計

Slide 2

Slide 2 text

| © 2024 Levtech Co., Ltd. 2 レバテック開発部 山川 太一 TAICHI YAMAKAWA 2024年1月にレバレジーズに入社し、現在はレバテックプラットフォームの開発を担当している。Scala と Akka を 使った分散システムの開発やコンサルティングの経験がある。関数型プログラミングやアーキテクチャ設計に強い関心 がある。

Slide 3

Slide 3 text

| © 2024 Levtech Co., Ltd. 3 お話しすること 1. 分散システムとアクターモデル 2. イベントソーシング 3. CQRS: Command Query Responsibility Segregation 4. クラスタシャーディング 5. アーキテクチャパターンの紹介

Slide 4

Slide 4 text

| © 2024 Levtech Co., Ltd. 4 Gemini に聞いてみると... 分散システムとは

Slide 5

Slide 5 text

| © 2024 Levtech Co., Ltd. 5 ● 分散システムを使用している ○ AWS, GCP, Azure, TiDB, etc... ● 分散システムを開発している ○ 複数のコンピュートリソース ○ リレーショナルデータベース ○ インメモリデータベース ○ メッセージキュー ○ etc... なぜ分散システムが重要なのか Fargate, RDS, ElastiCache などを使う分散システム TiDB のアーキテクチャ https://docs.pingcap.com/tidb/stable/tidb-architecture より引用

Slide 6

Slide 6 text

Actor Model Messages Drive the Future of Distributed Computing

Slide 7

Slide 7 text

| © 2024 Levtech Co., Ltd. 7 並行処理や分散システムを効率的に構築する概念モデルの1つ 以下が有名である: ● Erlang/OTP: プログラミング言語とライブラリ ● Akka: Java や Scala のライブラリ アクターモデル The actor model adopts the philosophy that everything is an actor. This is similar to the everything is an object philosophy used by some object-oriented programming languages. Actor model - Wikipedia より引用

Slide 8

Slide 8 text

| © 2024 Levtech Co., Ltd. 8 メッセージを受信して、そのメッセージを処理する。 アクター

Slide 9

Slide 9 text

| © 2024 Levtech Co., Ltd. 9 アクター同士のメッセージ交換によりシステムを実現する。 アクターモデルによる分散システム

Slide 10

Slide 10 text

| © 2024 Levtech Co., Ltd. 10 アクターモデルの特徴 エラーハンドリングが容易である スケーラビリティが高い 並行処理が容易である

Slide 11

Slide 11 text

| © 2024 Levtech Co., Ltd. 11 ● Actor 同士がお互いの情報を直接操作しない ● Mutex や Semaphore を使用しなくてよい ● 基本的にデッドロックは発生しない 並行処理が容易である Actor Model の特徴

Slide 12

Slide 12 text

| © 2024 Levtech Co., Ltd. 12 ● 位置透過性がある ○ アクターの物理的な場所を意識することなく、 同じ方法で他のアクターと通信できる ● 同じ記述方法で 簡単にスケールアウトすることができる スケーラビリティが高い Actor Model の特徴

Slide 13

Slide 13 text

| © 2024 Levtech Co., Ltd. 13 ● アクターは階層構造で管理する ● Supervision ○ Child Actors の監視が可能である ○ 発生したエラーに応じて Child Actors に次の指示ができる ■ 停止 ■ 再起動 ■ 再開 エラーハンドリングが容易である Actor Model の特徴

Slide 14

Slide 14 text

| © 2024 Levtech Co., Ltd. 14 Akka によるアクターの実装例

Slide 15

Slide 15 text

Event Sourcing Record the Event, Restore the State

Slide 16

Slide 16 text

| © 2024 Levtech Co., Ltd. 16 ● 操作による出来事を記録する ● 活用例 ○ 状態の再構築 ○ 監査 ○ デバッグ ○ ビューへの投影 イベントソーシング

Slide 17

Slide 17 text

| © 2024 Levtech Co., Ltd. 17 ● Akka Persistence により実現する ● アクターは状態を保持している ● イベントを通じて自身の状態を更新する アクターによるイベントソーシング Akka Persistence

Slide 18

Slide 18 text

| © 2024 Levtech Co., Ltd. 18 ● アクターは状態を保持している ● READ 処理ではイベントストアにアクセスしない ● 通信やデータI/Oをしないため処理が高速である READ は高速に処理できる Akka Persistence

Slide 19

Slide 19 text

| © 2024 Levtech Co., Ltd. 19 ● イベント履歴から現在の状態を復元する ● 通常起動もクラッシュによる再起動も同様のプロセスを行う イベントリプレイ Akka Persistence

Slide 20

Slide 20 text

| © 2024 Levtech Co., Ltd. 20 ● 基本的にイベントは追加されるのみ ○ 次第に大量のイベント履歴を扱うことに... ● イベントリプレイにかかる時間増加が問題となりうる イベント履歴の肥大化 Akka Persistence

Slide 21

Slide 21 text

| © 2024 Levtech Co., Ltd. 21 ● 特定時点の状態をスナップショットして保存する ● スナップショットから状態を復元する ● イベントリプレイを減らして高速化できる スナップショットによるリカバリの高速化 Akka Persistence リカバリ スナップショット 取得

Slide 22

Slide 22 text

| © 2024 Levtech Co., Ltd. 22 Akka Persistence による実装例

Slide 23

Slide 23 text

CQRS: Command Query Responsibility Segregation Two Responsibilities, One Powerful Approach

Slide 24

Slide 24 text

| © 2024 Levtech Co., Ltd. 24 ● コマンドとクエリを分離することで効率的なシステムを構築する ● より複雑なクエリは別データストアやシステムで扱える Command Query Responsibility Segregation

Slide 25

Slide 25 text

| © 2024 Levtech Co., Ltd. 25 ● Akka Projection により実現する ● イベント履歴をビューとして非同期的に投影する Read Data Store の構築 Akka Projection

Slide 26

Slide 26 text

| © 2024 Levtech Co., Ltd. 26 Akka Projection による実装例

Slide 27

Slide 27 text

Cluster Sharding Efficiently Distribute, Scale, and Failover

Slide 28

Slide 28 text

| © 2024 Levtech Co., Ltd. 28 アクターをクラスタ内に分散配置する。 同じ ID を持つアクターが、クラスタに1つだけ存在する。 リバランスやフェイルオーバーの機能を持つ。 Akka Cluster Sharding

Slide 29

Slide 29 text

| © 2024 Levtech Co., Ltd. 29 ノードの増減に応じて、自動的にアクターを別ノードに移動させる。 リバランス Akka Cluster Sharding

Slide 30

Slide 30 text

| © 2024 Levtech Co., Ltd. 30 ノードがクラッシュしたら、自動的にアクターを別ノードに移動させる。 フェイルオーバー Akka Cluster Sharding

Slide 31

Slide 31 text

| © 2024 Levtech Co., Ltd. 31 Akka Cluster Sharding による実装例

Slide 32

Slide 32 text

Architecture Patterns Building Resilient, Scalable Systems for the Future

Slide 33

Slide 33 text

| © 2024 Levtech Co., Ltd. 33 一般的なアーキテクチャパターンを活用する機会も多い。 これらを組み合わせることで、より良い分散システムが設計できる。 アーキテクチャパターンの紹介 ● リトライと冪等性 ● 補償トランザクション ● サーキットブレーカー ● バルクヘッド ● スロットリング ● Saga ● etc... おすすめのウェブサイト ● Cloud design patterns - Azure Architecture Center | Microsoft Learn ● Cloud design patterns, architectures, and implementations - AWS Prescriptive Guidance ● A pattern language for microservices

Slide 34

Slide 34 text

| © 2024 Levtech Co., Ltd. 34 まとめ 1. 分散システムとアクターモデル 2. イベントソーシング 3. CQRS: Command Query Responsibility Segregation 4. クラスタシャーディング 5. アーキテクチャパターンの紹介

Slide 35

Slide 35 text

Thank you :-)