문제

Erlang이 최고에 대한 희망을 가진 RPC 시맨틱에서, Sun RPC는 한 번도 한 번, Java RMI가 가장 큰 자와 RMI이지만 한 번도 의미론은 없습니다.

정확히 한 번의 의미론을 갖는 것은 왜 불가능한 것처럼 보입니까?

예를 들어 클라이언트가 회신이 수신 될 때까지 고유 한 태그가 지정된 요청을 계속 재현하고 서버가 요청을 복제하지 않기 위해 모든 처리 된 요청을 추적하는 경우. 정확히 한 번이 아니겠습니까?

도움이 되었습니까?

해결책

요청을 수행하고 요청을 수행 한 녹음 사이에 서버가 충돌하는 경우 어떻게됩니까?

요청을 녹음 한 다음 수행하여 at-once를 얻을 수 있습니다. 두 사람 사이에 충돌이 발생하면 (잘못) 수행 된대로 (잘못) 녹음 했으므로 다시는하지 않을 것입니다. 따라서 가장 많은 곳

기괴하게,이 제품 (타임 아웃 포함)은 특허를 받았습니다. http://www.freepatentsonline.com/7162512.html. 위에서 논쟁하는 것을 제외하고는 정확히 온스를 보장하지 않습니다.

당신은 그것을 운반 한 다음 녹음하여 대단한 온 것을 얻습니다. 둘 사이에 충돌이 발생하면 요청이 반복되면 다시 수행 할 것입니다.

그러나 모든 상황에서 "정확한 한 번"이라고 말하는 것은 실제로 가능하지 않습니다.

(서버 충돌보다는 네트워크 오류에 대한 유사한 시나리오가 있습니다)

다른 팁

IBM과 같은 고급 메시징 버스 WebSphere MQ 정확히 한 번 배송을 제공하기 위해 PUBPORT를 수행하십시오. 실제로 이것은 기본 동작입니다 (마지막으로 WMQ를 사용한 시간). 그들은 이것을 달성합니다 쓰기 로그 그리고 다양한 잠금 기술.

물론, 나는 법적 문서에 어딘가에 묻힌 "정확한 한 번"은 실제로 "메시지가 한 번, 한 번 이상 전달되거나 전달되지 않을 수도 있고 부지가 없거나 0보다 적다"는 의미로 정의된다는 것을 의심하지 않습니다. 등을 덮기 위해서는 전원 케이블을 걷어차거나 네트워크 인프라에 축을 가져가는 등 대부분의 경우에 작동합니다.

대답은 고객이 서버에서 결정적인 결과를 기다려야하기 때문에 의미론을 얻는 데 무기한 시간이 필요하다는 것입니다. 이 요구 사항은 실제 네트워크에서 실용적이지 않습니다.

클라이언트가 시도를 포기한 경우 (또는 트랜잭션을 완료하기 전에 또는 트랜잭션이 완료되기 전에 서버가 연장 된 기간 동안 내려가는 경우, 그 순서가 어떤 순서에 따라 완료되었음을 알리는 경우) 클라이언트는 클라이언트가 할 수있는 방법이 없을 수 있습니다. 요청이 접수 및 처리되었는지 여부를 알고 있습니다. 실제로, RPC 시스템은 예를 들어 기본 TCP 타임 아웃을 존중하기를 원할 수 있으므로 서버의 결정적인 성공 또는 실패를 기다릴 필요가 없습니다.

그래도 추측입니다. 저는 RPC 프로토콜을 설계 한 적이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top