Spring Cloud EurekaServerの自己保存と更新のしきい値を理解する


83

私はマイクロサービスの開発に不慣れですが、SpringのドキュメントとNetflixのドキュメントの両方を読んで、しばらくの間マイクロサービスについて研究してきました。

Githubで利用できる簡単なプロジェクトを開始しました。これは基本的に、Eurekaサーバー(アルキメデス)と3つのEurekaクライアントマイクロサービス(1つはパブリックAPI、2つはプライベート)です。詳細な説明については、githubのreadmeを確認してください。

重要なのは、すべてが実行されているときに、プライベートマイクロサービスの1つが強制終了された場合、Eurekaサーバーがそれを認識してレジストリから削除することです。

Stackoverflowこの質問見つけました。ソリューションenableSelfPreservation:falseは、Eurekaサーバー構成で使用することで合格します。しばらくすると、これを実行すると、強制終了されたサービスが期待どおりに消えます。

ただし、次のメッセージが表示されます。

自己保存モードがオフになっています。これは、ネットワーク/その他の問題が発生した場合にインスタンスの有効期限を保護しない場合があります。

1.自己保存の目的は何ですか?ドキュメントの状態、その上の自己保存と「クライアントはもはや存在しないインスタンスを取得することができます」。では、いつオン/オフにすることをお勧めしますか?

さらに、自己保存がオンの場合、Eurekaサーバーコンソールの警告で未処理のメッセージが表示される場合があります。

緊急!EUREKAは、そうでない場合でも、誤ってクレームインスタンスがアップしている可能性があります。更新はしきい値よりも少ないため、安全のためにインスタンスの有効期限が切れることはありません。

さて、SpringEurekaコンソールを続けます。

Lease expiration enabled    true/false
Renews threshold    5
Renews (last min)   4

しきい値カウントの奇妙な動作に遭遇しました。Eurekaサーバーを単独で起動すると、しきい値は1になります。

2. Eurekaサーバーが1つあり、registerWithEureka: false別のサーバーに登録されないように構成されています。それでは、なぜそれがしきい値カウントに表示されるのですか?

3.クライアントごとに、しきい値カウントが+2ずつ増加し始めます。毎分2通の更新メッセージを送信しているからだと思いますよね?

4. Eurekaサーバーは更新を送信しないため、最後の最小更新は常にしきい値を下回ります。これは正常ですか?

renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4

サーバーcfg:

server:
  port: ${PORT:8761}

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false
#   waitTimeInMsWhenSyncEmpty: 0

クライアント1cfg:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true

3
この質問に答えるのに時間をかけたいと思います。それは複雑です。答えのいくつかはNetflixコードにあり、その他は構成です。私の答えをSpringCloudのドキュメントの一部として終わらせたいのですが、それ以前に同僚が答えない限り、感謝祭の後である可能性があります。
spencergibb 2015年

:これは、ネットフリックスから少し背景であるgithub.com/Netflix/eureka/wiki/...
spencergibb

その他の背景は次のとおり
cloud

8
@spencergibbこれは9か月に近づいており、回答はありません。入力はありますか?
ニック

1
@spencergibbもう1年以上経ちました。いつでも明確な答えを得るチャンスはまだありますか?ある種のクリスマスプレゼント:)
OcuS 2016

回答:


63

@codependentが出会ったのと同じ質問を受けました。たくさんグーグルで実験しました。ここで、Eurekaサーバーとインスタンスがどのように機能するかについての知識を提供するようになりました。

すべてのインスタンスは、Eurekaサーバーへのリースを30秒に1回の頻度で更新する必要がありますeureka.instance.leaseRenewalIntervalInSeconds。これは、で定義できます。

更新(直前):直前にEurekaインスタンスから受信した更新の数を表します

更新しきい値:EurekaサーバーがEurekaインスタンスから1分あたりに受信することを期待する更新。

たとえば、がfalseregisterWithEureka設定されている場合、は30に設定され、2つのEurekaインスタンスを実行します。2つのEurekaインスタンスは1分あたり4回の更新をEurekaサーバーに送信します。Eurekaサーバーの最小しきい値は1(コードで記述)であるため、しきい値は5です(この数値は、後で説明する係数の倍数になります)。eureka.instance.leaseRenewalIntervalInSecondseureka.server.renewalPercentThreshold

自己保存モード:更新(最後の分)更新しきい値よりも小さい場合、自己保存モードがアクティブになります。

したがって、上の例では、しきい値が5であるため、自己保存モードがアクティブになっていますが、Eurekaサーバーは4回/分しか受信できません。

  1. 質問1:

自己保存モードは、ネットワーク接続の障害を回避するように設計されています。EurekaインスタンスAとBの間の接続は良好ですが、接続の一時的な中断により、BはEurekaサーバーへのリースを短期間で更新できません。現時点では、Eurekaサーバーは単にインスタンスBをキックアウトすることはできません。 Bが利用可能であるにもかかわらず、AはEurekaサーバーから利用可能な登録サービスを取得しません。したがって、これが自己保存モードの目的であり、オンにすることをお勧めします。

  1. 質問2:

最小しきい値1がコードに記述されています。registerWithEurekaはfalseに設定されているため、Eurekaインスタンスレジスタはありません。しきい値は1になります。

実稼働環境では、通常、2つのEurekaサーバーをデプロイregisterWithEurekaし、trueに設定されます。したがって、しきい値は2になり、Eurekaサーバーは1分に2回リースを更新するためRENEWALS ARE LESSER THAN THRESHOLD、問題は発生しません。

  1. 質問3:

はい、その通りです。eureka.instance.leaseRenewalIntervalInSeconds1分あたりにサーバーに送信される更新の数を定義しますがeureka.server.renewalPercentThreshold、上記の係数を掛けます。デフォルト値は0.85です。

  1. 質問4:

はい、しきい値の初期値が1に設定されているため、正常です。したがって、registerWithEurekaがfalseに設定されている場合、更新は常にしきい値を下回ります。

これについて2つの提案があります。

  1. 2つのEurekaサーバーをデプロイし、を有効にしregisterWithEurekaます。
  2. デモ/開発環境にデプロイするだけの場合はeureka.server.renewalPercentThreshold、0.49に設定できるため、Eurekaサーバーのみを起動すると、しきい値は0になります。

こんにちは
NieXing

こんにちは@jabrena、インスタンスがeurekaサーバーへのリースを更新しない場合、リースが期限切れになることを意味すると思います。これは、デフォルトで値が90秒であるeureka.instance.leaseExpirationDurationInSecondsに関連している可能性があります。この値を0または負の数に設定すると、ラベルが「リースの有効期限が有効になっています:False」に変わる場合があります。あなたはそれを試すことができます。
Nie Xing 2017


動作しません。Threshold = 0、Renews = 0でも警告がトリガーされます。
ハンマー

selfPreservationModeを無効にしましたが、それでもEurekaでこのメッセージが表示されます-EUREKAは、そうでない場合でも、誤ってインスタンスが起動していると主張している可能性があります。更新はしきい値よりも少ないため、安全のためにインスタンスの有効期限が切れることはありません。それは正しく起こらないはずですか?
DHRUVBANSAL20年

31

ここにEurekaの詳細を記載したブログ投稿を作成しました。これは、SpringドキュメントまたはNetflixブログから欠落している詳細を埋めるものです。これは、数日間のデバッグとソースコードの調査の結果です。外部URLにリンクするよりもコピー&ペーストする方が望ましいと理解していますが、コンテンツが大きすぎてSOの回答にはなりません。


2
このような明確な投稿をリンクしていただきありがとうございます。おすすめの読み物!!
共依存2017年

2
こんにちは@AbhijitSarkar、記事は素晴らしいです。私は多くの構成の疑問を解決しました。
jabrena 2017

0

eurekaサーバーのプロパティで更新のしきい値制限を設定してみることができます。eurekaに登録するマイクロサービスが3〜4個ある場合は、次のように設定できます。

eureka.server.renewalPercentThreshold=0.33
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.