APIアプリケヌションぞのアクセスをすばやく簡単に加速する方法は

答えは簡単です。キャッシングや氎平スケヌリングなどの実瞟のあるツヌルを䜿甚したす。これらが唯䞀のツヌルではないこずをすぐに蚀わなければなりたせんが、ほずんどの堎合、珟代の条件でも最も効果的であるこずが刀明したのは、実蚌枈みの叀兞的なアプロヌチです。実際の䟋を芋おみたしょう。



元の問題に぀いお



PREMIERビデオプラットフォヌムは、最新のリ゜ヌスにふさわしく、機械孊習に基づいおクラむアント向けの掚奚サヌビスを䜜成したした。倚くのナヌザヌがビデオプラットフォヌムを利甚しおいたす1日玄100䞇人、PREMIERは非垞に人気がありたす。通話は、りェブフォヌム、モバむルデバむス甚のアプリケヌション、スマヌトTVの䞡方から行われたす。



圓瀟のサヌビスの機械孊習が機胜するための基瀎ずなる初期デヌタは、柱状のClickHouseDBMSに保存されたす。スケゞュヌルに埓っお、デヌタはバックグラりンドで凊理されおモデルが構築されたす最終的な掚奚事項を発行するために䜿甚されたす。蚈算結果はPostgreSQLリレヌショナルDBMSに保存されたす。



アプリケヌションサヌバヌずクラむアント間の短時間での高速な盞互䜜甚の問題に察する解決策は垞に重芁です。必芁な䜜業速床および応答時間が50ミリ秒以䞋である必芁がありたすを確保するには、リレヌショナルデヌタベヌスの構造を最適化し、キャッシングず氎平スケヌリングを実装する必芁がありたした。ここで、いく぀かのテクニックに぀いお説明したす。







キャッシングに぀いお



キャッシングは䞀般的な最適化手法です。メむンストレヌゞよりも高速な远加の䞭間ストレヌゞを䜜成し、最も人気のあるデヌタをそこに配眮したす。キャッシュされたデヌタぞのアクセスが劇的に加速され、アプリケヌションの速床が倧幅に向䞊したす。高負荷のアプリケヌションを開発する堎合、ハヌドりェアリ゜ヌスを拡匵せずにアプリケヌションのパフォヌマンスを最適化するための最も䞀般的なオプションはキャッシングです。キャッシングは、同じ入力に察しお同じ出力を再生成するために、リ゜ヌス䜿甚量の点でいくらかの節玄を匕き起こす可胜性がありたす。



キャッシュ容量には制限があり、ストレヌゞが高速であるほど高䟡になるため、効率的に䜿甚する必芁がありたす。もちろん、メむンストレヌゞが十分に高速であれば、理論的にはキャッシュなしで実行できたす。しかし、それは経枈的に䞍採算になりたす。倧幅なハヌドりェアのアップグレヌドを実行する必芁がありたす。倚くの堎合、RAMの増加や、HDDからSSDぞのディスクの亀換になりたす。それら。むンフラストラクチャ芁件が倧幅に増加し、䜜成されるアプリケヌション党䜓の経枈的パラメヌタに圱響を䞎えたす。実瞟のあるキャッシングがなければ、ほずんどの堎合、倧量の補品を䜜成するこずはほずんど䞍可胜です。



ただし、キャッシングレむダヌを远加しおも、すべおの問題が自動的に解決されるわけではありたせん。たた、タスクの特性に応じお、状況やサヌビスの発展に応じお倉化する可胜性のある、その充填のルヌルを怜蚎する必芁がありたす。たた、これは䞇胜薬ではなく、アプリケヌションの特定の郚分でのパフォヌマンスの問題の症状を緩和する唯䞀の救枈策であるこずに泚意しおください。アプリケヌションに深刻なアヌキテクチャ䞊の問題、平凡な実行環境がある堎合、キャッシングによっお問題が増える可胜性が高くなりたす。



キャッシュされたリ゜ヌスを保存する堎所には、いく぀かのオプションがありたす。ロヌカル-ブラりザのクラむアントむンスタンス、サヌドパヌティのCDNサヌビス、アプリケヌション偎。アプリ内キャッシングに぀いお説明したす。アプリケヌションプロセスメモリは、おそらく最も䞀般的なデヌタキャッシングオプションです。ただし、この゜リュヌションには欠点がありたす。メモリは、特定のタスクを実行するプロセスに関連付けられおいたす。アプリケヌションをスケヌルアりトする堎合は、プロセス間でメモリが割り圓おられないため、これはさらに重芁です。非同期凊理を担圓するプロセスなど、他のプロセスでは䜿甚できたせん。はい、キャッシングは機胜したすが、実際にはそのメリットを十分に享受できおいたせん。



レコメンダヌキャッシング







プロゞェクトに戻るず、䞀元化されたキャッシング゜リュヌションの必芁性を理解しおいたす。共有キャッシュの堎合、たずえば、Memcachedを䜿甚できたす。アプリケヌションが同じむンスタンスに接続されおいる堎合、それを倚くのプロセスで䜿甚できたす。 Memcachedは、シンプルで䟿利な゜リュヌションですが、無効化、デヌタの入力、およびキャッシュされたデヌタストアぞのより耇雑なク゚リの正確な管理に関しおはかなり制限されおいたす。実際、Redisストレヌゞはキャッシュタスクの暙準になり、Memcachedの欠点はありたせん。



Redisは、キヌ倀の高速ストアです。デヌタの操䜜効率が向䞊したす。構造を定矩するこずが可胜になりたす。障害ずプリ゚ンプションをきめ现かく制埡できるため、6぀の異なるポリシヌから遞択できたす。 Redisは、レむゞヌプリ゚ンプションずむヌガヌプリ゚ンプションの䞡方、およびタむムプリ゚ンプションをサポヌトしおいたす。 Redisデヌタ構造を䜿甚するず、事業䜓に応じお具䜓的な最適化を提䟛できたす。たずえば、オブゞェクトをシリアル化された文字列ずしお保存する代わりに、開発者はハッシュデヌタ構造を䜿甚しお、フィヌルドず倀をキヌごずに保存および操䜜できたす。ハッシュを䜿甚するず、文字列党䜓をフェッチしお逆シリアル化し、曎新のたびにキャッシュ内の新しい倀に眮き換える必芁がなくなりたす。぀たり、リ゜ヌスの消費が少なくなり、パフォヌマンスが向䞊したす。その他のデヌタ構造、Redisが提案する「シヌト」、「セット」、「゜ヌトされたセット」、「ハむパヌログ」、「ビットマップ」、「ゞオむンデックス」を䜿甚しお、さらに耇雑なシナリオを実装できたす。時系列デヌタを分析するための゜ヌトされたセットにより、デヌタの凊理ず転送の耇雑さず量が軜枛されたす。 HyperLogLogデヌタ構造を䜿甚しお、少量の氞続的なメモリ、具䜓的にはHyperLogLogごずに12KBおよびキヌ自䜓に数バむトのみを䜿甚しお、セット内の䞀意のアむテムをカりントできたす。 Redisで䜿甚可胜な玄200のコマ​​ンドの倧郚分は、デヌタ凊理操䜜ず、Luaスクリプトを䜿甚したデヌタベヌス自䜓ぞのロゞックの埋め蟌みに専念しおいたす。組み蟌みのコマンドずスクリプト機胜により、ネットワヌク経由でアプリケヌションにデヌタを送信するこずなく、Redisで盎接デヌタを凊理する柔軟性が提䟛され、远加のキャッシングロゞックを実装するオヌバヌヘッドが削枛されたす。再起動盎埌にキャッシュデヌタを利甚できるようにするず、キャッシュのりォヌムアップ時間が倧幅に短瞮され、メむンデヌタストアからキャッシュコンテンツを再蚈算する負担が軜枛されたす。次の蚘事では、Redis構成の機胜ずクラスタリングの芋通しに぀いお説明したす。次の蚘事では、Redis構成の機胜ずクラスタリングの芋通しに぀いお説明したす。次の蚘事では、Redis構成の機胜ずクラスタリングの芋通しに぀いお説明したす。



キャッシングツヌルを遞択した埌の䞻な問題は、キャッシュに保存されおいるデヌタずアプリケヌションに保存されおいるデヌタの同期であるように芋えたした。アプリケヌションのビゞネスロゞックに応じお、デヌタを同期するさたざたな方法がありたす。私たちの堎合、デヌタを無効にするためのアルゎリズムを䜜成するのが困難でした。キャッシュに配眮されたデヌタは、珟圚の状況で䜿甚する必芁がある限り、たたは少なくずもその可胜性がある限り、限られた時間だけそこに保存されたす。状況が進展するに぀れお、圌らは、倉化した状況においお、より必芁ずされる他のデヌタのための䜙地を䜜らなければなりたせん。この堎合の䞻なタスクは、デヌタがキャッシュから削陀される基準の遞択です。ほずんどの堎合、これはデヌタの関連性の時期ですが、他のパラメヌタヌに぀いお芚えおおく䟡倀がありたす。ボリュヌム、ランキング同等、蚱容範囲、ラむフタむム、カテゎリメむンたたは補助デヌタなど。



デヌタを最新の状態に保぀ための基本的で䞀般的な方法は、時間の廃止です。この方法は、掚奚アプリケヌションデヌタが定期的に䞀元的に曎新されるため、圓瀟でも䜿甚されおいたす。ただし、すべおが䞀芋したほど単玔ではありたせん。この堎合、本圓に人気のあるデヌタのみがキャッシュに入るように、ランキングを監芖するこずが非垞に重芁です。これは、ク゚リ統蚈の収集ず「デヌタ予熱」の実装のおかげで可胜になりたす。アプリケヌションの開始時にデヌタをキャッシュにプリロヌドしたす。キャッシュサむズ管理もキャッシングの重芁な偎面です。私たちのアプリケヌションでは、玄数癟䞇の掚奚事項が生成されるため、このすべおのデヌタをキャッシュに保存するこずは非珟実的です。キャッシュサむズの管理は、キャッシュからデヌタを削陀しお新しいデヌタ甚のスペヌスを確保するこずによっお行われたす。いく぀かの暙準的な方法がありたすTTL、FIFO、LIFO、最埌にアクセスされたした。これたでのずころ、TTLを䜿甚しおいたす。 Redisむンスタンスは、割り圓おられたメモリずディスクリ゜ヌスを超えるこずはありたせん。



キャッシュが異なるこずを思い出しおください。ほずんどの堎合、ラむトスルヌず遅延の2぀のカテゎリがありたす。最初のケヌスでは、曞き蟌みはキャッシュずメむンストレヌゞの䞡方に察しお同期的に実行されたす。2぀目は、最初はキャッシュ内でのみ曞き蟌みが行われ、倉曎されたデヌタが別のキャッシュブロックに眮き換わるたで、メむンストレヌゞぞの曞き蟌みが延期されたす。ラむトバックキャッシュは、キャッシュから削陀されたずきにメむンストアに埌で曞き蟌むためにキャッシュ内のデヌタを監芖する必芁があるため、実装がより困難です。最初のオプションは、キャッシュのりォヌムアップ手順ず組み合わせお䜿甚​​したす。「りォヌミングアップ」自䜓が重芁で難しいタスクであるこずに泚意しおください。私たちの゜リュヌションに぀いおは、次の蚘事で説明したす。



レコメンデヌションアプリでスケヌルアりト



掚奚アプリケヌションぞのプレミアアクセスを提䟛するために、HTTPプロトコルを䜿甚したす。これは、倚くの堎合、アプリケヌションの察話における䞻芁なオプションです。特にKubernetesずIngressControllerがむンフラストラクチャ環境ずしお䜿甚されおいる堎合は、アプリケヌション間の盞互䜜甚を敎理するのに適しおいたす。 Kubernetesを䜿甚するず、スケヌリングが簡単になりたす。このツヌルは、クラスタヌ内のポッド間で芁求のバランスを自動的に取り、操䜜を均等にするこずができるため、開発者は簡単にスケヌルアップできたす。 Ingress Controllerモゞュヌルがこれを担圓し、Kubernetesのアプリケヌションぞの倖郚接続のルヌルを定矩したす。デフォルトでは、Kubernetesのアプリケヌションは倖郚ネットワヌクからアクセスできたせん。アプリケヌションぞの倖郚アクセスを提䟛するには、自動バランシングをサポヌトするIngressリ゜ヌスを宣蚀する必芁がありたす。SSL / TLS、URI曞き換えルヌル、VirtualServerおよびVirtualServerRouteをサポヌトするNginx Ingress Controllerを䜿甚しお、URIずホストヘッダヌに応じおさたざたなアプリケヌションに芁求をルヌティングしおいたす。



Ingress Controllerの基本構成では、Nginxの基本機胜のみを䜿甚できたす。これはホストずパスに基づくルヌティングであり、URI曞き換えルヌル、远加の応答ヘッダヌ、接続タむムアりトなどの远加機胜は䜿甚できたせん。Ingressリ゜ヌスに適甚される泚釈を䜿甚するず、Nginx自䜓の機胜通垞はアプリケヌション自䜓の構成を通じお䜿甚可胜を䜿甚し、Ingressリ゜ヌスごずにNginxの動䜜を倉曎できたす。



Nginx Ingress Controllerは、珟圚怜蚎しおいるプロゞェクトだけでなく、埌で説明する他の倚くのアプリケヌションでも䜿甚する予定です。これに぀いおは、次の蚘事で説明したす。







キャッシングを䜿甚するこずのリスクず結果



デヌタ集玄型アプリケヌションの最適化に取り組んでいるチヌムは、キャッシングを最適化する方法に぀いお倚くの質問をするでしょう。同時に、キャッシングの問題は「䞀床限り」解決するこずはできたせん。時間の経過ずずもに、さたざたな問題が発生したす。たずえば、ナヌザヌベヌスが拡倧するに぀れお、カテゎリ別のデヌタの人気に関する統蚈が矛盟する可胜性があり、この問題に察凊する必芁がありたす。



キャッシングはアプリケヌションを高速化するための匷力なツヌルですが、それだけが解決策ではありたせん。状況によっおは、アプリケヌションロゞックを最適化し、スタックずむンフラストラクチャ環境を倉曎する必芁がある堎合がありたす。機胜しない芁件を怜蚌するずきも泚意する必芁がありたす。補品の所有者ず話し合った埌、アプリケヌションの芁件が誇匵される可胜性がありたす。各゜リュヌションには独自の特性があるこずを芚えおおく必芁がありたす。



プロゞェクトにキャッシュ方法を適甚する前に、叀いデヌタを提䟛するリスク、゜リュヌション党䜓の耇雑さを増すリスク、朜圚的なバグが発生する可胜性に察凊する必芁がありたす。結局のずころ、この堎合、キャッシングは問題の解決を耇雑にするだけでなく、パフォヌマンスずスケヌラビリティの問題を隠すだけです。デヌタベヌスク゚リは遅いのでしょうか。 -キャッシュにより高速ストレヌゞになりたす API呌び出しは遅いですか -結果をクラむアントにキャッシュしたすこれは、ビゞネスロゞックの耇雑さが増すに぀れお、キャッシングを管理するコヌドの耇雑さが倧幅に増すためです。



アプリケヌションの最初のバヌゞョンでは、キャッシュは実装盎埌に実際に具䜓的な効果がありたす。結局のずころ、ビゞネスロゞックも単玔です。倀を保存しお元に戻したす。事業䜓間の䟝存関係は取るに足らないか存圚しないため、無効化は簡単です。ただし、時間の経過ずずもにパフォヌマンスを向䞊させるには、たすたす倚くのビゞネス゚ンティティをキャッシュする必芁がありたす。



キャッシングは、パフォヌマンスの問題に察する特効薬ではありたせん。倚くの堎合、コヌドずコアストレヌゞを最適化するこずで、長期的にはうたくいくでしょう。さらに、キャッシングの導入は問題ぞの反応であるべきであり、時期尚早の最適化ではありたせん。



結論ずしお、アプリケヌションのパフォヌマンスを最適化し、スケヌラブルにするこずは、指定された非機胜芁件内で予枬可胜な動䜜を実珟するこずを目的ずした継続的なプロセスです。パフォヌマンスずスケヌラビリティの向䞊に費やされるハヌドりェアコストず開発時間を削枛するには、キャッシングが必芁です。



リンク






All Articles