2014-03-03 1 views
0

그래서 내 응답이 클라이언트에 성공적으로 전달되었음을 알 수 있습니다. 우리의 API (php/yii)에 POST 요청을 보내는 약 20 개의 POS 시스템 (dot.net 및 java와 같은 다른 기술로 작성)이 있습니다. 우리가 알고 자하는 요청에 응답 할 때 성공적으로 전달 된 응답입니다. 고객에게 요금을 청구 할 때 상황이 발생할 수 있기 때문에 POS가이를 알지 못하고 미발표 상태로 머물 수 있기 때문에이 정보가 필요합니다. POS가 다른 요청을 보내고 POS 코드가 엉망이 될 수 있는지 확신 할 수 없습니다. 응답이 전달되지 않는다는 것을 알게되면 청구를 취소 할 수 있습니다. 기본 POST 요청으로 가능합니까? 내가 말했듯이 우리 프로젝트는 PHP로되어 있지만 다른 언어로 된 코드 스 니펫이나 문서도 허용됩니다. 미리 감사드립니다.내 POST 응답이 클라이언트에 전달됩니까

+1

저는 이것이 클라이언트 측 코드를 수정하지 않고는 이루어질 수 없다고 생각합니다. – Don

+0

나도 그렇게 생각한다.하지만 물어볼 필요가있다. 모든 포스트 요청이 소켓 연결 일종이며, 제대로 연결이 끝났거나 중간에 중단되었다고 판단 할 수있다. –

답변

1

이것은 Two Generals' Problem이며 이러한 유형의 질문에 대한 일반적인 정답은 없습니다. 그러나 연락이 없으면 중요한 행동을 유도/금지하지 않고 승인의 재전송/재 요청 만하는 수준에서 대화를 진행해야합니다.

여기서는 적절한 선택의 여지가 없습니다. 더 좋은 방법은 일단 서버가 트랜잭션에 대한 완전한 요청을 받으면 실행되도록하는 것입니다. 고객의 상태와 상관없이 POS가 응답을받지 못하면, 동일한 고유 ID로 트랜잭션을 재 시도하므로 서버는 두 번째 시간을 무시하고 완료했다고 말할 수 있습니다. 분산 시스템에서 트랜잭션이 발생하는 경우이기 때문에 서버의 지식을 기본적이고 안전한 것으로 취급하고 클라이언트를 안개 속으로있게하는 것이 더 적합합니다. POS가 안개에서 벗어날 수 없으면 재 시도해야합니다. 물론 이것은 매우 난장판 인 POS 코드 (현재는 견고 함의 개념과 관련하여 디자인이 망가졌습니다)를 "엉망으로 만들 수는없는"설계로는 어려움이 있습니다.

당신이 (기본 연결을 모니터하기 위해) 여러 가지 이유로 작동하지 않습니다 달성하기 위해 노력하고있다 : 연결이 응답을받을 때 폐쇄 할 수 있도록 설계되어

  • ; 이것은 IP 레벨 이상의 종료와 가장 일반적으로 구별 할 수 없습니다.
  • HTTP는 메시지 도착 보증을 위해 설계되지 않았습니다 (즉, "정상적으로 요청 닫기"명령이 없습니다). 이것이 HTTP가 나쁜 이유입니다
  • 이전 포인트가 모두 존재하지 않는다면 PHP + webserver가 좋지 않습니다. PHP를 계속 실행하는 것은 어렵습니다 (예 : 연결이 닫힌 후 모든 상태를 검사하는 것). 요청을 제공하고 나서 잊어 버리도록 설계되었습니다.
+0

이것은 정확히 내가 생각한 것입니다. 이 위대한 대답에 감사드립니다. –

관련 문제