1

일부 Java 프로세스 (소켓 프로그램)가 다른 서버, 일부는 동일한 네트워크, 다른 일부는 다른 네트워크에서 실행됩니다. 이 프로세스들은 모두 글로벌 카운터을 유지 관리합니다. 클라이언트는 이러한 프로세스 중 하나에 연결하여 increase, decrease 또는 get의 카운터 값에 명령을 보낼 수 있습니다. 글로벌 카운터는 결국 일치해야합니다 (네트워크 파티션이 발생할 수 있습니다 및 우리는 그것을 복구 할 수 있습니다).Java 소켓을 사용하는 기본 분산 카운터

내가 지금까지 생각한 해결책은 모든 노드에 대해 각 노드에서 증가 및 감소의 수를 유지하는 것입니다. 증가 명령이 노드에서 발행되면, 증가 수의 자체 로컬 사본을 증가시키고 증가 및 감소 계수를 브로드 캐스트합니다. 이 브로드 캐스트를 수신하는 노드는 수신 된 계수의 최대 값과 송신자 계수의 로컬 사본을 취하여 결과를 최신 계수로 저장합니다. 노드에서 get 명령을 발행하면 모든 증가 및 감소의 합계에 차이가 있습니다. 나는 이것이 방송이 주문 및 기타 비 신뢰성으로 수신되는 경우를 처리 할 것이라고 가정한다. 지속성 레이어를 사용하고 싶지 않습니다.

이것을 구현하는 더 좋은 방법이 있습니까? 카운트를 브로드 캐스트하기 위해 어떤 프로토콜을 사용해야합니까? UDP 작업에 대해 험담 할 것인가? 도움이 될만한 Java 라이브러리는 무엇입니까?

+1

귀하의 직관적 인 해결책은 [CRDT] (http://www.cakesolutions.net/teamblogs/how-to-build-a-distributed-counter)라고하며 좋습니다. 더 자세한 정보가 필요하면 [paper] (https://hal.inria.fr/file/index/docid/555588/filename/techreport.pdf)를보십시오. – Oleg

답변

0

당신이 디자인 패턴을 인식 할 수 있지만 여전히 영감을 할 수있다 : https://en.wikipedia.org/wiki/Observer_pattern

당신은 단순히 프로그램의 모든 인스턴스가 다른 인스턴스를 모두 관찰 할 수있다, 그들은 모두 통지합니다 어떤 것이든지 바뀌면 서로 (해당 링크의 도표를 확인하십시오).

그 중 하나가 여러분의 인생을 더 쉽게 만드는 경우 지금까지 자바 라이브러리로,이 체크 아웃을 참조하십시오

+0

모든 자바 프로세스가 과목이고 모두 관찰자 인 경우 주제가 증가 또는 감소가 발생할 때마다 (매우 자주 발생합니다) 노드의 수가 증가함에 따라 네트워크가 걸릴 것입니다 항상 서로 이야기하는 프로세스로 인해 – azuri

0

소리가납니다. Akka의 분산 데이터 라이브러리에서 PNCounter이 필요합니다. Gossip을 사용하여 카운터의 상태를 네트워크에 알립니다. 또한 읽기 일관성과 쓰기 일관성을 세밀하게 제어 할 수 있습니다. 따라서 예를 들어 ReadMajority을 수행하면 "이 값은 대부분의 복제본에서 읽히고 병합됩니다".

덧붙여서 PNCounter는 두 개의 분산 된 카운터를 사용하여 증가 및 감소를 유지하면서 설명대로 작동합니다.