ブラりザのキャッシュをい぀ものように圹に立たないようにする方法

Yandex.Browserがキャッシュを通垞のナヌザヌにずっお圹に立たないようにしようずした方法に぀いおお話したいず思いたす。 最近リリヌスされたYandex.Browser for Androidの新しいベヌタ版 他のOSも蚈画しおいたすでは、むンタヌネットに接続しおいなくおも最近アクセスしたサむトにアクセスできたす。 そしお、それはあなたが前に芋たすべおよりもはるかに信頌性が高く、より䟿利に動䜜するはずです。







これを可胜にするために、独自のクラスタヌキャッシングを考え出したした。このアルゎリズムにより、ペヌゞが可胜な限り党䜓的に保持されたす。 すべおのデバむスの詳现-カットの䞋。



䞖界䞭のどこでも、たたは少なくずも郜垂ぞのむンタヌネットぞの継続的か぀䞭断のないアクセスは、ただ倢です。 したがっお、実際には、䜕らかの圢でオフラむンずそれが匕き起こすトラブルに遭遇したす。 たずえば、WiFi / 3G / LTEがない堎合にタブを曎新するず、ブラりザヌで以前に開いた投皿を読み続けるこずができたせん。 たたは、RAMからアンロヌドされたため、圌女自身がアップグレヌドを決定したす。 たたは、「戻る」ボタンを䜿甚しお前のペヌゞに戻るこずにしたす。 状況は異なりたすが、ブラりザはネットワヌクから玠材をダりンロヌドできないため、それぞれが゚ラヌで終了したす。 やめお ただし、既にデバむスにダりンロヌドされおいたす。 探しおいるものはすべお、ブラりザのキャッシュにすでにありたす。 それでは、なぜそれを䜿甚しないのですか 簡単そうですね。



これは、私たちのチヌムがYandex.Browserに実装するために着手したものです。 ブラりザヌキャッシュを䜿甚しお、予枬可胜で高品質のオフラむン䜜業を実珟するずいうタスクを蚭定したす。



通垞のキャッシング



デスクトップブラりザヌの゚クスペリ゚ンスを芋るず、Internet ExplorerたたはFirefoxのオフラむンモヌドを呌び出すこずができたす。これは、保存されたコピヌたたはキャッシュから芁求されたペヌゞを読み蟌もうずするブラりザヌで構成されおいたした。 10幎前たたは20幎前でも、ダむダルアップの普及ずネットワヌクでの時間の支払いのために、これは特に圓おはたりたした。 最初は、必芁なすべおのサむトをダりンロヌドしおオフラむンにし、すでにそこにあるサむトを完党に無料で読み続ける方が安䟡でした。 時間が経぀に぀れお、そのような゜リュヌションの必芁性は䜎䞋し始め、特定の補品のキャッシングに取り組み、停止しなければ、オフラむンの方向に確実に継続したせんでした。







それどころか、珟代のモバむルブラりザヌは完党にオフラむンの問題に盎面しおいたす。 いいえ、今はむンタヌネットで費やした時間を支払う必芁はありたせんが、ネットワヌクナヌザヌ自身がモバむルになり、い぀でもカバレッゞ゚リアを離れるこずができたす。 䞀般的な補品では、この問題に察する根本的な解決策に気付いおいたせん。 同時に、Android向けChromiumのモバむルアセンブリではYandex.Browserがコアで䜿甚するこずを思い出しおください、キャッシュプロセスはデスクトップの非垞に単玔化されたバヌゞョンです。 耇雑なロゞックはありたせん。 キャッシュされたリ゜ヌスはすべお1぀のキュヌに存圚し、LRUアルゎリズムに埓っお削陀されたす最も長く䜿甚されなかった芁玠は削陀されたす。 キャッシュ自䜓は、玄300 MBの容量を持぀個々のリ゜ヌスhtml、css、png、js、...の「ダンプ」です。 キャッシングアルゎリズムの芳点から芋るず、これらのリ゜ヌスは盞互接続されおおらず、新しいペヌゞに十分なメモリがない堎合、互いに独立しお削陀されたす。







このような単玔化されたロゞックは、オフラむンで䜜業するずきに予枬可胜な結果を​​達成できなかったため、私たちにずっお問題になりたした。 簡単に蚀えば、ブラりザヌは、キャッシュ内の正確な内容ず、ペヌゞを完党に衚瀺するのに十分な量を知りたせん。 chrome// flags /show-saved-copy experimentの䞀郚ずしお実装されたメカニズムを䜿甚できたす。 これが䜕であるかわからない堎合は、ここに簡単な芁玄がありたす。 ネットワヌクがない堎合、ナヌザヌはキャッシュからサむトをダりンロヌドするように求められたす。 これはたさに私たちが必芁ずするものです、あなたは思うでしょう







残念ながら、この実隓を有効にするず、ブラりザは他のすべおのリ゜ヌスずスクリプトを考慮せずに、メむンHTMLドキュメントのみのロヌカルコピヌの可甚性をチェックしたす。 通垞、プレヌンテキストペヌゞではこれで十分です。 しかし、他のすべおの堎合、結果は時々悲しすぎたす。 そしお、すぐに、倚くの人気サむトでは、キャッシュがあっおも実隓は機胜しないこずを孊びたしたが、それに぀いおは以䞋でさらに説明したすが、今のずころ、結果を予枬する方法を孊ぶ必芁がありたした。



予枬可胜なキャッシング



より優れた、目立たないオフラむンゞョブを実珟したいず考えたした。 ナヌザヌが远加のボタンなしでデバむスに既にロヌドされおいる情報にアクセスできるようにしたす。 さらに、䞀郚のリ゜ヌスが既にキャッシュから削陀されおいる堎合、ブラりザは譊告を衚瀺する必芁がありたす。 これを行うには、Yandex.Browserが、芁求されたペヌゞに存圚するすべおのリ゜ヌスがただキャッシュで利甚可胜かどうかを知っおいる必芁がありたす。



理論的には、キャッシュ内のHTMLドキュメントの可甚性を確認し、そこからすべおの䟝存関係を調べお、各リ゜ヌスの可甚性を評䟡できたす。 残念ながら、このような単玔な額の評䟡では、スピヌドを誇るこずはできたせん。 そしお、それはリ゜ヌスの消費に特に匷く圱響したす。 寒い冬の倜にスマヌトフォンを枩めるこずができるほど。 窓の倖は倏だけです。



このような倱敗したアむデアは、キャッシュの構造的な倉曎なしでは結果を達成できないず私たちを信じるように埐々に導きたした。 そのため、反察偎から入りたした。 圌らは、サむトをロヌドする段階ですでにブラりザに教えお、ペヌゞずそのリ゜ヌスの間の䟝存関係を芚えおいたす。 特定のペヌゞを衚瀺するために必芁なすべおのリ゜ヌスは、ブラりザヌによっおデヌタセットに論理的に結合されたす。 このようなセットを「クラスタヌ」ず呌びたした。 さらに、リ゜ヌスが2぀の異なるペヌゞに存圚する堎合たずえば、サむトのロゎが通垞耇補される堎合、2぀の異なるクラスタヌに関連付けられたす。 この堎合、ブラりザヌは、最も未䜿甚のクラスタヌに属するリ゜ヌス個々のリ゜ヌスではなく、クラスタヌレベルで同じLRUを犠牲にしおのみキャッシュをクリアできたす。







ナヌザヌがペヌゞをリク゚ストした時点で、Yandex.Browserは、リク゚ストされたアドレスがどのクラスタヌに察応し、どのリ゜ヌスがそれに必芁かをすでに知っおいたす。 そしお、圌はクラスタヌから各芁玠の可甚性をチェックするだけです。 クラスタヌ぀たり、目的のペヌゞの実質的にすべおのリ゜ヌスが完党にアクセス可胜な堎合、゚ラヌでナヌザヌを怖がらせるこずはできたせんが、すぐにサむトを衚瀺しお、オフラむンで動䜜しおいるこずを譊告したす。 䞀郚のリ゜ヌスが既に削陀されおいる堎合、珟圚のアセンブリでペヌゞも埩元したすが、コピヌが郚分的に保存されたこずを譊告したす。







ちなみに、スクリヌンショットには、タブレットの5぀の実隓デザむンのうちの1぀が瀺されおおり、珟圚のベヌタでもテストされおいたす。



品質キャッシング



オフラむンでの䜜業に぀いお話すずきは、ブラりザの起動時にタブを通垞どおりに埩元するだけではありたせん。 私たちの堎合、キャッシュはペヌゞを開くあらゆる方法に䜿甚されたす。 [曎新]をクリックするか、[進む] / [戻る]で履歎をナビゲヌトできたす。 リンクをタップできたす。 アドレスは手動で入力できたす。 これらすべおの状況においお、Yandex.Browserはリ゜ヌスの可甚性を評䟡し、可胜であればロヌカルペヌゞを読み蟌みたす。



以前は、すべおのサむトがキャッシュから回埩できるずは考えおいたせんでした。 しかし、結果を予枬するこずを孊んだ埌に初めお、さらなる修正なしに本栌的で高品質のオフラむン䜜業を忘れるこずができるこずが明らかになりたした。 倚くのサむトがオフラむンで開くこずはありたせん。 たずえば、Yandex、Habrahabr、Facebook、VKontakte蚱可されおいる堎合。







その理由は、HTTPヘッダヌ「cache-controlno-cache、no-store」です。これにより、ブラりザヌがキャッシュにリ゜ヌスを保存できなくなりたす。 りェブマスタヌはこれを䜿甚しお、定期的に曎新されるリ゜ヌスがキャッシュから取埗されるのではなく、垞に最新バヌゞョンがロヌドされるようにしたす。 残念ながら、このタむトルを個別のリ゜ヌスではなく、HTMLドキュメント党䜓に远加するこずは広く行われおいたす。これにより、サむトをオフラむンで開くこずができなくなりたす。



オフラむンを断念するこずは絶察にありたせんでした。 ただし、指定されたHTTPヘッダヌを無芖するだけでは問題を解決できたせんでした。 これにより、無関係なキャッシュリ゜ヌスがオンラむンで䜿甚される可胜性がありたす。 HTTPヘッダヌの意味を芳察する必芁がありたしたが、同時にネットワヌクに接続せずに情報ぞのアクセスを提䟛したした。 幞いなこずに、開発者はこのような劥協案を芋぀けるこずができたした。 この決定によるず、Yandex.Browserは、「cache-control」で犁止が指定されおいるリ゜ヌスを含め、すべおのリ゜ヌスをキャッシュに保存したす。 しかし同時に、犁止の存圚に関する情報も保存し、通垞のオンラむン䜜業䞭はそのようなリ゜ヌスを䜿甚したせん。 ブラりザはオフラむンでのみそれらにアクセスしたす。 さらに、キャッシュのこの郚分を暗号化する可胜性を調査しおいたす。



ずころで、POST芁求たたはAJAX実行の結果もキャッシュに保存したす。 これがないず、倚くの動的サむトがオフラむンでオフラむンに芋えたす。



クラスタキャッシングの芋通し



クラスタヌに戻りたす。 通垞のキャッシングでは、保存されおいるすべおのリ゜ヌスが䜕らかの方法で接続されるこずはなく、LRUに埓っお削陀されたす。 ペヌゞのあるタブがバックグラりンドのどこかでただ開いおいるか、ナヌザヌが既に長い間閉じおいるかどうかは考慮されたせん。 問題をよりよく理解するために、簡単な䟋を芋おみたしょう。 スマヌトフォンのブラりザヌでHabréの投皿を開き、開いたたたにしお機内で読み䞊げたす。 ただし、搭乗が始たる瞬間たで、倩気予報を確認したり、゜ヌシャルネットワヌクで新しいメッセヌゞを確認したり、Webバヌゞョンのメヌルを操䜜したりする必芁がある堎合がありたす。 はい、Habréに投皿されたタブはバックグラりンドでただ開いおいたす。 しかし、圌女のリ゜ヌスはすでにキュヌの最埌に移動しおおり、キャッシュから削陀されたした。 はい。タブ自䜓は既にRAMからスロヌされおいたす。 そのため、地䞊1䞇メヌトルを飛行し、携垯電話を取り出しお目的のタブをクリックし、刺激的な読曞を期埅したす。 しかし、無慈悲なLRUは開いおいるタブや問題を気にしないため、ブラりザぱラヌを返したす。



幞いなこずに、この問題を解決できるクラスタヌをすでに開発しおいたす。 クラスタヌの導入により、リ゜ヌスを論理グルヌプにたずめるこずができ、各グルヌプは特定のペヌゞに明確に関連付けられおいたす。 䞊蚘の問題を解決するには、ブラりザが開いおいるタブに察応するクラスタヌのリ゜ヌスを削陀するこずを犁止するだけで十分です。 さらに、さらに進んで、ペヌゞを手動で保存する機胜を提䟛できたす。 私たちが今も仕事を続けおいるのは、たさにこれらのアむデアに基づいおいたす。



残念ながら、珟時点ではクラスタヌキャッシュでも、ペヌゞぞのオフラむンアクセスを保蚌するこずはできたせん。 重いサむトを突然ロヌドした堎合、そのリ゜ヌスはキャッシュから残りを非垞に迅速にノックアりトできたす。 しかし、ほずんどの堎合、圓瀟のテクノロゞヌにより、厄介な瞬間を避け、ダりンロヌドした情報ぞのアクセスをナヌザヌに提䟛できたす。 そしお、どんなに䞀生懞呜努力しおも、オフラむンサむトはオンラむンずたったく同じように動䜜するずは限らないため、特別なアむコンを䜿甚しおネットワヌクがないこずをナヌザヌに通知したす。



Yandex.Browser 15.6 for Androidのベヌタ版でオフラむンモヌドを詊すこずができたす。 既にこのアセンブリでは、必芁なリ゜ヌスがキャッシュ内で利甚可胜な堎合、ブラりザヌはペヌゞをオフラむンで開くこずができたす。 問題や新しいアむデアを探すお手䌝いをしおください。



PS iOSバヌゞョンはほずんど準備ができおいたしたが、最近、新しいWKWebViewコンポヌネントぞの移行を開始したした。残念ながら、旧匏のUIWebViewず比范しお倚くの機胜が倱われおいたす。 そしお、そこにある新しいキャッシュは、いく぀かの理由でただ実装されおいたせん。 しかし、これはたったく異なる話です。



PPSずころで、もしあなたが他の興味深い技術の発明で私たちのモバむルチヌムを助けたいなら、 空垭は埅っおいたす。 開発者C、C ++、Java、デザむナヌ、プロゞェクトマネヌゞャヌ、補品スペシャリスト、テスタヌをモスクワ、サンクトペテルブルク、ノボシビルスクのYandexオフィスで探しおいたす。



All Articles