みなさんこんにちは!
アドテクのダーシャです✨先週は自己紹介だけでしたが今日から!!ついに!!Akkaの勉強を初めますょ‼︎
今日はこんな感じでこのブログを書きながらアクター君を描いてます!(コーヒー飲んでるのが写真でもバレますね )
さて、早速ですが勉強タイムスタート!!
今日のテーマは基本の基本ですが、とても大事です!そのテーマは
いやいや、そもそもAkkaって何??
大事🌟
最短説明:Akkaは並列処理、分散システムを簡単に作るためのtoolkitです。
ちょっと長めの説明:「Scalaを始めてからAkka気になってました」って言ってましたけど、実はAkkaはScalaだけではなくJVMで並列処理を簡単にできるActor Modelを使っているtoolkitです。なのでJavaでも、Scalaでも、(本当に使いたい人がいるかどうか不明ですけど)Groovyでも使えます。
AkkaはActor Modelに基づいていて、並列処理の実装を抽象化することで、アプリケーション内の並列処理に関する設計をシンプルにできて、その結果バグを少なくすることができます♬ ここで思ったかもしれないこと言ってもいいですか??
Actor Modelって?・・・
ですよねですよね o(^^)o Actor modelを理解しないとさっきのは説明になっていませんね!
アクターモデルは、今までよく習ってきた「オブジェクト指向」とはちょっと違ったプログラミングに対する考え方です。オブジェクト指向プログラミングでは、クラスから新しいインスタンスを作って、出来上がったオブジェクトのメソッドを使って処理を行います。アクターモデルだと、基本の処理に対する考え方が違っていて、「メッセージパッシング」(メッセージ送受)のように処理を行います。アクター(何かしらアクションを起こしてくれるもの)間でメッセージ(何かしらのデータ)を送り合うことによって処理が進みます。
想像するときは会話かキャッチボールでいいと思います!こんな感じですね↓↓↓
アクターとはメッセージを処理できるものです。アクターの中のメソッドにはアクセスできなくて、アクターにはメッセージを送ることしかできません。メッセージの種類によって、アクターがどんな処理をするべきかを決めます。よく見かけるmatch文で、こんな風にアクターくんが会話できるようになります✨
アクター達はみんな仕事が決められていて、自分のお仕事しかできません でも他のアクター達にメッセージを送ることができて、受け取ることもできます。
このメッセージでのやり取りには「返事待ち」の時間がありません。これを「非同期処理」と言います。
アクターモデルをレストランに例えると、レストランのウェイトレス[waitress actor]がお客さんの注文を聞いた後、オーダーをメモ[message]に書いて、キッチン[kitchen actor]に渡します。そして、キッチンの人はメモを見て料理を作るけど、その間にウェイトレスがずっと料理が出るのを待っていると、とても効率が悪くて、とても行きたくないレストランになっちゃいます。でも普通のレストランではウェイトレスが他のお客さんの注文を聞きに行って、料理が出来上がった時にキッチンに呼ばれて料理を運びます。アクターも同じように、自分のお仕事にしか興味がないので自分のタスクが終わったら次の自分のタスクを始めます。
なのでアクターたちが効率よくお仕事ができます!
んーなんか難しそうじゃない?なんでAkka使うん?
今からAkkaのいいとこいっぱいあげていきますね✨✨✨✨✨
デザインによる抽象化 Abstraction by design
Akkaは上で書いたようにActor modelを使っているので、難しい「ザ並列処理」の実装をエンジニアから隠します。Actorのルールに従っていれば、裏側でAkkaさんがいい感じにしてくれる!!(、と信じる!✨)
というのはすごい単純な言い方ですが、アクターを使うことによって並列処理をイメージしやすく、言葉で伝えやすくなって、バグや矛盾している設計ミスに簡単に気づけるようになります。
スレッドでいいんじゃない?っていう人はもう話かけないでください(;;)大学時代にセマフォのせいで十分涙を流しました。
というのは嘘です。(涙は流しましたが)スレッドで並列処理をする場合は、リソースが解放される待ち時間、デッドロックなどを考えないといけないので、スケールするとともに考えないといけないことが多くなります。システム全体を理解してちゃんと設計することが難しいので、
もう嫌です><できるだけ直接スレッド処理を実装したくないのです。
一人のアクターの中では同時に複数のスレッドが存在することは絶対にないのでデッドロックなどのマルチスレッドプログラミング上でよく起こる問題を考えなくていいです!o(^^)o
Fault tolerance & Supervision
AkkaはErlangの「Let It Crash」というアプローチをエラー処理に使います。というのは、「エラーが出てしまった場合は、無駄にcatchせずにユーザーにエラーがあったことを知らせて、次はエラーが起きないようにする」ってことです。
アクターの中でエラーが発生すると、その中で解決するのではなく、他のアクターにそのエラーを解決するように頼みます。そうするといろいろメリットがあるのですが、それはまたの機会で話しますね✨
Location transparency
やっぱり大きいシステムを作る場合はクラスターになっちゃいますが、Akkaのクラスタリングサポートはすごいです🌟 友達がどこにいるかわからなくても、電話番号を知っていたら連絡が取れるように、アクターも分散システムで離れた他のアクターのmailing addressを知っていたら連絡が取れます。これがLocation transparencyです。こうやって複数のサーバーを使っていてもアクター間のコミュニケーションが簡単になります♬
うわ、、、こんなに長くなったけど今回コード一行も書いてない!次回はAkkaのActor本当に作ってみるよ!