CustomPeerResolverService 内部:クライアント登録
メッシュ内の各ノードは、Register
関数を介してエンドポイント情報をリゾルバー サービスに公開します。 リゾルバー サービスは、登録レコードとしてこの情報を保存します。 このレコードには、ノードの一意の識別子 (RegistrationID) およびエンドポイント情報 `(PeerNodeAddress) が格納されます。
古くなったレコードと有効期限
ノードがメッシュからの離脱時に Unregister
関数を呼び出し、それによってリゾルバー サービスで登録エントリが削除されるのが理想的ですが、 Unregister
を呼び出す前に、ノードがシャットダウンしたりアクセスできなくなったりするために、古い登録レコードが残ることがあります。
リゾルバー サービス内の古くなったレコードは、接続障害の原因となる場合があります。 メッシュへの接続時に、ノードがリゾルバー サービスから古い接続情報を受け取った場合、メッシュへの参加に時間がかかることがあります。 古いレコードはメモリも消費します。 効率的なクリーンアップ処理がなければ、登録の保存に使用したキャッシュがオーバーフローしてリゾルバー サービスがクラッシュする可能性があります。
CustomPeerResolverService は、各レコードを有効期限 (DateTime) でマークし、レコードの一部としてその情報を保存します。 サービスは、有効期限を使用してレコードを識別します。 カスタム実装でも同様な処理が必要です。
RefreshInterval および CleanupInterval
RefreshInterval
の CustomPeerResolverService プロパティは、サービスの登録ルックアップ テーブルで登録レコードが有効である期間を定義します。 特定のレコードについて、このプロパティで指定された時間が経過すると、そのレコードは古くなり、削除対象としてマークされます。
CleanupInterval
の CustomPeerResolverService プロパティは、古くなったレコードの検索と削除の頻度をサービスに指示します。 CleanupInterval
は、サービスに設定されている RefreshInterval
以上の時間に設定する必要があります。
独自のリゾルバー サービスを実装するためには、古い登録レコードを削除するメンテナンス関数を作成する必要があります。 これにはいくつかの方法があります。
定期的メンテナンス: 定期的に鳴るようにタイマーを設定し、データ ストアを調べて古いレコードを削除します。 CustomPeerResolverService では、この方法を使用します。
パッシブ削除: 古くなったレコードを一定間隔で検索する代わりに、サービスが既に別の関数を実行しているときに、古くなったレコードを識別し、削除することができます。 この方法では、リゾルバー クライアントからの要求に対する応答時間が遅くなる可能性がありますが、タイマーの必要がなくなるほか、一部のノードが
Unregister
を呼び出さずに離脱することが予想される場合には効果的です。
RegistrationLifetime および Refresh
リゾルバー サービスに登録されると、ノードはサービスから RegisterResponseInfo オブジェクトを受け取ります。 このオブジェクトには、RegistrationLifetime
プロパティが含まれます。このプロパティは、登録の期限が切れてリゾルバー サービスによって削除されるまでに、どれだけの時間があるかを示します。 たとえば、RegistrationLifetime
が 2 分である場合、レコードが古くならず、削除されないようにするためには、ノードは 2 分以内に Refresh
を呼び出す必要があります。 リゾルバー サービスは Refresh
要求を受け取ると、レコードを検索し、有効期限をリセットします。 Refresh は、RefreshResponseInfo プロパティのある RegistrationLifetime
オブジェクトを返します。