문제

이것은 이전 질문에서 진행중인 토론과 관련이 있습니다.

공유 데이터와 달리 메시지 전달의 성능 저하

논의된 문제 중 하나는 메시지 전달과 메시지 전달을 사용하는 Erlang의 분산 알고리즘에 필요한 작업량이었습니다.공유 상태.내 관점은 공유 상태(아마도 DB의 레코드)를 사용하여 분산 리더 선택을 구현하는 것이 메시지 손실에 강력한 알고리즘을 설계하는 것보다 쉽다는 것입니다.그렇지 않나요?

메시지 전달 기반 알고리즘을 구현할 때의 문제점은 분산 알고리즘을 메시지 손실에 강력하게 만들거나 여러 번의 시도가 필요한 경우에도 메시지가 항상 전달되도록 해야 한다는 것입니다.물론, 분산 리더 선택은 잘 알려진 문제이며 강력한 메시지 전달 알고리즘이 이미 존재한다고 생각합니다(낸시 린치의 책에서 제공할 수도 있음). 그러나 저는 이 문제를 요점을 도출하기 위한 예로 삼을 뿐입니다.

감사해요!

도움이 되었습니까?

해결책

"구현 문제..."라고 말하는 곳에서 동어반복이 발생합니다.

메시지 전달을 사용하거나 공유 상태를 사용하여 알고리즘을 구현하는지에 관계없이 코드가 강력해지기 위해서는 오류를 처리해야 합니다.반드시 오류 처리에 신경 쓸 필요는 없지만 정의상 코드는 강력하지 않습니다."Erlang이 강력하려면 이런 저런 작업을 수행해야 합니다"라고 말한 다음 "하지만 데이터베이스의 행을 업데이트할 수 있으며 항상 작동합니다"라고 말하면 사과와 사과를 비교하는 것이 아닙니다.어떤 경우든 첫 번째 시도에서 항상 작동하는 데이터베이스(또는 공유 상태)에 대한 설명은 분명히 거짓입니다.

따라서 메시지 전달을 사용하여 구현하려면 애플리케이션 프로그래머가 사용하기에 적합하도록 충분히 높은 수준으로 메시지 전달 구성을 래핑하는 API가 필요하지만 오류를 확인하고 처리하는 것은 여전히 ​​프로그래머의 몫입니다.

그것은 다음과 같이 요약됩니다(이것이 내가 동어반복이라고 말한 이유입니다):

a) 메시지 전달을 사용하는 경우 코드에서 "메시지가 성공적으로 전달되었거나 오류가 발생함(시간 초과)"을 구현해야 합니다.

b) 데이터베이스를 사용하는 경우 코드는 "행이 성공적으로 업데이트되거나 오류가 발생합니다"를 구현해야합니다. (공유 상태 솔루션에도 동일하게 적용됩니다).

a와 b는 동등하기 때문에 당신이 말하는 "문제"는 메시지 전달과 데이터베이스 접근 방식에 동일하게 적용되므로 더 이상 논의할 것이 없습니다.

이제 어느 것이 더 쉬운지(또는 더 적절한지)에 대한 간단한 대답은 없습니다.합리적인 대답은 "문제 영역에 더 잘 맞는 접근 방식을 사용하십시오"입니다.Erlang에 대해 이야기할 때 OTP와 같은 어떤 라이브러리/도구를 사용하고 있는지도 고려해야 합니다. 이러한 라이브러리/도구는 이러한 기능을 구현하는 방법에 큰 영향을 미칠 수 있습니다.

다른 팁

메시지 보내는 것은 비동기식이고 안전하며, 수신자가 존재한다면 메시지는 결국 수신자에게 도달하도록 보장됩니다.

프로세스가 사망하면 출구 신호가 모든 연결된 프로세스로 방출됩니다.

분산 환경에서는 Erlang : Monitor_Node/2를 사용하여 노드 상태를 모니터링 할 수도 있습니다. 문서에서

연결이 손실되면 {NodeDown, Node} 메시지가 수신됩니다.

IMO, 당신이해야 할 일은 처리하는 것뿐입니다. 연결 손실.

인생에서 많은 것들 : 그것은 달라집니다.

그것은에 달려 있습니다 규모 우리는 여기서 이야기하고 있습니다. 공유 국가의 특성은 무엇입니까? SPOF ( "단일 고장") 인 경우, 결함 불쾌감 문제와 액세스 문제 (대역폭, 처리)에 직면하게됩니다.

결함에 대한 걱정이 적은 소규모 시스템에 대해 이야기하고 있다면 중앙 DB를 사용하는 것이 더 쉬울 수 있습니다.

그런 다음 다시, 나는 질문에 대해 약간 혼란 스러워요 : 메시지 전달은 의사 소통 측면 반면 데이터베이스는 처리하는 데 사용됩니다 스토리지 측면. 왜 이런 것들이 당신의 질문에 섞인 인상을 얻습니까? (물론 나일 수 있습니다).


메시지 전달 견고성 : 여기서 실제로 문제는 무엇입니까? 통신 계층은 TCP 인 커뮤니케이션 레이어는이 지구의 어떤 것과 같이 불완전하지만 많은 도움이됩니다. 노드간에 의사 소통의 전반적인 합병증에 대해 걱정하고 있다면 사라지지 않을 것입니다 선택한 플랫폼 / 언어에 관계없이. Erlang은 분산 커뮤니케이션을 만듭니다 훨씬 쉽습니다.

나는 당신이 당신의 질문/토론에서 이상한 가정을 만들고 있다고 생각합니다. 메시지가 사라질 수 있지만 공유 상태로 작업하면 항상 작동하고 실패하지 않으며 알고리즘의 복잡성을 비교하려고합니다. 그렇게 작동하지 않습니다. 일이 잘못되면 그들이 할 것이지만, 그렇게 할 것입니다. 그러나 그들은 프로그래밍됩니다. 동시 시스템을 구축하기 위해 Mutable Shared State를 사용하는 것은 어렵습니다. 강력한 동시 시스템을 구축하는 데 사용하는 것은 올바른 놈입니다.

실제 분산 시스템에서 강력한 지 확인하려면 메시지가 도착하지 않을 수 있음을 항상 고려해야합니다. 이것이 어떻게 이루어지는 지 정확히 응용 프로그램에 따라 다릅니다.

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