---
title: Orleans について調べてみた
tags:  #orleans #.net  
author: [Tomohiro Suzuki](https://convert.docswell.com/user/hiro128_777)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/VJP9NQGPE8.jpg?width=480
description: Orleans が .NET チームに異動になり、今回 .NET 7 のリリースで Orleans 7 が .NET 7 の新機能として紹介されました。そこで、Orleans がどういうものなのかを調べてみました。  ★★★本スライドの新バージョンが以下よりご覧いただけます。 より詳しい内容となっておりますので、以下をご覧いただけますと幸いです。  https://www.docswell.com/s/hiro128_777/K6YMNL-2023-02-19-170020
published: November 25, 22
canonical: https://convert.docswell.com/s/hiro128_777/58J1X5-2022-11-25-004835
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/VJP9NQGPE8.jpg)

Orleans について調べてみた
Tomohiro Suzuki
@hiro128_777
2022-11-26
C# Tokyo


# Page. 2

![Page Image](https://bcdn.docswell.com/page/2EVMK56VEQ.jpg)

ご注意 追記：2023/02/19
本スライドは内容が最新ではありません。
本スライドの新バージョンが以下よりご覧いただけます。
より詳しい内容となっておりますので、以下をご覧いただけますと幸いです。
https://www.docswell.com/s/hiro128_777/K6YMNL-2023-02-19-170020
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/57GGQ6N17L.jpg)

自己紹介
鈴木友宏
M365、Azure、Power Platform、.NET などの Microsoft
製品を用いたシステムの構築をしています。
Twitter：@hiro128_777
blog：https://hiro128.hatenablog.jp/
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/4EQXK4QN7P.jpg)

.NET 7 がリリースされましたが…
なにやら見慣れないものがありました（私が不勉強なだけかもですが）
Orleans is 何？
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/KJ46PQN371.jpg)

Orleans（オーリンズ） とは
とりあえず、Microsoft learn の公式ドキュメントを一通り見てみるが、
いつも通りよくわかりません…
• Orleans は何者なのか
• Orleans がどういう動機で開発されたのか
• Orleans を採用するとどんなことが嬉しいのか
本日のゴール
これらを理解して
learn のドキュメントを読む
下地を作る
のようなことがよくわかりにくい…
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LE1V9P5Z7G.jpg)

結局 Orleans is 何？
Orleans は Microsoft による「仮想アクターモデルの実装」です。
アクターモデルとは、1973年にカール・ヒューイットらによって提唱された、「近い将来、数
百・数千のマイクロプロセッサから構成され、個々にローカルメモリを持ち、高性能通信
ネットワークで通信を行う並列コンピュータが登場するとの予測」から開発された、ロック
ベースの同期の必要性を取り除き並行計算を行うための方法論です。
※ロックこそが並行計算の一番の妨げであるため、それをなくしたいという動機
アクターモデルと仮想アクターモデルの主な違いは、後者はアクターの物理的なインスタン
ス化を完全に抽象化し、それをランタイムで管理できるようにしたものです。
仮想アクターは、仮想的に常に存在する論理エンティティであり、明示的に作成したり破
棄したりすることはできません。また、その仮想的な存在は、それを実行するサーバーの障
害に影響されません。 アクターは常に存在し続け、常にアドレス指定が可能です。
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/GEWLQ25672.jpg)

Orleans 何がうれしいの
すごく、簡単に言えば、
「分散アプリケーションを開発するときに発生するいろいろな面倒な
ことについて自前で実装することなく、いい感じで面倒を見てくれる
ので、メリットだけを享受することができます」ということでした。
ちなみに、Teams や HALO のバックエンドでも利用されています。
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/47ZMWDNRE3.jpg)

Orleans の動機
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/YJ6NG181JV.jpg)

古典的なWebアプリの問題点
www
• 読み取り要求のたびにデータベースにアクセ
スするため、 データベースの負荷が大きい
Load Balancer
App
App
App
• アプリのインスタンスの状態をお互いが把握
できず、データベースへの書き込み競合が発
生する
• 各々のアプリのインスタンスが状態を個別に
持ちリソースの効率が悪い。
DB
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GJ55V49LJ4.jpg)

対策としてキャッシュ、キューなどを追加するも新たな問題が
• 読み取り要求のデータベース負荷対策とし
てキャッシュを追加
→キャッシュの一貫性の問題が発生
www
Load Balancer
App
Cache
App
Queue
• データベースへの書き込み競合対策として
キューを追加
→非同期書き込みの待ちが発生
App
DB
問題は軽減しているが、インフラを追加して厄介
ごとをオフロードしているだけなので根本的な解決
ではない…
スケーラビリティが確保できない
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/9E2N3V237R.jpg)

Orleans のコンセプト
• アプリインスタンスがお互いに会話し互いに
連携することで分散アプリの問題を解決し
たい
www
Load Balancer
App
• データベースを唯一の「真実のソース」とし、
キャッシュやキューなどの余計なインフラ自体
をなくしたい
App
App
Cache
DB
（True Source）
Queue
• 高スループット
• 低レイテンシー
• 高スケーラビリティ
を確保したい
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/D7YP13Y87M.jpg)

Orleans とは
Orleans は、アプリケーションのフロントエンド
とDB(永続化ストレージ)の間のステートフルで
スマートな中間層を提供するフレームワークで
す。
www
Load Balancer
App
App
App
Orleans
DB
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/VEN52VP9J8.jpg)

Orleans の概念と機能
1


# Page. 14

![Page Image](https://bcdn.docswell.com/page/Y79Y1633E3.jpg)

Orleans の 構成
www
HTTP
Response
HTTP
Request
REST APIが定義されたエンドポイント
HTTP リクエストを適切なグレインにルーティングする
Grain Call
Orleans
Cluster
Silo
Silo
Grain Response
Front End (Orleans External Client)
クラスターを1つの巨大なコンピューターのように扱う
Silo
Glain
Glain
Glain
Glain
Glain
Glain
Glain
Data Query
Glain
Glain
Glain
スケールアウトやアップグレードによるインスタンス追
加や、障害時のインスタンスの突然停止に対応す
るため、サイロは、Container Apps、App Service、
マネージド k8s などの SaaS にデプロイする
Data
Glain
Glain
DB
(Persistent Storage)
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/G7864ZMLJD.jpg)

Orleans の 構成要素 フロントエンド（外部クライアント）
• 外部クライアントは、www と Orleans のゲートウェイの役割を果たします。
公開されている REST API への HTTP リクエストを受信して、リクエストを処理すべき Grain
に対してメソッドをコールし、 Grain からレスポンスを受け取り、 HTTP リクエストにレスポンスを
返します。
• Minimum なアプリケーションの実装としては、ASP.NET Core Web API のプロジェクトで
REST API を定義し、Generic Host で DI された、Grain インスタンスのメソッドをコールし、戻
り値を返します。
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/L7L96D3QER.jpg)

Orleans の 構成要素：フロントエンド（外部クライアント）
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/4EMZ5PMK7W.jpg)

Orleans の 構成要素：フロントエンド（外部クライアント）
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/PER631V6J9.jpg)

Orleans の 構成要素：グレイン
• グレインは Orleans における仮想アクターの役割を果たします。
• グレインは Orleans においてサービスの構成要素となり、ビジネスロジックをメソッドとして提供
します。
• グレインはユーザー定義のID（identity）、動作（behavior）、および状態（state）をカプ
セル化し、他のグレインとメッセージを送受信したり、クライアントからの要求に対するレスポン
スを返します。
• GrainID で呼び出すと、どのフロントエンドで呼び出したとしてもアプリインスタンスのクラスタ
内の同じ場所にルーティングされます。
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/P7XM4YZDJX.jpg)

Orleans の 構成要素：グレイン
• グレインはシングルスレッド実行が保証され、ロックや一貫性の問題の考慮が不要です。
• 個々のグレインは Orleans のランタイムによって、開発者は意識することなく、必要に応じて
ページイン（アクティブ化）・ページアウト（非アクティブ化）されるため、メモリの使用量やグ
レインのロードバランシングは動的に最適化されます。
• アプリケーションコードはグレインの障害や呼び出された時点で当該のグレインが非アクティブ
になっているなどの状態とは無関係に、物理的な位置を意識することなくグレインと通信でき
ます。開発者はグレインの物理的な場所に関して意識する必要がありません。
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/37KGZ38DED.jpg)

Orleans の 構成要素：グレイン
インターフェース
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/LJ3NDG2PJ5.jpg)

Orleans の 構成要素：グレイン
インプリメント
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/8JDWP1Z3EG.jpg)

Orleans の 構成要素：サイロ
• サイロは複数の仮想アクターをホストするコンテナです。サイロは単一ではその効力を発揮でき
ません。複数のサイロによって構成されるグループを一緒に実行しクラスターを形成することでス
ケーラビリティや耐障害性を提供する役割を果たします。
• サイロのクラスターにより、アプリケーションの状態は物理的に暗黙的・透過的に分割され、
負荷に応じて並列に処理が実行されますが、開発者はそれを意識する必要はなくプロキシ
オブジェクトであるグレインの呼び出しを行うだけでスケーラビリティを確保することができます。
• サイロのクラスターにより、分割されたアプリケーションの状態のバックアップを使用することで、
回復力が向上し、障害からの回復性が高まります。
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/VEP9NQDP78.jpg)

Orleans の 構成要素：サイロ
本来サイロは複数展開すべきですが、ローカルで起動しているので単一サイロです。
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/27VMK51V7Q.jpg)

その他、Orleans のメリット（データベース関連）
• ホットデータもウォームデータもすべてクラスターのどこかのメモリに保存されるため、データベース
の読み取り回数が減り、データベースの読み込み負荷を軽減することができます。
• 上記により別途キャッシュを用意する必要もないため、キャッシュの一貫性の問題が発生し
ません。
• 各グレインが独自の状態を持ち、データベースへの書き込みを調整し実行するため、複数の
場所から一度に書き込まれるようなホットな行がデータベース内に発生することはなく、書き
込み競合の調整が不要です。
• 上記によりレイテンシも低く抑えられるため、書き込みの調整に非同期の Queue Worker
などを使用する必要がなく、グレインから直接データベースに対して非常に迅速な書き込みが
実行できます。
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/5JGGQ621JL.jpg)

Orleans においてスケーラビリティが向上する理由
スケーラビリティが向上する理由は以下の2つです。
• データベースへの負荷が減るから
• すべてのアプリケーション・インスタンスをより有効に活用できるから。
たとえば、メモリもより有効に活用できるから。
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/47QXK4PNJP.jpg)

終わりに
これまでご説明した予備知識がある状態で、公式ドキュメントを読むとかなり読
みやすくなると思います。
というわけで、.NET 7 の注目機能だと（私が勝手に思っている）Orleans で遊
んでみましょう！
https://learn.microsoft.com/ja-jp/dotnet/orleans/
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/KE46PQY3J1.jpg)

ご清聴ありがとうございました


