2

私は現在erlangでソフトウェアを書いていますが、これは現在gen_serverの動作に基づいています。このgen_serverは、sslを使用してオンラインで別のサービスに接続し、関数に引数として渡された値を送信する関数(update / 1と呼びます)をエクスポートする必要があります。

現在、update/1は次のようになっています。

update(Value) ->
  gen_server:call(?SERVER, {update, Value}).

したがって、呼び出されると、次のように処理される?SERVERへの呼び出しがあります。

handle_call({update, Value}, _From, State) ->
    {ok, Socket} = ssl:connect("remoteserver.com", 5555,  [], 3000).
    Reply = ssl:send(Socket, Value).
    {ok, Reply, State}.

パケットがリモートサーバーに送信されると、ピアは接続を切断する必要があります。

これはシェルでのテストでは正常に機能しますが、mymod:update(Value)を1000回呼び出す必要があり、ssl:connect / 4がうまく機能しない(つまり、タイムアウトに達している)場合はどうなりますか?

この時点で、私のgen_serverには非常に大量の値があり、それらは1つずつしか処理できないため、update/1を使用して値が更新されてから1000*3000ミリ秒後に1000番目の更新が実行されます。

呼び出しの代わりにキャストを使用すると、同じ問題が発生します。どうすればこの問題を解決できますか?gen_server呼び出しではなく、通常の関数を使用する必要がありますか?

4

1 に答える 1

4

個人的な経験から言えば、大きなメッセージをキューに入れていない限り、gen_server プロセスごとに 1000 個のメッセージが問題になることはありません。

テストの結果、gen_server がこれだけの負荷を処理できないと思われる場合は、できればアプリケーションの起動時 (または実行時) にスーパーバイザー プロセスの下で gen_server の複数のインスタンスを作成する必要があります。

それに加えて、更新ごとに新しい接続を作成する必要があることを本当に理解していません!! キャッシュされた接続/サーバーへの事前接続などの最適化を検討する必要があります..いいえ?

于 2012-08-18T17:18:32.163 に答える