일부 Java 프로세스 (소켓 프로그램)가 다른 서버, 일부는 동일한 네트워크, 다른 일부는 다른 네트워크에서 실행됩니다. 이 프로세스들은 모두 글로벌 카운터을 유지 관리합니다. 클라이언트는 이러한 프로세스 중 하나에 연결하여 increase
, decrease
또는 get
의 카운터 값에 명령을 보낼 수 있습니다. 글로벌 카운터는 결국 일치해야합니다 (네트워크 파티션이 발생할 수 있습니다 및 우리는 그것을 복구 할 수 있습니다).Java 소켓을 사용하는 기본 분산 카운터
내가 지금까지 생각한 해결책은 모든 노드에 대해 각 노드에서 증가 및 감소의 수를 유지하는 것입니다. 증가 명령이 노드에서 발행되면, 증가 수의 자체 로컬 사본을 증가시키고 증가 및 감소 계수를 브로드 캐스트합니다. 이 브로드 캐스트를 수신하는 노드는 수신 된 계수의 최대 값과 송신자 계수의 로컬 사본을 취하여 결과를 최신 계수로 저장합니다. 노드에서 get
명령을 발행하면 모든 증가 및 감소의 합계에 차이가 있습니다. 나는 이것이 방송이 주문 및 기타 비 신뢰성으로 수신되는 경우를 처리 할 것이라고 가정한다. 지속성 레이어를 사용하고 싶지 않습니다.
이것을 구현하는 더 좋은 방법이 있습니까? 카운트를 브로드 캐스트하기 위해 어떤 프로토콜을 사용해야합니까? UDP 작업에 대해 험담 할 것인가? 도움이 될만한 Java 라이브러리는 무엇입니까?
귀하의 직관적 인 해결책은 [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