webapp에서 동일한 데이터를 편집하는 여러 사용자를 어떻게 처리합니까?


26

여러 사용자간에 작업 목록을 관리하는 웹 응용 프로그램을 만들려고하는 프로젝트가 있습니다. 권한이있는 사용자가 작업 항목을 배포하는 마스터 작업 목록입니다. 각 사용자는 로그인하고 할당 된 작업을 볼 수있는 자신의 계정을 가지고 있습니다. 여러 사용자가 단일 작업을 공통으로 수행 할 수 있습니다.

다음 상황을 처리하는 방법에 대한 전반적인 개념을 더 잘 이해하면서 프로젝트 세부 정보를 남기려고 노력하고 있지만 도움이된다면 RequestFactory가 구현 된 Java, EclipseLink 및 GWT를 사용하고 있습니다. 데이터베이스는 PostgreSQL입니다.

따라서 조정하려고하는 개념적 문제는 다음과 같습니다.

  1. 여러 사용자에게 공통적 인 단일 작업 (예 : 작업 완료, 삭제 등)이 변경되면이 작업이있는 모든 사용자의 작업 목록이 업데이트됩니다. 이 기능을 구현하는 데 도움이되는 디자인 패턴은 무엇입니까?

    • 내가 본 일부 패턴은 관찰자와 중재자입니다. 이것에 대해 고려해야 할 다른 패턴이 있습니까?
  2. 동일한 작업을 동시에 변경하는 두 명의 사용자가 있다고 가정하십시오.

    • 먼저 그러한 상황이 발생하도록 허용해야합니까? 아니면 다른 사람이 변경을 완료 할 때까지 상황을 잠 가야합니까?

    • 둘째, 잠금을 설정하지 않으면 누구의 변경 사항을 수락하도록 조정합니까? 이는 사용자 1이 데이터를 제출할 수 있고 사용자 2가 업데이트 된 데이터를 수신하기 전에 진행하여 변경 사항을 제출 한 경우 1의 상황과 관련됩니다.

이 웹 앱의 여러 인스턴스간에 데이터를 올바르게 동기화하는 방법에 대한 지침, 조언 또는 팁을 찾고 있습니다. 대단히 감사하겠습니다!

답변:


17

화이트 보드 가 # 1의 선택 패턴이 될 것이라고 생각 합니다. 작업 (또는 다른 공유 데이터)에 변경 사항을 공통 위치에 게시해야하므로 모든 관련 당사자가 DTRT를 볼 수 있습니다.

# 2의 경우 낙관적 잠금 을 살펴 봐야 합니다. 기본적으로 모든 편집 가능한 레코드를 마지막 업데이트 시간으로 타임 스탬프해야합니다. 레코드를 저장하려고 할 때 먼저 데이터베이스의 레코드가 레코드와 마지막으로 업데이트 된 타임 스탬프를 가지고 있는지 확인하십시오. 그렇지 않은 경우 누군가 레코드를 업데이트 한 후 이제 업데이트 된 레코드를 가져 와서 변경 사항을 다시 입력해야한다는 사실을 사용자에게 알리거나 사용자의 변경 사항을 업데이트 된 레코드에 병합하려고 시도 할 수 있습니다 (일반적으로 밝혀 짐) 간단하거나 불가능합니다).


7

나는 도움이 될만한 비슷한 요구 사항을 가진 데스크톱 응용 프로그램 (아직 테스트되지 않은)을 디자인했습니다.

내 솔루션은 MVC 패턴 (단일 모델이지만 여러 컨트롤러 및 뷰)을 사용하여 각 컨트롤러가 트랜잭션을 사용하여 모델을 변경하고 ( STM 사용 ) 트랜잭션이 커밋되면 모델이 뷰에 업데이트 알림을 브로드 캐스트했습니다. ).

각 클라이언트는 모두 로컬로 업데이트되는 모든 것을 추적했지만 로컬 업데이트가 완료되면 (즉, 커밋되도록 전송) 기본 모델 정보를 사용하여 되돌 렸습니다.

또한 사용자가 변경 한 내용을 모두 되돌릴 수 있도록 실행 취소 스택이있었습니다.

모델이 웹 클라이언트에서 가장 쉬운 것은 아니지만 뷰에 대한 변경 사항을 브로드 캐스트해야했기 때문에 이것은 웹 앱에 가장 적합한 모델이 아닐 수도 있습니다.


4

1. 발행 / 구독 패턴이 더 적합한 지 확인해야합니다.
2. 상황에 따라 다릅니다.

  • 이 상황은 얼마나 자주 발생합니까?
  • 사용자 중 하나가 작업이 잠겨 있거나 그 동안 다른 사람이 작업을 변경하여 작업을 업데이트 할 수없는 상황은 얼마나 나쁜가?
    개인적으로 나는 다음과 같은 접근 방식을 선호합니다 (예 : pivotaltracker 에서 사용 ).
    • 자물쇠가 없습니다.
    • 모든 변경 사항을 실시간으로 볼 수 있으며
    • UI는 여러 속성에서 더 큰 업데이트 대신 자주 업데이트를 수행하도록 초대합니다.
    • 모든 변경 사항의 기록을 유지합니다. 히스토리가 사용자에게 표시되는 경우, 충돌, 겹쳐 쓰기로 인해 발생하는 주석, 주석 또는 메시지로 해결할 수 있습니다.

문제는 더 학문적이므로 최악의 경우 어떻게 처리되는지 살펴보기 위해 매우 자주 말할 것입니다. 패턴 참조의 경우 +1
hulkmeister

@ kr1 pivotaltracker는 충돌 경고가 없으며 충돌하지 않는 변경 사항을 병합하지 않으므로 레코드 편집 다중 사용자 응용 프로그램의 좋은 예를 사용해서는 안됩니다.
에두아르도

0

충돌이 발생하면 절대로 잠 그거나보고하지 않는 것이 좋습니다.

다음을 살펴보십시오.

https://github.com/spring-projects/spring-petclinic/issues/433

비디오 및 샘플 코드를 볼 수 있습니다.

그것이 귀하의 요구 사항을 충족합니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.