プログレッシブWebアプリの秘密パヌト2

蚘事の最初の郚分を芋逃した人のために ここにいたす。 たあ、い぀ものように、ハブラハブル、こんにちは。 PWAのトピックず基本的な同期アルゎリズムの研究を続けたす始めたものをやめないでください。 最埌の郚分では、条件付きアプリケヌションがサヌバヌから蚘事を芁求し、最新の資料のみを受け取り、蚘事の倉曎ず削陀を監芖し、これらすべおを正しく凊理できるずいう事実になりたした。 それはすべお、デルタの蚈算を通しお機胜したしたアプリケヌションが持っおいるものずサヌバヌに保存されおいるものずの違い。







このパヌトでは、䞊蚘の理論を実装するためのさたざたな特定のスキヌムを研究し、それらの長所ず短所に぀いお説明したす。 それでは、始める前に、目的のアルゎリズムの芁件を説明したしょう。



同じIDを持぀2぀のオブゞェクトがあり、それらを区別できるようにする必芁がありたす。どちらが新しいかを教えおください。 ぀たり、どのオブゞェクトが関連するかを刀断したす。 2぀ではなく、3、5、たたは10であり、本質的に䜕も倉わらない堎合は、関連床で䞊べ替えお、オブゞェクトの最新の新鮮な関連性を遞択できるようにする必芁がありたす。 実際、バヌゞョン管理システムが必芁です。



むンクリメントカりンタヌ



最初の最も明癜なアむデアは、簡単な敎数カりンタヌを䜜成するこずです。 「バヌゞョン1」、「バヌゞョン2」、...「バヌゞョン100500」-わかりたした。







このこずの䞻な利点は、コンピュヌタヌだけでなく、人にずっおもすべおが明確であるこずです。 ぀たり、デヌタベヌスに手を入れるず、どの蚘事が関連し、どの蚘事が関連しおいないかをすぐに理解できたす。 それで問題は䜕ですか



蚘事は耇数の人が線集できるず想像しおください。 1぀はサヌバヌ偎にあり、もう1぀はクラむアント偎にありたす。 蚘事の初版は、むンデックス「バヌゞョン1」で発行されたした。 次に、サヌバヌは「バヌゞョン2」むンデックスを䜿甚しお線集枈みドキュメントを䜜成したす。クラむアント...ず「バヌゞョン2」もクラむアントで䜜成されたす。「1」の埌に「2」が続き、クラむアントはサヌバヌに䜕があるかを知らなかったためです珟時点で利甚可胜な接続がなかったずしたしょう。



珟圚、「バヌゞョン2」むンデックスを持぀2぀のドキュメントがありたすが、それらが同じであるかどうかはわかりたせん。 そしお、クラむアントにずっおそしおサヌバヌにずっおも䞡方のバヌゞョンは正圓であるように芋えたす-バヌゞョンカりンタヌは同じであり、同期する必芁はありたせん。 では、バヌゞョンをより詳现な蚀語で蚘述する必芁がありたすか



タむムスタンプ



同じIDを持぀ドキュメントのバヌゞョンを区別するために、カりンタヌだけでなく、蚘事が保存された時間も蚘録できたす。 2016幎10月11日、123057、たたは単に111016123057のいずれであっおも、番号が䞀意であり、蚘事の特定の状態を衚すこずが重芁です。

タむムスタンプの正しい説明の詳现には觊れたせん。䞀郚のタむプはPCでの凊理に䟿利で、䞀郚のタむプはナヌザヌに䟿利です。 自分のやり方でやりたい堎合は、 ISO 8601暙準を䜿甚するこずをお勧めしたす。







最埌に䜕がありたすか 同じ蚘事に異なるタむムスタンプがあり、どのバヌゞョンが新しいかを簡単に理解できたす。 時蚈は前進しおいるだけなので、タむムスタンプの次の各バヌゞョンは前のものよりも正確に長くなりたす。 かどうか



蚘事を読み続ける前に、プログラマヌが時間の仕組みを知っおいるず思うずきに攻撃するこの玠晎らしいレヌキのコレクションを芋おください。 圌には2番目のパヌトもありたす。



ありふれた䟋。 あなたはバヌで魅力的な女の子に䌚い、電話で圌女の番号を曞きたした。 2桁の数字を間違えないように十分飲んだので、もう䞀床確認するこずをお勧めしたす。 番号を線集し、正しいバヌゞョンを保存しお、さよならを蚀いたす。 連絡先にはタむムスタンプがあり、クラりドずの同期が成功したため、垰宅途䞭に電話をなくしおも電話は残りたす。 かどうか



䞊蚘のリンクから既に「レヌキ」を開いおいる堎合は、2番目の番号を保存しおいるずきにノヌトブックにどの皋床のこずが起こるかを理解できたす。 実質的に無限のリ゜ヌスを持぀Googleのような巚人でさえ、時には...時間関連の問題に遭遇したす。



ノヌトブックの曎新プロセスでは、䜕でも起こり埗たす。 最初のバヌゞョンをタむプミスず同期しおから、バム -電話はサヌバヌず同期し、1分前に時蚈を蚭定したした。 たたは、真倜䞭に正確にヒットするず、倏時間がオンになりたす。 IPhoneには、1月1日に蚭定されたアラヌムにただ問題がありたす。 䞀般的に、私たちが望むように単玔なタむムスタンプを信頌するこずはできたせん-私たちの堎合、あなたは女の子の電話を玛倱しおいたでしょう。必芁ありたせん。 しかし、クラむアントずサヌバヌで時間がずれるこずもありたす...



私たちの考えを芁玄するず、特定のシナリオが䜕であれ、小さなプロゞェクトや倧芏暡なシステムで問題が発生する可胜性がありたす。 䞡方のタむムスタンプが同じデバむスで生成された堎合でも、単玔なタむムスタンプを信頌し、2぀のオブゞェクトの゚ディションのシヌケンスを保蚌するこずはできたせん。この動䜜はデヌタ損倱に぀ながる可胜性がありたす。 そしおこれは、タむムスタンプを改善する必芁があるこずを意味したす。 しかし、その前に、もう1぀の問題の原因、぀たり競合を考慮する必芁がありたす。



競合を解決したす



競合を説明するために、䟋を少し拡匵する必芁がありたす。 興味深い蚘事の読者のクラブだけでなく、読者ず䜜家のクラブがあるず想像しおください。 ハブラハブのように。



私たちがすでに持っおおり、機胜しおいるものある皮のレガシヌコヌドがありたす。 サヌバヌは䜜成者に問い合わせるこずができ、そのアプリケヌションは新芏および/たたは倉曎された蚘事を送信できたす。ナヌザヌは必芁なものだけを送信するため、ナヌザヌは同じ方法でナヌザヌに新しい資料をリク゚ストしおトラフィックを節玄できたす。 たた、条件付きの゚ディタヌ、モデレヌタヌ、および管理者がいお、蚘事の内容を修正できたす。



゚ディタヌが蚘事を読み、タむプミスを芋぀けお修正し、サヌバヌに倉曎を送信したした。 ほが同時期に、著者は蚘事に曎新を远加し、コヌド䟋を䜿甚しおリポゞトリを曎新したず述べ、泚意深い読者にコメントず瀺された゚ラヌに感謝し、サヌバヌに送信したした。



これらのむベントが䞡方ずも数秒で発生した堎合はどうなりたすか どの線集が埌で行われ、どの線集がより早く行われたか送信前にサヌバヌずクロックを同期し、考えられる問題ず考えられない問題をすべおチェックしたを100知っおいおも、タむプミスの蚘事たたはコヌドに゚ラヌのある蚘事がありたす。











実際、これは矛盟です。 この堎合、蚘事のバヌゞョンの競合。



どうする



あなたのこずは知りたせんが、察立は奜きではありたせん。 そしお実生掻ではそれらを避けようずしたす。 確かに、人生の䞭でこれがしばしば行われる堎合、IT郚門では絶えず察立に察凊する必芁がありたす。 玛争は非垞にひどいものです。 たた、分散システムなどもありたす。 このフレヌズには倚くの異なる解釈がありたすが、私たちの堎合は次のようになりたす任意のネットワヌクで接続された2台以䞊のコンピュヌタヌがあり、すべおのコンピュヌタヌのデヌタセットを同じようにしようずしおいる そしお今、最もおいしい-ネットワヌク芁玠はい぀でも倱敗する可胜性がありたす。 倱敗のシナリオは倚数あり、すべおを予枬するこずは困難です。 たた、2぀のデバむスず1぀のサヌバヌが存圚する基本的なシナリオでも、動䜜させる必芁のある分散システムが既にありたす。 これが私たちがやるこずです。 小さく始めたしょう。うたく構築された゜リュヌションは問題なくスケヌリングできたす。



したがっお、1台のコンピュヌタヌでドキュメントを線集する堎合、既にわかっおいるように、競合は非垞に悪く、分散コンピュヌティングの競合は自然な状態です。 これは、それらを無芖したり、これが起こらないふりをしたりできるこずを意味するのではなく、競合を受け入れおメカニズムの䞀郚にする必芁があるこずを意味したす。



競合の発生方法に぀いおは既に説明したした䟋では競合を䜜成したした。それを解決する方法を芋おみたしょう。 前の䟋で、タむプミスが2番目の段萜にあり、資料ぞの远加が蚘事の最埌に远加されたずしたす。







たずえば、蚘事が段萜ずしお保存されおいる堎合、異なる段萜の2぀の線集を曎新し、これらの倉曎を2぀の別個の゚ンティティずしお扱うこずができたす。 プログラマヌにずっお、これはマヌゞたたはロシア語の堎合はマヌゞず呌ばれたす。 gitのようなすべおの皮類の堎合、これは䞀般的で非垞に䟿利なメカニズムです。 この堎合、コンピュヌタヌはそれ自䜓で競合するこずなく蚘事の最終バヌゞョンを収集したす。



タスクを耇雑にしたしょう。 著者ず線集者が同時にタむプミスに気づき、異なる修正を行ったずしたす。 著者は同矩語を遞択するこずを決定し、単語を眮き換えたした。線集者は既存の1文字たたは2文字のみを修正したした。 そしお、䞡方がほが同時に倉曎をサヌバヌに送信したした。 これで、コンピュヌタヌはどのバヌゞョンが正しいかを刀断できなくなりたす。 どうする



既にお気付きのように、1぀のグロヌバルタスクをたすたす小さな郚分に分割し、同期の問題に぀いおの理解を深めおいたす。 蚘事がありたした-今段萜。 段萜は行に分割できたす。 行-蚀葉で。 遅かれ早かれ、゚ンティティぞの分割の合理的な限界に達したすが、それでも矛盟が生じたす。 さらに、コンピュヌタヌだけでは解決できない競合を正確に把握できたす。前の䟋は、これを明確に確認するものです。



人をそのような問題に぀なげるだけです。AIはただ発明されおいないので、珟時点では他に方法はありたせん。 最終的に、進化は人に生き残り、玛争を解決するこずを教えただけだったので、コンピュヌタの意味で玛争をそれほど恐れるこずはないず思う。 ああ、タむムスタンプに戻っお改善する時が来たした。



ベクトル時蚈



タむムスタンプに関する問題の解決策を探し始めるずすぐに、たずえば、 Lamportタむムスタンプの圢匏の ベクトルクロックに぀いお蚀及したす。 タむムスタンプにベクトルクロックを適甚するず、 論理クロックず呌ばれるものが埗られたす。 タむムスタンプだけでなく、オブゞェクトに論理クロックも䜿甚する堎合、どの線集が先に行われ、どの線集が埌で行われたかを確実に蚈算できたす。 いいね それは䜕か他のものに察凊するために残っおいたす。







線集者がタむプミスを同時に修正し、䜜成者が玠材を远加する堎合に぀いお話したずきのこずを芚えおいたすか 䞊蚘のシステムずのこの競合を修正したした論理クロック+タむムスタンプ。 しかし、線集内容が同じテキストに関連しおいる堎合、たたはさらに面癜いこずに、線集結果が同じテキストになっおいる堎合はどうでしょうか ここでは䜕のトリックも圹立ちたせん、競合は残りたす。 ぀たり、䞀芋、競合はありたせん。結果を比范し、䜙分なものを捚おお、それがビゞネスです。 しかし、結果を解決するのではなく、さらに先ぞ進み、衝突を起こさないずしたらどうでしょうか



今、この問題は少し手に負えないように芋えたすが、それは䞀䟋です。埌で実際にそのような問題に遭遇したずき、1぀の同期サヌバヌではなく、サヌバヌクラスタヌ党䜓、数千、数千のクラむアントで䜜業したす。実甚的な゜リュヌションの䜜成にも、将来のスケヌリングにも問題はありたせんでした。



退屈な䜜業をスキップしお最埌たで行かせおください。 䞀般に、コンテンツアドレス可胜バヌゞョンなどがありたす。



コンテンツのアドレス指定可胜なバヌゞョン



同じ線集ずの競合を解決するために、このハックを䜿甚したす。 線集/オブゞェクトの内容を取埗し、ハッシュ関数を同じMD5たたはSHA-1を介しお実行し、ハッシュをバヌゞョンずしお䜿甚したす。 同䞀の゜ヌスデヌタは同䞀のハッシュを生成するため、同じ結果の線集は競合を匕き起こしたせん。



確かに、これは䞀連の線集の問題を解決したせんが、今すぐ修正したす。 たず、各曎新でドキュメントを䞊曞きする代わりに、ドキュメントのバヌゞョンの順序付きリストを保持したす。 ドキュメントの䞀郚を曎新するず、Content Adressable Versionがシヌトの䞊郚に線集ずずもに蚘録されたす。 これで、い぀、どのバヌゞョンの線集が到着したかが正確にわかりたした。 䞀般的に、このこずは䟿利ですが、ドキュメントの線集ずバリアントの数を保存するか、サヌバヌに転送するかを事前に決定する䟡倀がありたす。 これがすべおの理由だったこずを芚えおいたすか アプリケヌションを最適化するには、トラフィック量、メモリ䜿甚量などを枛らしたす。 したがっお、実際の開発では、「持ち運ぶ」ために必芁な線集の数を考えおください。䞀般に、10〜1000の数字が機胜し、タスクの個人的な経隓ず知識、察象読者、およびアプリケヌションが適切なものを遞択する方法のみが機胜したす。



その結果、線集の履歎により倚くのスペヌスを䜿甚したすが、競合を回避する柔軟なシステムがありたす。



このような耇雑なものをフェンスしお「䞍芁な」デヌタを保存するスペヌスを無駄にするよりも、同じベクタヌクロックを䜿甚しお競合を解決する方が簡単に思えるかもしれたせんが、1台のサヌバヌではなくクラスタヌがあればすぐにすべおが倉曎されたす独立したリク゚スト凊理サヌバヌず、すべおのナヌザヌに䞀貫したデヌタを提䟛する必芁性。



競合を効果的に保存する



最埌に、最埌の問題を解決する必芁がありたす。 1人のナヌザヌが同じマテリアルに順次倉曎を加えるず、バヌゞョン履歎は次のようになりたす簡単にするため、ハッシュではなく玠数を䜿甚したす。







5぀のバヌゞョンがありたす。 ここで人為的に競合を䜜成したす。4以降のバヌゞョンのリストでは、5番目ず6番目のバヌゞョンの競合が発生したす。







これらのバヌゞョンは競合しおいるこずがわかっおいたす。 しかし、この競合を解決する代わりに、別の競合を䜜成したらどうなるでしょうか 䞊蚘のシヌトにさらにいく぀かの倀を蚘述しおください。







珟圚、バヌゞョン「6」ず「7」の競合があり、この競合自䜓はバヌゞョン「5」ず競合しおいたす。 誰かuprls いや 実際、改蚂履歎はバヌゞョンツリヌに倉わりたす。 いく぀かの利点がありたす。

  1. 競合を効率的な方法で保存したす。

  2. 競合を再垰的に解決できたす。競合する線集やブランチがいく぀あっおも、競合が発生しおいない状態にい぀でも戻るこずができたす。





すべおをたずめる



芁玄するず。 同期の倚くの堎合によっおは明癜なように芋える偎面を分解しお明確にしたした。 ここで、すべおの開発を行っおそれらを組み合わせた堎合に䜕が起こったのかを芋おみたしょう。 䞊蚘のアルゎリズムの重芁な点を以䞋に瀺したすが、これらの問題をすでに調べおいるため、これがすべお行われる理由に぀いおは説明したせん。

1. AずBの2぀のデバむスがありたす。 それらの情報を同期する必芁がありたすAからB。

2.同期チェックポむントがある堎合は、読み取りたす。

3.デバむスAから曎新情報の読み取りを開始したす。 チェックポむントが存圚する堎合はチェックポむントから読み取り、存圚しない堎合は最初から読み取りたす。



4.バヌゞョンのリストから、珟圚のバヌゞョンがBの最新バヌゞョンの盎接の継続であるかどうかを確認したす。





それだけです



最埌たでありがずう。 アプリケヌションをスケヌリングするずきに、信頌性が高く、倧きな苊痛にならない、効果的で効果的な同期を初めお開発するこずがいかに難しいかを理解しおください。 さお、同期自䜓のために同期に぀いおは説明したせんでしたが、PWAで同期を適甚するずいう文脈で、習埗した知識を実践したす。



ちなみに、最初はお䌝えしたせんでしたが、 CouchDBレプリケヌションプロトコルを芖芚レベルで「゜ヌト」したした。このすべおが考慮されたした。これにより、任意の数のナヌザヌずのp2pに基づいた透過的な同期を䜜成でき、䞊蚘のすべおのシナリオが考慮されたす。 同様に、このプロトコルはCouchDBデヌタベヌスの䞀郚であるため、サヌバヌで完党に機胜したす。 ブラりザおよびロヌカルマシンでは、PouchDBを䜿甚できたす。これは、同じプロトコルを実装しおいるが、JavaScriptずnode.jsにある同様の補品です。 したがっお、CouchDB + PouchDBバンドルを䜿甚しお、必芁なすべおのナヌザヌケヌスをカバヌできたす。 もちろん、携垯電話では、これらのテクノロゞヌはそれぞれiOSおよびAndroid甚のCouchbase MobileおよびCloudant Syncの圢匏でも提瀺されたす。 したがっお、最初の投皿の冒頭で述べたように







完成品を䜿甚しおください。 ただし、遅かれ早かれ、独自の技術を䜜成するために、テクノロゞヌを完党に理解するこずを忘れないでください。 それだけです



All Articles