add synch policy
This commit is contained in:
parent
8c95d2f24f
commit
a8a09924b8
@ -777,6 +777,7 @@ fn apply(this, mutator, updatedAt, seq){
|
||||
|
||||
### 5.2.3 다른 작업들
|
||||
|
||||
다음은 청크 컴포넌트에 관한 의사코드이다.
|
||||
```
|
||||
module chunk {
|
||||
type mode = Read | Write
|
||||
@ -817,7 +818,7 @@ module chunk {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
다음은 검색 기능에 관한 의사코드이다.
|
||||
```
|
||||
module search {
|
||||
searchWord(chunks, word) {
|
||||
@ -839,7 +840,7 @@ module search {
|
||||
when Ctrl-F is pressed { searchWordPrompt() }
|
||||
}
|
||||
```
|
||||
|
||||
다음은 문서 컴포넌트에 관한 의사코드이다.
|
||||
```
|
||||
module document {
|
||||
struct Document {
|
||||
@ -872,7 +873,7 @@ module document {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
다음은 파일리스트 컴포넌트에 관한 의사코드이다.
|
||||
```
|
||||
module filelist {
|
||||
fileList(dir : Directory, open: (File) => void) : Component {
|
||||
@ -890,7 +891,7 @@ module filelist {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
다음은 설정에 관한 의사코드이다.
|
||||
```
|
||||
module settings {
|
||||
settings() : Component {
|
||||
@ -911,6 +912,7 @@ module settings {
|
||||
}
|
||||
}
|
||||
```
|
||||
다음은 프론트엔드를 요약하는 의사코드이다.
|
||||
```
|
||||
module frontend {
|
||||
main() : Component {
|
||||
@ -933,3 +935,69 @@ module frontend {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 5.3 동기화 정책(Synchronization Policy)
|
||||
|
||||
동기화 정책은 이렇다. 기본적으로 상대문서의 갱신 시간과 나의 갱신 시간을 비교하고 상대문서가 최신이 아니면 거부한다. 메소드가 실행 순서에
|
||||
무관하면 언제나 실행하고 갱신한다. 메소드가 순서에 따라 조정될 수 있으면 조정한다.
|
||||
|
||||
예를 들어, 다음과 같은 상황이 있다.
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant A as Alice
|
||||
participant S as Server
|
||||
participant B as Bob
|
||||
S ->> A: document.open
|
||||
S ->> B: document.open
|
||||
A ->> S: chunk.create
|
||||
B ->> S: chunk.create
|
||||
S -->> A: response
|
||||
S -->> B: conflict
|
||||
S -) B: chunk.update
|
||||
```
|
||||
|
||||
처음에 Server에서 Alice와 Bob이 문서를 받아왔다. 그리고 Alice가 `chunk.create` 메소드를 보내고 Bob이
|
||||
`chunk.create`메소드를 보냈다. 그러면 Server는 Alice가 먼저 도착했으므로 Alice의 메소드을 처리하고 최근 갱신 시간을
|
||||
갱신한다. 그리고 Bob의 메소드를 처리할때 Bob의 문서의 최근 갱신 시간이 Server 문서의 최근 갱신 시간보다 작으므로 거부한다.
|
||||
|
||||
별개로 Alice의 갱신사실을 알리기 위해서 Bob에게 `chunk.update`를 보낸다.
|
||||
|
||||
다른 예로 다음과 같은 상황에서는 이렇다.
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant A as Alice
|
||||
participant S as Server
|
||||
participant B as Bob
|
||||
S ->> A: document.open
|
||||
A ->> S: chunk.create
|
||||
S ->> B: document.open
|
||||
S -->> A: response
|
||||
S -) B: chunk.update
|
||||
B ->> S: chunk.create
|
||||
S -->> B: response
|
||||
S -) A: chunk.update
|
||||
```
|
||||
|
||||
여기서는 Bob의 문서가 최신이기 때문에(**문서 갱신 시간이 Server와 같기 떄문에**) 거부되지 않고 처리되는 것을 볼 수 있다.
|
||||
그와 별개로 갱신 사실을 알리기 위해서 `chunk.update`가 Alice와 Bob에게 전달되는 것을 볼 수 있다.
|
||||
|
||||
메소드를 조정할 수 있으면 조정한다는 것은 인수를 바꾸어서 실행한다는 것이다. 예를 들어 다음의 예에 대해서
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant A as Alice
|
||||
participant S as Server
|
||||
participant B as Bob
|
||||
S ->> A: document.open
|
||||
S ->> B: document.open
|
||||
A ->> S: chunk.create
|
||||
B ->> S: chunk.create
|
||||
S -->> A: response
|
||||
S -->> B: response
|
||||
S -) B: chunk.update
|
||||
```
|
||||
|
||||
A는 1번째 위치에서 `chunk.create`에서 시도하고 B가 3번째 위치에서 `chunk.create`를 시도하면 A가 B보다 먼저 앞의 위치에서
|
||||
삽입을 했으므로 B의 위치를 4번째로 조정하고 적용한다.
|
@ -50,6 +50,7 @@
|
||||
1. [서버 RPC 메세지 처리](./architecture.md#521-서버-rpc-메세지-처리)
|
||||
2. [클라이언트의 메세지 처리 동기화](./architecture.md#522-클라이언트의-메세지-처리-동기화)
|
||||
3. [다른 작업들](./architecture.md#523-다른-작업들)
|
||||
3. [동기화 정책(Synchronization Policy)](./architecture.md#53-동기화-정책synchronization-policy)
|
||||
6. [시험(Testing)](./testing.md)
|
||||
1. [유닛 테스트(Unit test)](./testing.md#61-유닛-테스트unit-test)
|
||||
2. [기능 테스트(Functional Test)](./testing.md#62-기능-테스트functional-test)
|
Loading…
Reference in New Issue
Block a user