여러 마이크로 서비스 중 하나가 실패 할 경우이를 업데이트하는 소프트웨어를 어떻게 설계합니까?


12

다운되거나 다운되는 서비스를 돕는 데 사용할 수있는 디자인 패턴이나 실습이 있습니까?

마이크로 서비스가 3 개 있는데 그 중 2 개가 양호하고 하나가 POST 도중에 죽으면 어떻게합니까? 2 개는 POST를 받고 1 개는 그렇지 않습니다. 요청을 서비스로 배송하기 때문에 거래를 할 수 없다고 생각합니다.

이를 위해 어떻게 설계합니까? 다양한 데이터베이스에서 고아 데이터를 원하지 않습니다.


6
해결해야 할 간단한 문제는 아닙니다. 나는 서비스에 대한 대기열 (최종 일관성)로 구현되는 것을 보았습니다. 대부분 귀하가 서비스를 제어하지 못하고 거래 관리자 또는 거래 기능을 부과하는 것은 기껏해야 쓰레기 처리이며 아마도 좋은 생각은 아닙니다. SOA 환경에서. 나는 주로 당신이 당신의 목적지에 연결되어 있거나 연결되어 있지 않을 수있는 모바일 푸시 주변에서 이것을 보았습니다.
Mike

마이크로 서비스에 대한 산성은 까다로운 너트이며, 또 다른 옵션은 redis publish / subscribe 또는 대기열 디자인을 사용하고 인바운드 채널에서 한 번 게시 한 다음 버스 서비스, 서비스 프록시가 대상에 푸시되어 성공을보고하는 일종의 버스 일 수 있습니다. 실패. 실패를 모니터링하고 그에 대한 흐름도 필요합니다. 트랜잭션이 한 서비스에서는 유효하지 않지만 다른 두 서비스에서는 유효하지만 실패해야 할 또 다른 실패 흐름에서는 실패 할 수도 있습니다.
Tim Cederquist

"큐 관리자"와 같은 것을 사용하지 않습니까? Redis가 병목 현상을 일으킬 것이라고 생각합니까? 아니면 적어도 잠재력도 높습니까? 나는 당신이 설명한 것 외에 다른 방법을 알고 있습니다.
johnny

데이터 흐름의 양에 따라 성공이보고 될 때까지 전송을 재 시도하거나 실패한 알림을 게시하고 중단에 대한 SMS 경보를 보내는 큐 관리자를 구현했습니다. 나는 그것이 예상되는 정전 기간에 약간 의존 할 것이라고 생각합니다 (얼마나 오래).
htm11 시간

이것이 rabbitmq와 같은 것입니까?
johnny

답변:


9

일부 옵션.

지속적인 커뮤니케이션 채널 사용

HTTP 대신, 가용성이 높고 지속적인 대기열에 메시지를 삭제하십시오. 예를 들어 Kafka. 특정 시점에 대상 서버를 사용할 수있게되면 메시지가 표시됩니다.

복잡한 서브 시스템 (대기열)을 프로비저닝하고 관리해야한다는 단점이 있습니다. 따라서 이것이 가치가 있는지 분석하십시오.

백 오프 및 재시도

호출자가 실패한 요청을 유지하고 (디스크에 지속될 수 있음) 주기적으로 재 시도하십시오. 이 경우 충돌을 일으킨 요청과 중단 된 서비스를 구분하는 것이 중요합니다. 전자는 아마도 버그로 인한 것일 수 있으며 기록되어야합니다 ... 재 시도는 수정 될 때까지 차이가 ​​없을 것입니다.

감지 및 보상

주기적 작업은 마이크로 서비스 간의 일관성 조건을 점검합니다. 예를 들어 실패는 필요에 따라 API 쿼리를 지시하기 위해 계속해서 기록합니다. 문제가 발견되면 (예 : 주문이 있지만 배송에 포장 목록이 도착하지 않은 경우) 보상 단계를 수행하십시오. 이러한 단계는 수동 수정에 대한 지원 티켓을 만들거나 누군가에게 이메일을 보내는 등의 작업 일 수 있습니다.

디자인 대안 고려

이와 같은 경우에는 영향을받는 마이크로 서비스에 대한 호출을 관리하기 위해 API 게이트웨이가 필요합니다. 그렇게하면이 문제를 완화시키는 데 사용할 전술을 제어 할 수 있습니다. 당신은 아마도 그러한 구현 세부 사항으로 클라이언트에게 부담을주고 싶지 않을 것입니다. 회로 차단기 패턴을 참조하십시오 .

마이크로 서비스는 독립적이므로 불일치가 발생할 수있는 몇 가지 실패 사례가 항상 존재합니다. 이러한 상황이 발생하면 수동으로 수정하도록 준비해야합니다.

강력한 일관성이 필요한 경우 마이크로 서비스가 적합하지 않습니다. 여전히 확장 성이 필요한 경우 일관성있는 보장을 위해 관련 데이터를 동일한 샤드에 함께 배치 할 수있는 샤딩 을 조사 할 수 있습니다. 샤드를 추가하여 여전히 IO를 확장 할 수 있습니다.

강력한 일관성이 필요하고 확장 성 문제가없는 경우 모 놀리 식 서비스 만 사용하십시오. 애플리케이션 내에서 라이브러리를 경계로 사용하여 우려를 분리하십시오.


이것이 RabbitMQ를위한 것입니까?
johnny

RabbitMQ가 귀하의 질문에 대한 답변입니까? 아니요. 요구 사항을 충족하는 솔루션의 일부일 수 있지만 문제만으로는 해결되지 않습니다.
Kasey Speakman

그냥 참고하십시오. RabbitMQ는 메시지를 유지하지 않는다고 생각합니다. 대기열에서 소비되어 제거되므로 NO입니다. 지속성과 재 시도가 필요한 경우 RabbitMQ는 도움이되지 않습니다.
Laiv

2

나는 당신이 설명하는 것이 합의 문제라고 생각합니다. 분산 트랜잭션의 각 참가자가 작업이 성공했다고 말하지 않으면 커밋하고 싶지 않습니다. 이에 대한 간단한 해결책은 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/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.