1

2 つのノードに分散されたアプリケーションがあります。最初のノードを Halt() すると、フェイルオーバーは完全に機能しますが (時々 ?) 最初のノードを再起動すると、start_link が既に開始されているため、テイクオーバーが失敗し、アプリケーションがクラッシュします。

SUPERVISOR REPORT  <0.60.0>                                 2009-05-20 12:12:01
===============================================================================
Reporting supervisor                          {local,twitter_server_supervisor}

Child process
   errorContext                                                     start_error
   reason                                         {already_started,<2415.62.0>}
   pid                                                                undefined
   name                                                                    tag1
   start_function                                {twitter_server,start_link,[]}
   restart_type                                                       permanent
   shutdown                                                               10000
   child_type                                                            worker

ok

マイアプリ

start(_Type, Args)->
    twitter_server_supervisor:start_link( Args ).

stop( _State )->
    ok.

私の上司:

start_link( Args ) ->
    supervisor:start_link( {local,?MODULE}, ?MODULE, Args ).    

両方のノードが同じ sys.config ファイルを使用しています。

上記が機能しないというこのプロセスについて、私が理解していないことは何ですか?

4

1 に答える 1

2

問題は、Twitter サーバーのスーパーバイザーがその子の 1 つを開始しようとしていることが原因のようです。エラーレポートは start_function を持つ子について不平を言うので

{twitter_server,start_link,[]}

そのコードを表示していないので、それ自体の名前を登録しようとしていると推測できますが、その名前で登録されたプロセスが既に存在します。

さらに推測すると、理由は Pid を示しています。これは、私たちが自分で取得しようとした名前を持つ Pid です。

{already_started,<2415.62.0>}

そこの Pid にはゼロ以外の初期整数があり、ゼロの場合はそれがローカル プロセスであることを意味します。そこから、グローバル名を登録しようとしていて、その名前でグローバルに登録されたプロセスが既に存在する別のノードに接続していると推測します。

于 2009-07-21T09:28:28.683 に答える