다운되거나 다운되는 서비스를 돕는 데 사용할 수있는 디자인 패턴이나 실습이 있습니까?
마이크로 서비스가 3 개 있는데 그 중 2 개가 양호하고 하나가 POST 도중에 죽으면 어떻게합니까? 2 개는 POST를 받고 1 개는 그렇지 않습니다. 요청을 서비스로 배송하기 때문에 거래를 할 수 없다고 생각합니다.
이를 위해 어떻게 설계합니까? 다양한 데이터베이스에서 고아 데이터를 원하지 않습니다.
다운되거나 다운되는 서비스를 돕는 데 사용할 수있는 디자인 패턴이나 실습이 있습니까?
마이크로 서비스가 3 개 있는데 그 중 2 개가 양호하고 하나가 POST 도중에 죽으면 어떻게합니까? 2 개는 POST를 받고 1 개는 그렇지 않습니다. 요청을 서비스로 배송하기 때문에 거래를 할 수 없다고 생각합니다.
이를 위해 어떻게 설계합니까? 다양한 데이터베이스에서 고아 데이터를 원하지 않습니다.
답변:
일부 옵션.
HTTP 대신, 가용성이 높고 지속적인 대기열에 메시지를 삭제하십시오. 예를 들어 Kafka. 특정 시점에 대상 서버를 사용할 수있게되면 메시지가 표시됩니다.
복잡한 서브 시스템 (대기열)을 프로비저닝하고 관리해야한다는 단점이 있습니다. 따라서 이것이 가치가 있는지 분석하십시오.
호출자가 실패한 요청을 유지하고 (디스크에 지속될 수 있음) 주기적으로 재 시도하십시오. 이 경우 충돌을 일으킨 요청과 중단 된 서비스를 구분하는 것이 중요합니다. 전자는 아마도 버그로 인한 것일 수 있으며 기록되어야합니다 ... 재 시도는 수정 될 때까지 차이가 없을 것입니다.
주기적 작업은 마이크로 서비스 간의 일관성 조건을 점검합니다. 예를 들어 실패는 필요에 따라 API 쿼리를 지시하기 위해 계속해서 기록합니다. 문제가 발견되면 (예 : 주문이 있지만 배송에 포장 목록이 도착하지 않은 경우) 보상 단계를 수행하십시오. 이러한 단계는 수동 수정에 대한 지원 티켓을 만들거나 누군가에게 이메일을 보내는 등의 작업 일 수 있습니다.
이와 같은 경우에는 영향을받는 마이크로 서비스에 대한 호출을 관리하기 위해 API 게이트웨이가 필요합니다. 그렇게하면이 문제를 완화시키는 데 사용할 전술을 제어 할 수 있습니다. 당신은 아마도 그러한 구현 세부 사항으로 클라이언트에게 부담을주고 싶지 않을 것입니다. 회로 차단기 패턴을 참조하십시오 .
마이크로 서비스는 독립적이므로 불일치가 발생할 수있는 몇 가지 실패 사례가 항상 존재합니다. 이러한 상황이 발생하면 수동으로 수정하도록 준비해야합니다.
강력한 일관성이 필요한 경우 마이크로 서비스가 적합하지 않습니다. 여전히 확장 성이 필요한 경우 일관성있는 보장을 위해 관련 데이터를 동일한 샤드에 함께 배치 할 수있는 샤딩 을 조사 할 수 있습니다. 샤드를 추가하여 여전히 IO를 확장 할 수 있습니다.
강력한 일관성이 필요하고 확장 성 문제가없는 경우 모 놀리 식 서비스 만 사용하십시오. 애플리케이션 내에서 라이브러리를 경계로 사용하여 우려를 분리하십시오.
나는 당신이 설명하는 것이 합의 문제라고 생각합니다. 분산 트랜잭션의 각 참가자가 작업이 성공했다고 말하지 않으면 커밋하고 싶지 않습니다. 이에 대한 간단한 해결책은 Two Phase Commit입니다. 기본적으로 준비가 완료되었다고보고 할 때까지 (1 단계) 각 시스템에서 트랜잭션을 준비합니다. 거래의 모든 참가자가 성공을 반환하면, 각 참가자는 커밋하라는 지시를받습니다. 그 중 하나가 실패를 반환 한 경우 롤백이 발행됩니다 (단계 2). 더 복잡한 3 상 커밋 솔루션으로 연결되는 주름이 있습니다. 각각에 대해 훨씬 더 나은 설명을 읽을 수 있습니다.
http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/
http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/