5

他のモジュールからの指示を受け取り、受け取った指示に応じてアクションを実行するサーバーを作成する必要があります。効率が私の主な関心事です。だから私は自分のサーバーを使うgen_serverのか、それとも自分のサーバーを書くのか。「自分のサーバー」とは、次のような意味です。

-module(myserver).
-export([start/0, loop/0]).

start() ->
        spawn(myserver, loop, []).

loop() ->
   receive
        {From, Msg} -> %Do some action here... ;
        message2 -> %Do some action here...;
        message3 -> %Do some action here...;
        message4 -> %Do some action here...;
        .
        .
        .
        _-> ok
   end,
   loop().

したがって、を使用するmyserverには、プロセスの開始時に登録済みの名前でプロセスを登録し、各クライアントがこのpidを使用してサーバーにメッセージを送信します。

したがって、このメソッドを使用する必要がありますか、それとも代わりにgen_server動作を使用してサーバーを実装する必要がありますか?使用することに何か利点はありますgen_serverか?しかし、使用gen_serverすると、比較するとオーバーヘッドが追加されmyserverますか?

4

5 に答える 5

10

gen_serverメッセージごとにいくつかの追加の関数呼び出しが必要になるため、自己実装サーバーと比較してオーバーヘッドはごくわずかです(そのうちの1つは動的です)。実装のこの時点では、これを考慮する必要はないと思います。いつか気が変わったのでgen_server、自分のサーバーへの移行は簡単なはずです。

gen_server単純なループと比較して得られるものは次のとおりです。

  • デバッグ(sysを使用)
  • SASLロギング
  • 休止状態のサポート
  • コードアップグレードのサポート
于 2009-12-03T14:30:08.483 に答える
10

私も一緒に行きgen_serverます。この施設を使用すると、その価値を理解できるようになります。関数のコールバックは少しぎこちない場合があります (handle_cast非同期呼び出しなど) が、最終的には慣れるでしょう。

さらに、いくつかのテストを行わずに「時期尚早の最適化」に従事しないことをお勧めします。おそらく、わずかな効率向上のために可読性/保守性を犠牲にしたくないでしょう。

于 2009-12-03T13:13:34.660 に答える
3

gen_serverさまざまな状況下で正しいことをするために多くの考えがなされてきたという理由だけで、私はそれを選びます。正しく理解するのが難しい詳細を処理します。オーバーヘッドが増えるgen_serverかもしれないと思いますが、パフォーマンスに関するアドバイスはやめました。本当に興味がある場合は、両方を実装して速度を測定してください。これが唯一の確実な方法です。

于 2009-12-03T13:03:23.150 に答える
2

RabbitMQ の背後にいる連中がgen_server2を使用することもできます。

次の調整(コメントから)を除いて、gen_serverに似ています。

1) the module name is gen_server2

2) more efficient handling of selective receives in callbacks
gen_server2 processes drain their message queue into an internal
buffer before invoking any callback module functions. Messages are
dequeued from the buffer for processing. Thus the effective message
queue of a gen_server2 process is the concatenation of the internal
buffer and the real message queue.
As a result of the draining, any selective receive invoked inside a
callback is less likely to have to scan a large message queue.

3) gen_server2:cast is guaranteed to be order-preserving
The original code could reorder messages when communicating with a
process on a remote node that was not currently connected.
于 2009-12-03T16:09:15.273 に答える
2

あなたの質問から、より「永続的な」サーバーを作成していると思います。

一般的に、独自のサーバーを展開する方が用途が広く、うまくいけば少し速くなります。しかし、これは大きな問題ですが:

  • すべてを自分で行う必要があるため、エラーのリスクが高まります。

  • サーバーを OTP 方式で管理したい場合 (堅牢なシステムを構築している場合はおそらくそうするでしょう)、それもすべて自分で処理する必要があります。そして、それを正しく理解してください。

常設サーバーを使用していたgen_server場合、必要なものを実装する際に深刻な問題が発生した場合にのみ、使用を開始し、フォールバックして自分自身をロールバックします。

短命のサーバーは別の問題です。

于 2009-12-03T22:20:38.060 に答える