Akkaの優れた使用例[終了]


605

私はAkkaフレームワーク(Java / Scalaサービスプラットフォーム)について多くの絶賛を聞いていますが、これまでのところ、それが役立つユースケースの実際の例は多くありません。ですから、開発者がこれをうまく使ったことについて聞いてみたいと思います。

制限は1つだけです。チャットサーバーを作成する場合は含めないでください。(なぜですか?これは多くの類似したものの例として使いすぎているためです)


10
解決策を見つけてそれを適用する問題を探すよりも、問題から始めて解決策を見つける方が簡単ではないでしょうか。私の推測では、RMIを使用する代わりに、Akkaとそのアクターはコードを書くのがはるかに簡単/簡単に見えます。
ケネット

67
はい、解決する特定の問題があった場合。どうしても「あっかを使う口実」を探しているわけではありませんが、もう少し学びたいです。これは将来の問題の解決にも役立ちますが、主に継続的な学習プロセスのためです。
StaxMan

そこに関連する質問ですが、いくつかのユースケース+既存のアプリケーションのためにアッカの適用について:stackoverflow.com/questions/16595685/...は
SES

2
Akkaは、JMSまたはMQスタイルの分散メッセージキューシステムよりも優れたソリューションです。これは、まったく同じ質問を最近行った私にとって、それを理解するための最良の方法です。「それを使用する方法を理解し、どこで使用できるかを確認しますが、これが本当の利点をもたらす場所を確認できません。」Akkaの背後にあるコア設計の前提は、特にプロセスの分離、ロックのない設計、再試行/障害処理に関して、JMS / MQの背後にあるものよりもはるかに優れています。次に、APIはJMS / MQツールよりもはるかにエレガントです。
user2684301 2014年

2
@ user2684301うーん。リンゴからオレンジの方法で、その答えは少し不公平です。MQは(論理的に)単純なビルディングブロックであり、Akkaよりもはるかに少ないため、並べて比較することはしません。しかし、「JMSを使用して構築され、宣言的に記述された分散システムと比較して」と読んだ場合、それはもっと理にかなっていると思います。
StaxMan 2014年

回答:


321

これまでのところ、2つの実際のプロジェクトで非常にうまく使用しています。どちらもほぼリアルタイムの交通情報フィールド(高速道路の車のような交通)にあり、複数のノードに分散され、複数のパーティ間でメッセージを統合し、信頼性の高いバックエンドシステムです。私はまだクライアントの詳細を説明する自由はありません、私がOKを得るとき、それはおそらくリファレンスとして追加することができます。

Akkaは、バージョン0.7だったときに始めたにもかかわらず、これらのプロジェクトを本当に成功させました。(ちなみにスカラを使っています)

大きな利点の1つは、アクターとメッセージからシステムを簡単に構築できることです。これは、ボイレプリングがほとんどなく、手作業によるスレッド化の複雑さをまったく伴わずに非常によく拡張でき、オブジェクト間で非同期メッセージをほぼ無料で渡すことができます。

あらゆるタイプの非同期メッセージ処理のモデリングに非常に適しています。他のスタイルよりも、このスタイルで任意のタイプの(Web)サービスシステムを記述したいと思います。(これまでに、JAX-WSを使用して非同期Webサービス(サーバー側)を記述しようとしたことはありますか?これはかなりの手間です)。したがって、すべてが暗黙的に同期メソッドを使用して呼び出され、1つのコンポーネントが何かをロックしているため、そのコンポーネントの1つでハングアップしたくないシステムを言います。それは非常に安定しており、障害に対するlet-it-crash +スーパーバイザソリューションは本当にうまく機能します。すべてをプログラムで簡単に設定でき、単体テストも難しくありません。

次に、優れたアドオンモジュールがあります。Camelモジュールは本当にAkkaにうまくプラグインし、設定可能なエンドポイントで非同期サービスのそのような簡単な開発を可能にします。

私はフレームワークに非常に満足しており、私たちが構築する接続システムの事実上の標準になりつつあります。


14
あなたの意見では、メッセージの受け渡しにメッセージングバックエンド(ActiveMQなど)を使用する場合と比較して、このアプローチの利点は何ですか?
magiconair 2012

27
MQ製品は実際には別のユースケース向けです。異なる保証と非常に異なるパフォーマンス。MQ製品には多くの設定が必要です。そのような製品では、オブジェクトを使用する場合と同じようにキューを使用しないでください。アクターはakkaでは一流の市民であり、オブジェクトの使用方法と同様に、好きなように使用します。したがって、プログラミングモデルとセットアップの両方でオーバーヘッドがはるかに少なくなります。他の外部システムと統合するためにより多く使用するMQ製品。システムの「内部」を構築するためではなく、これはアクターを使用するものです。
Raymond Roestenburg、2013年

26
DBPケーススタディの新しいURLは、downloads.typesafe.com
Bas

2
@RaymondRoestenburg re:MQシステムと代替手段の構築。たとえば、RabbitMQは、アクターベースのプログラミング言語Erlangに基づいて構築さています。これは、アクターとMQの関係(および区別)について考える1つの方法です。一方、Apache Sparkはワーカーおよびキューベースでもアクターベースでもありませんが、Akkaで使用できます。Typesafeは、AkkaでSparkストリーミングを使用する方法を示しています
ドリフトキャッチャー2015年

6
@RaymondRoestenburg Actorモデルがそのままスパゲッティのような構造を促進していることの言及を怠っていました。あなたが書いた「Akka in Action」の本は、この「機能」の最高のデモンストレーションです。コード例はかなり基本的なストーリーを扱っています。しかし、ワークフローを理解してコードから理解するのは非常に困難です。関連する問題は、Akkaコードが、ビジネスロジック全体で、想像できる最も煩わしい方法でIRREVERSIBLYになるということです。他の非俳優フレームワークよりもはるかに多く。別のセクションに分割することなく基本的なワークフローを書くことは、単に不可能です。
17

222

免責事項:私はAkkaのPOです

同時推論を提供することに加えて、推論と修正を行うのがはるかに簡単になり(俳優、エージェント、データフローの同時実行)、STMの形式で同時実行制御を使用できます。

以下は、検討すべきユースケースです。

  1. トランザクション処理(オンラインゲーム、金融、統計、賭け、ソーシャルメディア、テレコムなど)
    • スケールアップ、スケールアウト、フォールトトレランス/ HA
  2. サービスバックエンド(あらゆる業界、あらゆるアプリ)
    • サービスREST、SOAP、cometdなど
    • メッセージハブ/統合レイヤーとして機能
    • スケールアップ、スケールアウト、フォールトトレランス/ HA
  3. スナップインの同時実行/並列処理(すべてのアプリ)
    • 正しい
    • 扱いやすく理解しやすい
    • jarを既存のJVMプロジェクトに追加するだけです(Scala、Java、Groovy、またはJRubyを使用)
  4. バッチ処理(あらゆる業界)
    • ラクダ統合により、バッチデータソースと接続
    • アクターはバッチワークロードを分割して征服します
  5. 通信ハブ(テレコム、Webメディア、モバイルメディア)
    • スケールアップ、スケールアウト、フォールトトレランス/ HA
  6. ゲームサーバー(オンラインゲーム、賭け)
    • スケールアップ、スケールアウト、フォールトトレランス/ HA
  7. BI /データマイニング/汎用クランチ
    • スケールアップ、スケールアウト、フォールトトレランス/ HA
  8. ここに他の素晴らしいユースケースを挿入します

10
FuturesとSTMのメリットは理解していますが、アクターの適切な使用例が見つかりません。ゲームまたはベッティングサーバーの場合、ロードバランサーの背後で複数のアプリサーバーとアクターを使用する利点は何ですか?
Martin Konicek 2013

8
@ViktorKlang POs!=技術リーダー。彼らは一緒に働きますが、役割は異なります。
taylorcressy 2017

79

それを使用する方法の例は、デビット/クレジットカードトランザクションの優先キューにあります。これらは数百万あり、作業の労力は入力文字列のタイプに依存します。トランザクションのタイプがCHECKの場合、処理はほとんどありませんが、POSの場合は、メタデータ(カテゴリ、ラベル、タグなど)とのマージやサービス(電子メール/ SMSアラート、詐欺の検出、資金残高の低下など)。入力タイプに基づいて、ジョブを処理して作業を実行するために必要なさまざまな特性(ミックスインと呼ばれる)のクラスを作成します。これらのジョブはすべて、異なる金融機関からリアルタイムモードで同じキューに入ります。データがクレンジングされると、永続化、分析のためにさまざまなデータストアに送信されるか、ソケット接続またはLiftコメットアクターにプッシュされます。動作しているアクターは常にデータの自己負荷分散を行っているため、データを可能な限り速く処理できます。また、追加のサービス、永続モデル、および 重要な決定ポイント。

JVMを通過するErlang OTPスタイルのメッセージは、既存のライブラリとアプリケーションサーバーの肩の上でリアルタイムシステムを開発するための優れたシステムになります。

Akkaでは、従来のようにメッセージパッシングを行うことができます。 しかし、スピードで!また、ソリューションに必要な大量のアクタープール、リモートノード、フォールトトレランスを管理するためのフレームワークのツールも提供します。


1
それで、リクエストごとのシングルスレッドが適切にスケーリングされない(いくつかの)長いレイテンシのリクエストのケースであると言うのは公正ですか?
StaxMan 2010

7
アクタープログラミング全般の重要な部分はメッセージフローです。副作用のないデータのフローの概念化を開始したら、できるだけ多くのフローがノードごとに発生するようにします。これは、メッセージを送信せず、処理に長い時間がかかる半均質ジョブがある場合、ハイパフォーマンスコンピューティングとは大きく異なります。アクターベースのフィボナッチ実装は、アクターを使用する理由を示しておらず、そのアクターのみがタクを麻痺させるため、非常に限定的な例だと思います。ユースケースについては、イベント駆動型アーキテクチャを考えてください。
Wade Arnold

4
イベント駆動型アーキテクチャは、問題についての別の考え方です。Akkaでのコーディングについて考えている場合は、マニングからErlang OTP in Actionを読む価値があります。akkaの多くの構成要素はErlang OTPの影響を受けており、この本は、Jonas Bonerがakka apiを彼が作成した方法で構築した理由の原則を示しています。アッカはあなたが立っている大きな山です!アクターが状態の変化を通じて持続する場合、本当に1秒に1万回の書き込みが持続する必要があります
Wade Arnold

8
ウェイド、どうやってメッセージの保証を処理するの?あなたは言及します:(電子メール/ smsアラート、詐欺の検出、資金残高の減少など)、これらはリモートの俳優に送信される可能性があると思いますか?これらの操作が実際に行われたことをどのように確認しますか?不正警告の処理中にノードが失敗した場合はどうなりますか?それは永遠に消えたのですか?最終的にそれをクリーンアップする一貫したシステムはありますか?ありがとう!
James

2
ジェームス、いい質問だ。急いで返信する必要がないシステムに適合しているのは明らかです。たとえば、クレジットカードの請求書を処理できます。計算する; メール等を送ってください。返信が必要な場合、どうすればいいのか(トランザクション)どうすればいいのでしょうか。最後に; リクエストが外部から行われた場合(インターネットユーザー、コールセンターの代表者など); 彼または彼女は返事を待ちます。サブタスク(非同期で実行される)が確実に実行されるようにするにはどうすればよいですか。返事を返すことができるようにxaトランザクションで?
Kaan Yy、2012

44

Akkaを使用してREST呼び出しを非同期で処理します-非同期Webサーバー(Nettyベース)を併用することで、従来のユーザーごとのスレッドリクエストモデルと比較して、ノード/サーバーごとに提供されるユーザー数を10倍改善できます。

AWSのホスティング料金が10分の1になることを上司に伝え、それは簡単です!Shh ...アマゾンにそれを言わないでください... :)


3
そして、私はakkaフューチャーのモナディックな性質により、よりクリーンな並列コードにつながり、コードのメンテナンスで何千もの節約になりました...
piotrga

8
コールはレイテンシが高く、スループットが低いと思いますか?他のサーバーを呼び出して、応答を待っているように(プロキシ)?
StaxMan 2012年

38

大規模な電話会社のプロジェクトでAkkaを使用しています(残念ながら、多くの詳細を開示することはできません)。Akkaアクターはデプロイされ、Webアプリケーションによってリモートでアクセスされます。このようにして、Googleのプロトバッファーに基づいた単純化されたRPCモデルがあり、Akka Futureを使用して並列処理を実現しています。これまでのところ、このモデルは見事に機能しています。注:Java APIを使用しています。


もう少し詳しく教えてください。Afaik先物は有線で送信できません(シリアル化)。あなたは多くの先物と少数の俳優を使用しますか、それとも両者の混合を使用しますか?すべてのシリアル化にprotobufを使用し、メッセージとして俳優に送信しますか?
Aktau 2012

これは、Akkaがなくても簡単に処理できたようです。
エリックカプルン2014年

1
TDCは、Fiaddesioのケースでは電話会社です。
Roman Kagan

37

チャットサーバーを1レベル上に抽象化すると、答えがわかります。

Akkaは、Erlangの「クラッシュさせよう」という考え方に似たメッセージングシステムを提供します。

したがって、例は、メッセージングのさまざまなレベルの耐久性と信頼性を必要とするものです。

  • チャットサーバー
  • MMOのネットワーク層
  • 財務データポンプ
  • iPhone /モバイル/あらゆるアプリの通知システム
  • RESTサーバー
  • たぶん、WebMachineに似ていると思います(推測)

Akkaの優れた点は、永続化のための選択肢であり、STMの実装、RESTサーバー、およびフォールトトレランスです。

チャットサーバーの例に迷惑をかけないでください。それを特定のクラスのソリューションの例として考えてください。

優れたドキュメントがすべて揃っているので、この正確な質問、ユースケース、および例がギャップのように感じます。例は重要なものです。

(ビデオを見たり、ソースで遊んだりする経験だけで書かれているので、私はakkaを使用して何も実装していません。)


2
ありがとう-私はチャットサーバーが必ずしも悪いと言ったのではなく、補足的な例が欲しいだけだ。可能性をよりよく理解するのが容易になります。
StaxMan 2010

RESTサーバーがここにどのように適合するか知りたいですか?Node.jsスタイルの非同期サーバーのコンテキストでそれについて言及していますか?使用例を共有していただきありがとうございます。私はそれらが役に立ったと思いました。
software.wikipedia

24

作業中のいくつかのプロジェクトでAkkaを使用しています。その中で最も興味深いのは、自動車の衝突修理に関するものです。主に英国にありますが、現在は米国、アジア、オーストラリア、ヨーロッパにも拡大しています。アクターを使用して、衝突修理情報がリアルタイムで提供され、車両の安全で費用対効果の高い修理を可能にします。

Akkaに関する質問は、「Akkaで何ができないのか」ということです。強力なフレームワーク、強力な抽象化、およびすべてのフォールトトレランス機能と統合できるため、非常に包括的なツールキットになります。


あなたが選択しなければならなかった場合、あなたはどの側面が最も好きですか?他のフレームワークの自動統合、自動フォールトトレランス、または他の何か?
StaxMan 2010

6
個人的な見地から、私が一番気に入っているのは、アッカがテーブルにもたらす抽象化レベルの引き上げです。企業の観点からは、統合機能です。生計を立てるようになり、Akkaはビジネスと喜びの両方を非常にうまくカバーしています:-)
rossputin 2010

メッセージの流れについて詳しく教えてください。ユーザーは修理工場の人であり、クラッシュの詳細をhttpフォームに入力してから、データをサーバーに送信します。これはakkaによって処理されるメッセージを作成しますか?このメッセージで何をするのですか?入力した情報を抽出してデータベースにクエリを送信し、応答をキューに入れてWebフロントエンドに送り返しますか?
surfmuggle

24

Akkaはいくつかの異なる種類のものに使用できます。

私はWebサイトで作業していて、テクノロジースタックをScalaとAkkaに移行しました。私たちはウェブサイトで起こったほとんどすべてにそれを使用しました。チャットの例は悪いと思うかもしれませんが、すべて基本的に同じです:

  • ウェブサイトのライブアップデート(例:ビュー、いいね、...)
  • ユーザーのライブコメントを表示しています
  • 通知サービス
  • 検索およびその他すべての種類のサービス

特にライブの更新は、チャットの例が要約されているため、簡単です。サービスの部分はもう1つの興味深いトピックです。リモートアクターの使用を選択するだけでよく、アプリがクラスター化されていなくても、簡単に別のマシンにデプロイできます。

また、ラップトップからデータセンターまで拡張できるようにするため、PCBオートルーターアプリケーションにAkkaを使用しています。より多くの力を与えるほど、結果は良くなります。Akkaは位置の透過性も提供するため、通常の同時実行を使用しようとすると、これを実装するのは非常に困難です。

現在、自由時間プロジェクトとして、アクターのみを使用してWebフレームワークを構築しています。ここでも利点は、単一のマシンからマシンのクラスタ全体までのスケーラビリティです。さらに、メッセージ駆動型アプローチを使用すると、ソフトウェアサービスが最初から指向されます。あなたはそれらの素晴らしいコンポーネントをすべて持っています。お互いに話し合いますが、必ずしもお互いを知っているわけではありません。同じデータセンターでさえ同じマシン上に住んでいます。

そして、Google Readerがシャットダウンしたので、RSSリーダーから始め、もちろんAkkaを使用しました。それは私にとってカプセル化されたサービスのすべてです。結論として:アクターモデル自体が最初に採用すべきものであり、Akkaは非常に信頼性の高いフレームワークであり、その過程で得られる多くの利点を備えた実装に役立ちます。


こんにちはジョー、サイトを更新するためにメッセージがどのように使用されるか説明できますか?コンテンツ作成者のための1つのシステムがありますか。彼は新しい記事を作成し、保存を押します。これにより、着信トラフィックを処理する複数のサーバーに送信されるメッセージが作成されますか?各サーバーは、更新メッセージをできるだけ早く処理します。すべての新しいブラウザ要求は、ページの更新されたバージョンを取得しますか?ありがとう
surfmuggle 2018

18

キャメルプラグインと一緒にakkaを使用して、twimpact.comの分析とトレンド処理を配信しています。1秒あたり50から1000のメッセージを処理する必要があります。キャメルによるマルチノード処理に加えて、最大のパフォーマンスを得るために、単一のプロセッサでの作業を複数のワーカーに分散するためにも使用されます。非常にうまく機能しますが、輻輳の処理方法をある程度理解する必要があります。


Akkaのフォールトトレランスも使用していますか?
エリックカプルン2014年

Sparkクラスターにアクセスできる場合、Spark Streamingはどうですか?
skjagini

18

私はAkka(Java api)を試してみました。私が試みたのは、Akkaのアクターベースの同時実行モデルをプレーンなJava同時実行モデル(java.util.concurrentクラス)と比較することでした。

使用例は、文字数の実装を減らす単純な正規マップでした。データセットはランダムに生成された文字列(長さが400文字)のコレクションであり、その中の母音の数を計算します。

Akkaでは、BalancedDispatcher(スレッド間のロードバランシング用)とRoundRobinRouter(関数アクターの制限を維持するため)を使用しました。Javaの場合、私は単純なフォーク結合手法(作業スチールアルゴリズムなしで実装)を使用しました。中間結果はブロッキングキューに保持され、結合も可能な限り並列化されました。おそらく、私が間違っていなければ、それはどういうわけか彼らがメッセージを受信するAkkaアクターの「メールボックス」概念を模倣するでしょう。

観察:中程度の負荷(〜50000文字列の入力)まで、結果は同等であり、反復ごとにわずかに異なりました。ただし、負荷を最大100000に増やしたため、Javaソリューションがハングしました。この状況でJa​​vaソリューションを20〜30スレッドで構成しましたが、すべての反復で失敗しました。

負荷を1000000に増やすと、Akkaにとっても致命的でした。クロスチェックをしたい人とコードを共有できます。

したがって、私にとっては、Akkaは従来のJavaマルチスレッドソリューションよりもスケールアウトが良いようです。そして、おそらくその理由は、Scalaの内部の魔法です。

問題ドメインを、イベントドリブンのメッセージパッシングとしてモデル化できる場合、AkkaはJVMに適していると思います。

実行したテスト:Javaバージョン:1.6 IDE:Eclipse 3.7 Windows Vista 32ビット。3GB RAM。Intel Core i5プロセッサ、2.5 GHzクロック速度

テストに使用される問題のドメインは議論される可能性があることに注意してください。私はJavaの知識が許す限り公平にしようとしました:-)


3
「クロスチェックをしたい人とコードを共有できます。」よろしければよろしくお願いします。
n1r3 2012

3
コードも欲しいのですが、githubリンクを投稿できますか?
ゴータム

ご関心をお寄せいただきありがとうございます。残念ながら、GitHubリポジトリの設定に問題があります。メールをいただければ、ソースコードをメールでお送りします。そして、返信が遅くなったことを後悔しています!
スタヌダルイ2013年

@sutanudaluiまだコードをお持ちですか?メールを共有できますか?
ジェイ

16

音声対話システム(primetalk)でAkkaを使用します。内部的にも外部的にも。単一のクラスターノードで多数のテレフォニーチャネルを同時に実行するには、いくつかのマルチスレッドフレームワークが明らかに必要です。アッカは完璧に動作します。java-concurrencyには以前から悪夢がありました。そして、Akkaを使用すると、スイングのように、単に機能します。堅牢で信頼できる。24時間365日、ノンストップ。

チャネル内には、並行して処理されるイベントのリアルタイムストリームがあります。特に:-長い自動音声認識—俳優で行われます。-いくつかのオーディオソース(合成音声を含む)をミックスするオーディオ出力プロデューサー。-テキストから音声への変換は、チャネル間で共有される別個のアクターのセットです。-セマンティックおよび知識処理。

複雑な信号処理の相互接続を作成するには、SynapseGridを使用します。複雑なアクターシステムでのDataFlowのコンパイル時チェックの利点があります。


14

私は最近、Akkaで正規のmap-reduceサンプルを実装しました:単語数。つまり、それはAkkaの1つの使用例であり、パフォーマンスの向上です。これは、何よりもJRubyとAkkaのアクターの実験でしたが、AkkaがScalaでもJavaだけでもないことを示しています。これは、JVM上のすべての言語で動作します。


パフォーマンスを向上させるために何が(また、どの代替手段と比較して)責任があるか知っていますか?それは、JRuby(vsネイティブRuby)でのJRubyの使用によるものですか、非ブロッキングI / Oによるスカラーライブラリなどによるものですか?
StaxMan 2010

2
私が書いた比較は次のとおりでした:俳優とのJruby順次VS Jruby。したがって、より迅速な実行に責任を持つことができる唯一のものは、俳優の参加です。I / Oは実験に参加していません(ファイルはディスクから読み込まれますが、ベンチマークタイマーが設定される前に行われます)。
ダニエル・リベイロ2010

私は最近、マップは、同様の例を減らす実装しましたが、それは単なるだバニラのjava github.com/chaostheory/jibenakka
カオス理論
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.