add synch policy

This commit is contained in:
monoid 2022-06-12 01:05:00 +09:00
parent 8c95d2f24f
commit a8a09924b8
2 changed files with 73 additions and 4 deletions

View File

@ -777,6 +777,7 @@ fn apply(this, mutator, updatedAt, seq){
### 5.2.3 다른 작업들 ### 5.2.3 다른 작업들
다음은 청크 컴포넌트에 관한 의사코드이다.
``` ```
module chunk { module chunk {
type mode = Read | Write type mode = Read | Write
@ -817,7 +818,7 @@ module chunk {
} }
} }
``` ```
다음은 검색 기능에 관한 의사코드이다.
``` ```
module search { module search {
searchWord(chunks, word) { searchWord(chunks, word) {
@ -839,7 +840,7 @@ module search {
when Ctrl-F is pressed { searchWordPrompt() } when Ctrl-F is pressed { searchWordPrompt() }
} }
``` ```
다음은 문서 컴포넌트에 관한 의사코드이다.
``` ```
module document { module document {
struct Document { struct Document {
@ -872,7 +873,7 @@ module document {
} }
} }
``` ```
다음은 파일리스트 컴포넌트에 관한 의사코드이다.
``` ```
module filelist { module filelist {
fileList(dir : Directory, open: (File) => void) : Component { fileList(dir : Directory, open: (File) => void) : Component {
@ -890,7 +891,7 @@ module filelist {
} }
} }
``` ```
다음은 설정에 관한 의사코드이다.
``` ```
module settings { module settings {
settings() : Component { settings() : Component {
@ -911,6 +912,7 @@ module settings {
} }
} }
``` ```
다음은 프론트엔드를 요약하는 의사코드이다.
``` ```
module frontend { module frontend {
main() : Component { 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번째로 조정하고 적용한다.

View File

@ -50,6 +50,7 @@
1. [서버 RPC 메세지 처리](./architecture.md#521-서버-rpc-메세지-처리) 1. [서버 RPC 메세지 처리](./architecture.md#521-서버-rpc-메세지-처리)
2. [클라이언트의 메세지 처리 동기화](./architecture.md#522-클라이언트의-메세지-처리-동기화) 2. [클라이언트의 메세지 처리 동기화](./architecture.md#522-클라이언트의-메세지-처리-동기화)
3. [다른 작업들](./architecture.md#523-다른-작업들) 3. [다른 작업들](./architecture.md#523-다른-작업들)
3. [동기화 정책(Synchronization Policy)](./architecture.md#53-동기화-정책synchronization-policy)
6. [시험(Testing)](./testing.md) 6. [시험(Testing)](./testing.md)
1. [유닛 테스트(Unit test)](./testing.md#61-유닛-테스트unit-test) 1. [유닛 테스트(Unit test)](./testing.md#61-유닛-테스트unit-test)
2. [기능 테스트(Functional Test)](./testing.md#62-기능-테스트functional-test) 2. [기능 테스트(Functional Test)](./testing.md#62-기능-테스트functional-test)