6

저는 XML 기반의 페이로드를 사용하여 iPhone과 웹 사이트간에 두 개의 비즈니스 객체를 동기화하기 위해 작업 중이며 최적의 루틴에 대한 아이디어를 얻고 싶습니다.서로 다른 두 시스템간에 개체를 동기화하는 것이 가장 좋습니다.

이 질문의 성격은 꽤 일반적이지만 웹 엔터티와 클라이언트 (데스크톱, 휴대 전화 등)간에 비즈니스 개체를 동기화해야하는 다양한 시스템에 모두 적용될 수 있습니다.

비즈니스 오브젝트는 양쪽에서 편집, h 제 W 갱신 할 수 있습니다. 양측 모두 개체를 로컬에 저장할 수 있지만 동기화는 연결 해제 된보기를 위해 iPhone 측에서만 시작됩니다. 모든 객체는 updated_at 및 created_at 타임 스탬프를 가지고 있으며 양쪽에서 RDBMS에 의해 백업됩니다 (iPhone 측의 SQLite와 웹상의 MySQL ...이 문제는별로 생각하지 않습니다). 그리고 전화가 마지막으로 시간을 기록합니다. 동기화가 시도되었습니다. 그렇지 않으면 다른 데이터가 저장되지 않습니다 (현재).

동기화를 위해 시스템 간의 네트워크 채터를 최소화하기 위해 어떤 알고리즘을 사용 하시겠습니까? "소프트 삭제 (soft-deletes)"옵션이 아닌 경우 삭제 처리 방법은 무엇입니까? 이 데이터를 변경하기 위해 어떤 데이터 모델을 변경하겠습니까?

답변

11

가장 간단한 방법은 동기화 할 때 모든 레코드를 전송하는 것입니다. where updated_at >= @last_sync_at. 아래쪽 :이 방법은 시계 스큐를 전혀 허용하지 않습니다.

행이 업데이트 될 때마다 증가하는 (시계 오차가 동기화 프로세스를 파울 수 없도록) 버전 번호 열과 마지막으로 동기화 된 버전 번호를 유지하는 것이 더 안전합니다 식별). 이 대역폭을 효율적으로 사용하려면 수정 된 행만 전송해야하므로 각 복제 피어에 전송 된 마지막 버전의 각 데이터베이스에 캐시를 유지하십시오. 이것이 스타 토폴로지가 될 경우 잎은 마지막 동기화 된 버전이 각 테이블에 저장되는 단순화 된 스키마를 사용할 수 있습니다.

삭제 동기화 동기화를 지원하려면 일부 형태의 소프트 삭제가 필요하지만 삭제 된 행의 키만 포함하는 '삭제 표시'레코드 형식 일 수 있습니다. 삭제 표시는 모든 복제본이 처리 된 것이 확실한 경우에만 안전하게 삭제할 수 있습니다. 그렇지 않으면 삭제 된 복제본이 삭제 된 것으로 생각되는 레코드를 부활시킬 수 있습니다.

+0

의견을 보내 주셔서 감사합니다. 시간 왜곡과 관련하여 제기 한 문제가 중요하다고 생각합니다. 초기 희망은 서버의 NTP와 iPhone/Touch의 자체 시간 동기화 서비스/이동 통신사/컴퓨터 시간 왜곡 문제가 완화된다는 것입니다. 이 가정이 너무 위험한가요? – hyuan

+0

그것은 많은면에서 취약합니다. 예를 들어, 시계가 역방향으로 재설정되면 누락 된 업데이트가 발생할 수 있으며 누락 된 업데이트로 인해 편집 충돌이 감지되지 않을 수 있습니다. 다중 마스터 복제는 중요한 작업입니다. –

+0

친절한 조언을 가져 주셔서 감사합니다. 바라기를 두어 주 안에, 당신은 당신의 지혜의 열매를 볼 수있을 것입니다. 문제의 사이트는 이미 가동 중이지만 (www.ayenotes.com) iPhone 앱은 그렇지 않습니다. – hyuan

0

그래서 요약하면 연결이 끊어진 동기화와 관련이 있다고 생각합니다.

초기 동기화하여 데이터와 그와 관련된 정보 (행 버전, 파일 체크섬 등)를 검색 : 그래서 여기

내가 어떻게해야한다고 생각하는 것이다. 이 정보를 저장하고 다음번 성공적으로 동기화 될 때까지 깨끗하게 유지하는 것이 중요합니다. 이 데이터의 사본을 변경해야합니다.

변경 내용 추적 데이터베이스 행을 처리하는 경우 기본적으로 삽입, 업데이트 및 삭제 작업을 추적해야합니다. xml과 같은 텍스트 파일을 다루는 경우에는 약간 더 복잡합니다. 여러 사용자가 동시에이 파일을 편집하는 경우 diff 도구가 있어야하므로 충돌이 전체 파일 대신보다 세분화 된 수준에서 감지 될 수 있습니다.

충돌 확인 데이터베이스 행만 처리하는 경우에도 충돌을 쉽게 감지 할 수 있습니다. 행이 업데이트 될 때마다 증가하는 다른 열을 가질 수 있습니다 (mssql에는 mysql이 내장되어 있지 않은 것으로 생각됩니다). 따라서 복사본의 복사본 수가 서버의 복사본 수와 다른 경우 충돌이 발생합니다. 파일이나 문자열의 경우 체크섬이 작업을 수행합니다. 수정 된 날짜를 사용할 수도 있지만 실수를 방지하기 위해 매우 정확하고 정확한 측정을해야합니다.예 : 파일을 검색하고 검색 한 즉시 저장한다고 말할 수 있습니다. 시간 차이가 1 밀리 초라고합니다. 그런 다음 파일을 변경 한 다음 저장하려고합니다. 기록 된 최종 수정 시간이 10 밀리 초까지만 정확하다면, 검색 한 파일이 저장 한 날짜와 동일한 수정 된 날짜를 가지게되므로 프로그램이 충돌을 생각하지 않고 변경 사항을 덮어 쓸 가능성이 있습니다. 그래서 나는 일반적으로이 방법을 안전한면에 사용하지 않습니다. 반면에 사소한 수정 후 체크섬/해시 충돌 가능성은 거의 없습니다.

충돌 해결 이제는 까다로운 부분입니다. 자동 프로세스 인 경우 상황을 평가하고 변경 사항을 덮어 쓰거나 변경 사항을 잃거나 서버에서 데이터를 다시 검색하여 변경 사항을 다시 시도할지 결정해야합니다. 운 좋게도 인간과의 상호 작용이있는 것 같습니다. 하지만 여전히 코드를 작성하는 데는 많은 어려움이 있습니다. 데이터베이스 행을 처리하는 경우 각 개별 열을 검사하고이를 서버의 데이터와 비교하여 사용자에게 제시 할 수 있습니다. 이 아이디어는 사용자에게 압도적이지 않도록 매우 세부적인 방식으로 사용자에게 충돌을 제시하는 것입니다. 대부분의 갈등은 여러 장소에서 매우 작은 차이가 있으므로 한 번에 한 가지 작은 차이 만 사용자에게 제시합니다. 텍스트 파일의 경우 거의 동일하지만 100 배 이상 복잡합니다. 따라서 기본적으로 diff 도구를 사용하거나 작성해야합니다 (텍스트 비교는 완전히 다른 주제이며 여기에서 언급하기에는 너무 광범위합니다).이 도구를 사용하면 파일의 작은 변경 사항 및 해당 변경 사항이 데이터베이스 : 텍스트가 삽입, 삭제 또는 편집 된 곳입니다. 그런 다음 동일한 방식으로 사용자에게 제공하십시오. 그래서 기본적으로 작은 충돌마다 사용자는 변경 사항을 버리거나 서버의 변경 사항을 덮어 쓰거나 서버에 보내기 전에 수동 편집을 수행할지 여부를 선택해야합니다.

그렇다면 제대로 된 작업을 수행 한 경우 충돌이있는 경우 사용자에게 충돌 목록이 제공되어야합니다. 이러한 충돌은 사용자가 신속하게 결정할만큼 세밀해야합니다. 예를 들어 갈등은 다음과 같은 철자 변경 사항입니다. 사용자가 전체 단락을 제공하고 변경 사항이 있음을 알리고 사용자가 수행 할 작업을 결정해야한다는 점에서 사용자가 철자 맞춤법에서 선택하는 것이 더 쉬울 것입니다 , 사용자는이 작은 오타를 사냥해야합니다.

기타 고려 사항 : 데이터 유효성 검사 - 데이터가 변경되었을 수 있으므로 충돌을 해결 한 후에 유효성 검사를 수행해야한다는 것을 명심하십시오. 텍스트 비교 - 말했듯이, 이것은 큰 문제입니다. 그래서 구글! Disconnected Synchronization - 거기에 몇 가지 기사가 있다고 생각합니다.

출처 : https://softwareengineering.stackexchange.com/questions/94634/synchronization-web-service-methodologies-or-papers