並行処理の弱点を解消するActorモデル
並行処理が持つ「デッドロックが発生しうる」「スレッド管理が大変」といった弱点からエンジニアを解放すると言われているのがActorモデルです。
Actorモデルはもともと、AIのためのアーキテクチャとして開発された数学的モデルです。
その歴史は古く、1973年に最初の論文が登場しました。
(参考: http://dl.acm.org/citation.cfm?id=1624804 )
モデルの構築にあたって、Actorモデルを動作させる並列コンピュータに幾つかの仮定を置いています:
- 数百・数千のマイクロプロセッサからなる
- 個々にローカルメモリを持つ
- 高性能通信ネットワークで通信を行う
これらの仮定は、マルチコア環境が誕生し、大規模サービスの基盤として用いられるようになった昨今、現実のものになりつつあります。
AkkaのActorモデルを導入してコードを書いてみよう
Akkaは、Actorモデルに基づいて並行処理が書ける、Java又はScalaで動作するライブラリです。
以下に、Akkaの公式サイトに記述されているサンプルコードを示します。
import akka.actor.Actor
import akka.actor.Props
import akka.event.Logging
class MyActor extends Actor {
val log = Logging(context.system, this)
def receive = {
case "test" => log.info("received test")
case _ => log.info("received unknown message")
}
}
(参考:http://doc.akka.io/docs/akka/snapshot/scala/actors.html)
サンプルコードでは、「MyActor」クラス、及び「receive」というメソッドを定義しています。
Actorモデルのプログラミングにおいてはこのようなactorを複数生成し、相互にメッセージをやり取りすることで動作します。
- それぞれのactorはメールボックスとアドレスを持つ
- actorの動作は非同期的(返答を待たずに次の処理に移る)
上記のコードで定義したactorの仕事は、「test」というメッセージを受け取ったら「"received test"」という文字列、それ以外のメッセージを受け取ったら「"received unknown message"」という文字列をイベントストリームに流すというものです。
メッセージの送り手となるactorをもう一人定義すれば、このプログラムを完全なものとして動作させることが出来ます。
Actorモデルでできること
Actorモデルで構築されたシステムの有名な成功例は、スウェーデンの通信機器メーカー・エリクソン社の通信システムです。 これはIoTの事例としても興味深いものです。
(参考: https://www.ericsson.com/research-blog/internet-of-things/edge-computing-in-iot/)
このシステムはErlangという、アクターモデルをサポートした並行処理指向のプログラミング言語で記述されています。
Akkaはもともと、Erlangに影響を受けて開発されました。 Akkaの強みとしては、子actorを定義しメッセージを一斉送信出来ることなどが挙げられます。 大規模な計算が必要なサービスに不可欠な並行計算の技術。まずはこんな形で触れてみてはいかがでしょうか。
弊社の取り組み
弊社では、クローラーの開発と保守を行っていますが、データの収集処理の並列化などで、 Akka Actor を利用しています。
関連記事
- 2018/07/18 全文検索を自社サイト・社内サーバーに構築したいクライアントのための留意点 システム開発における「全文検索」の実装方式・コスト・性能に関して、クライアント企業の方にも腹落ち頂けるようまとめました。grep型と索引型の違いに関する平易な解説を記載しているので、これらをクライアントに解説されたい開発者にもオススメです。
- 2018/02/01 利益管理のためのデータ可視化 技術者にできる事は何か? データ可視化は科学技術分野において発祥した技術であり、与えられたデータから自動的に「見やすい図示」を出力するアルゴリズムを指します。データを見やすくし、ビジネスの意思決定に活用するという観点から手法を紹介し、R言語によるデモを行います。
- 2017/12/28 機械学習・統計学・最適化の違いについてまとめてみた 「機械学習」という手法は、システム開発の現場で用いられる事例が急増しています。一方、「統計学」という分野も機械学習と同様にデータを扱い、やはり多数の事例があります。本記事は「機械学習と統計学の違い」について整理することを試みます。
- 2017/12/04 システムによる最適化を通じて、開発者がめざすもの 〜エレベーターの制御システムを例に〜 システム開発においてお客様の要望に応えようとするとき、いろいろなところで「システムによる最適化」を含む開発アイデアを発想します。この記事では、最適化を成り立たせる「目的関数」と「制約式」という思考法を紹介します。
- 2017/06/30 Chainerを使ってMarkov chain(マルコフ連鎖)を書いてみる 本記事は、Python上で動作するニューラルネットワークのライブラリ「Chainer」を使ってマルコフ連鎖を実装、様々な実験を行うものです。本来関係のない両者を結びつけることでどんなメリットが得られるのでしょうか?