실시간 공동 편집-어떻게 작동 작동?
문서를위한 거의 실시간 공동 편집 기능을 갖고 싶은 애플리케이션을 작성 중입니다 (Google 문서 스타일 편집과 매우 유사).
커서 위치를 추적하는 방법을 알고 있습니다. 간단합니다. 데이터베이스에 저장 될 수있는 현재 사용자 ID, 파일 이름, 줄 번호 및 행 번호로 서버를 0.5 초 또는 2 초마다 폴링하면 폴링 요청의 반환 값은 다른 사용자의 커서 위치입니다.
내가 어떻게 해야할지 모르겠다는 것은 커서를 버리지 않고 전체 재로드를 강제하지 않는 방식으로 문서를 업데이트하는 것입니다.
이것은 Google 크롬, 조치하게는 Firefox 작동해야합니다. 다른 브라우저를 지원할 필요가 없습니다.
여러 피어의 협업 편집을 병합하기 위해 백그라운드에서 사용되는 알고리즘을 운영 변환 이라고 합니다 . 그래도 구현하는 간단하지 않습니다.
유용한 링크 는 이 질문 을 참조하십시오 .
이를 위해 반드시 xmpp 또는 wave가 필요하지 않습니다. infinote라는 오픈 소스 구현에 대한 대부분의 작업은 이미 jinfinote ( https://github.com/sveith/jinfinote ) 로 완료되었습니다 . Jinfinote는 최근 동시성과 문서 상태를 중앙에서 처리하기 위해 Python ( https://github.com/phrearch/py-infinote )으로 포팅되었습니다 . 저는 현재 websockets 및 json 전송에 의존 하는 hwios 프로젝트 ( https://github.com/phrearch/hwios ) 내에서 둘 다 사용합니다 . 폴링을 사용하고 싶지는 않습니다. 또한 xmpp는 복잡하게 만드는 것입니다.
실시간 공동 편집에는 몇 가지 사항이 반드시 있어야합니다. 여기에있는 대부분의 다른 답변은 문제의 한만에 점점 더 맞습니다. 즉 분산 상태 (일명 공유 변경 가능 상태). OT (Operational Transformation), CRDT (Conflict-Free Replicated Data Types), 차동 동기화 및 기타 관련 기술은 거의 모든 실시간 분산 상태를 달성하기 위해 접근 방식입니다. 대부분의 경우 최종 일관성에 두어 각 참가자 상태의 일시적 차이를 허용하지만 편집이 결국 각 참가자 상태가 수렴합니다. 다른 기술에서는 여러 구현에 대해 언급했습니다.
그러나 변경 가능한 상태를 공유 한 후에는 합리적인 사용자 경험을 제공하기 위해 몇 가지 다른 기능이 있습니다. 다음과 같은 추가 개념이 있습니다.
- 확실한 : 당신이 함께 일하는 사람들은 누구인가.
- 현재 상태 : 현재 "여기"에서 편집중인 사람.
- 커뮤니케이션 : 사용자가 작업을 조정할 수있는 채팅, 오디오, 비디오 등
- Collaborative Cueing : 다른 참가자가 무엇을하고 또는하는지에 대한 표시를 제공하는 기능입니다.
공유 커서 및 선택 항목은 Collaborative Cueing (Collaboration Awareness)의 예입니다. 사용자가 다른 참가자의 의도와 가능한 다음 작업을 이해하는 데 도움이됩니다. 원래 포스터는 부분적으로 공유 된 변경 가능 상태와 협업 큐 상호 작용에 대해 질문했습니다. 이는 문서에서 커서 또는 선택의 위치가 일반적으로 문서 내의 위치를 통해 설명되기 때문에 중요합니다. 문제는 커서 (예 :)의 위치가 문서의 빨리에 따라 달라진다는 것입니다. 커서가 색인 37에 말하면 내가보고있는 문서의 37 번 문자를 의미합니다. 현재 가지고있는 문서는 편집 내용이나 다른 사용자의 편집 내용으로 인해 내 문서와 다를 수 있으므로 문서의 색인 37이 없을 수 있습니다.
따라서 커서 위치를 배포하는 데 사용하는 사용은 공유 변경이 가능합니다. 메시징의 과제 중 하나는 많은 OT / CRDT, 양방향 메시징, 채팅 및 기타 라이브러리가 통합되지 않은 격리 된 솔루션이라는 것입니다. 이로 인해 좋은 경험을 제공하는 최종 시스템을 구축하기가 어렵고 종종 개발자가 수행하는 사용자의 문제가 발생합니다.
효율적으로 효율적인 실시간 편집 시스템을 구현해야합니다. 그리고 우리는 역사, 권한, 응용 프로그램 수준 충돌 해결 및 기타 많은 이해에 대해 논의하지 않습니다. 사용 사례에 사례 방식으로 각 개념을 지원하는 기술을 구축하거나 찾아야합니다. 그런 다음 통합해야합니다.
좋은 소식은 공동 편집을 지원하는 응용 프로그램이 훨씬 더 인기를 많은 것입니다. 구축을 지원하는 기술이 성숙되고 매달 새로운 기술이 제공되고 있습니다. Firebase 는 이미 많은 개념을 사용하기 쉬운 API로 통합하려는 최초의 솔루션 중 하나였습니다. 새로 등장한 Convergence (전체 공개, 저는 Convergence Labs의 창립자)는 전체적으로 편집의 대부분을 지원하고 실시간 구축의 시간, 비용 및 비용을 크게 수있는 올인원 API를 제공합니다. 공동 편집 앱.
이 질문에 답하고 좀 더 신중한 것을 한 후, 확인하는 가장 좋은 독립형 애플리케이션 은 JS 브라우저 앱으로 실행되고 서버 측에서 Node.js를 사용하는 Etherpad 일 하기 생각합니다 . 이를 뒷받침하는 기술을 운영 혁신이라고 합니다.
Etherpad는 원래 Google에서 구입하여 Google Wave에 통합 된 상당히 무거운 애플리케이션 이었지만 실패했습니다. 이 코드는 오픈 소스로 구현 된 기술은 Etherpad Lite 용 Javascript로 재 작성되는 이름이 "Etherpad"로 변경되었습니다. 일부 Etherpad 기술은 아마도 Google 문서 도구에 통합 된 것입니다.
Etherpad 이후이 기술에는 다양한 버전이 있고 특히이를 웹 앱에 직접 통합 할 수있는 일부 Javascript 라이브러리가 있습니다.
저는 Meteor 앱에 실시간 편집기를 직접 추가하기위한 meteor-sharejs 패키지 의 관리자입니다. IMHO는 두 세계 모두에서 최고입니다 :)
Gintautas가 지적했듯이 이것은 Operational Transformation에 의해 수행됩니다. 내가 이해하는 것과 같이 사용하는 기능에 대부분의 연구 및 개발은 현재 없어진 Google Wave 프로젝트의 일부로 수행 할 수있는 Wave Protocol로 있습니다. 음성 Google Wave는 오픈 소스 http://code.google.com/p/wave-protocol/ 에서 좋은 코드 샘플을 얻을 수 있습니다 .
Google 문서 팀은 실시간 공동 작업이 어떻게 작동하는지에 대한 사례의 사례를 수행했지만 블로그 항목을 수 없습니다.
하지만 위키피디아 페이지에는 괜찮은 내용이 있습니다. : http://en.wikipedia.org/wiki/Collaborative_real-time_editor
나는 최근에 당신이 달성하려는 것의 실제 예제와 함께 저장소를 게시했습니다.
https://quill-sharedb-cursors.herokuapp.com
그것은 떨어져 기반으로 ShareDB 백엔드와 같은 (OT) 퀼 프론트 엔드 에 서식있는 텍스트 편집기입니다.
기본적으로 모든 커서를 그리는 코드 로이 를 연결합니다 . 코드는 이해하기 위해 특정 솔루션에 복사 할 수 있어야합니다.
노력에 도움이되기를 바랍니다.
참고 URL : https://stackoverflow.com/questions/5086699/real-time-collaborative-editing-how-does-it-work
'ProgramingTip' 카테고리의 다른 글
nonce를 만들고 사용하는 방법 (0) | 2020.11.28 |
---|---|
Java Generics-Bridge 방법? (0) | 2020.11.28 |
Java Primitives 범위 계산 (0) | 2020.11.28 |
applicationWillTerminate 언제 호출되고 호출되지 않을 때 (0) | 2020.11.28 |
모든 DOM 요소를 반복하는 가장 효율적인 방법? (0) | 2020.11.28 |