오프라인 시스템과 동기화


9

데이터를 생성하고 서버로 다시 보내는 모바일 장치 (내장 응용 프로그램이있는)의 비즈니스 데이터를 동기화 할 시스템을 설계하고 있습니다. 동기화 된 각 회선은 데이터베이스에서 특정 비즈니스 로그를 생성합니다.

내가 동기화 한 것이 비즈니스 데이터의 마지막 수정 날짜보다 낮은 날짜 (동기화 데이터 내)로 데이터를 생성하는 경우이를 무시하고 데이터베이스에 로그인을 추가해야합니다. 업로드 된 데이터가 처리되면 데이터베이스에서 데이터를 가져와 장치로 다운로드합니다.

기록 직후이 다운로드로 인해 동기화가 동기화되어야합니다. 이와 같은 것이 기존 솔루션을 대체 할만 큼 가치가 있다면 독자 / 작가 패턴을 가질 수 있습니다. 더 중요한 것은 최신 데이터를 다운로드 할 수있는 것입니다. 그 데이터는 전체적으로 페치되며, 현재 구현 된 diff는 없습니다 (나중에 나올 수 있지만 문제가되지는 않습니다).

동일한 비즈니스 오브젝트를 실행하는 중에 여러 개의 동기화가있을 수 있지만 발생 가능성은 낮지 만 처리 할 수있는 것을 선호합니다. 동기화는 몇 일 동안 재 동기화없이 내장 모바일 애플리케이션을 사용하지 않는 한 몇 초 동안 지속될 것으로 예상됩니다.

동기화 된 데이터의 양은 크지 않으며 동기화 프로세스도 아닙니다.

그래서 나는 동기화 방법에 대해 상호 배제를 사용하고, 더 정확하게는 Java를 사용하고 있으며 읽기 전용 동기화를 차단하지 않기 위해 전체 동기화 프로세스가 아닌 쓰기 방법에 동기화를 설정했습니다.

나는 알고 싶다 :

  1. 이 방법이 의미가 있다면? 동기화 프로세스의 양과 시간은 여전히 ​​수용 가능합니다.
  2. 일반적으로 어떤 개념을 살펴 봐야합니다. 보너스 : Spring 모듈에서 이러한 개념이 구현 된 경우.

오프라인의 원인은 무엇입니까? 장치가 오프라인 상태 일 때 서버에만 액세스 할 수 없거나 인터넷에 연결되어 있지 않다는 것을 의미합니까?
Laiv

인터넷에 접속할 수 없습니다. 또는 자주는 아닙니다.
Walfrat

동기화하는 클라이언트 / 서버가 여러 개인 경우 먼저 무언가가 다른 경우 데이터 마스터 쉽을 결정해야합니다 . 간헐적 인 연결 만 사용하고 여러 클라이언트를 고려하는 경우이를 점진적으로 수행 할 방법이 없습니다.
tofro

내 경우에는 @tofro 데이터 마스터 쉽을 쉽게 결정할 수 있으므로 문제가되지 않습니다. 그러나 간헐적 연결로 점진적으로 수행 할 수없는 이유는 무엇입니까? 마지막 동기화 날짜 만 사용할 수 있습니까? 그러한 날짜를 사용하는 경우의 유일한 문제는 현재 내 장치에있는 데이터가 이동되어 장치에서 삭제되어야한다는 것을 아는 것입니다.
Walfrat

귀하의 설명을 통해 서버 또는 하나 이상의 여러 클라이언트에서 동일한 데이터 항목을 변경할 수 있음을 이해했습니다. 모바일 # 1로 이동 한 다음 서버에서 변경된 다음 모바일 # 2로 이동하여 변경된 다음 모바일 # 1이 연결되면 (연결이 끊어진 모바일 # 2로) 데이터 항목을 어떻게 3 방향 동기화 하시겠습니까?
tofro

답변:


1

날짜 (믿을 수 없을 수도 있음) 또는 동기 요청에 의존하지 않고 클라이언트 데이터가 서버 데이터와 동기화되도록 잠시 동안 (일부 성공했지만) 조사 한 접근법은 JSON 패치 (아마도 POJO) 의 조합입니다 귀하의 경우) 및 이벤트 소싱 .

기본 개념은 클라이언트와 서버에 현재 상태를 저장하는 대신 클라이언트와 서버가 변경 목록과 이벤트 또는 패치 요청을 통해 서로 메시지를 저장한다는 것입니다.

따라서 클라이언트가 모든 데이터와 날짜를 서버로 보내는 대신 클라이언트는 마지막으로 데이터가 업데이트되었다고 생각한 수정 번호와 함께 이벤트를 보냅니다. 이 같은:

Server.send("MODIFY FOO", 3);

서버가이 이벤트를 비동기식으로 받으면, 이미 수신 한 다른 이벤트와 조정합니다. 예를 들어, 동일한 데이터로 작업하는 다른 클라이언트가 이미 일부 사항을 수정했을 수 있으며 이제 서버의 개정 번호가 5 일 수 있습니다. 따라서이 개정은 마지막 2 개를 적용하기 전에 적용해야합니다. 이 변경 사항을 고객에게 알려야합니다.

서버가 완료되면 모든 관심있는 클라이언트에게 변경 사항 및 새로운 현재 개정 번호를 알립니다. 그런 다음 클라이언트는 이러한 변경 사항을 적용하고 내부 개정 번호를 업데이트합니다.

마일리지가 다를 수 있지만 도움이 되길 바랍니다.

편집 : 이 관련 질문 에서 언급 했듯이이 접근법의 또 다른 이름 또는 변형을 메시지 큐잉 이라고 합니다 .


시스템은 며칠 동안 오프라인 상태 (서버에 액세스 할 수 없음) 일 수 있으며 이벤트가 서버와 동기화 된 시간이 아니라 이벤트가 발생한 날짜를 등록해야합니다. 그래서 날짜를 사용해야합니다. optimisticLocking의 개정 번호도 있지만 같은 이유로 2 개의 장치가 POJO의 버전 X를 다운로드 할 수 있으며 나중에 동기화 할 때 버전 X + 1 및 X + 2를 생성 해야하는 각 보내기 이벤트를 수행 할 수 있습니다. 그리고 장치는 서로 통신 할 수 없습니다.
Walfrat

이 답변의 개정 번호는 항상 서버에서 생성되며 클라이언트는 이전 개정 번호를 보냅니다. 개정 증분이 그 책임이 아니므로 다른 클라이언트에 대해 알 필요가 없습니다. 이 답변은 제안 된 솔루션의 가장 중요한 부분 인 충돌 해결에 대해서는 언급하지 않습니다.
Basilevs

0

첫 번째 문제는 날짜를 데이터 동기화 방법으로 사용하는 것입니다. 나는 당신의 솔루션의 모든 세부 사항을 얻지 못했다고 확신하지만 다음과 같이 말할 것입니다.

  1. 휴대폰에서 날짜가 생성됩니까? 이 경우 모바일에서 실행되는 앱이 항상 올바른 날짜를 사용합니까? 모바일 장치에서 시스템 날짜를 다소 변경할 수있는 악의적 인 사용자는 어떻습니까? 다른 시간대의 사용자는 어떻습니까? @jeffrey가 말했듯이 장치에서 생성 된 날짜를 사용하는 것이 가장 좋은 방법은 아닙니다.

  2. 올바르게 이해하면 낙관적 동시성 제어 를 사용 합니다 . 나는 당신의 접근 방식에서 본질적으로 잘못된 것을 보지 못했습니다.

  3. 이 질문은 Spring에서 낙관적 잠금을 구현하는 것에 관한 것 입니다. 어쩌면 당신은 그것에 영감을 찾을 수 있습니다.


나는 행동이 실행 된 날짜를 기록해야합니다. 그러므로 나는 모바일 날짜와 붙어 있습니다. 이동 날짜는 종종 시스템과 다시 동기화됩니다. 등록 된 장치 만 서버와 동기화 할 수 있습니다. 보안에 관해서는 현재 남아있는 또 다른 관심사입니다 (X509 장치 인증, ...)
Walfrat

날짜는 다른 데이터 필드로 기록 될 수 있으므로 동기화 토큰으로 취급 할 필요가 없습니다.
Basilevs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.