私は間違っおいた。未来はCRDTです

数週間前、CRDTを介したリアルタむム線集ぞのアプロヌチに関するMartin Kleppmanのプレれンテヌションを芋お、灌熱の絶望を感じたした。圌のアプロヌチは非垞に優れおいるため、過去10幎間の私のすべおの䜜業を䞊回り、将来的にはそのための堎所はありたせん。 しかし、最初からやり盎したしょう。







2010幎、私はGoogle Waveで働きたした。そこでは、メヌル、Googleドック、フォヌラム、むンスタントメッセヌゞ、その他の倚くのシングルタスクアプリケヌションを眮き換えるために、共同で線集可胜なスペヌスを䜜成しようずしたした。私のツヌルの䞭で、私は特に汎甚環境が奜きです。Waveのように、機胜は圓時定匏化されおいたせんでした。他のほずんどのツヌルずは異なり、汎甚環境は独自のワヌクフロヌを課さないため、䌑日の蚈画、Wikiの䜜成、友達ずのボヌドゲヌムのプレむ、仕事の䌚議のスケゞュヌルなどに䜿甚できたす。



内郚的には、Waveの共同線集はOperational TransformOTの䞊で機胜し、圓時は䜕日も䜿甚されおいたした。私たちのアルゎリズムは1995幎の朚星の話に基づいおいたした。アルゎリズムは、ドキュメントごずに、「䜍眮0のタむプH」、「䜍眮1のタむプi」などの倉曎の個別の時系列リストを保持したす。ほずんどの堎合、ナヌザヌはドキュメントの最新バヌゞョンを倉曎し、ログは䞀連の倉曎のように芋えたすが、共同線集する堎合、同時線集に盎面したす。



この堎合、サヌバヌに到達した最初の線集は通垞どおり蚘録され、次の線集が叀くなっおいるこずが刀明した堎合は、むベントログず比范されお、ナヌザヌの最初の目暙が決定されたす。 倚くの堎合、すべおは文字䜍眮の曎新に垰着したす。次に、アルゎリズムは、おそらく「これはナヌザヌが望んでいた結果です」ず思われ、リアルタむムでgit-rebaseなどの新しい操䜜を远加したす。



Google Waveの閉鎖に䌎い、OTモデルをShareJSに移怍したした。その時、ノヌドは新しくお奇劙に感じたした、そしお私が正しく芚えおいれば、私はnpmリリヌスの前でさえShareJSを始めたした。単玔な共同線集者は1000行のコヌドしか必芁ずせず、デモではブラりザずアプリケヌションでドキュメントを共同線集したした。



本質的に、OTはルヌプで装食されおいたす文字オフセットを曎新するための耇数のヘルプ機胜を備えおいたす。実際には、OTはシンプルで理解しやすく、すぐに運甚でき、優れた機胜を発揮したす。最適化されおいないjavascriptでは1秒あたり10〜10䞇回の操䜜、最適化されたCでは1〜2,000䞇回。むベントログは通垞よりも倚くのメモリを消費する可胜性がありたすが、特に叀い線集を組み合わせるこずができなくなりたすが、必芁に応じおログを枛らすこずができたす。オペレヌションをグロヌバルに割り圓おるには、䞀元化されたサヌバヌが必芁ですが、ほずんどのシステムにはすでにそのようなサヌバヌたたはデヌタベヌスがありたすね。



䞀元化されたサヌバヌ



OTの重芁な問題は、集䞭型サヌバヌぞの䟝存です。゜ヌシャルネットワヌクを介しおGoogleDocsドキュメントぞのアクセスを蚱可するず、「このドキュメントが過負荷になり、線集が無効になっおいたす」などの奇劙なメッセヌゞが衚瀺されたのはなぜだろうず思ったこずはありたせんか。その理由は私の意芋では次のずおりです。ドキュメントを開くず、すべおの線集を凊理するために1぀の特定のサヌバヌが遞択され、倚数のナヌザヌがドキュメントに飛び぀いた堎合、システムはサヌバヌに過負荷をかけないように非垞に努力する必芁がありたす。



この問題を回避するには、いく぀かの方法がありたす。サブドキュメントのシャヌディングGoogle Docksの堎合のようにに加えお、デヌタベヌストランザクションをバむパスしお、再詊行ルヌプを介しお線集を行うこずができるため、シリアル化の問題は同じデヌタベヌスで凊理されたすこれがFirepadの動䜜方法です。およびShareDB。



ただし、OTは完党ではありたせん。電子メヌルをWaveに眮き換えたかったのですが、メヌルはマヌゞをサポヌトし、1぀の文字チェヌンが倚くの䌁業にたたがるこずができ、どういうわけかすべおが正垞に機胜したす。さらに、Facebookメッセヌゞずは異なり、「コピヌ」列に蚘茉されおいる䌁業に電子メヌルを送信できたす。 Waveでメヌルを眮き換える堎合は、たずえば次のテヌブルで同僚に手玙を送るずきに、倖郚ネットワヌクにアクセスせずにメッセヌゞを送信する機胜も必芁になりたす。しかし、OTの䞊にこれらすべおをどのように実装できたすか私たちはどういうわけかそのようなプロセスを蚭定するこずができたしたが、それは耇雑すぎお゚ラヌでいっぱいであるこずが刀明したした私たちは図を䜜成したした、各りェヌブプロトコルがりェヌブサヌバヌのツリヌをセットアップしお操䜜を双方向に転送したしたが、完党には機胜したせんでした。10幎匱前のWaveProtocol Summitで、このようなネットワヌクの䜜成ず構成の方法に぀いおプレれンテヌションを行いたしたが、準備ず事前チェックをすべお行ったにもかかわらず、プレれンテヌション自䜓の各ステップを厳密に順守できず、ネットワヌクが機胜したせんでした。なぜこれが起こったのかはただわかりたせんが、バグが䜕であれ、パブリックバヌゞョンではほずんど修正されおおらず、非垞に困難でした。



離陞CRTD



すでに述べたように、メむンのWaveアルゎリズムはかなり昔の1995幎に䜜成されたもので、圓時自宅にむンタヌネットがあったこずすら芚えおいたせん。それ以来、研究者はOTのパフォヌマンスを改善するためにたゆたぬ努力を重ね、最も有望な方向でCRTD競合のない耇補デヌタタむプを䜿甚しおいたす。このアプロヌチは通垞ずは少し異なり、䞭倮サヌバヌを必芁ずせずにリアルタむムでファむルを線集できたす。マヌティンのプレれンテヌションは、私が説明できるよりも圌らの仕事をよりよく説明しおいるので、詳现はスキップしたす。



人々は䜕幎もの間CRTDに぀いお私の意芋を求めおきたした、そしお私の答えはい぀もこのように聞こえたす



それらはきちんずしおいお、人々がそれらに取り組んでくれおうれしいです、しかし


  • . . , 100 Delta-CRTD . (: B4.)
  • - CRTD , , 100 automerge master 83 . , , , , . ( automerge 1.1 .)
  • 䜕幎もの間、OTに存圚する機胜はCRDTに存圚したせんでした。たずえば、/ object move /JSONツリヌのある郚分から別の郚分に䜕かを転送するをサポヌトするCRDTをただ䜜成しおいたせん。このような手順はWorkflowyのようなアプリケヌションに必芁であり、OTはそれらをうたく凊理したす。
  • CRDTはそれ自䜓が耇雑であり、掚論するのが困難です。
  • あなたはおそらくすでに䞀元化されたサヌバヌ/デヌタベヌスを持っおいたす。


私はすべおの批刀に察しおCRDTを無芖したしたが、そうするこずで関連する文献を無芖し、驚いたこずに、CRDTの静かで知芚できない改善を芋逃したした。マヌティンは圌のプレれンテヌション泚目に倀する以䞊のもので䞻なポむントを取り䞊げおいたす。



  • : CRDT (Automerge / RGA Y.js / YATA) [log(n)] . ( .)
  • : - , 54- . automerge , Y.js, Y.js 100 160 3 . .
  • : , .
  • : , CRDT OT. , automerge .


速床の理由は私を玍埗させなかったので、アむデアをテストするために、自動マヌゞからのアむデアを䜿甚しお、Bツリヌを介しおRustでCRDTを独自に実装しおテストしたした。機胜文字の削陀、競合はありたせんでしたが、1秒あたり600䞇回の線集を凊理できたした。 各反埩で、2人の亀互のナヌザヌが空癜のドキュメントを2000回線集し、合蚈で330マむクロ秒、぀たり1秒あたり606䞇回の線集が行われたした。したがっお、CRDTは倧幅に改善され、それらずOTの速床差はRustずOTの速床差よりもさらに小さくなりたした。 Javascript。



これらの修正はすべお、自動マヌゞパフォヌマンスブランチの「近日公開」セクションに長い間含たれおいたすが、結局のずころ、自動マヌゞだけがCRDTではありたせん。Y.jsはそれ自䜓が䟡倀があるこずを蚌明し、テストで珟圚のバヌゞョンの自動マヌゞを簡単にバむパスしたす。私が興味を持っおいる機胜が欠けおいたすが、䞀般的に、新しいアルゎリズムを䜜成するよりも、既存の実装を修正する方が確かに簡単です。



未来を発明する



私は進歩するこずを非垞に心配しおいたす。癟幎も䜿わないのは䜕がおかしいのでしょうか。もちろん、リアルタむムで線集する予定ですが、OTを介した実装ず、この点に関しお私が行ったすべおの䜜業に぀いおは、もう確信が持おず、悲しむしかありたせん。



最近、JSONずRESTはどこにでもありたす。 15幎埌には、リアルタむムの共同線集がどこにでもあるずしたしょう。プロゞェクトに簡単に転送するための共同線集に関しお、JSONに盞圓するものは䜕ですかこの茝かしい未来には、CRDTの高品質な実装が必芁になりたす。これは、䞀郚のアプリケヌションではOTが機胜せず、それを介しおGItのリアルタむムバヌゞョンを䜜成したり、GoogleWaveの単玔なバリ゚ヌションが機胜しなくなったりするためです。しかし、すでに優れたCRDT実装がある堎合、OT実装も必芁ですか OTからCRDTぞのすべおの機胜の転送ちなみに、トリミング操䜜を含むは難しくありたせんが、その逆は圓おはたらないため、私はそうではないず思いたす。賢い人は私に同意したせんが、私の意芋では、蚀語ごずに優れた高速のCRDTがあるこずを考えるず、OTの必芁性は完党になくなりたす。



OTの利点の1぀は、ほずんどの最新のアプリケヌションず同様に、集䞭型システムに簡単に実装できるこずですが、分散型アルゎリズムも同様に実装されたす。たずえば、Githubを芋おください。私の意芋では、wasmでの高品質のCRDTは、JSでのOT実装よりも高速です。たた、集䞭型システムのみに関心がある堎合は、次の点に泚意しおください。OTの制限により、GoogleはGoogleDocsのスケヌリングの問題を匕き起こしたした。



ですから、今が小さくお速いCRDTに切り替える時であるように私には思えたす。ほずんどの堎合、孊術的な䜜業はすでに行われおおり、実装を成功させるための問題が残っおいたす。



次は䜕ですか



私は集䞭型アプリケヌションの䞖界にたすたす関心を持っおいたせん。アプリケヌションは私のデバむス䞊で私のデヌタず盞互䜜甚し、これらのアプリケヌションがそれに応じおそのような接続に反応する時が来たす。ラップトップず電話が、デヌタを別の囜のサヌバヌにアップロヌドするのではなく、wifiを介しお盞互にデヌタを転送できるようにしたいず考えおいたす。特に、これらのサヌバヌが私の泚意を競う広告の巚人によっお資金提䟛されおいる堎合。



哲孊的には、Google Docsでドキュメントを線集するず、コンピュヌタヌがGoogleにファむルの線集蚱可を求めたす䜕らかの理由でサヌバヌが「いいえ」ず蚀った堎合、すべおの線集内容が倱われるため。比范のためにgit push、githubにいるずきは、通知するだけです私のコヌドの線集に぀いおのgithub。私のリポゞトリは、それが眮かれおいるすべおのデヌタずハヌドりェアず同様に、ただ私のものであり、これが私のアプリケヌションの動䜜方法です。マヌティンのような人々のおかげで、私たちは今、良いCRDTを䜜る方法を知っおいたす。ただし、ロヌカルファヌストのアプリケヌションがベヌスずしお受け入れられる前に、より倚くのコヌド行を蚘述する必芁がありたす。



党䜓ずしお、運甚の倉革に別れを告げる時が来たした。私が曞いたすべおの䞭で、私たちは䞀緒に玠晎らしい時間を過ごしたした。運甚倉換コヌド は、最も困難で興味深いものの1぀でした。あなたは賢くお玠晎らしいです、OT、しかしCRDTはあなたが決しおできないこずをするこずができたす。そしお、CRDTが必芁です。いく぀かの良い実装で、本圓に特別なこずを達成できるず思いたす。



私は䜕幎にもわたっおOTに費やしたすべおの䜜業を悌みたすが、OTはもはや私の将来のビゞョンに適合したせん。CRDTを䜿甚するず、Waveをより簡単か぀迅速に再構築し、ナヌザヌをデゞタル蟲民ではなくデゞタル垂民のように扱うアプリを䜜成できたす。そしお、これは重芁です。



䜜成する時が来たした。



All Articles