SlideShare uma empresa Scribd logo
1 de 33
Baixar para ler offline
Copyright © 2018 TIS Inc. All rights reserved.
Akkaの並⾏性
前出 祐吾 @yugolf
Copyright © 2018 TIS Inc. All rights reserved.
TIS株式会社
 前出 祐吾 @yugolf
最近の研究テーマ
 オープン環境で⾼可⽤システムどうやって構築する?
翻訳した本
最近書いてる記事
 ThinkIT:リアクティブシステムの使いどころ(仮)
2
⾃⼰紹介
Copyright © 2018 TIS Inc. All rights reserved.
Akkaを通じて
アクターモデルの並⾏性を知る
3
本⽇のお話
https://akka.io/
Copyright © 2018 TIS Inc. All rights reserved.
リアクティブシステム
4
まとめ
Copyright © 2018 TIS Inc. All rights reserved. 5
リアクティブシステムの4つの原則
• メッセージ駆動のアーキテクチャによりユーザーの要求に可能な限り迅速に
レスポンスする(即応性)システム
• ⾼負荷状況や問題が検出された時でも応答時間を⼀定⽔準に保ち(弾⼒
性)、部分的な障害が発⽣した時にもシステム全体を危険にさらすことなく
回復させる(耐障害性)
※リアクティブ宣言(https://www.reactivemanifesto.org/ja)より
Copyright © 2018 TIS Inc. All rights reserved. 6
⼿段となるメッセージ駆動
コンポーネント
コンポーネント
メッセージ駆動をアクターモデルで実現する
リアクティブシステムは⾮同期なメッセージパッシングによっ
てコンポーネント間の境界を確⽴する
Copyright © 2018 TIS Inc. All rights reserved.
アクターモデル
7
まとめ
Copyright © 2018 TIS Inc. All rights reserved. 8
アクターモデルとは
並⾏的に受信するメッセージに対する以下のふるまいを備える
• アクターを作る
• アクターにメッセージを送信する
• メッセージを受信したときの動作を指定する
トラディショナルモデルとの違い
トラディショナルモデル
アクターモデル
逐次実⾏が基本で部分的に並⾏処理を実装
本質的に並⾏
Copyright © 2018 TIS Inc. All rights reserved. 9
本質的に並⾏?
受付係 チケット販売員
Buy
Buy
メールボックス
Akkaを使うことでアクターのプログラミングに集中できる
• コンポーネント間のやり取りはメッセージで⾏う
• 関数の応答を待つ必要はなく並⾏に処理される
• アクターはメールボックスを持ち到着順に処理する
イベントA
イベントB
Copyright © 2018 TIS Inc. All rights reserved.
アクターモデルの実装
10
まとめ
本質的に並行?
Copyright © 2018 TIS Inc. All rights reserved. 11
例:アクターモデルによるチケット販売サービス
• チケットの購⼊
• イベントの作成 チケット販売サービス
GoTicks.com
イベント管理者
お客さん
https://github.com/yugolf/akka-in-action-java/tree/master/chapter-up-and-running
Akka実践バイブル第1章より
ソースコード
Copyright © 2018 TIS Inc. All rights reserved. 12
クラス構成
ActorSystem	
“go-ticks”
create
create
Actor	
BoxOffice
Actor	
TicketSeller
HTTP	Route	
RestApi
Copyright © 2018 TIS Inc. All rights reserved.
アクターの基本操作
13
まとめ
Copyright © 2018 TIS Inc. All rights reserved. 14
アクターシステムの⽣成
ActorSystem	
“go-ticks”
Main
new
create
create
create
Actor	
BoxOffice
Actor	
TicketSeller
HTTP	Route	
RestApi
[Main] アクターシステムを⽣成する
final ActorSystem system = ActorSystem.create("go-ticks");
Copyright © 2018 TIS Inc. All rights reserved. 15
アクターの⽣成
[RestApi] アクターを⽣成する
ActorSystem	
“go-ticks”
Main
new
create
create
create
Actor	
BoxOffice
HTTP	Route	
RestApi
ActorRef boxOfficeActor =
system.actorOf(BoxOffice.props(timeout), "boxOfficeActor");
// propsの定義
public static Props props(Duration timeout) {
return Props.create(BoxOffice.class,
() -> new BoxOffice(timeout));
}
[BoxOffice] アクターのファクトリーメソッドを定義する
Copyright © 2018 TIS Inc. All rights reserved. 16
アクターシステム
https://doc.akka.io/docs/akka/2.5/general/supervision.html
アクターシステムに作成したアクターは、Userガーディアンの配下に⽣成され
ヒエラルキーを構成する
Actor	
BoxOffice
Actor	
TicketSeller
Actor	
XXX
Copyright © 2018 TIS Inc. All rights reserved.
Interface	
ITicketSeller
Interface	
IBoxOffice
17
メッセージのやり取り1:イベントの作成
Reactive	
Osaka
boxOffice
create
Add
Actor	
BoxOffice
Actor	
TicketSeller
BoxOfficeアクターがTicketSellerアクター(Reactive Osakaイベント)を
⽣成し、Addメッセージでイベントのチケットを追加する
• コンポーネント間のやり取りはメッセージで⾏う
• 関数の応答を待つ必要はなく並⾏に処理される
• アクターはメールボックスを持ち到着順に処理する
Copyright © 2018 TIS Inc. All rights reserved.
ticketSeller.tell(new TicketSeller.Add(newTickets), getSelf());
getContext().sender().tell(
new EventCreated(new Event(createEvent.getName(),
createEvent.getTickets())),
getSelf());
18
実装1/2 BoxOfficeからTicketSellerにAddメッセージを送信
[BoxOffice ] TicketSellerアクターの⽣成
String eventName = “Reactive Osaka”;
ActorRef ticketSeller = getContext()
.actorOf(TicketSeller.props(eventName), eventName);
BoxOffice TicketSeller
Add
[BoxOffice ] Addメッセージの送信
sender BoxOffece
EventCreated
送信元の処理と送信先の処理は⾮同期
Copyright © 2018 TIS Inc. All rights reserved. 19
実装2/2 BoxOfficeからTicketSellerにAddメッセージを送信
[TicketSeller] メッセージプロトコルの定義
[TicketSeller] メッセージ受信時のふるまい定義
interface ITicketSeller {
class Add extends AbstractMessage {
private final List<Ticket> tickets;
public Add(List<Ticket> tickets) {
this.tickets = Collections.unmodifiableList(new ArrayList<>(tickets));
}
public List<Ticket> getTickets() {
return tickets;
}
}
private final List<Ticket> tickets = new ArrayList<>();
private void add(Add add) {
log.debug(msg, add);
tickets.addAll(add.getTickets());
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Add.class, this::add)
.build();
}
BoxOffice TicketSeller
Add
メッセージはイミュータブルに
受信するメッセージの型に対してふるまいを指定
Copyright © 2018 TIS Inc. All rights reserved. 20
おさらい:(再掲)アクターモデルとは
並⾏的に受信するメッセージに対する以下のふるまいを備える
• アクターを作る
• アクターにメッセージを送信する
• メッセージを受信したときの動作を指定する
トラディショナルモデルとの違い
トラディショナルモデル
アクターモデル
逐次実⾏が基本で部分的に並⾏処理を実装
本質的に並⾏
getContext().actorOf()
ticketSeller.tell()
receiveBuilder().match()
Copyright © 2018 TIS Inc. All rights reserved.
Interface	
ITicketSeller
Interface	
IBoxOffice
21
アクターの外からのメッセージ
Reactive	
Osaka
boxOffice
create
Add
Actor	
BoxOffice
Actor	
TicketSeller
HTTP	Route	
RestApi
RestApi
CreateEvent
EventCreated
RestApiクラスはクライアントにレスポンスするためアクターからの
返信(イベントが作成できたか?)が必要
Copyright © 2018 TIS Inc. All rights reserved. 22
実装 RestApiからBoxOfficeにCreateEventメッセージを送信
[RestApi ] CreateEventメッセージを送信し応答を処理
CompletionStage<EventResponse> futureEventResponse =
ask(boxOfficeActor,
new CreateEvent(name, event.getTickets()),
timeout)
.thenApply(EventResponse.class::cast);
return onSuccess(() -> futureEventResponse, maybeEventResponse ->
{
log.debug(msg, maybeEventResponse);
...
});
RestApi BoxOffice
CreateEvent
EventCreated
CompletionStage:完了したときにアクションの実⾏または値
の計算を⾏う、⾮同期の可能性がある計算のステージです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/CompletionStage.html
Copyright © 2018 TIS Inc. All rights reserved.
Interface	
ITicketSeller
Interface	
IBoxOffice
23
メッセージのやり取り2:チケットの購⼊
Reactive	
Osaka
boxOffice
Tickets
Actor	
BoxOffice
Actor	
TicketSeller
HTTP	Route	
RestApi
RestApi
GetTickets
Buy
TicketSellerアクターはBuyメッセージを受信すると、状態(チケット)を
更新しTicketsメッセージをRestApiクラスに返信する
Copyright © 2018 TIS Inc. All rights reserved. 24
実装 BoxOfficeからTicketSellerへBuyメッセージを送信
[BoxOffice ] Buyメッセージの転送(返信先は送信元になる)
child.get().forward(new TicketSeller.Buy(getTickets.getTickets()),
getContext());
BoxOffice TicketSeller
Buy
RestApi
GetTickets
[TicketSeller] メッセージ受信時のふるまい
- 送信元へTicketsメッセージの返信
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Buy.class, this::buy)
.build();
BoxOffice TicketSeller
Buy
BoxOffice
Tickets
private final List<Ticket> tickets = new ArrayList<>();
private void buy(Buy buy){
log.debug(msg, buy);
if (tickets.size() >= buy.getTickets()) {
List<Ticket> entries = tickets.subList(0, buy.getTickets());
getContext().sender().tell(new Tickets(event, entries), getSelf());
entries.clear();
} else {
getContext().sender().tell(new Tickets(event), getSelf());
}
}
アクターの持つ状態(tickets)を更新してい
るが、ロック制御を気にする必要はない
Copyright © 2018 TIS Inc. All rights reserved.
アクターとスレッド
25
まとめ
Copyright © 2018 TIS Inc. All rights reserved. 26
送信者が直接扱うのはActorではなくActorRef
Interface	
ITicketSeller
Interface	
IBoxOffice
Reactive	
Osaka
boxOffice
create
Add
Actor	
BoxOffice
Actor	
TicketSeller
[BoxOffice ] TicketSellerアクターの⽣成
String eventName = “Reactive Osaka”;
ActorRef ticketSeller = getContext()
.actorOf(TicketSeller.props(eventName), eventName);
Copyright © 2018 TIS Inc. All rights reserved. 27
メッセージ送信の流れ
boxOffice
create
enqueue
thread
dequeue
Actor
MailBox
core
Dispatcher	
Pinned	Dispacher	
CallingThreadDispatcher
Reactive	
Osaka
Reactive	
Osaka
ActorRef Actor
Dispatcher
1. ActorRefに対してメッセージを送信
2. ディスパッチャーはActorRefからメッセージを取得してメールボックスにエンキューする
3. ディスパッチャーはExecutionServiceに対してメールボックスをexecute
4. メールボックスはrunメソッドが起動されるとキューからメッセージを取り出しアクターに渡す
5. アクターのReceive処理が実⾏される
Copyright © 2018 TIS Inc. All rights reserved. 28
ディスパッチャー
Reactive	
Osaka
box	
Office
Actor	
BoxOffice
Actor	
TicketSeller
Dispatcherはアクターをスレッドプールに割り当てる
Scala	
Matsuri
Thread
Copyright © 2018 TIS Inc. All rights reserved.
ブロッキング処理:デフォルトディスパッチャーの場合
29http://www.slideshare.net/ktoso/zen-of-akka#44
デフォルトのディスパッチャーでブロッキング処理を⾏うと
全体に影響を及ぼしてしまう
Copyright © 2018 TIS Inc. All rights reserved. 30http://www.slideshare.net/ktoso/zen-of-akka#44
ブロッキング処理:専⽤ディスパッチャーの場合
専⽤のディスパッチャを使ってブロッキング処理を隔離する
Copyright © 2018 TIS Inc. All rights reserved.
まとめ
31
まとめ
Copyright © 2018 TIS Inc. All rights reserved. 32
まとめ
• リアクティブシステムの原則の1つであるメッセージ駆動は
Akkaで実現できる
• アクターモデルは本質的に並⾏であり、スレッドを直接扱わず
に並⾏処理が実装できる
• ディスパッチャーなどによりスレッドモデルを設定できる
• 最⼤限のパフォーマンスを引き出すにはスレッドを意識した
チューニングが必要だが、実装とは切り離せる
第16章「パフォーマンスTips」にディスパッチャの
チューニング例を掲載
THANK YOU

Mais conteúdo relacionado

Mais procurados

Cloudian for cloud stack days japan 2014
Cloudian for cloud stack days japan 2014Cloudian for cloud stack days japan 2014
Cloudian for cloud stack days japan 2014
CLOUDIAN KK
 

Mais procurados (20)

ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決
ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決
ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決
 
Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127
 
Cloudian presentation for Cassandra Conference 2012 in Tokyo
Cloudian presentation for Cassandra Conference 2012 in TokyoCloudian presentation for Cassandra Conference 2012 in Tokyo
Cloudian presentation for Cassandra Conference 2012 in Tokyo
 
Elastic Cloudを活用!!ゼロトラストセキュリティの「はじめの一歩」
Elastic Cloudを活用!!ゼロトラストセキュリティの「はじめの一歩」Elastic Cloudを活用!!ゼロトラストセキュリティの「はじめの一歩」
Elastic Cloudを活用!!ゼロトラストセキュリティの「はじめの一歩」
 
Cloudian for cloud stack days japan 2014
Cloudian for cloud stack days japan 2014Cloudian for cloud stack days japan 2014
Cloudian for cloud stack days japan 2014
 
【SecurityJAWS】Kibana Canvasで魅せる!AWS環境における脅威分析ユースケース
【SecurityJAWS】Kibana Canvasで魅せる!AWS環境における脅威分析ユースケース【SecurityJAWS】Kibana Canvasで魅せる!AWS環境における脅威分析ユースケース
【SecurityJAWS】Kibana Canvasで魅せる!AWS環境における脅威分析ユースケース
 
7.9 elasticstackandcloudtechnicalenablement excitingnewfeatures-jpn0827
7.9 elasticstackandcloudtechnicalenablement excitingnewfeatures-jpn08277.9 elasticstackandcloudtechnicalenablement excitingnewfeatures-jpn0827
7.9 elasticstackandcloudtechnicalenablement excitingnewfeatures-jpn0827
 
【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較
【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較
【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較
 
Building andobservingcloudnativeappliactionusingazure elastic-terraform
Building andobservingcloudnativeappliactionusingazure elastic-terraformBuilding andobservingcloudnativeappliactionusingazure elastic-terraform
Building andobservingcloudnativeappliactionusingazure elastic-terraform
 
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure aiGpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
 
スケールアウト型オブジェクトストレージの企業ITにおける使いどころ
スケールアウト型オブジェクトストレージの企業ITにおける使いどころスケールアウト型オブジェクトストレージの企業ITにおける使いどころ
スケールアウト型オブジェクトストレージの企業ITにおける使いどころ
 
Elastic7.10 newfeaturesintroduce 1216
Elastic7.10 newfeaturesintroduce 1216Elastic7.10 newfeaturesintroduce 1216
Elastic7.10 newfeaturesintroduce 1216
 
Migrating tocloudnativeapplicationwithusingelasticapm
Migrating tocloudnativeapplicationwithusingelasticapmMigrating tocloudnativeapplicationwithusingelasticapm
Migrating tocloudnativeapplicationwithusingelasticapm
 
先行事例から学ぶ IoT / ビッグデータの始め方
先行事例から学ぶ IoT / ビッグデータの始め方先行事例から学ぶ IoT / ビッグデータの始め方
先行事例から学ぶ IoT / ビッグデータの始め方
 
[data analytics showcase] B11: ビッグデータを高速に検索・分析する「Elasticsearch」~新プラグイン「Graph」...
[data analytics showcase] B11: ビッグデータを高速に検索・分析する「Elasticsearch」~新プラグイン「Graph」...[data analytics showcase] B11: ビッグデータを高速に検索・分析する「Elasticsearch」~新プラグイン「Graph」...
[data analytics showcase] B11: ビッグデータを高速に検索・分析する「Elasticsearch」~新プラグイン「Graph」...
 
whats-new-in-elastic-7-14
whats-new-in-elastic-7-14whats-new-in-elastic-7-14
whats-new-in-elastic-7-14
 
[db analytics showcase Sapporo 2018] B25 Hadoop上で動く世界最速のAnalytic DBをSparkと一緒に...
[db analytics showcase Sapporo 2018] B25 Hadoop上で動く世界最速のAnalytic DBをSparkと一緒に...[db analytics showcase Sapporo 2018] B25 Hadoop上で動く世界最速のAnalytic DBをSparkと一緒に...
[db analytics showcase Sapporo 2018] B25 Hadoop上で動く世界最速のAnalytic DBをSparkと一緒に...
 
Realizling Dapr Observability Using Elastic Stack
Realizling Dapr Observability Using Elastic StackRealizling Dapr Observability Using Elastic Stack
Realizling Dapr Observability Using Elastic Stack
 
Elastic observabilitycansmartlymanagetheappsonkubernetes
Elastic observabilitycansmartlymanagetheappsonkubernetesElastic observabilitycansmartlymanagetheappsonkubernetes
Elastic observabilitycansmartlymanagetheappsonkubernetes
 
【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化
【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化
【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化
 

Semelhante a Akkaの並行性

【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
Hibino Hisashi
 

Semelhante a Akkaの並行性 (20)

リアクティブシステムとAkka
リアクティブシステムとAkkaリアクティブシステムとAkka
リアクティブシステムとAkka
 
システムアーキテクト~My batis編~
システムアーキテクト~My batis編~システムアーキテクト~My batis編~
システムアーキテクト~My batis編~
 
JTF2018 FIWARE x robot x IoT
JTF2018 FIWARE x robot x IoTJTF2018 FIWARE x robot x IoT
JTF2018 FIWARE x robot x IoT
 
2018年01月27日 Keras/TesorFlowによるディープラーニング事始め
2018年01月27日 Keras/TesorFlowによるディープラーニング事始め2018年01月27日 Keras/TesorFlowによるディープラーニング事始め
2018年01月27日 Keras/TesorFlowによるディープラーニング事始め
 
Jazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & RobotJazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & Robot
 
IoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache FlinkIoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache Flink
 
RETEアルゴリズムを使いこなせ
RETEアルゴリズムを使いこなせRETEアルゴリズムを使いこなせ
RETEアルゴリズムを使いこなせ
 
今話題のクラウドOSとは
今話題のクラウドOSとは今話題のクラウドOSとは
今話題のクラウドOSとは
 
ServerlessConf Tokyo2018 サーバーレスなシステムのがんばらない運用監視
ServerlessConf Tokyo2018 サーバーレスなシステムのがんばらない運用監視ServerlessConf Tokyo2018 サーバーレスなシステムのがんばらない運用監視
ServerlessConf Tokyo2018 サーバーレスなシステムのがんばらない運用監視
 
Lt20190129
Lt20190129Lt20190129
Lt20190129
 
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
 
Aerospike deep dive LDTs
Aerospike deep dive LDTsAerospike deep dive LDTs
Aerospike deep dive LDTs
 
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
 
Big query and elasticsearch insight at scale
Big query and elasticsearch insight at scaleBig query and elasticsearch insight at scale
Big query and elasticsearch insight at scale
 
Extreme Data Center
Extreme Data CenterExtreme Data Center
Extreme Data Center
 
【JEUG】 オープンSIEMの世界へ
【JEUG】 オープンSIEMの世界へ【JEUG】 オープンSIEMの世界へ
【JEUG】 オープンSIEMの世界へ
 
Springのプログラムモデルと動く仕様~テスト編~
Springのプログラムモデルと動く仕様~テスト編~Springのプログラムモデルと動く仕様~テスト編~
Springのプログラムモデルと動く仕様~テスト編~
 
Google Cloud Next '18 Recap/報告会 機械学習関連
Google Cloud Next '18 Recap/報告会 機械学習関連Google Cloud Next '18 Recap/報告会 機械学習関連
Google Cloud Next '18 Recap/報告会 機械学習関連
 
Developers.IO 2018 ビジネスを阻害しない!AWS アカウントの管理
Developers.IO 2018 ビジネスを阻害しない!AWS アカウントの管理Developers.IO 2018 ビジネスを阻害しない!AWS アカウントの管理
Developers.IO 2018 ビジネスを阻害しない!AWS アカウントの管理
 
The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)
 

Mais de TIS Inc.

AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
TIS Inc.
 
Akka in Action workshop #ScalaMatsuri 2018
Akka in Action workshop #ScalaMatsuri 2018Akka in Action workshop #ScalaMatsuri 2018
Akka in Action workshop #ScalaMatsuri 2018
TIS Inc.
 
甲賀流Jenkins活用術
甲賀流Jenkins活用術甲賀流Jenkins活用術
甲賀流Jenkins活用術
TIS Inc.
 

Mais de TIS Inc. (17)

AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
 
Reactive Systems that focus on High Availability with Lerna
Reactive Systems that focus on High Availability with LernaReactive Systems that focus on High Availability with Lerna
Reactive Systems that focus on High Availability with Lerna
 
Starting Reactive Systems with Lerna #reactive_shinjuku
Starting Reactive Systems with Lerna #reactive_shinjukuStarting Reactive Systems with Lerna #reactive_shinjuku
Starting Reactive Systems with Lerna #reactive_shinjuku
 
可用性を突き詰めたリアクティブシステム
可用性を突き詰めたリアクティブシステム可用性を突き詰めたリアクティブシステム
可用性を突き詰めたリアクティブシステム
 
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
 
JavaからAkkaハンズオン
JavaからAkkaハンズオンJavaからAkkaハンズオン
JavaからAkkaハンズオン
 
Akka in Action workshop #ScalaMatsuri 2018
Akka in Action workshop #ScalaMatsuri 2018Akka in Action workshop #ScalaMatsuri 2018
Akka in Action workshop #ScalaMatsuri 2018
 
Preparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuriPreparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuri
 
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
Akkaで実現するステートフルでスケーラブルなアーキテクチャAkkaで実現するステートフルでスケーラブルなアーキテクチャ
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
 
akka-doc-ja
akka-doc-jaakka-doc-ja
akka-doc-ja
 
10分で分かるリアクティブシステム
10分で分かるリアクティブシステム10分で分かるリアクティブシステム
10分で分かるリアクティブシステム
 
Typesafe Reactive Platformで作るReactive System入門
Typesafe Reactive Platformで作るReactive System入門Typesafe Reactive Platformで作るReactive System入門
Typesafe Reactive Platformで作るReactive System入門
 
Typesafe Reactive Platformで作るReactive System
Typesafe Reactive Platformで作るReactive SystemTypesafe Reactive Platformで作るReactive System
Typesafe Reactive Platformで作るReactive System
 
Effective Akka読書会2
Effective Akka読書会2Effective Akka読書会2
Effective Akka読書会2
 
再帰で脱Javaライク
再帰で脱Javaライク再帰で脱Javaライク
再帰で脱Javaライク
 
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
 
甲賀流Jenkins活用術
甲賀流Jenkins活用術甲賀流Jenkins活用術
甲賀流Jenkins活用術
 

Akkaの並行性

  • 1. Copyright © 2018 TIS Inc. All rights reserved. Akkaの並⾏性 前出 祐吾 @yugolf
  • 2. Copyright © 2018 TIS Inc. All rights reserved. TIS株式会社  前出 祐吾 @yugolf 最近の研究テーマ  オープン環境で⾼可⽤システムどうやって構築する? 翻訳した本 最近書いてる記事  ThinkIT:リアクティブシステムの使いどころ(仮) 2 ⾃⼰紹介
  • 3. Copyright © 2018 TIS Inc. All rights reserved. Akkaを通じて アクターモデルの並⾏性を知る 3 本⽇のお話 https://akka.io/
  • 4. Copyright © 2018 TIS Inc. All rights reserved. リアクティブシステム 4 まとめ
  • 5. Copyright © 2018 TIS Inc. All rights reserved. 5 リアクティブシステムの4つの原則 • メッセージ駆動のアーキテクチャによりユーザーの要求に可能な限り迅速に レスポンスする(即応性)システム • ⾼負荷状況や問題が検出された時でも応答時間を⼀定⽔準に保ち(弾⼒ 性)、部分的な障害が発⽣した時にもシステム全体を危険にさらすことなく 回復させる(耐障害性) ※リアクティブ宣言(https://www.reactivemanifesto.org/ja)より
  • 6. Copyright © 2018 TIS Inc. All rights reserved. 6 ⼿段となるメッセージ駆動 コンポーネント コンポーネント メッセージ駆動をアクターモデルで実現する リアクティブシステムは⾮同期なメッセージパッシングによっ てコンポーネント間の境界を確⽴する
  • 7. Copyright © 2018 TIS Inc. All rights reserved. アクターモデル 7 まとめ
  • 8. Copyright © 2018 TIS Inc. All rights reserved. 8 アクターモデルとは 並⾏的に受信するメッセージに対する以下のふるまいを備える • アクターを作る • アクターにメッセージを送信する • メッセージを受信したときの動作を指定する トラディショナルモデルとの違い トラディショナルモデル アクターモデル 逐次実⾏が基本で部分的に並⾏処理を実装 本質的に並⾏
  • 9. Copyright © 2018 TIS Inc. All rights reserved. 9 本質的に並⾏? 受付係 チケット販売員 Buy Buy メールボックス Akkaを使うことでアクターのプログラミングに集中できる • コンポーネント間のやり取りはメッセージで⾏う • 関数の応答を待つ必要はなく並⾏に処理される • アクターはメールボックスを持ち到着順に処理する イベントA イベントB
  • 10. Copyright © 2018 TIS Inc. All rights reserved. アクターモデルの実装 10 まとめ 本質的に並行?
  • 11. Copyright © 2018 TIS Inc. All rights reserved. 11 例:アクターモデルによるチケット販売サービス • チケットの購⼊ • イベントの作成 チケット販売サービス GoTicks.com イベント管理者 お客さん https://github.com/yugolf/akka-in-action-java/tree/master/chapter-up-and-running Akka実践バイブル第1章より ソースコード
  • 12. Copyright © 2018 TIS Inc. All rights reserved. 12 クラス構成 ActorSystem “go-ticks” create create Actor BoxOffice Actor TicketSeller HTTP Route RestApi
  • 13. Copyright © 2018 TIS Inc. All rights reserved. アクターの基本操作 13 まとめ
  • 14. Copyright © 2018 TIS Inc. All rights reserved. 14 アクターシステムの⽣成 ActorSystem “go-ticks” Main new create create create Actor BoxOffice Actor TicketSeller HTTP Route RestApi [Main] アクターシステムを⽣成する final ActorSystem system = ActorSystem.create("go-ticks");
  • 15. Copyright © 2018 TIS Inc. All rights reserved. 15 アクターの⽣成 [RestApi] アクターを⽣成する ActorSystem “go-ticks” Main new create create create Actor BoxOffice HTTP Route RestApi ActorRef boxOfficeActor = system.actorOf(BoxOffice.props(timeout), "boxOfficeActor"); // propsの定義 public static Props props(Duration timeout) { return Props.create(BoxOffice.class, () -> new BoxOffice(timeout)); } [BoxOffice] アクターのファクトリーメソッドを定義する
  • 16. Copyright © 2018 TIS Inc. All rights reserved. 16 アクターシステム https://doc.akka.io/docs/akka/2.5/general/supervision.html アクターシステムに作成したアクターは、Userガーディアンの配下に⽣成され ヒエラルキーを構成する Actor BoxOffice Actor TicketSeller Actor XXX
  • 17. Copyright © 2018 TIS Inc. All rights reserved. Interface ITicketSeller Interface IBoxOffice 17 メッセージのやり取り1:イベントの作成 Reactive Osaka boxOffice create Add Actor BoxOffice Actor TicketSeller BoxOfficeアクターがTicketSellerアクター(Reactive Osakaイベント)を ⽣成し、Addメッセージでイベントのチケットを追加する • コンポーネント間のやり取りはメッセージで⾏う • 関数の応答を待つ必要はなく並⾏に処理される • アクターはメールボックスを持ち到着順に処理する
  • 18. Copyright © 2018 TIS Inc. All rights reserved. ticketSeller.tell(new TicketSeller.Add(newTickets), getSelf()); getContext().sender().tell( new EventCreated(new Event(createEvent.getName(), createEvent.getTickets())), getSelf()); 18 実装1/2 BoxOfficeからTicketSellerにAddメッセージを送信 [BoxOffice ] TicketSellerアクターの⽣成 String eventName = “Reactive Osaka”; ActorRef ticketSeller = getContext() .actorOf(TicketSeller.props(eventName), eventName); BoxOffice TicketSeller Add [BoxOffice ] Addメッセージの送信 sender BoxOffece EventCreated 送信元の処理と送信先の処理は⾮同期
  • 19. Copyright © 2018 TIS Inc. All rights reserved. 19 実装2/2 BoxOfficeからTicketSellerにAddメッセージを送信 [TicketSeller] メッセージプロトコルの定義 [TicketSeller] メッセージ受信時のふるまい定義 interface ITicketSeller { class Add extends AbstractMessage { private final List<Ticket> tickets; public Add(List<Ticket> tickets) { this.tickets = Collections.unmodifiableList(new ArrayList<>(tickets)); } public List<Ticket> getTickets() { return tickets; } } private final List<Ticket> tickets = new ArrayList<>(); private void add(Add add) { log.debug(msg, add); tickets.addAll(add.getTickets()); } @Override public Receive createReceive() { return receiveBuilder() .match(Add.class, this::add) .build(); } BoxOffice TicketSeller Add メッセージはイミュータブルに 受信するメッセージの型に対してふるまいを指定
  • 20. Copyright © 2018 TIS Inc. All rights reserved. 20 おさらい:(再掲)アクターモデルとは 並⾏的に受信するメッセージに対する以下のふるまいを備える • アクターを作る • アクターにメッセージを送信する • メッセージを受信したときの動作を指定する トラディショナルモデルとの違い トラディショナルモデル アクターモデル 逐次実⾏が基本で部分的に並⾏処理を実装 本質的に並⾏ getContext().actorOf() ticketSeller.tell() receiveBuilder().match()
  • 21. Copyright © 2018 TIS Inc. All rights reserved. Interface ITicketSeller Interface IBoxOffice 21 アクターの外からのメッセージ Reactive Osaka boxOffice create Add Actor BoxOffice Actor TicketSeller HTTP Route RestApi RestApi CreateEvent EventCreated RestApiクラスはクライアントにレスポンスするためアクターからの 返信(イベントが作成できたか?)が必要
  • 22. Copyright © 2018 TIS Inc. All rights reserved. 22 実装 RestApiからBoxOfficeにCreateEventメッセージを送信 [RestApi ] CreateEventメッセージを送信し応答を処理 CompletionStage<EventResponse> futureEventResponse = ask(boxOfficeActor, new CreateEvent(name, event.getTickets()), timeout) .thenApply(EventResponse.class::cast); return onSuccess(() -> futureEventResponse, maybeEventResponse -> { log.debug(msg, maybeEventResponse); ... }); RestApi BoxOffice CreateEvent EventCreated CompletionStage:完了したときにアクションの実⾏または値 の計算を⾏う、⾮同期の可能性がある計算のステージです。 https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/CompletionStage.html
  • 23. Copyright © 2018 TIS Inc. All rights reserved. Interface ITicketSeller Interface IBoxOffice 23 メッセージのやり取り2:チケットの購⼊ Reactive Osaka boxOffice Tickets Actor BoxOffice Actor TicketSeller HTTP Route RestApi RestApi GetTickets Buy TicketSellerアクターはBuyメッセージを受信すると、状態(チケット)を 更新しTicketsメッセージをRestApiクラスに返信する
  • 24. Copyright © 2018 TIS Inc. All rights reserved. 24 実装 BoxOfficeからTicketSellerへBuyメッセージを送信 [BoxOffice ] Buyメッセージの転送(返信先は送信元になる) child.get().forward(new TicketSeller.Buy(getTickets.getTickets()), getContext()); BoxOffice TicketSeller Buy RestApi GetTickets [TicketSeller] メッセージ受信時のふるまい - 送信元へTicketsメッセージの返信 @Override public Receive createReceive() { return receiveBuilder() .match(Buy.class, this::buy) .build(); BoxOffice TicketSeller Buy BoxOffice Tickets private final List<Ticket> tickets = new ArrayList<>(); private void buy(Buy buy){ log.debug(msg, buy); if (tickets.size() >= buy.getTickets()) { List<Ticket> entries = tickets.subList(0, buy.getTickets()); getContext().sender().tell(new Tickets(event, entries), getSelf()); entries.clear(); } else { getContext().sender().tell(new Tickets(event), getSelf()); } } アクターの持つ状態(tickets)を更新してい るが、ロック制御を気にする必要はない
  • 25. Copyright © 2018 TIS Inc. All rights reserved. アクターとスレッド 25 まとめ
  • 26. Copyright © 2018 TIS Inc. All rights reserved. 26 送信者が直接扱うのはActorではなくActorRef Interface ITicketSeller Interface IBoxOffice Reactive Osaka boxOffice create Add Actor BoxOffice Actor TicketSeller [BoxOffice ] TicketSellerアクターの⽣成 String eventName = “Reactive Osaka”; ActorRef ticketSeller = getContext() .actorOf(TicketSeller.props(eventName), eventName);
  • 27. Copyright © 2018 TIS Inc. All rights reserved. 27 メッセージ送信の流れ boxOffice create enqueue thread dequeue Actor MailBox core Dispatcher Pinned Dispacher CallingThreadDispatcher Reactive Osaka Reactive Osaka ActorRef Actor Dispatcher 1. ActorRefに対してメッセージを送信 2. ディスパッチャーはActorRefからメッセージを取得してメールボックスにエンキューする 3. ディスパッチャーはExecutionServiceに対してメールボックスをexecute 4. メールボックスはrunメソッドが起動されるとキューからメッセージを取り出しアクターに渡す 5. アクターのReceive処理が実⾏される
  • 28. Copyright © 2018 TIS Inc. All rights reserved. 28 ディスパッチャー Reactive Osaka box Office Actor BoxOffice Actor TicketSeller Dispatcherはアクターをスレッドプールに割り当てる Scala Matsuri Thread
  • 29. Copyright © 2018 TIS Inc. All rights reserved. ブロッキング処理:デフォルトディスパッチャーの場合 29http://www.slideshare.net/ktoso/zen-of-akka#44 デフォルトのディスパッチャーでブロッキング処理を⾏うと 全体に影響を及ぼしてしまう
  • 30. Copyright © 2018 TIS Inc. All rights reserved. 30http://www.slideshare.net/ktoso/zen-of-akka#44 ブロッキング処理:専⽤ディスパッチャーの場合 専⽤のディスパッチャを使ってブロッキング処理を隔離する
  • 31. Copyright © 2018 TIS Inc. All rights reserved. まとめ 31 まとめ
  • 32. Copyright © 2018 TIS Inc. All rights reserved. 32 まとめ • リアクティブシステムの原則の1つであるメッセージ駆動は Akkaで実現できる • アクターモデルは本質的に並⾏であり、スレッドを直接扱わず に並⾏処理が実装できる • ディスパッチャーなどによりスレッドモデルを設定できる • 最⼤限のパフォーマンスを引き出すにはスレッドを意識した チューニングが必要だが、実装とは切り離せる 第16章「パフォーマンスTips」にディスパッチャの チューニング例を掲載