2

ゲームの複数のインスタンスをホストするゲーム サーバーがあります。プレイヤーは ID を入力して、現在実行中のゲームに参加できます。クライアントを必要なゲーム インスタンスとペアにするために、ゲーム ID をその特定のゲーム インスタンスを処理する Erlang プロセスの PID にマップする ETS テーブルがあります。これは機能しますが、ETS を使用する必要があるのはあまり好きではありません。ETS を使用すると、1 つのプロセスの制御下にないグローバル データが作成されるからです。

私が知りたいのは、Erlang/OTP で識別子をプロセスにマップする慣用的な方法はありますか? この場合、データは本質的にグローバルであるため、ETS を使用しても問題ありませんか? または、マッピングを処理するためのすべての ID の辞書を格納する 1 つのプロセスが必要ですか? それはよりErlangスタイルだと思いますが、パフォーマンスや並行性は劣るかもしれません。また、他のSOの回答を見ているときにgprocに出くわしました。これは、改善されたプロセス辞書のようです。ただし、プロセス辞書の使用は嫌われているという印象を受けました ( erlang.org Web ページによると)。

4

1 に答える 1

6

ETS tables特定のprocess/gen_serverによって制御でき、テーブルの作成中または作成中に問題が発生したときに、プロセス間で所有権を譲渡できます。多くのゲーム開発者は、(意図的に)と変わらないようなものに依存しています。ただし、これは非常に安定したOTPアプリケーションであり、に比べてはるかに多くの同時更新を処理できます。非常にビジーなアプリケーションでmnesiaを使用してきましたが、他の問題が原因でVM全体がダウンしない限り、mnesiaがダウンすることはありません。実際、erlangに組み込まれているほとんどの利用可能なシステムは、冗長コンポーネント間で状態を共有するために、またはそれらに依存しているため、あるコンポーネントが別のコンポーネントにフェイルオーバーすると、メモリ内のデータが利用可能になります。 ets:give_away/3 heir option

memcachedETSmnesiaETSmnesiaETS

gproc 特にゲームなどに非常に便利なツールです。これは、プロセスがそれ自体の簡単にアクセスできるデータに依存しているためです。他のプロセスは、他のプロセスのデータを検索できません。したがって、ゲームの状態をに保つ代わりに、をETS使用することもできますgproc

とにかく、時間があれば、各オプションを試して、負荷テストを実行して、どちらがパフォーマンスが優れているかを確認できます。

于 2012-06-14T06:29:18.593 に答える