0

私はこの質問を正確にどこで(正確に聞くのか)はわからないので、ここの誰かが私に正しい方向を向けることを願っています。クラスタアプリケーションを開発する

私にはサービスがあります。そのサービスはメモリ内に異なるオブジェクトを持ちます。それぞれのオブジェクトは独自の状態です。オブジェクトが作成されるたびに、データベースから状態をロードして保持します。オブジェクトに変更が加えられると、それらはデータベースに永続化されます。

私はこのサービスを拡大したいと思います。私はakka.net(アクターモデル)のようなソリューションを見てきました。彼らはクラスタリングソリューションを持っています。私が読んだことから、それは、各ノードが他のノードに状態を送信する「ゴシップ」と呼ばれるものと状態を同期させます。現時点で私の作業用アプリケーションをakka.netに変換することが本当に可能かどうかはわかりません。

クラスタが異なるノード間でどのように状態同期をとっているのか(私はゴシップの考え方をしています)、メッセージAを受信したマシンBとメッセージBを受信するとどうなりますかオブジェクトの同じ状態を変更する - 状態間のデータの完全性に問題が生じる。これについての私の考えは、共有リソースをロックすることですが、それはクラスタの目的に反するものです。

データベースがボトルネックおよび単一障害点になるため、データベースに状態を保持することもオプションではありません。

オンラインで関連する読書資料を見つけることができないようですが、私は焦点を当てる必要がある技術的なフレーズも欠いています。

関連性がある場合は、.NET CoreとC#を使用して開発しています。

誰でもクラスタリングの概念について説明し、どのように動作し、ノードが同期していることを確認できますか?または正しい方向を指すことができますか?

+0

Akka.NETのクラスタゴシップは、クラスタの健全性に関するタブを維持するためにのみ存在します。つまり、ノードがいつ利用可能になったか、死んだときなどを知ることです。 あなたの俳優の状態を同期させません。あなたのクラスター内のアクター内でメッセージをディスパッチし、状態が同期していることを確認することは、あなたの責任です。 これを達成するために使用できるさまざまな方法があります。IIRC Petabridgeには、これに関するいくつかのブログ記事(およびその他の有用なAkka.NETの記事)があります。 – easuter

答えて

1

大きな問題があります。私は、あなたが問題を考えていることが大きな問題だと思います。基本的なことを考えてみましょう。

クラスタリングは、「象を食べる」問題と同じように大きな問題を解決するために使用されます。この問題を解決するには、巨大な口を持つユニークな大きな捕食者を設計することができます。しかし、歴史と古生物学は、大きな捕食者は容易に持続できない(環境が高価である)ことを示しています。

問題を解決するには、より強力なサーバーを使用することができます。

また、クラスタリングを使用することもできます。

クラスタリングは「象を食べる」問題を非常に異なる方法で解決します。象を食べるために巨大な口を持つユニークな巨大な捕食者を送るのではなく、一度に食べるために分散処理と共有処理という概念を使用します。適切に行われると、蟻は象を食べることができます。十分なものがあれば、状況は正しい。

私の例では、アリは非常に小さいです...単一の蟻が象全体を運ぶことはありません。すべてのアリが一緒に働いていたら、象全体を運ぶことができますが、同時に並行性とロックの問題に遭遇します(あなたはアリを調整する必要があります)。

アリはこれに対処するより良い方法を私たちに示しています。彼らは象の一部をとり、小さな塊で問題に対処します。

あなたのシステムでは、ノード間でデータを同期する方法を尋ねます...私の質問はなぜでしょうか?データを同期している場合は、ミラーリングしていて問題はさらに大きくなります(あなたはゾウを複製していますが、オリジナルのみを食べることができます)。

問題の解決方法は、解決策を再考し、問題をより小さな部分に分解できるかどうかを確認することです。

AkkaとActorパターンでは、問題を処理する最善の方法は、小さな「プロセス」(単一のant)を使用することです。プロセス自体はほとんど無駄ですが、大規模で使用すると非常に強力になります。建築が正常に行われると、火炎放射器をアリに奪われても、それを打ち負かすことはできません...もっとアリが来るでしょう、彼らは問題を解決し続けます。

データをコピーして同期することはあなたの解決策ではなく、クラスタリングです。あなたはあなたのデータを取って、それを単一のアリに与えることができるようなところまで壊さなければなりません。これを行うことができれば、Akkaを使うことができます。このアプローチが馬鹿げているようなら、Akkaはあなたのためではありません。

これを考慮してください...明らかに、データベースのバックエンドには懸念があります.IOを増やして単一障害点を導入することは望ましくありません。私はあなたに同意する必要があります。しかし、あなたは物事を再考する必要があります。シングルポイント障害を取り除くためにデータベースのミラーリングができますが、これがボトルネックを取り除くことは間違いありません。ですから、ミラーで単一障害点が取り除かれたとしましょう...次に、ボトルネック部分を攻撃しましょう。

あなたのデータをアリが扱うことができる十分小さな塊に分けることができれば、私はあなたのアリに、データが変わったときにのみデータベースに報告するように促すでしょう。初期化あなたはバックエンドの店を必要とする、あなた自身をキュートしないでください、電気はすぐに失われる可能性があります...それはどこかに保存する必要があります)しかし、あなたは大幅になります式からすべてのクエリを削除します負荷がどこから来ているのかを調べる。更新、挿入、削除のみを処理すると、全体の風景がはるかにシンプルになります。

クラスタリングはあなたのための解決策でなければなりませんが、ミラーの概念をあなたの心から奪うことができる場合に限ります。

クラスタノードはクラッシュする可能性がありますが、他のノードに再ポスティングすることができるため、常に素早くシステムを使用できます。ノード/ワーカープロセス/アリのクラッシュや紛失に対処する場合にのみ、データをリロードする必要があります。

幸運にも...私はソフトウェア工学の学位を持つ人々解決に失敗する。

関連する問題