diff --git a/src/architecture.md b/src/architecture.md index 23c9f19..e8ab6ff 100644 --- a/src/architecture.md +++ b/src/architecture.md @@ -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번째로 조정하고 적용한다. \ No newline at end of file diff --git a/src/index.md b/src/index.md index d9a6a46..993626a 100644 --- a/src/index.md +++ b/src/index.md @@ -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) \ No newline at end of file