비동기 상호 통신을 처리하는 가장 좋은 방법은 무엇입니까?


10

최근 신용 카드 처리를위한 프로젝트를 완료했습니다. 내가 직면 한 어려움 중 하나는 알림 메시지의 지연 / 가능한 실패를 처리하는 것이 었습니다. 가장 복잡한 예는 다음과 같습니다.

  • 지불 요청을 보내는 외부 시스템
  • 내 시스템이 해당 요청을 지불 게이트웨이에 대한 요청으로 전환
  • 사용자를 게이트웨이로 보내기
  • 사용자가 결제를 수행하기를 기다리는 중
  • 사용자가 내 시스템으로 돌아가지만 시스템이 성공 / 실패 알림을 수신 할 때까지 보류 됨
  • 실패에 따라 사용자를 외부 시스템으로 다시 보내기

통지 전송에 실패하면 게이트웨이는 15 시간마다 여러 시간 동안 통지 전송을 시도한다는 사실이 더욱 어려웠습니다.

보류중인 트랜잭션의 데이터베이스 레코드를 사용하여 문제를 해결 한 다음 반환 및 성공 및 실패 감지 및 알림 및 트랜잭션 처리를위한 시간 지연 리스너 감지 ...

상당히 어렵다!

그러나 이것은 전에 가질 리언 시대에 해결 되었어야 했으므로 가장 좋은 방법은 무엇입니까?

내 미래가 이러한 모든 시스템 간의 처리를 작성하고 시간 지연 및 가능한 네트워크 오류를 관리 할 것이므로 모범 사례를 따르고 싶습니다.

도서 / 기사 추천이 좋습니다.

미리 감사드립니다!

답변:


13

분산 시스템을 구축 할 때 '동기'시스템과 '비동기'시스템의 차이점은 다음과 같습니다. 동기 시스템은 계산 및 메시지 전달 시간의 상한을 알고 있습니다. 따라서 특정 이벤트에 알려진 상한이없는 비동기 시스템이 있습니다. 어떻게 처리합니까?

  1. 이러한 비동기 프로세스에 확률 상한 이있는 경우 제한 시간 을 사용하여 시스템이 부분 동기 시스템 처럼 작동하도록 할 수 있습니다 . 지불 게이트웨이의 98 번째 백분위 수 응답 시간이 5 초이면 5 초의 타임 아웃으로 요청의 98 %가 성공하고 나머지 2 %는 실패합니다. 이는 이제이 프로세스가 성공 또는 실패하는 데 걸리는 시간에 대한 알려진 상한이 있음을 의미합니다. 이 확률 적 오류 감지 는 비동기 시스템을 동기 시스템으로 전환하는 데 중요한 도구입니다.

  2. 시스템 장애시 시스템 상태를 복구 할 수 있도록 이러한 이벤트를 지속적으로 기록하십시오 . 지불 게이트웨이 핸들러가 이러한 이벤트를 휘발성 메모리에 유지하고 충돌하면 문제가 발생합니다.

  3. 각 복잡한 트랜잭션은 기본적으로 시스템 내에서 메시지 (이벤트)의 송수신에 기반한 일련의 상태 변환입니다. "보류중인 거래 기록"을 사용하여이를 비공식적으로 모델링하는 것처럼 들리지만 더 진행할 것을 제안합니다. 관리해야 할 각 거래 에 대해 설명 하는 공식적인 상태 머신만들고 현재 상태에 대한 내구성있는 기록을 유지하십시오. . 이러한 상태 머신은 이해하기 쉽고 테스트하기 쉬우 며 사용자와 사용자 모두에게 이러한 프로세스에 대한 가시성을 제공합니다.

시스템이 비동기식 일수록 복잡한 이벤트 상태 변환을 관리 할 때 공식적이고 명시 적이어야합니다. 제한 시간, 내구성있는 이벤트 로깅 및 상태 머신이 여기에서 가장 좋습니다. 이것이 바로 Erlang OTP가 상태 머신 모델을 기반으로 많은 애플리케이션 동작을 수행하는 이유입니다.

참고로, 신뢰할 수 있고 안전한 분산 프로그래밍 소개 보다 더 나은 것을 찾지 못했습니다 . 첫 번째 원칙에서 동기식 시스템과 비동기식 시스템을 모두 이해하기위한 강력한 알고리즘 기반을 제공합니다.

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