2017-11-16 9 views
1

これはGenServerの有効な使用である可能性があります:GenServerに大きなマップを保存すると、これは有効なユースケースですか?

process_idがuser_idであり、一意です。プロセスには、DBを介して生成される大きなデータマップのクエリ結果が含まれます。ユーザー100人がシステムにログインしてデータマップを要求すると、すべてがユニークなuser_idによって参照される独自のプロセスに保存されます

したがって、地図を尋ねるときに、プロセスIDであるuser_idでプロセスを取得し、それを取得してユーザーに返します(作成しない場合は作成して新しい状態にします)

ユーザーがマップを更新すると、 sateを更新するか、新しいものを作成してください。

はご指導ありがとうござい

+1

「Elixir」は、この目的のために['Agent'](https://hexdocs.pm/elixir/Agent.html#content)モジュールを提供していますが、これは普通の良い' GenServer'がIMHOクリーナ概念。 – mudasobwa

答えて

3

あなたは万人のユーザーがこれは通常、いわゆるプールとErlangのエコシステムで処理されます。ログインしていない限り、これは完全に有効です。

主な原則は、プロセスプールのサイズを、たとえば100(5000、それは主にHW容量に依存します)に制限し、新規ユーザー用に先取りストレージを使用します制限を超えています)。

これらの置換されたデータをシリアル化したり、新しいノードを作成したりすることが考えられます。一般に、メモリ制限に達しない限り、状態を保持するプロセスがOTPの望ましい解決策です。この場合、おそらくDETSや(より良い)mnesiaのようないくつかの永続ストレージをオプトインすることになります。

エリクサーはこの目的のためにAgentモジュールを提供していますが、私はそれを使用しません。普通の良い良いGenServerは、より洗練された概念です。

+0

あなたは "プロセスプールのサイズ、つまり、100"という意味は何ですか?あなたはプロセッサの数を指していますか?これは大きなアプリケーションであり、アプリケーションのさまざまな部分で実行中の他のプロセスがあります。私たちは合計について話していますか?申し訳ありませんが、私はちょっと混乱しています。 –

+0

私が言っていたことは、「プールサイズには限界があります」ということです。正確な数は、セットアップに基づいて実験的に求められます。 – mudasobwa

1

あなたgenserverがマップを保存し、APIを経由して、それを返すより他に何も行わない場合は、多分それはプロセスの多くを作成する価値はありません。

この目的のためにetsテーブルを使用するか、エージェントモジュール(key = user id、value = map)を使用するだけです。

+0

膨大な数のerlangプロセスを信じられないほど安価に作成する一方で、巨大なマップを参照することはできません。これは間違ったアドバイスです。 – mudasobwa

0

誰かがすでにElixir forumのどこかでそれを言及しています - 純粋な状態ストア用エージェント、純粋な計算用タスク - 間のすべてのもの - GenServers!

現時点で計算が必要ない場合でも、近い将来に必要となるように見えるかもしれません。私はGenServerに固執します。

+0

Elixirフォーラムのメインページへのリンクは意味をなさない。有効な参照を入力してください。 – mudasobwa

+0

リンクはフォーラムに言及してリンクするだけです。私は後で少しポストをGoogleにしようとします。 – Kociamber

関連する問題