2008-08-13 7 views
2

문서 서버를 구현 중입니다. 현재 두 명의 사용자가 같은 문서를 열고 수정 한 다음 변경 사항을 저장하면 문서의 상태가 정의되지 않습니다. 첫 번째 사용자의 변경 사항은 영구히 저장되거나 두 번째 사용자의 변경 사항이 저장됩니다. 이것은 완전히 만족스럽지 않습니다. 이 문제를 해결하기 위해 두 가지 가능성을 고려했습니다 :Document Server : 동시 저장 처리

첫 번째는 누군가가 처음 열 때 문서를 잠그고 닫을 때 잠금을 해제하는 것입니다. 그러나 서버에 대한 네트워크 연결이 갑자기 중단되면 문서는 영원히 잠긴 상태를 유지합니다. 분명한 해결책은 서버에 정기적 인 ping을 보내는 것입니다. 서버가 특정 클라이언트로부터 K 개의 ping (K> 1)을받지 못하면이 클라이언트에 의해 잠긴 문서의 잠금이 해제됩니다. 해당 클라이언트가 다시 나타나면 누군가가 이미 잠근 적이없는 경우 문서가 다시 잠 깁니다. 이것은 클라이언트 응용 프로그램 (웹 브라우저에서 실행 중)이 예기치 않게 종료되어 '종료, 내 문서의 잠금 해제'신호를 서버에 보낼 수없는 경우에도 도움이 될 수 있습니다.

두 번째는 다른 사용자가 저장 한 동일한 문서의 여러 버전을 저장하는 것입니다. 문서가 빠르게 연속해서 변경되면 시스템은 버전을 병합하거나 원하는 버전을 선택할 수 있습니다. 저장 공간을 최적화하려면 소스 제어 소프트웨어와 마찬가지로 문서 비교 만 보관해야합니다.

서버에 연결하면 가끔이 느려지고 응답하지 않을 수 있다는 점을 고려하여 어떤 방법을 선택해야합니까? 매개 변수 (핑 간격, 빠른 연속 간격)는 어떻게 결정되어야합니까?

P. 불행히도 데이터베이스에 문서를 저장할 수 없습니다.

답변

0

제 제안은 귀하의 첫 번째 제안과 유사 할 것입니다. 첫 번째 사용자 (Bob)가 문서를 열면 다른 사용자가 현재 문서 만 읽을 수 있도록 잠금을 획득합니다. 사용자가 문서를 사용하는 동안 문서를 저장하면 그는 잠금을 유지합니다. 그가 문서를 종료 할 때만 잠금이 해제되고 다른 사람들이 문서를 편집 할 수 있습니다.

Bob이 Bob을 잠그고있는 동안 두 번째 사용자 (Kate)가 문서를 열면 Kate는 문서를 편집 할 수 없다는 메시지를 받지만 잠금이 해제 될 때까지 읽을 수 있습니다.

Bob이 잠금을 가져 왔을 때 문서가 한두 번 저장되었지만 잠금이 설정된 상태에서 응용 프로그램을 종료하면 어떻게됩니까?

자신이 말했듯이 특정 주파수로 핑을 보내도록 잠금 장치가 필요한 클라이언트가 가장 좋습니다. 정해진 시간 동안 클라이언트로부터 ping을받지 못하면 클라이언트가 더 이상 응답하지 않는다는 것을 의미합니다. 이 웹 응용 프로그램의 경우 ping에 javascript를 사용할 수 있습니다. 마지막으로 저장된 문서가 잠금을 해제하고 Kate가 이제이를 가져올 수 있습니다.

ping에는 클라이언트가 잠겨있는 문서의 이름이 포함될 수 있으며 서버는 해당 문서의 마지막 ping이 수신 된 시점을 계산할 수 있습니다.

1

설명하는 첫 번째 옵션은 본질적으로 비관적 인 잠금 모델이며 두 번째 옵션은 낙관적 인 모델입니다. 선택할 수있는 요소는 여러 가지 요인에 따라 다르지만 기본적으로 비즈니스가 어떻게 작동하길 원하는지에 달려 있습니다. 예를 들어 편집해야하는 문서가 다른 사용자가 잠근 경우 사용자에게 불편을 겪게됩니까? 문서가 잠겨서 클라이언트가 연결된 상태로 휴일이되면 어떻게됩니까? 각 문서의 가능한 경합은 무엇입니까? 즉, 동시에 두 명의 사용자가 동일한 문서를 수정할 가능성은 얼마나됩니까? 한 문서 내에 수정 내용이 얼마나 현지화되어 있습니까?(동일한 섹션이 정기적으로 수정되는 경우 병합을 수행하는 것은 단순히 변경을 다시 수행하는 것보다 오래 걸릴 수 있습니다).

경합이 상대적으로 낮고 각 변경의 크기가 상당히 작다고 가정하면 자동 또는 수동 병합을 사용하여 충돌을 해결하는 낙관적 인 모델을 선택하게됩니다. 버전 번호 또는 문서 내용의 체크섬을 사용하여 병합이 필요한지 확인할 수 있습니다.

0

현재 문서는 제한된 그룹에 의해 게시되며 각 그룹은 개별 주제로 작업합니다. 따라서 잠금 장치로 인한 불편 함을 최소화 할 수 있습니다. 사람들은 대부분 기존 문서를 확장하고 실수를 수정합니다.

비관적 인 모델에 대해 말하면, 잠금 시작 날짜를 잠금 시작 날짜 1 일전으로 설정하면 '비 N 클라이언트 연결'시나리오를 피할 수 있습니다. 편집 된 문서는 절대로 중요하지 않으며 여러 사용자가 수정하는 경우가 거의 없으므로 충분할 수 있습니다.

이제 낙관적 인 모델을 고려해보십시오. 문서에 규칙적인 (말하자면, 계층 적) 구조가있는 경우 어떻게 차이점을 발견해야합니까? 그렇지 않다면? 이 경우 성공적인 자동 병합의 기회는 무엇입니까?

'admins'사용자 그룹이 편집 한 문서 중 일부에 중요한 구성 정보 (문서 글로벌 색인, 사용자 역할 등)가 포함되어있어 상황이 더욱 복잡해집니다. 내 마음에 자물쇠는 이런 종류의 정보에 대해 더 유리합니다. 왜냐하면 일상적으로 바뀌지 않기 때문입니다. 따라서 일부 하이브리드 솔루션이 적합 할 수도 있습니다.

당신은 어떻게 생각하십니까?