ステロむドの聖杯Swarm.jsの完党同期ず同圢JavaScript

今日、Habréでは、耇補されたモデルのテクノロゞヌを玹介したす。これにより、ロヌカルデスクトップアプリケヌションず同じくらい簡単に、コラボレヌションおよびリアルタむムのWebアプリケヌションを䜜成できたす。 アプリケヌションを開発するずき、リアルタむムのデヌタ同期は、TCPストリヌム、HTTPリク゚スト、たたは゜ケットからの電流ず同じ方法で、即座に、そしお間違いなく利甚できるはずだず考えおいたす。 Swarmで蚘述されたHTML5アプリケヌションは、自埋性、ロヌカリティ、ダりンロヌド速床の点で、ネむティブのものより劣りたせん。

Swarmラむブラリを䜿甚するず、1か月間にSwarmを䜿甚しなかった堎合よりも週末に倚くのこずができたす。 さらに重芁なこずは、それなしではできなかったこずを実行できるこずです。 この同期ラむブラリは無料で提䟛しおいたす。







本日、Swarm + Reactで 蚘述された反応性HolyGrail -on-steroidsアプリケヌションであるTodoMVC ++を投皿したす。 以䞋は、アプリケヌションで瀺されおいる機胜のリストです。





䞀般に、アプリケヌションは、単玔なロヌカルMVCアプリケヌションずしお、ネットワヌクぞの参照なしで蚘述されたす。 同期ずキャッシングはSwarmラむブラリレベルで完党に行われ、アプリケヌションはモデルのロヌカルバックボヌンのようなオブゞェクトで動䜜したす。



そのため、ここにアプリケヌション自䜓がありたす ppyr.us。

コヌドは次のずおりです。github.com / gritzko / todomvc-swarm



アプリケヌションずラむブラリの詳现な分析は次の資料にありたすが、珟圚、レプリカ、CRDT、および理論的根拠に関する倚くの手玙がありたす。



珟圚、クラむアントずサヌバヌの䞡方で同期が匷く求められおいたす。 むンタヌネット倧手のサヌバヌ゚コノミヌでは、同期を必芁ずするさたざたなストレヌゞずデヌタ凊理ツヌルがたすたす増えおいたす。 真実の源ずしおの1぀の倧きなデヌタベヌスの原則は、拡匵が困難です。 しかし、私たちは䞻にクラむアントに぀いお話しおいる。 今日、䞀般ナヌザヌは倚くのデバむスを持っおいたす。 ノヌトパ゜コンの画面に衚瀺されるデヌタがiPhoneの画面に衚瀺されるデヌタず䞀臎しない堎合、ナヌザヌは動揺したす。 レプリカの同期はどこでも必芁であり、デヌタ同期システムSDはすぐにデヌタベヌスず同じ消費財になるず考えおいたす。



珟圚の詳现は、業界のリヌダヌでさえ、同期の決定を「䜜業の皮類」段階たでしか完了しおいないこずです。 GDocsはオフラむンではたったく機胜せず、GTalkずSkypeは䜓系的にチャット履歎からレプリカを倱いたす。Evernoteはさたざたなバグで有名です。 そしお、これらはリヌダヌです。 䞀般に、同期の問題は驚くほど耇雑で倚面的です。 Evernoteをお詊しください。 Evernoteがロヌカルアプリケヌションの堎合、孊生は80/20サブセットを䜜成できたす。 圌がMySQLずPHPを持っおいるように、Zuckerbergはfacebookを曞きたした。



同期の基本的な耇雑さは䜕ですか 叀兞的な耇補および同期テクノロゞヌの仕組み、レプリカIDのサポヌト方法を理解したしょう。 最も簡単な方法は、すべおをセンタヌで行うこずです。 すべおの曞き蟌み操䜜は䞭倮のデヌタベヌスに集たり、読み取り操䜜の新しい結果はセンタヌから戻りたす。 信頌性が高くシンプルなように芋えたすが、すぐに3぀の偎面から困難に近づき始めたす。

  1. 同時実行性-前の操䜜に察する答えがオンになっおいる間、クラむアントは別のこずを䜕ずかしお、それをどのように組み合わせるかはもはや明確ではありたせんが、
  2. すべおの操䜜が1぀のポむントを経由するスキヌムのスケヌリング
  3. センタヌが顧客に応答しないか、応答が遅い堎合、むンタヌネットが䞍十分な状態で機胜する。




このスキヌムをスケヌリングする最初の兞型的なステップは、 兞型的な デヌタベヌスに 実装されおいるマスタヌスレヌブ耇補です。 マスタヌは操䜜を線圢ログに入れ、このログをスレヌブに配垃し、スレヌブは同じ線圢順序でデヌタレプリカに適甚し、同じ結果を取埗したす。 これは読み取り倀のスケヌリングに圹立ちたすが、最終的な敎合性芁玠を远加したす。 スレヌブは若干の遅れを䌎っお曎新されたす。 蚘録の問題は残りたす-すべおの蚘録は同じセンタヌを通過したす。 線圢化は、 PaxosやRaftなどのコンセンサスアルゎリズムを䜿甚しお分散レプリカに拡匵できたすが、線圢化は「リヌダヌ」、぀たり すべお同じセンタヌ。 センタヌが閉じられるず、氎平方向に拡倧し始めたす-ベヌスを「砎片」に切断したす。 ここで、線圢化ずACID党䜓が、千の小さなACIDに匕き裂かれたす。



たあ、オフラむン䜜業では、センタヌず線圢化の互換性がありたせん。 もちろん、オフラむンは「もうすぐではない」ず蚀うこずができたすが、実際には、オフラむンは定期的に発生したす。 私たちがツむヌトしたり、䜕かが奜きなら、これは容認できたすし、䜕かがより深刻な堎合、それはほずんどありたせん。 たずえば、りェむタヌが電線を蹎り、むンタヌネットが消えた堎合、管理者がラむトを点滅させお車で到着するたで顧客をレストランから远い出すこずはできず、無料でサヌビスを提䟛するこずもできたせん IIKO共同蚭立者のMax Nalskyの䟋。



さらに、サヌバヌ偎でのこれらの冒険はすべおクラむアント偎に圱響したせん。 クラむアントは、サヌバヌが互いに同意し、結果を報告するたで単に埅機したす。 悪名高いプロゞェクトで、 Meteorはリアルタむムでクラむアントの同期を詊み、実際にMongoDBをクラむアントにキャッシュしたした。 すべおを鮮明に機胜させるために、サヌバヌの応答を埅぀こずは「レむテンシヌ補正」のトリックによっお隠されおいたした。 クラむアントは操䜜をキャッシュにロヌルしおサヌバヌに送信し、サヌバヌは正垞に適甚されたかどうかを確認し、適甚されおいない堎合はパッチを送信したす。 このアプロヌチは疑わしい以䞊のものです。 「-ルシャ、車をガレヌゞに入れたしたか」 「はい、郚分的に」



ここに、線圢化を䌎うこのような耇雑な話がありたす。 さお、より興味深いのは、線圢化のスコアが付けられおいる䞀般的な゜リュヌションを調べるこずです。 GitずCouchDBの2぀の良い䟋がありたす。 GitはLinus Torvaldsによっお曞かれたした。LinusTorvaldsはLinux開発者の䞭でたさに「䞭心」でした。 これがおそらく圌が䞭心がゆっくりであり、䞭心が拡倧瞮小しないず非垞に感じた理由です。 gitでは、マスタヌずマスタヌの原則に基づいお同期が行われたす。 デヌタはバヌゞョンのダむグラフずしお衚瀺され、すべおの䞊列バヌゞョンはい぀かマヌゞする必芁がありたす。 スケヌリング-完璧、オフラむン-問題ありたせん。 CouchDBでもほが同じです。 クラむアントにCouchDBのようなロゞックをもたらす詊みがありたす-pouchdbずhood.ie。



この分野で完党に新しいものはCRDTであり、今日私たちはそれに぀いお話しおいる、長い導入に぀いおすみたせん。 CRDTは、収束/可換/クラりドレプリケヌトデヌタ型です。 CRDTの䞀般的な考え方は、線圢化の代わりに半順序を䜿甚するこずです。 操䜜は倚くのレプリカで䞊行しお実行でき、䞀郚の操䜜は競争力がありたす。 異なるレプリカで発生し、お互いを知らず、そのうちの1぀が「最初」ではなく、異なるレプリカで異なる順序で適甚されたす。 䜿甚されるデヌタ構造が、因果関係に違反しない操䜜のこのような簡単な䞊べ替えに耐えるこずができる堎合、センタヌに関連するすべおの問題は単玔に解消されたす。



もう1぀の質問は、CRDTデヌタ構造がいく぀あるかずいうこずです。 結局のずころ、コンピュヌティング消費財党䜓-倉数、配列、連想配列-は、CRDTの圢で非垞に実珟可胜です。 そしお、お金を数えるず 次に、線圢化ずACIDの保蚌がたさに必芁ですか 残念ながら、新しいものは忘れられた叀いものであるこずが刀明したした。 䌚蚈で䜿甚されるデヌタ構造-勘定、残高-は非垞にCRDTであるこずがわかりたした。 確かに、ルネサンス期に䌚蚈の䌝統が圢成されたずき、むンタヌネットは存圚しなかったため、線圢化なしで抜け出したした。



CRDTの玠晎らしい攟射機胜は、センタヌに接続されおいなくおも完党に機胜するラむブレプリカです。 たあ、センタヌに走るこずなく、すべおの操䜜の即時適甚。 このような自埋性ず速床は、2぀の堎合に特に関連したす。 たず、モバむルデバむス甚-信頌性の䜎いむンタヌネットで、倖出先で䜿甚されたす。 CRDTを䜿甚するず、将来の䜿甚に備えおデヌタを保存し、バックグラりンドで同期しおロヌカルで静かに䜜業できたす。 第二に、特にリアルタむムでのコラボレヌション機胜を備えたアプリケヌションの堎合Google Docs、Apple iCloudに぀いお考えたす。 このようなアプリケヌションでは、「状態」は倧きく、急速に倉化したす。サヌバヌぞの実行ずその逆は、coの䞭の釘です。



デヌタをオフラむンで操䜜できる非CRDTテクノロゞヌがありたす。 Dropboxはその同期APIを提䟛したす。StrongLoop 、 Firebaseなど、などがありたす。 これらのすべおの゜リュヌションは、Last-Write-WinsLWWの原則に基づいお動䜜したす。各レコヌドにはタむムスタンプが割り圓おられ、倧きなマヌクを持぀レコヌドは前のレコヌドをミルしたす。 Cassandraは同じ原理に基づいおいたす。 そしお、私たちのSwarmラむブラリで、最も䞀般的なプリミティブはLWWオブゞェクトです。 Swarmの利点は、LWWで解決できないデヌタ構造です。 たずえば、線集䞭のテキスト。



䞀般に、分散システムのLooking Glassでは、逆のこずが圓おはたりたす。 通垞のプログラミング蚀語では、最も単玔な操䜜は倉数の増分++です。 配列の操䜜は少し難しく、オブゞェクトず連想コレクションはさらに耇雑です。 分散システムでは、すべおが正反察です LWWオブゞェクトず連想コンテナは特に耇雑ではありたせん。 線圢構造配列、テキストは非垞に耇雑で、カりンタヌは非垞に耇雑です。 これは、LWWオブゞェクトが最初に行われたCassandraの䟋で芋るこずができ、カりンタヌは、そのたたで、ただ完了しおいたす。







ポむントに到達したす。 ラむブラリの動䜜を瀺すために、Swarm + ReactでTodoMVCを䜜成するこずにしたした。 実際、Swarm + Reactの最初のTodoMVCは7月にAndrei Poppによっお1日以内に曞かれたしたが、そのコヌドは「 むディオマティック 」ではありたせんでした。 今回は、線圢コレクション Vector 、サヌバヌレンダリング、たくさんのグッズを远加したした。 さらに、通垞のTodoMVCは少し退屈で圹に立たないように思えたした。 たずえば、React + flux TodoMVCを芋るず、著者が単玔なアプリケヌションでこれらすべおのトリックをだたしおいる理由を理解するこずは非垞に困難です。 したがっお、1぀の機胜-再垰性を远加したした。 Tabキヌを抌すず、ナヌザヌはネストされた「子」リストに移動したす。 たた、むンタヌフェむスをリアルタむム同期に適合させたした。 そのようなアプリケヌションは、すでに少なくずもいく぀かの実際的な利点を衚しおいたす。 たた、ナヌザヌ間で簡単に共有できるように、URLにアプリケヌションのステヌタスを衚瀺し始めたした。 䞀般的に、止めるこずは困難でした。 過去のリアルタむムプロゞェクトの開発ず比范しお、Swarmの人にはある皮の剣の宝庫があり、い぀も他の人を噛むために手がかゆいものがありたした。



アプリケヌションずラむブラリの詳现な分析は、次の資料にありたす。



@swarm_jsプロゞェクトtwitterのアップデヌトをフォロヌしおください。



All Articles