Maison  >  Article  >  Tutoriel système  >  Architecture de microservices : solution d'arrêt gracieuse

Architecture de microservices : solution d'arrêt gracieuse

王林
王林original
2024-08-07 18:47:02629parcourir
Résumé : L'arrêt progressif des applications dans l'architecture des microservices fait principalement référence à la sortie planifiée et en douceur des instances d'application (c'est-à-dire qu'aucun incident ne doit être géré).
1 Introduction

L'arrêt progressif des applications dans l'architecture des microservices fait principalement référence à la sortie planifiée et en douceur des instances d'application (c'est-à-dire qu'aucun incident ne doit être géré). Les arrêts des serveurs d'applications sont principalement divisés en deux catégories : les arrêts actifs et les arrêts passifs, parmi lesquels les arrêts actifs et la plupart des arrêts passifs peuvent réaliser des arrêts progressifs. Si l'application ne s'arrête pas correctement, les situations suivantes se produiront :

  • Perte de données : les données en mémoire n'ont pas été conservées sur le disque
  • Corruption de fichier : le fichier en cours d'écriture n'a pas été mis à jour, ce qui entraîne une corruption de fichier
  • Demande perdue : La demande en attente dans la file d'attente est perdue
  • Réponse perdue : La transaction réussie n'a pas eu le temps de répondre
  • Interruption des transactions : les transactions en cours de traitement vers un état intermédiaire sont interrompues de force
  • Le service n'est pas hors ligne : le service amont continuera quand même à envoyer des demandes de consommation au service aval

L'objectif de la mise à niveau élégante de nos microservices est d'éviter les situations ci-dessus, évitant ainsi la charge de travail d'intervention manuelle et améliorant la fiabilité du service de l'architecture des microservices.

2 Scénarios d'utilisation

Un arrêt progressif peut résoudre les scénarios suivants :

  • TUER PID
  • L'application s'est fermée automatiquement de manière inattendue (System.exit(n))
  • Utilisez la commande de script pour arrêter l'application

Un arrêt progressif ne peut pas résoudre les scénarios suivants :

  • Panne de courant soudaine
  • Destruction physique des machines
  • KILL-9 PID ou taskkill /f /pid
3 crochet d'arrêt

L'arrêt progressif de Java est généralement obtenu en enregistrant le ShutdownHook (hook) du JDK. Lorsque le système reçoit la commande de sortie, il marque d'abord le système comme étant dans l'état de sortie et ne recevra plus de nouveaux messages, puis traite l'arriéré de messages, et enfin appelle les ressources. L'interface de recyclage détruit les ressources, et enfin chaque thread quitte l'exécution. Un cas de démonstration simple est le suivant (version simple) :

 <span class="hljs-comment">/**
 * 优雅停机处理方式
 * 
 * <span class="hljs-doctag">@author</span> lry
 **/</span>
<span class="hljs-keyword"><span class="hljs-selector-tag">public</span></span> <span class="hljs-class"><span class="hljs-keyword"><span class="hljs-selector-tag">class</span></span> <span class="hljs-title"><span class="hljs-selector-tag">Main</span></span></span>{

    <span class="hljs-comment">/**
     * 启动应用
     **/</span>
    <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-selector-tag">public</span></span> <span class="hljs-keyword"><span class="hljs-selector-tag">void</span></span> <span class="hljs-title"><span class="hljs-selector-tag">start</span></span><span class="hljs-params">()</span></span>{
        <span class="hljs-comment">// 第一步:启动应用服务……</span>

        <span class="hljs-comment">// 第二步:注册JDK钩子</span>
        <span class="hljs-selector-tag">Runtime</span><span class="hljs-selector-class">.getRuntime</span>()<span class="hljs-selector-class">.addShutdownHook</span>(<span class="hljs-keyword">new</span> Thread(<span class="hljs-keyword">new</span> Runnable() {
            <span class="hljs-meta"><span class="hljs-variable">@Override</span></span>
            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span> </span>{
                System.out.println(<span class="hljs-string">"The hook running..."</span>);
                <span class="hljs-comment">//第三步:调用停机处理</span>
                stop();
            }
        }));
    }

    <span class="hljs-comment">/**
     * 停止应用
     **/</span>
    <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-selector-tag">public</span></span> <span class="hljs-keyword"><span class="hljs-selector-tag">void</span></span> <span class="hljs-title"><span class="hljs-selector-tag">stop</span></span><span class="hljs-params">()</span></span>{
        <span class="hljs-comment">// 停止应用前停机处理(如:注销服务、标记不接受请求等)</span>
    }

}

Contrôle du délai d'attente
Habituellement, une sortie gracieuse nécessite un mécanisme de contrôle du délai d'attente. Si la récupération des ressources et d'autres opérations avant la sortie ne sont pas terminées avant que le délai d'attente ne soit atteint, le script d'arrêt appelle directement KILL -9 PID pour forcer la sortie. Sinon, il peut attendre un délai d'attente. longue durée.

4 microservices s'arrêtent normalement

마이크로서비스의 우아한 종료를 위한 통합 솔루션은 없습니다. 핵심 아이디어와 디자인만 파악하세요.
배수 → 배플 → 정지 대기

그러나 마이크로서비스 아키텍처에서는 다음 권장 규칙에 따라 마이크로서비스에 대한 정상적인 종료 메커니즘을 설계할 수 있습니다.

  • 모든 마이크로서비스 애플리케이션은 우아한 종료를 지원해야 합니다
  • 등록센터에 등록된 서비스 인스턴스의 등록 취소를 우선적으로 처리
  • 다운될 서비스 애플리케이션의 액세스 포인트가 서비스 거부로 표시됩니다
  • 업스트림 서비스는 정상적인 중단으로 인해 거부된 서비스의 장애 조치를 지원합니다
  • 특정 업종에 따른 적절한 종료 인터페이스도 제공

마이크로서비스 애플리케이션의 우아한 가동 중지 시간은 다양한 사용자 역할에 따라 주로 두 가지 유형으로 나뉩니다.

    • 마이크로서비스 비즈니스 애플리케이션을 위한 우아한 종료 디자인:

Architecture de microservices : solution darrêt gracieuse

    • 마이크로서비스 비즈니스 애플리케이션을 위한 우아한 종료 디자인
    • 마이크로서비스 게이트웨이 애플리케이션의 우아한 종료 설계:

Architecture de microservices : solution darrêt gracieuse마이크로서비스 게이트웨이 애플리케이션의 우아한 종료 설계

다른 장비 계층의 우아한 종료는 다음과 같은 두 가지 유형의 솔루션에서 파생될 수 있습니다.

  • 전체 백엔드 아키텍처를 업그레이드하고 DNS 또는 Nginx에서 직접 전환할 수 있습니다
  • Nginx 레이어를 업그레이드하면 DNS에서 직접 전환할 수 있습니다
5가지 사용 사례

업계의 오픈 소스 제품 중에서 다음 제품과 같은 많은 제품이 JDK 후크를 사용하여 우아한 종료를 달성합니다.

  • 네티
  • DUBBO

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn