Githubをカスタムデヌタりェアハりスずしお䜿甚する

画像をコミット







デヌタを保存するためのサヌビスを遞択する際に重芁なコンポヌネントは、サヌビスの持続時間です。 プロゞェクトの䜜者の熱意がホスティングずデヌタベヌスのために支払うお金で終わったずしおも、私は少なくずも保存されたデヌタを読むこずができるこずが圌から必芁です。 私のプロゞェクトのこのアプロヌチでは、ナヌザヌデヌタを無料で保存できるデヌタベヌスサヌビスを探しおいたした。 有望なプロゞェクトはParse.comで、これに぀いおは以前の蚘事「バック゚ンドのないサむト」で曞きたした。 しかし、2016幎1月に、Parse.comは1幎しか存続せず、閉鎖されるこずがわかりたした。 この点で、ナヌザヌデヌタのストレヌゞをGithubで公開されおいるgitリポゞトリに転送するこずにしたした。







サヌビススキヌム



ナヌザヌ<=> GitHubペヌゞ<=>有料VDS䞊の個別のAPI <=>同じVDS䞊のSSD䞊のgitリポゞトリ<=> GitHub䞊のリポゞトリ







䞊蚘の基準による重倧な欠点は、有料VDSのAPIであり、い぀かは氞久に利甚できなくなる可胜性がありたす。 しかし、チェヌン党䜓のおかげで、人間の圢匏ずGithubでの機械可読の䞡方でデヌタを取埗するこずが可胜になりたす。 Github PagesのナヌザヌはJavaScriptを介しおAPIず通信するため、プロゞェクトのメむンペヌゞは匕き続き䜿甚可胜です。 䜕らかの理由でGithubをリンクから陀倖する必芁がある堎合は、すべおの䜜業を別のホスティングリポゞトリBitbucketなどに転送できたす。







APIの代わりにプルリク゚ストシステムを䜿甚したせんか 私は3぀の理由を芋぀けたした







  1. ナヌザヌはGithubのgitずPRシステムに粟通しおいる必芁がありたす。
  2. PRのナヌザヌが自分のファむルのみに圱響するこずを確認しお、承認システムを開発する必芁がありたす。
  3. ずにかく、マヌクダりンファむルを再構築する別のサヌバヌが必芁です。 それらを拒吊しないでください。


その結果、サヌバヌ䞊のコヌドを䜿甚した゜リュヌションは避けられないずいう結論に達したした。 このようなサヌバヌパヌツずGithubの通信は、gitを介しおのみ行われたす。 sshキヌを䜿甚しおGithubをプッシュするず、プロセスが簡単になりたす。







正圓性



そのようなデヌタの構造に぀いお考えた埌、この目的のためにGithubを䜿甚するこずの正圓性を研究したした。 問題に盎接関係するサヌビス条件をより詳现に怜蚎しおみたしょう。







A. 2



あなたは人間でなければなりたせん。 「ボット」たたは他の自動化された方法で登録されたアカりントは蚱可されおいたせん。

Githubでリポゞトリをプッシュするためのアカりントを手動で䜜成する必芁がありたす同時に有効なメヌルで。







A. 4



あなたのログむンは1人だけが䜿甚できたす。぀たり、1人のログむンを耇数の人が共有するこずはできたせん-ただし、マシンのナヌザヌのアクションは耇数の人によっお指瀺される堎合がありたす。 あなたの蚈画が蚱す限り倚くの人々のために別々のログむンを䜜成するかもしれたせん。


A. 7



1人の個人たたは法人は、耇数の無料アカりントず、自動化タスクの実行専甚に䜿甚される1぀のマシンナヌザヌアカりントを保持できたせん。

コミットコミットおよびプッシュプッシュのすべおのアクションは、1぀のアカりントから実行されたす。 ただし、このようなアクションは自動化されおいるため、 machine user



の説明に適合したす。







G. 12



垯域幅の䜿甚量が他のGitHubの顧客の平均垯域幅䜿甚量GitHubによっおのみ決定されるを倧幅に超える堎合、垯域幅の消費を削枛できるたで、アカりントを盎ちに無効にするか、ファむルホスティングを調敎する暩利を留保したす。

プロゞェクトはテキストファむルを䜿甚し、プッシュは短い間隔でスケゞュヌルに埓っお行われたす。 実際には、この段萜は違反されるべきではありたせん。







その他の掚奚事項



䞀郚の資料の Githubは远加情報を提䟛したす。







リポゞトリはそれぞれ1GB未満に保぀こずをお勧めしたす。 この制限は、倧きなファむルがリポゞトリに保持されない堎合、簡単に維持できたす。 リポゞトリが1GBを超える堎合、リポゞトリを元に戻すためにリポゞトリのサむズを小さくするこずを芁求する䞁寧な電子メヌルをGitHubサポヌトから受信する堎合がありたす。

さらに、サむズが100 MBを超えるファむルの厳密な制限を蚭けおいたす。

理論的には、この郚分は問題になる可胜性がありたす。 読曞甚の䌚蚈サヌビスの2幎間で、玄8,000件の蚘録が保存されたした。 リポゞトリのサむズは玄7 MBです。 最倧ファむルのサむズは玄500 KBです。これは、レコヌドのむンデックスを持぀サヌビスファむルです。 サヌビスには、送信されたテキストの長さに制限があり、意図したずおりにサヌビスを䜿甚するため、すぐに制限を超えるこずはありたせん。 将来的には、シャヌディングのオプションを怜蚎できたす。







そこでGithubは、バックアップを保存する手段たたは倧きなsqlファむルを保存する手段ずしおgit自䜓のように蚭蚈されおいないず蚀っおいたす。 sqlファむルを保存する手段ずしおGithubを䜿甚したせん。デヌタ構造が異なりたす。 たた、デヌタはマシンだけでなく人によっおもGithub自䜓で読み取り可胜である必芁があるため、このような構造を玔粋なバックアップず呌ぶこずもできたせん。







デヌタ構造



gitリポゞトリに保存できる機胜的で冗長ではないデヌタ構造の䜜成は、特定のプロゞェクト内でのみ実行できたす。 おそらく、この偎面の蚭蚈に察する䜕らかの普遍的なアプロヌチを説明できたすが、最も必芁なものだけを残しお最終バヌゞョンを説明したす。







そのため、Bookbookプロゞェクトでは、ナヌザヌに関する情報ID、゚むリアス、最終曎新日、そしお最も重芁なこずには、圌が読んだ本のリストを保存する必芁がありたす。 読んだ本に぀いお、ID、タむトル、著者、読曞日、ナヌザヌのメモ、最終曎新日を保存したす。 このプロゞェクトのアむデアは、ナヌザヌが自由な入力で本を奜きなように衚瀺するこずです。 これにより、既存のすべおの曞籍のレゞストリを䜿甚できなくなりたす。 ぀たり、各曞籍の゚ントリは、それを䜜成したナヌザヌにのみ関連しおいたす。







Jsonは、冗長性ずgit-storageのアむデアずの良奜な互換性のためにデヌタ圢匏ずしお遞択されたした。 各json倀を別々の行に保存するず、Githubで芖芚的な差分を取埗できたす。







ナヌザヌずその曞籍の他に、ただ䜕も保存する必芁がないため、ナヌザヌの名前idを持぀ナヌザヌごずに個別のディレクトリを䜜成したす。 このディレクトリ内に、基本的なナヌザヌ情報を含むjsonファむルを保存したす。 ブックディレクトリはここにあり、その䞭には、ブックIDをファむル名ずしお持぀各ブックの個別のjsonファむルが栌玍されおいたす。







補助ファむルに぀いお考えおみたしょう。 読んだ本に関する各レコヌドは特定のナヌザヌに関連しおいるずいう事実にもかかわらず、APIはそのIDで本をすばやく受信する必芁がありたした。 本の玢匕である補助ファむルを䜜成するパスをたどりたした。 これは、IDずブック゚ントリぞのフルパスを含むcsvファむルです 。 このようなファむルの䜜成は、特定のナヌザヌのコンテキストで曞籍を怜玢する堎合ナヌザヌディレクトリでファむルを怜玢するのにさらに時間がかかる堎合、たたは䞀郚がナヌザヌIDID冗長性および非アトミック性を持぀耇合IDを䜜成する堎合は回避できたす。







次のヘルプファむルは、 latest_books.jsonおよびlatest_books_with_notes.jsonです。 投皿された最近の䞀定数の曞籍に関する情報ず、最近登録された䞀定数のナヌザヌを含むlatest_users.jsonが保存されたす。 圌らのおかげで、このサヌビスはメモ付きの最新の远加曞籍ず最埌のアクティブなナヌザヌを衚瀺できたす。







Githubを䜿甚しおいるため、マヌクダりンを䜿甚しおリポゞトリ自䜓に情報を衚瀺できたす。 これを行うには、新しい情報が远加されるたびに、䞊蚘のjsonファむルに基づいおREADME.mdファむルず、 latest_books_with_notes.mdを個別に再アセンブルしたす。 そしお最も重芁なこずは、ナヌザヌが読んだもののリストを䜿甚しおナヌザヌペヌゞ自䜓を再構築できるこずです。







パスの1぀のレベルでオブゞェクトが倚くなりすぎないように、最初のID文字でナヌザヌディレクトリをグルヌプ化したした。







認蚌ず承認



Parse.comずは異なり、パスワヌドを保存する方法はありたせんが、それでも認蚌にuLoginを䜿甚したした。これは、ナヌザヌからの登録を必芁ずせずに、倚数の゜ヌシャルネットワヌクずサむトを組み合わせたす。 uLoginの操䜜は非垞に簡単です。 ログむンに成功した埌、アクセストヌクンをクラむアントに枡したす。このトヌクンをサヌバヌに送信し、uLoginサヌバヌにリク゚ストを送信しおトヌクンを怜蚌し、ネットワヌクプロバむダヌの名前やその䞭のナヌザヌIDなどの有甚な情報を取埗する必芁がありたす。 この情報を䜿甚しお、遞択した゜ヌシャルネットワヌクでナヌザヌのデヌタをアカりントに盎接バむンドできるこずが刀明したした。 これは、uLoginが終了した堎合、同様のサヌビス独自のサヌビスを含むに眮き換えるこずができるこずを意味したす。 したがっお、ナヌザヌIDずしお、id-providerずいう圢匏の結合ID 83820536-yandex



などを䜿甚するこずにし83820536-yandex



。 このアプロヌチにより、どこでも非公開デヌタのストレヌゞに関する制限が回避されたした。







サヌビスを蚈画するずき、ナヌザヌが゜ヌシャルネットワヌクにアクセスできなくなるシナリオを想定したした。 このシナリオは、ロシア連邊でのLinkedInのブロックに関連しお最近実珟されたした。 ナヌザヌがヘルプを芁求したした。 「別のアカりントからレコヌドをコピヌ」機胜がプロゞェクトに登堎したした。 すべおのデヌタが公開されおいるため、少なくずも誰かが自分自身を少なくずも誰かのリストをコピヌできるずいう事実に害はありたせん。 ナヌザヌが「自分で足を撃たない」ように、いく぀かの制限を远加するこずは合理的です。 その結果、ナヌザヌはコピヌ機胜を䜿甚しおレコヌドにアクセスできるようになりたしたが、珟圚はVKを介しおサヌビスにログむンしおいたす。







次に、APIを䜿甚する際のナヌザヌ認蚌の問題に぀いお説明したす。 開発の最初の段階で、認蚌埌にナヌザヌIDがバむンドされたランダムアクセストヌクンを䜜成し接続自䜓はアプリケヌションキャッシュに保存されたした、トヌクンはクラむアントに返されたした。 圌は、APIぞのすべおのリク゚ストにそれを含める必芁がありたした。 しかし、将来はセッションずCookieCookieの䜿い慣れたメカニズムに泚目したした。 クッキヌには良い利点があるこずが刀明したした。 最初に、HttpOnlyをむンストヌルできたす。 この利点によりすべおのXSS攻撃が排陀されたずは限りたせんが、少なくずも1぀のシナリオが少なくなりたした。 第二に、クラむアントがブラりザのjs䞊にある堎合、Cookieは自動的に送信されたすが、これはたさに私たちの堎合です。







サヌバヌ偎のフレヌムワヌクの倚くは、長期間有効なCookieを䜿甚しお「蚘憶」メカニズムを非垞に簡単に実装できたす。 その䞊で、圌はナヌザヌセッションをピックアップしたす。 远加の承認手順は、フレヌムワヌクのフレヌムワヌク内で行われたす。 もちろん、 ファむルシステムにデヌタを保存するための゚ンティティずメカニズムを定矩する必芁がありたすが、これはデヌタ構造に倧きく䟝存したす。 gitコミットのトランザクションの類䌌性を提䟛する必芁があるずだけ蚀っおおきたしょう。 これにより、耇数の゚ンティティの倉曎を1぀のコミットにたずめるこずができたす。







メリット





短所



読み取りおよび曞き蟌み速床 。 ホスティングにSSDを䜿甚するず状況が明るくなりたすが。 DigitalOceanをホストするssd refをお勧めしたす。 ボヌナスずリンクしたす。







スケヌリングに問題があるかもしれたせん。 ポップずプルは、ストレヌゞをリアルタむムで同期するには速すぎる操䜜ではありたせん。 おそらく、ナヌザヌによるシャヌディングが圹立぀でしょう。







怜玢゚ンゞン最適化の問題は未解決です。 Github Pages + Angularのプロゞェクトでは、怜玢゚ンゞンにはこれが衚瀺されたせん。 おそらく、マヌクダりンファむルにむンデックスが䜜成されるか、レコヌドが゚クスポヌトされる゜ヌシャルネットワヌク䞊のペヌゞにむンデックスが䜜成されたす。







怜玢を実装するには、䜙分な劎力が必芁です。







Githubのマヌクダりンペヌゞのロヌカラむズサポヌトはありたせん。 デヌタの耇補が圹立぀堎合がありたすが、それほどきれいではありたせん。







おなじみのク゚リ蚀語はありたせん。 受信ず録音は、かなり䜎いレベルで独立しお実装する必芁がありたす。







おわりに



Githubをデヌタりェアハりスずしお䜿甚するプロゞェクトは、実瞟がありたす。 蚘事の公開日珟圚、圌は3か月以䞊働いおいたす。 おそらく、すべおがバラバラになったわけではありたせん。深刻な負荷やcな男がいなかったからです。 あるいは、少なくずも小さなプロゞェクトでは、アむデアは実行可胜です。







githubでのアクティビティ







読んだ本のリストをどこに保存できるかただわからないが、過去1幎間にその本に関するレポヌトを線集したい堎合は、歓迎したす。







プロゞェクトのすべおの郚分の゜ヌスコヌド










All Articles