동기화
bae의 동기화는 coven의 동기화입니다. bae가 table과 blob을 선언하면 coven이 나머지를 합니다. 이 페이지는 bae에 적용되는 동작을 설명합니다. coven 자체 문서는 각 부분을 더 깊게 다룹니다.
coven은 SQLite 연결을 소유하므로 bae가 커밋하는 모든 write는 coven을 통과합니다. 동기화 table을 바꾸는 transaction이 커밋되면, coven은 같은 transaction 안에서 각 row 변경을 그것이 건드린 column과 함께 기록합니다. 그래서 앱이 직후에 비정상 종료되더라도 커밋된 변경은 사라지지 않습니다. diffing도 dirty flag도 없습니다. 캡처는 연결의 속성이므로 write를 놓칠 수 없습니다. 변경은 기기에서 기다리다가 보낼 때에만 암호화되고 서명되므로, 쓰기에는 키도 네트워크도 필요 없습니다.
클라우드 홈에 있는 라이브러리의 전체 기록은 번호 매겨진 객체들의 하나의 순서입니다. 각 객체는 한 기기의 변경 묶음, 관리 항목, 한 구성원에게 봉인된 키, 또는 snapshot 공지 중 하나입니다. 모든 기기가 이를 차례대로 적용하고 하나도 건너뛰지 않으므로, 무엇이 언제 일어났는지에 대해 모든 기기의 판단이 같습니다. 기기는 앞선 것을 모두 적용한 뒤에만 다음 객체를 추가합니다.
동기화 패스는 기기가 마지막으로 적용한 객체부터 빠진 객체가 나올 때까지 앞으로 읽고, 각 객체의 서명을 확인해 적용하고, 이 기기의 대기 중인 변경을 새 객체 하나로 보낸 뒤, 새 상태가 요구하는 작업을 합니다. 접근 공유나 해제, snapshot 생성, 오래된 기록 삭제입니다. 조용한 라이브러리에 대한 패스는 크기와 관계없이 요청 두 번이면 됩니다.
패스는 로컬 변경 뒤, idle timer, 그리고 지금 동기화 즉시 실행으로 동작합니다. 실패는 하나의 backoff 일정으로 재시도되며, 진행할 수 없는 것은 무엇을 기다리는지 밝히고 bae는 이를 동기화 상태 줄에 표시합니다.
두 기기가 떨어져 있는 동안 같은 라이브러리를 편집하는 것은 예외가 아니라 일반적인 경우입니다. 변경이 만날 때:
- 서로 다른 row 또는 서로 다른 column 편집은 둘 다 적용됩니다. 노트북에서 릴리스의 year를 고치고 데스크톱에서 label을 고치면 둘 다 남습니다.
- 같은 row의 같은 column 편집은 타임스탬프로 순서가 정해집니다. 나중 편집이 모든 기기에서 결정적으로 똑같이 이깁니다.
- 삭제는 동시 편집을 이깁니다. 이후 삭제된 row에 대한 편집은 언제 도착하든 지므로, 한 기기에서 삭제한 릴리스는 같은 간격에 다른 기기에서 편집됐더라도 삭제된 상태로 남습니다.
coven은 교체된 값을 잃어버린 값으로 보관합니다. bae는 이를 표시하지도 버리지도 않으므로 conflict UI가 없습니다. 어떤 도착 순서에서도 모든 기기는 같은 결과로 모입니다.
스냅샷
이 섹션으로 연결참가하거나 복원하는 기기는 기록을 처음부터 재생하지 않습니다. 기기들은 snapshot, 즉 순서의 한 지점에서 라이브러리의 전체 상태를 만들고, 라이브러리와 모든 비공개 서클에 snapshot이 생기면 그 이전 기록은 삭제됩니다. 새 기기는 최신 snapshot을 불러온 뒤 그 이후에 온 것만 적용합니다. 보관된 기록보다 오래 떨어져 있던 기기도 같은 방식을 쓰며, 보내지 않은 편집은 그대로 유지합니다.
스키마 버전
이 섹션으로 연결bae의 스키마는 하나의 마이그레이션이며, 기기가 보내는 모든 변경은 만들어진 스키마 버전을 기록합니다. 자기보다 새 스키마의 변경에 닿은 기기는 거기서 멈추고, 앱이 업데이트될 때까지 그 뒤의 것은 아무것도 적용하지 않습니다. 아무것도 잃지 않고 잘못 적용되지도 않습니다.
스키마 버전보다 큰 단위가 호환성 시대입니다. 각 바이너리에 포함된 고정 coven 리비전입니다. 두 빌드는 같은 시대 안에서만 동기화합니다. coven 전송 형식의 호환성 파괴는 새 시대이며 모든 앱의 주 버전 증가입니다. 1.0 전에는 모든 빌드가 시대 0이고 형식은 마이그레이션 없이 바뀝니다.
제공자가 보는 것
이 섹션으로 연결제공자는 암호화된 변경, snapshot, 구성원 레코드, 파일을 저장합니다. 객체 수와 크기, 시점, 각 객체를 쓴 계정을 볼 수 있지만 내용은 읽을 수 없습니다. 기기가 가져오는 모든 객체는 데이터베이스에 닿기 전에 서명과 구성원 자격을 검증합니다. 저장소는 신뢰할 수 없는 수동 우편함입니다. 암호화와 신원과 구성원을 보세요.