2012-07-31 4 views
0

내가 작업 한 응용 프로그램의 기본 개념은 사용자 그룹이 플래시 카드의 "스택"에 대해 공동 작업을 할 수있게하는 것입니다. 결국 앱은 클라이언트 - 서버 시스템으로 작동합니다 (iOS 앱을 클라이언트로, 레일즈 앱을 서버로 사용)이 클라이언트 - 서버 디자인이 의미가 있습니까? 실용적인가?

이 디자인의 요구 사항은 다음과 같습니다 :

  1. 편집 사항을 원활하게 병합해야합니다. 많은 사용자가 각 스택을 편집 할 것이고 모든 클라이언트가 완료 되 자마자 변경 사항을 업로드 할 수 없기 때문에 디자인은 공유 데이터에 대한 불일치 변경 사항을 우아하게 조정할 수 있어야합니다.
  2. 효율적이어야합니다. 많은 사용자가 셀 연결을 통해 앱에 액세스 할 것이므로 서버에서 업로드 및 다운로드 한 데이터의 양을 최소화하고 앱이 이러한 연결을 통해 신속하게 실행되는지 확인하고 이미 제한된 클라이언트의 데이터 사용량을 줄여야합니다.

원래 단순한 경로로 이동하여 클라이언트가 모든 동기화에서 "대량"보고서를 보내면 각 스택의 전체 로컬 복사본이 업로드 된 다음 서버는이 모든 데이터를 처리하여 이전 클라이언트의 편집 내용과 함께 자체 마스터 복사본에 병합 한 다음 클라이언트에게 전체 데이터 세트를 전송합니다.이 데이터 복사본은 오프라인보기 및 편집을 위해이 정확한 복사본을 저장합니다.

내 디자인 요구 사항을 염두에 두면서이 문제를 보았을 때 주로 끔찍한 비효율적 인 문제가있었습니다. 클라이언트 응용 프로그램은 모든 데이터를 업로드하고 다운로드하는 데 시간을 낭비해야 할뿐만 아니라 대부분의 데이터가 이전 사본과 동일 할지라도 모든 새 정보를 로컬 데이터 저장소에 작성해야합니다. 또한 서버가 효율적이고 논리적 인 방식으로 충돌하는 편집을 이해하는 방법을 알 수 없었습니다. 클라이언트가 데이터베이스의 복사본을 변경하는 것 외에도, 공유 스택을 변경하는 때마다

은, 그것은 변화의 노트를 만들 것입니다 :

그래서 여기 내가 생각 해낸거야 어떻게, 언제, 그리고 누구에 의해 변경되었는지를 포함한 로그. 다음에 클라이언트가 서버와 동기화 될 때 (2 ~ 3 일 후), 작업의 "수신"이 전체 로컬 데이터 복사본 대신 서버로 전송됩니다.

여기서 서버는 데이터의 서버 복사본에 대한 모든 변경을 실행하기 전에 먼저 이러한 작업을 저장합니다. 그런 다음이 영수증 데이터베이스를 사용하여 클라이언트가 데이터베이스와 마지막으로 동기화 한 이후 스택에 대한 모든 관련 변경 사항을 가져옵니다. 그런 다음 이들 만 클라이언트로 보내지며 클라이언트는 자체 로컬 사본에서 변경 사항을 실행합니다.

클라이언트가 수행 한 모든 변경 사항에 대한이 로그를 사용하여 서버는 다른 변경 사항을 무효로하는 변경 사항을 결정할 수 있습니다 (예 : 사용자가 카드를 삭제 한 다음이 변경 사항과 동기화하기 전에 다른 사용자가 일반 카드를 편집하면, 삭제가 무효화됩니다). 구현하기가 복잡하기는하지만, 이론적으로 병합 문제에 대한 이상적인 솔루션입니다.

그래서 어떻게 생각하십니까?

이것은 실현 가능한 해결책입니까? 내 마스터 플랜에 눈부신 구멍이 보이니?

감사합니다.알고리즘의 일부로 장치에서 시간을 신뢰하지 않는 조심하는

+0

무엇이 끝났습니까? 대답이 의미가 있었습니까? – bryanmac

답변

1

한 가지 : 그 또한 작업을 인터리빙/병합에 대한 스레드 회담에

Can I Rely on the iOS Device Clock Being Correct?

내 대답.

두 명의 사용자가 동일한 카드에서 충돌하는 동일한 데이터를 편집하는 경우를 고려해야합니다. 시간을 신뢰할 수 없기 때문에 클라이언트는 마지막 동기화 시점에서 마지막 "서버 시간 마커"를 알고 있으므로 마지막 동기화 서버 마커에서 모든 변경 내용을 확인할 수 있습니다. 그게 당신이 (서버의 시간) 확신 할 수있는 유일한 방법으로 변경 사항을 삽입 할 때 더 자주 동기화되는 클라이언트에 대한 보상입니다.

희망이 있습니다. 정확하게 (그리고 일반적으로) 할 복잡한 주제.

관련 문제