2010-01-19 4 views
40

많은 컴퓨터, 모바일 장치 또는 웹 서비스가 데이터를 공유하거나 허브처럼 작동하는 오늘날과 같이 동기화가 더욱 중요 해지고 있습니다. 우리 모두가 알고 있듯이 동기화가 가장 안 좋은 솔루션은 아니며 전혀 동기화하지 않는 것이 가장 좋습니다.여러 엔터티간에 데이터를 동기화하는 가장 영리하고 쉬운 방법은 무엇입니까?

여러 엔터티간에 동기화하기 위해 동기화 솔루션을 구현하는 방법에 대해 아직도 궁금합니다. 변경된 날짜 필드 나 해시를 비교하고 가장 최근의 데이터를 사용하거나 충돌이 발생했을 때 사용자가 원하는 것을 선택하도록하는 것과 같은 다양한 접근 방식이 이미 있습니다. 또 다른 방법은 충돌하는 데이터를 자동으로 병합하려고하는 것입니다. 내 의견으로는 그렇게 똑똑하지 않습니다. 컴퓨터가 사용자의 의도를 추측 할 수 없기 때문입니다.

  • 가장 최근의 데이터가 무엇인가

    어쨌든, 우리가 동기화를 구현하기 위해 시작하기 전에 답해야 동기화와 관련된 몇 가지 질문은 무엇입니까? 그것을 어떻게 표현하고 싶습니까?

  • 충돌이 발생한 경우 어떻게해야합니까? 병합 하시겠습니까? 내가 묻는 메시지를 표시하고 사용자에게 무엇을해야하는지 묻습니다.
  • 일치하지 않는 상태 (예 : 모바일 네트워크 연결이 끊어져 연결이 끊어짐)에 들어갔을 때 어떻게해야합니까?
  • 일관성없는 상태가되고 싶지 않을 때 무엇을해야합니까?
  • 중단 된 현재 동기화를 재개하려면 어떻게합니까?
  • 데이터 저장소 (예 : 웹 서비스의 MySQL 데이터베이스, iPhone의 Core Data, 많은 접착제 코드없이 데이터를 병합/동기화하는 방법)는 어떻게 처리합니까?
  • 백그라운드에서 실행되는 동기화 중에 발생하는 사용자 편집을 어떻게 처리해야합니까? 즉, UI가 차단되지 않았습니까?
  • 사용자가 컴퓨터에서 "Foo"항목을 작성하여 동기화하지 않은 경우, 사용자가 이동 중에 다른 "Foo"항목을 생성하는 등 변경 사항을 전파하는 방법 및 방향; 두 장치 모두 동기화)? 사용자가 고유 ID가 서로 다른 두 개의 "Foo"항목이 있습니까? 사용자는 항목을 하나만 가질 수 있습니까?
  • 계층 적 데이터가있을 때 어떻게 동기화해야합니까? 위에서 아래로? 상향식? 모든 항목을 원자 적으로 처리합니까, 아니면 슈퍼 노드 만 보입니까? 지나치게 단순화하는 것과 구현에 너무 많은 시간을 투자하는 것 사이의 절충은 어느 정도입니까?
  • ...

다른 많은 질문이 있고 나는 충분히 영감을 할 수 있기를 바랍니다. 동기화는 상당히 일반적인 문제입니다. 일단 좋은, 다목적 동기화 접근법이 발견되면 처음부터 생각하기보다는 구체적인 애플리케이션에 적용하는 것이 더 쉬워야합니다. 이미 동기화를 해결하려고하거나 (또는 ​​성공적으로 해결하는) 많은 응용 프로그램이 있다는 것을 알고 있지만, 이미 상당히 구체적이며 동기 방식에 대한 충분한 대답을 제공하지 못합니다.

I (예 의욕이나 자식 등) 분산 버전 제어 시스템이의 큰 부분을 알아 낸 생각 : 여기

답변

44

내가 일하는 곳에서는 사용자가 인터넷에 접속할 수없는 위치에서 랩톱 컴퓨터로 작업 할 수있는 기본 (웹) 응용 프로그램의 "오프라인"버전을 개발했습니다. 요즘 실제로 존재하는 장소들입니다.하지만 그들이 말한 적이 있습니다.)). 사용자가 메인 사이트로 돌아 오면 오프라인으로 입력 한 데이터를 메인 애플리케이션과 동기화해야합니다.

따라서, 귀하의 질문에 대답 :

  • 가장 최근의 데이터가 무엇입니까? 그것을 어떻게 표현하고 싶습니까?

우리는 모든 테이블에 LAST_UPDATED_DATE 열 수 있습니다. 서버는 동기화가 수행되는 시점을 추적하므로 오프라인 응용 프로그램이 동기화를 요청할 때 서버에서 "이봐 요,이 날짜 이후에 변경된 데이터 만 제공하십시오"라고 말합니다.

  • 충돌이 발생한 경우 어떻게해야합니까? 병합 하시겠습니까? 메시지를 표시하고 사용자에게 무엇을해야하는지 묻습니다.

이 경우 오프라인 응용 프로그램은 모든 데이터의 비교적 작은 하위 집합 만 업데이트 할 수 있습니다. 각 레코드가 동기화 될 때마다 이러한 레코드 중 하나인지 확인하고, 그렇다면 LAST_UPDATED_DATE 레코드를 온라인과 오프라인으로 비교합니다. 날짜가 다른 경우 값을 확인합니다 (둘 다 동일한 값으로 업데이트 된 경우 충돌이 없기 때문에). 충돌이있을 경우 차이를 기록하고 적어도 하나의 충돌이 있음을 알리는 플래그를 설정하고 나머지 세부 사항을 확인합니다. 일단 프로세스가 완료되면 "isConflict"플래그가 설정되면 사용자는 차이를 표시하고 어떤 데이터가 "올바른"버전인지를 결정하는 특수 페이지로 이동할 수 있습니다. 이 버전은 호스트에 저장되고 "isConflict"플래그가 재설정됩니다.

  • 내가 내가 일관성 상태에 들어갈 싶지 않을 때 어떻게해야합니까?
  • 중단 된 현재 동기화를 재개하려면 어떻게합니까?

글쎄, 우리는 처음에는 일관성없는 상태가되는 것을 피하려고합니다.어떤 이유로 든 동기화가 중단되면 last_synchronisation_date가 업데이트되지 않으므로 다음에 동기화가 시작될 때 이전 동기화 (끼워 넣어 진 동기화)의 시작 날짜와 같은 날짜부터 시작됩니다.

  • 어떻게 데이터 저장 (그리고 어떻게 병합/ 글루 코드를 많이하지 않고 데이터를 동기화 할 아이폰에 예를 들어, 웹 서비스에 MySQL 데이터베이스, 코어 데이터) 처리하나요?

우리는 두 응용 프로그램 모두에서 표준 데이터베이스를 사용하며 중간에 Java 객체를 사용합니다. 객체는 실제 동기화 프로세스를 위해 XML로 직렬화 (전송 속도를 높이기 위해 gzip으로 압축) 된 다음 각 끝에서 압축 해제/비 직렬화됩니다. 합니다 ( UI가 차단되지 않도록, 백그라운드에서 실행)

  • 어떻게 동기 동안 일어나는 사용자의 편집을 처리해야합니까?

이 편집 동기화 시작 날짜 이후에 일어날 것이다, 그래서 다음 동기화 될 때까지 다른면에 포착되지 않습니다.

  • 어떻게 어느 방향으로 나는 (사용자가 를 생성 예를 들어, 자신의 컴퓨터와 에 "푸"항목이 동기화되지 않는 변경 내용을 전파 않습니다 그는 이동이고 는 또 다른 "푸"생성 그가 기기를 동기화하려고하면 은 무엇이 발생합니까? 사용자가 고유 ID가 서로 다른 두 개의 "Foo" 항목이 있습니까? 사용자가 항목을 하나만 가질 수 있습니까? 어느 항목입니까? 당신이 푸의 기본 키가 무엇인지에 따라 어떻게 하나 푸 다른과 동일 여부를 결정 즉이 특정 푸 ... 처리하는 방법을 결정하는 당신까지

.

  • 계층 적 데이터가있을 때 어떻게 동기화해야합니까? 위에서 아래로? 상향식? 모든 항목을 기본적으로 으로 처리합니까 아니면 슈퍼 노드 만 보나요? 하나 개의 레코드는 그 전체 처리는 트랜잭션을 커밋 서브 마찬가지로, 불완전 표시된 실패하면되도록

동기화는, 원자이다.

  • 일을 지나치게 단순화 및 구현에 너무 많은 시간을 투자 사이의 트레이드 오프는 얼마나 큰?

말인지 정확히 모르겠지만, 나는 그것이 모든 상황과 동기화 할 데이터의 종류/양에 따라 달라집니다 말하고 싶지만. 프로세스를 설계하고 구현하는 데 시간이 오래 걸릴 수도 있지만 가능합니다.

호프가 도움이되었거나 적어도 몇 가지 아이디어를 제공합니다. :)

+0

일부 동기화 알고리즘을 소개해주세요. 감사합니다. – Charles0429

+0

예. 모든 알고리즘을 공유하여 편리하게 만드십시오. –

+0

No1이 역순으로 있어야한다고 생각합니다. 클라이언트는 서버가 아닌 동기화 대상을 결정해야합니다. 예 : 내 기기에서 LAST_UPDATED_DATE은 오후 2시입니다. 오프라인 일 때 오후 2시 10 분에 변경 사항이 적용되었지만 동료가 같은 날 오후 2시 30 분에 업데이트하면 저장되었습니다. LAST_UPDATED_DATE에 서버에 오후 2시 30 분에 잃을 것입니다. 서버가 동기화 후보를 결정하는 경우 변경 사항은 @ 2:10 pm입니다. –

4

아마 "아니 진짜 질문은"진짜 답이 아니다. 그러나 사람들은 "가장 최근"버전이 둘 이상있을 수 있으며 충돌하는 업데이트는 해결하기 위해 수동 해결이 필요하다는 사실을 사람들이 받아 들일 것을 요구합니다. 또한 전체 변경 기록을 유지하는 데 관심이 없다면 이러한 시스템에 약간의 오버 헤드가 있습니다 (물론 두 버전의 관계를 확인하기 위해 공통 조상을 찾는 데는 최근 기록이 필요합니다).

하지만 모든 사람이 여러 장치 및 서비스에 데이터가 분산되어있는 환경에서 업데이트를 자동으로 추적하고 배포해야하므로 응용 프로그램에서 사용하는 일반적인 파일 형식에 충분한 정보가 포함될 필요가 있음에 동의합니다. 어떤 종류의 지능형 병합 동작을 용이하게하는 메타 데이터. 그러나 충돌하는 업데이트를 해결할 수있는 일반적인 방법이 없으므로 해당 동작은 응용 프로그램 수준에서 발생할 수 있습니다.

한편, iTunes-iPod 방식이 가장 쉽습니다. 하나의 마스터 라이브러리 만 있고 모든 장치가 여기에서 가져옵니다. 분명히 단일 마스터 동기화는 모든 시나리오에서 (특히 한 명 이상의 사용자가 참여할 때) 만족스럽지 않지만, 더 많은 응용 프로그램에서 이와 같은 옵션을 제공하면 감사 할 것입니다. 3 개의 iPhoto가 설치되어 있습니다. 사진이 내 iPod과 동기화되는 것처럼 하나의 전용 마스터에서 자동으로 동기화되면 개선 될 것입니다.

0

GaZ에 대한 자세한 답변을 보내 주셔서 감사합니다. 몇 가지 후속 질문이 있습니다.

타임 스탬프를 사용하는 경우 부정확 한 시간 설정 (작은 차이, 예 : 1-5 초)은 어떻게 처리합니까? 그들이 얼마나 자주 등장합니까? 다른 데이터 변경을 처리 할 때 SVN과 같은 버전 관리가 더 좋지 않습니까?

두 개의 개의 타임 스탬프 사이의 데이터 만 가져오고 있으며, 이제는 클라이언트 당 last_synchronisation_date가 되었습니까?

사용자가 충돌을 해결하지 못한 경우 어떻게합니까? isConflict 플래그로 표시된 데이터를 동기화하거나 다른 충돌을 추가하지 않으므로 사용자는 모든 충돌을 해결하기로 결정할 때 엔티티의 두 가지 버전 중에서 선택할 수 있습니다. 또는 충돌 한 것으로 표시된 데이터가있는 경우 전혀 동기화하지 않습니까?

+0

사용 된 날짜는 모두 서버에 있으므로 시계가 서버에서 변경되지 않는 한 아무런 차이점이 없습니다. 버전 관리에 대해 무슨 뜻인지 모르겠습니까? 사용자가 충돌을 해결하지 않으면 특정 엔터티의 데이터가 다시 동기화되지 않습니다. 다른 엔티티는 여전히 동기화 할 수 있습니다. – GaZ

+0

버저 닝 (versioning)에서는 모든 객체의 속성 값으로 정수 값을 의미합니다. 현재 버전과 마지막 동기화 버전의 두 가지 증분 값은 동기화 중에 비교되며 변경 사항을 전파하거나 충돌 데이터로 표시하는 버전 번호의 차이를 기반으로합니다. –

관련 문제