2012-01-18 5 views
3

다음과 같은 상황이 있습니다. 두 개의 similair java 응용 프로그램이 서로 다른 서버에서 실행되고 있습니다. 두 응용 프로그램은 제공된 웹 서비스를 사용하여 동일한 웹 사이트에서 데이터를 가져옵니다. 그러나 사이트에서는 첫 번째 앱이 두 번째 앱과 동일한 데이터 평화를 취했다는 사실을 알지 못합니다. 데이터를 가져온 후 데이터베이스에 저장해야합니다. 그래서 나는 같은 데이터를 데이터베이스에 두 번 저장하는 문제가있다.두 개의 Java 응용 프로그램을 어떻게 동기화 할 수 있습니까?

어떻게하면 데이터베이스에 중복 항목을 피할 수 있습니까?

1) 데이터베이스 측면을 사용하십시오. "유일한 경우 삽입"과 같은 것을 작성하십시오.

2) 서버 측을 사용하십시오. 두 개의 데이터 가져 오기 프로그램으로부터 응답을 받고 어떻게 든 처리 할 중간 서비스를 작성하십시오.

두 번째 해결 방법이 더 효과적이라고 생각합니다.

이 주제에 대해 조언을 해 줄 수 있습니까? 어떻게 그 중간 서비스를 구현하겠습니까? 서비스 간의 통신을 어떻게 구현합니까? 수신 된 데이터를 저장하기 위해 HashMaps를 사용한다면 우리 시스템이 처리 할 수있는 HashMap의 최대 크기를 어떻게 추정 할 수 있습니까?

답변

3

당신이 정말로 동시에 두 개의 서버에서 데이터를 가져해야합니까? 모든 항목을 확인하는 동안 삽입하지 않으면 비쌀 수 있습니다. 여러 페치를 병합하는 것도 시간이 오래 걸릴 수 있습니다. 병렬로 가져 오는 이점이 있습니까? 한 번에 한 명의 가져 오기를 고려하십시오.

당신이 직면하게 될 문제는 분산 된 프로세스 중 어느 것이 데이터를 가져 와서 DB에 저장해야 하는지를 선택해야한다는 것입니다.

어떤 종류의 Leader Election 문제입니다.

분산 조정 서비스 인 Apache ZooKeeper을 살펴보십시오. ZooKeeper로 리더 선거를 구현하는 방법은 receipt입니다.

이미이 영수증을 구현 한 많은 프레임 워크가 있습니다. Netflix curator을 사용하는 것이 좋습니다. 큐레이터와의 리더 선거에 대한 자세한 내용은 wiki에서 확인할 수 있습니다.

+0

Mairbek, 답장을 보내 주셔서 감사합니다. 이 방법의 문제점은 모든 응용 프로그램이 완전히 동일해야한다는 것입니다. 따라서 첫 번째 앱에는 가져 오는 코드를 넣을 수 없으며 두 번째 앱에는 배치하지 마십시오. 아니면 Apache Zookeeper가이 문제를 해결할 수 있다는 뜻입니까? 정말,이 문제를 해결하는 세 번째 방법이 될 수 있다고 가정합니다. 응용 프로그램 중 하나에서만 루틴을 가져 오는 서비스를 만듭니다. 즉, 내 앱이 가져 오기 작업을 수행 할 수있는 신호를 생성하는 무언가가 필요합니다. – KutaBeach

+0

실행중인 코드가 동일해야합니다.그들 중 하나가 리더로서 행동해야만하는 분산 된 프로세스간에 합의가 필요합니다. 예를 들어 두 개의 동일한 서버가있는 경우 시작 시간에 둘 다 리더 중 하나를 결정해야합니다. 이것은 ZooKeeper를 사용하여 수행 할 수 있습니다. 첫 번째 서비스가 리더 인 경우 데이터를 가져 와서 두 번째 DB를 유휴 상태로 유지하고 그 반대의 경우도 마찬가지입니다. –

+0

이것은 내가 뭔가를해야한다는 것을 의미합니다. 속성 파일을 변경하고, 응용 프로그램 코드를 변경하고, 일부 응용 프로그램 속성에서 코드를 작성합니다. 이렇게하면 내 응용 프로그램이 완전히 동일하지 않게됩니다. 또는 일부 외부 서비스를 사용하여 리더를 선택하도록 제안 하시겠습니까? – KutaBeach

3

이런 종류의 문제에 대한 분산 프레임 워크가 있습니다.

  • Hazelcast은 - 단일 분산 ConcurrentMap 여러 JVM의에서 가질 수 있습니다.
  • Terracotta - 그것은 DSO가 (분산 공유 객체가 내 생각)이 JVM에 걸쳐지도 구현을 유지할 수있어 사용;의
+0

그게 아주 유용합니다! 고마워, 데이비스! – KutaBeach

관련 문제