このデヌタベヌスは燃えおいたす...

このデヌタベヌスは燃えおいたす...

技術的な話をしたしょう。

䜕幎も前、私はコラボレヌション機胜が組み蟌たれたアプリケヌションを開発しおいたした。 これは、初期の React ず CouchDB の可胜性を最倧限に掻甚した、ナヌザヌフレンドリヌな実隓甚スタックでした。 JSON経由でリアルタむムにデヌタを同期したした OT。 これは瀟内で䜿甚されおいたしたが、他の分野でも幅広い適甚可胜性ず可胜性があるこずは明らかでした。

このテクノロゞヌを朜圚的な顧客に販売しようずしおいるずきに、予期せぬ障害に遭遇したした。 デモビデオでは、圓瀟のテクノロゞヌは芋た目も機胜も玠晎らしく、問題はありたせんでした。 ビデオはそれがどのように機胜するかを正確に瀺しおおり、䜕も暡倣しおいたせんでした。 私たちは、プログラムを䜿甚するための珟実的なシナリオを考え出し、コヌディングしたした。

このデヌタベヌスは燃えおいたす...
実際、これが問題になりたした。 私たちのデモは、他の人がアプリケヌションをシミュレヌトしたのずたったく同じように機胜したした。 具䜓的には、たずえそれが倧きなメディア ファむルであっおも、情報は A から B に即座に転送されたした。 ログむン埌、各ナヌザヌには新しい゚ントリが衚瀺されたす。 このアプリケヌションを䜿甚するず、村のどこかでむンタヌネット接続が䞭断された堎合でも、異なるナヌザヌが同じプロゞェクトで明確に共同䜜業するこずができたす。 これは、After Effects でカットされた補品ビデオに暗黙的に含たれおいたす。

「曎新」ボタンの目的は誰もが知っおいたしたが、構築を䟝頌された Web アプリケヌションには通垞、独自の制限があるこずを実際に理解しおいる人は誰もいたせんでした。 そしお、それらが䞍芁になった堎合、ナヌザヌ゚クスペリ゚ンスはたったく異なるものになるでしょう。 圌らは䞻に、話しおいる盞手にメモを残しお「チャット」できるこずに気づき、これがたずえば Slack ずどう違うのか疑問に思いたした。 ふう

日垞の同期のデザむン

゜フトりェア開発の経隓がある堎合、ほずんどの人はむンタヌフェヌスの画像を芋ただけで、それを操䜜するずきに䜕が行われるかを理解するこずはできないこずを思い出すず、緊匵するはずです。 プログラム自䜓の内郚で䜕が起こるかは蚀うたでもありたせん。 ずいう知識 猶 起こるずいうこずは䞻に、䜕が起こり埗ないのか、䜕が起こっおはいけないのかを知った結果です。 これには必芁です メンタルモデル ゜フトりェアが䜕を行うかだけでなく、その個々の郚分がどのように調敎され、盞互に通信するかに぀いおも説明したす。

この兞型的な䟋は、ナヌザヌが䜕かを芋぀めおいるこずです。 spinner.gif、぀いに䜜品が完成するのはい぀になるのだろうか。 開発者は、おそらくプロセスが停止しおおり、GIF が画面から消えるこずはないこずに気づいおいたでしょう。 このアニメヌションはゞョブの実行をシミュレヌトしたすが、ゞョブの状態ずは関係ありたせん。 このような堎合、技術者の䞭にはナヌザヌの混乱の皋床に驚いお目を䞞くする人もいたす。 しかし、回転しおいる時蚈を指しお、実際には止たっおいるず蚀う人がどれだけいるかに泚目しおください。

このデヌタベヌスは燃えおいたす...
これがリアルタむム䟡倀の本質です。 最近では、リアルタむム デヌタベヌスはただほずんど䜿甚されおおらず、倚くの人が疑念を抱いおいたす。 これらのデヌタベヌスのほずんどは NoSQL スタむルに倧きく傟いおいるため、通垞は Mongo ベヌスの゜リュヌションが䜿甚されたすが、これは忘れるのが最善です。 しかし、私にずっおこれは、CouchDB の操䜜に慣れるこずず、䞀郚の官僚以䞊にデヌタを入力できる構造の蚭蚈を孊ぶこずを意味したす。 時間をより有効に䜿えるようになったず思いたす。

しかし、この蚘事の本圓のテヌマは、私が今日䜿甚しおいるものです。 それは遞択によるものではなく、䌁業ポリシヌが無関心か぀盲目的に適甚されたためです。 そこで、密接に関連する XNUMX ぀の Google リアルタむム デヌタベヌス補品を完党に公平か぀公平に比范​​しおみたす。

このデヌタベヌスは燃えおいたす...
どちらも名前に「火」ずいう蚀葉が入っおいたす。 懐かしく思い出されるこずが䞀぀ありたす。 私にずっおの XNUMX 番目のこずは、異なる皮類の火です。 私は圌らの名前を蚀うのを急いでいたせん。なぜなら、名前を蚀うず、最初の倧きな問題、぀たり名前に遭遇するこずになるからです。

最初のものはず呌ばれたす Firebase リアルタむム デヌタベヌス、およびXNUMX番目- Firebase クラりド Firestore。 どちらもこちらの商品です Firebase スむヌト グヌグル。 それらの API はそれぞれ呌び出されたす firebase.database(
) О firebase.firestore(
).

このようなこずが起こったのは、 リアルタむムデヌタベヌス - それはただのオリゞナルです ファむアベヌス 2014幎にGoogleに買収される前。 その埌、Google は䞊行補品ずしお䜜成するこずを決定したした。 コピヌ Firebase はビッグデヌタ䌁業をベヌスにしおおり、クラりドを備えた Firestore ず呌ばれおいたす。 ただ混乱しおいないこずを願っおいたす。 ただ混乱しおいる堎合でも、心配しないでください。私自身、蚘事のこの郚分を XNUMX 回曞き盎したした。

瀺す必芁があるため、 ファむアベヌス Firebaseの質問で、そしお ファむダヌストア Firebase に関する質問で、少なくずも数幎前の Stack Overflow に぀いお理解しおもらうために。

最悪の゜フトりェア呜名゚クスペリ゚ンスに賞が䞎えられるずしたら、これは間違いなく候補の XNUMX ぀になるでしょう。 これらの名前間のハミング距離は非垞に小さいため、頭で別の名前を考えおいる間に XNUMX ぀の名前を指で入力する経隓豊富な゚ンゞニアでさえ混乱したす。 これらは善意に基づいた蚈画ですが、惚めに倱敗したす。 圌らは、デヌタベヌスが炎䞊するずいう予蚀を成就したした。 党然冗談じゃないよ。 この呜名案を考え出した人は、血ず汗ず涙を流したした。

このデヌタベヌスは燃えおいたす...

ピュヌリクスの勝利

Firestore は 亀換 Firebase はその次䞖代の子孫ですが、それは誀解を招きたす。 Firestore が Firebase の適切な代替ずなるずは保蚌されおいたせん。 誰かがそこから興味深いものをすべお切り取り、残りのほずんどをさたざたな方法で混乱させたようです。

ただし、この XNUMX ぀の補品をざっず芋ただけでは混乱するかもしれたせん。基本的に同じ API を介しお、さらには同じデヌタベヌス セッション内で、同じこずを実行しおいるように芋えたす。 違いは埮劙であり、広範な文曞を泚意深く比范怜蚎するこずによっおのみ明らかになりたす。 たたは、Firebase で完党に動䜜するコヌドを Firestore で動䜜するように移怍しようずしおいる堎合。 それでも、リアルタむムでマりスをドラッグ アンド ドロップしようずするずすぐにデヌタベヌス むンタヌフェむスが点灯するこずがわかりたす。 繰り返したすが、冗談ではありたせん。

Firebase クラむアントは、倉曎をバッファリングし、最埌の曞き蟌み操䜜を優先する曎新を自動的に再詊行するずいう意味で䞁寧です。 ただし、Firestore には、ナヌザヌごずにドキュメントごずに 1 秒あたり XNUMX 回の曞き蟌み操䜜ずいう制限があり、この制限はサヌバヌによっお匷制されたす。 これを䜿甚する堎合、アプリケヌションを構築しようずしおいるだけの堎合でも、それを回避する方法を芋぀けお曎新レヌト リミッタヌを実装するのはナヌザヌの責任です。 ぀たり、Firestore は、API を䜿甚するリアルタむム クラむアントを装ったリアルタむム デヌタベヌスです。

ここで、Firestore の存圚意矩の最初の兆候が芋え始めたす。 私が間違っおいるかもしれたせんが、Google の経営陣の䞊局郚の誰かが賌入埌に Firebase を芋お、単に「いや、なんおこずだ、違う」ず蚀ったのではないかず思いたす。 これは受け入れがたい。 私のリヌダヌシップの䞋ではないだけです。」

このデヌタベヌスは燃えおいたす...
圌は郚屋から珟れおこう宣蚀した。

「1 ぀の倧きな JSON ドキュメントですか? いいえ。 デヌタを個別のドキュメントに分割し、それぞれのサむズが XNUMX メガバむト以䞋になるようにしたす。」

このような制限は、十分に動機付けられたナヌザヌ ベヌスに最初に遭遇した埌は生き残れないず思われたす。 そうですよね。 たずえば、職堎では XNUMX 件を超えるプレれンテヌションが行われたすが、これはたったく正垞なこずです。

この制限により、デヌタベヌス内の XNUMX ぀の「ドキュメント」は、ナヌザヌがドキュメントず呌ぶオブゞェクトには䌌おいないずいう事実を受け入れる必芁がありたす。

「他の芁玠を再垰的に含めるこずができる配列の配列? いいえ。 神が意図したずおり、配列には固定長のオブゞェクトたたは数倀のみが含たれたす。」

したがっお、GeoJSON を Firestore に入れたいず思っおいたずしおも、それは䞍可胜であるこずがわかりたす。 䞀次元以倖のものは受け入れられたせん。 Base64 や JSON 内の JSON を気に入っおいただければ幞いです。

「HTTP、コマンドラむンツヌル、たたは管理パネル経由で JSON をむンポヌトおよび゚クスポヌトしたすか? いいえ。 Google Cloud Storage ぞのデヌタの゚クスポヌトずむンポヌトのみが可胜になりたす。 今ではそう呌ばれおいるず思いたす。 私が「あなた」ず蚀うずきは、プロゞェクト オヌナヌの資栌を持぀人のみを指したす。 他の人は誰でもチケットを䜜成できたす。」

ご芧のずおり、FireBase デヌタ モデルは簡単に説明できたす。 これには、JSON キヌを URL パスに関連付ける XNUMX ぀の巚倧な JSON ドキュメントが含たれおいたす。 ず曞くず HTTP PUT в / FireBase は次のずおりです。

{
  "hello": "world"
}

その GET /hello 戻りたす "world"。 基本的には期埅どおりに機胜したす。 FireBase オブゞェクトのコレクション /my-collection/:id JSON蟞曞に盞圓 {"my-collection": {...}} ルヌトにあり、その内容は次の堎所で入手できたす。 /my-collection:

{
  "id1": {...object},
  "id2": {...object},
  "id3": {...object},
  // ...
}

これは、各挿入に衝突のない ID がある堎合に正垞に機胜したす。システムにはそのための暙準゜リュヌションがありたす。

蚀い換えれば、デヌタベヌスは 100% JSON(*) 互換性があり、CouchDB などの HTTP ずうたく連携したす。 ただし、基本的には、WebSocket、承認、およびサブスクリプションを抜象化するリアルタむム API を通じお䜿甚したす。 管理パネルには䞡方の機胜があり、リアルタむム線集ず JSON むンポヌト/゚クスポヌトの䞡方が可胜です。 コヌドで同じこずを行うず、patch ず diff JSON が氞続的な状態を凊理する日垞的なタスクの 90% を解決するこずに気づくず、どれほど倚くの特殊なコヌドが無駄になるかに驚くでしょう。

Firestore デヌタ モデルは JSON に䌌おいたすが、いく぀かの重芁な点で異なりたす。 配列内に配列が存圚しないこずに぀いおはすでに述べたした。 サブコレクションのモデルは、それらを含む JSON ドキュメントから独立した、第䞀玚の抂念ずなるこずです。 これには既補のシリアル化がないため、デヌタの取埗ず曞き蟌みには特殊なコヌド パスが必芁です。 独自のコレクションを凊理するには、独自のスクリプトずツヌルを䜜成する必芁がありたす。 管理パネルでは䞀床に XNUMX フィヌルドず぀小さな倉曎のみが可胜で、むンポヌト/゚クスポヌト機胜はありたせん。

圌らはリアルタむム NoSQL デヌタベヌスを利甚し、自動結合ず独立した非 JSON 列を備えた䜎速な非 SQL に倉えたした。 GraftQLのようなもの.

このデヌタベヌスは燃えおいたす...

ホットゞャワ

Firestore がより信頌性ずスケヌラビリティを備えおいるはずだった堎合、皮肉なこずに、平均的な開発者は、そのたた FireBase を遞択するよりも信頌性の䜎い゜リュヌションを䜿甚するこずになりたす。 気難しいデヌタベヌス管理者が必芁ずする皮類の゜フトりェアには、その補品が埗意ずするニッチ分野では非珟実的なレベルの努力ず才胜が必芁です。 これは、開発ツヌルやプレヌダヌがない堎合、HTML5 Canvas が Flash の代わりにならないのず同じです。 さらに、Firestore はデヌタの玔床や䞍毛な怜蚌を求める欲求に囚われおおり、平均的なビゞネス ナヌザヌのやり方ずはたったく䞀臎したせん。 仕事が倧奜き圌にずっお、すべおはオプションです。なぜなら、最埌たですべおがドラフトだからです。

FireBase の䞻な欠点は、クラむアントが時代の数幎前、ほずんどの Web 開発者が䞍倉性に぀いお知る前に䜜成されたこずです。 このため、FireBase はナヌザヌがデヌタを倉曎するこずを前提ずしおおり、ナヌザヌが提䟛する䞍倉性を利甚したせん。 さらに、ナヌザヌに枡すスナップショット内のデヌタは再利甚されないため、diff はさらに困難になりたす。 倧きなドキュメントの堎合、倉曎可胜な diff ベヌスのトランザクション メカニズムはたったく䞍十分です。 皆さん、私たちはすでに持っおいたす WeakMap JavaScriptで。 快適ですよ。

デヌタに必芁な圢状を䞎え、ツリヌのボリュヌムを倧きくしすぎない堎合、この問題は回避できたす。 しかし、開発者が䞍倉性を䜿甚し、デヌタベヌス蚭蚈に関する本栌的な実践的なアドバむスを組み合わせた非垞に優れたクラむアント API をリリヌスした堎合、FireBase はさらに興味深いものになるだろうかず私は興味がありたす。 むしろ、壊れおいないものを盎そうずしたようで、それが事態をさらに悪化させたした。

Firestore の䜜成の背埌にあるロゞックをすべお知っおいるわけではありたせん。 ブラックボックスの䞭で生たれる動機を掚枬するのも楜しみのひず぀だ。 非垞に䌌おいるが比范できない XNUMX ぀のデヌタベヌスがこのように䞊眮されるこずは非垞にたれです。 誰かがこう思ったようです。 「Firebase は Google Cloud で゚ミュレヌトできる機胜にすぎたせん」しかし、珟実䞖界の芁件を特定したり、それらの芁件をすべお満たす有甚な゜リュヌションを䜜成したりするずいう抂念はただ発芋しおいたせん。 「開発者に考えおもらいたしょう。 UIだけ綺麗にしお もっず火を぀けおくれたせんか」

デヌタ構造に぀いおいく぀かのこずを理解したした。 私は、「すべおを XNUMX ぀の倧きな JSON ツリヌに」ずいう抂念を、デヌタベヌスから倧芏暡な構造の感芚を抜象化する詊みであるず確信しおいたす。 ゜フトりェアが疑わしいデヌタ構造のフラクタルに簡単に察凊できるこずを期埅するのは、たったく狂気の沙汰です。 事態がどれほど悪いこずになるかを想像する必芁さえありたせん。私は厳栌なコヌド監査を行っおいたす。 あなたたちが倢にも思わなかったこずを私は芋たした。 でも、良い構造がどのようなものかも知っおいるし、 それらの䜿い方 О なぜこれを行う必芁があるのか。 Firestore が論理的で、それを䜜成した人々が良い仕事をしたず思うような䞖界が想像できたす。 しかし、私たちはこの䞖界に生きおいるわけではありたせん。

FireBase のク゚リ サポヌトはどの暙準から芋おも貧匱で、事実䞊存圚したせん。 間違いなく改善、あるいは少なくずも修正が必芁です。 ただし、Firestore は、単玔な SQL ず同じ XNUMX 次元むンデックスに限定されおいるため、それほど優れおいるわけではありたせん。 無秩序なデヌタに察しお人々が実行するク゚リが必芁な堎合は、党文怜玢、耇数範囲のフィルタヌ、およびカスタムのナヌザヌ定矩の順序付けが必芁です。 詳しく調べおみるず、単玔な SQL の機胜はそれ自䜓ではあたりにも制限されおいたす。 さらに、実皌働環境で実行できる SQL ク゚リは高速ク゚リのみです。 スマヌトなデヌタ構造を備えたカスタム むンデックス䜜成゜リュヌションが必芁です。 他のすべおに぀いおは、少なくずも増分マップリデュヌスたたは同様のものがあるべきです。

これに関する情報を Google ドキュメントで怜玢するず、BigTable や BigQuery などの方向性が瀺されるず思いたす。 ただし、これらの゜リュヌションにはすべお、䌁業向けのセヌルス専門甚語が非垞に倚く含たれおいるため、すぐに匕き返しお別のものを探し始めるでしょう。

リアルタむム デヌタベヌスで最も望たしくないのは、管理職の絊料を支払っおいる人によっお、管理職のために䜜られたデヌタベヌスです。

(*) これは冗談です、そんなこずはありたせん。 100% JSON 互換.

広告の暩利に぀いお

探しおいる VDS プロゞェクトのデバッグ甚、開発およびホスティング甚のサヌバヌ? あなたは間違いなく圓瀟のクラむアントです 🙂 さたざたな構成のサヌバヌ、DDoS 察策ラむセンス、および Windows ラむセンスの日次䟡栌は、すでに䟡栌に含たれおいたす。

このデヌタベヌスは燃えおいたす...

出所 habr.com

コメントを远加したす