写真を最適化するこずを決定した方法-そしおその過皋で、サむト、管理パネル、およびむンタヌフェむスぞのアプロヌチを再蚭蚈したした

MeduzaのテクニカルディレクタヌであるBorisGoryachevが報告したす。



私たちの䞻力補品であるサむトは、垞に新しい機胜で倧きくなりすぎおいたすが、そのため、埐々に重くなり、扱いにくくなっおいたす。したがっお、私たちの技術郚門は、それをより簡単か぀迅速にするために時々忙しいです。







ほずんどすべおのサむト、特にメディアサむトの読み蟌み速床に圱響を䞎える䞻な芁玠の1぀は、画像です。Meduzaにはたくさんの写真があり、これは線集者がストヌリヌを䌝えるための貎重な方法です。私たちの写真サヌビスの芁件は、次のように定匏化するこずができたす。



  • 写真はできるだけ早くCMS「モニタヌ」ず呌びたすにアップロヌドする必芁がありたす
  • 写真は矎しく、すべおのプラットフォヌムで芋栄えがする必芁がありたす
  • リヌダヌはこの画像が読み蟌たれるのを埅぀必芁はありたせん




最初のアプロヌチ



2014幎にリリヌスしたずき、モニタヌにロヌドされた画像を操䜜するプロセスは次のようになりたした。ファむルはPaperclipずImagemagickを䜿甚しおRailsアプリケヌションにロヌドされ、メタデヌタがクリアされ、遞択された品質で圧瞮されたしたJPEGの堎合は玄75でした。 3぀のサむズにカットしたす。電話の堎合は小さい、タブレットや倧画面の電話の堎合は倧きい、コンピュヌタヌの堎合は非垞に倧きい。スラむスされたファむルは、元のファむルず䞀緒にAWSクラりドストレヌゞに配眮されたした。それらはAWSから盎接䞎えられたそしお䞎えられたのではなく、゚ッゞサヌバヌにキャッシュするCDNを介しお䞎えられたした。



サむトずアプリケヌションのJSONを生成するAPIは、資料の芋出しなどの単玔な属性に加えお、資料の「コンテンツ」郚分に挿入され、CSSスタむルでハングアップするHTMLコヌドの巚倧なチャンクも提䟛したした。そしお、API自䜓は、サむト、アプリケヌション、RSSや怜玢などのサポヌトサヌビスなど、すべおのクラむアントで同じでした。







このアプロヌチは時の詊緎に耐えられないこずがすぐにわかりたしたが、迅速に立ち䞊げ、膚倧な数の仮説をテストし、実隓し、生き残る必芁がありたした。私たちは意識的に少なくずもそれを信じおいたすが、コヌドや゜リュヌションの矎しさではなく、「クラッチ」を遞択したした。時が経ち、私たちの聎衆ず私たちの補品は成長したした。そしおこれに䌎い、線集者の欲求も高たりたした。線集者は、資料にたすたす倚くのテクニックず「トリック」を求めおいたした。同時に、もちろんデザむンも倉わりたした。



技術郚門は、写真のスタむル、衚瀺方法、サむズをいじくり回さなければなりたせんでした。それらは、サむトのデザむンや新しい芁玠の倉曎に䌎っお倉曎されたした。たすたす奇劙な゜リュヌションを远加しおサポヌトしたした。



ここにそれらの1぀がありたす




時間が経぀に぀れお、モニタヌはそれに遭遇したすべおの人を激怒させたした線集スタッフはバグに苊しんでいたした。これらのバグの修正には時間がかかり、開発者は激怒し、発明されたアヌキテクチャの制限は䞊叞に合わなかったため、補品を迅速に開発できたせんでした。



モニタヌの再蚭蚈を開始したした。玄1幎間、材料の䜜業を担圓するCMSの䞻芁郚分を曞き盎し、叀いバヌゞョンのバグに定期的に気を取られおいたした。その埌、「Meduza」に内郚ミヌムが衚瀺されたした。「新しいモニタヌに衚瀺されたす。」これが私たちが線集者の芁求のほずんどに答えた方法ですが、もちろん、叀いCMSず新しいCMSで同時にいく぀かのこずを行いたした。今のずころ悪いバヌゞョンであり、埌で良いバヌゞョンです。



「モニタヌ」の倉曎に぀いおは、たもなくブログに別の投皿を曞きたす。



再起動



Meduza党䜓を再起動しお再構築した埌、APIの圢匏は同じたたでしたが、CMS自䜓によっお圢成されなくなり、別のサヌビスによっお凊理されたした。そしお最終的に、APIをいく぀かに分割するこずにしたした-クラむアントごずに。



モバむルアプリケヌションから始めるこずにしたした。その時たでに、圌らはすでにデザむン、UX、速床に぀いお質問をしおいたので、アプリケヌションをクリヌンアップし、iOSずAndroidの開発者が望む方法でAPIを䜜成したした。



APIを分離する前は、WebViewを介しお資料のコンテンツ郚分を衚瀺しおいたため、アプリケヌションやサむトだけに䜕かを衚瀺するこずはできたせんでした。すべおがどこにでも衚瀺されおいたした。今では、コンテンツをより柔軟に管理する機䌚がありたす。モバむルアプリケヌションに必芁なものだけを提䟛し、重い芁玠を別の方法で衚瀺しYouTubeビデオ挿入など、最埌にLazy Loadを䜜成したす。これにより、重い芁玠を埐々にマテリアルにロヌドできたす。写真ず埋め蟌み。



アプリケヌションを分離した埌、サむトに焊点を合わせたした。この時点で、既存のサむトのコヌドを倉曎せずに、すべおを最初から䜜成するこずがすでに決定されおいたすはい、1幎以䞊続くプロゞェクトに参加したした。同時に、テクニカルディレクタヌが亀代し、新しい圹職では、プロゞェクトを監査し、䜕を閉じるこずができるかを決定し、䞊叞ず調敎する必芁がありたした。すべおの困難にもかかわらず、チヌムは新しいサむトを完成させるこずにしたした。しかしその前に、私は別のプロゞェクトが必芁だず決めたした。



これがメデュヌサのUIキットの登堎です



コンテンツを柔軟に配信するには、倉換に最も適した圢匏である必芁がありたした。コンテンツナニットのセマンティック境界画像、テキストの段萜、芋出しは適切に調敎する必芁がありたす。コンテンツの䞀郚は、単玔すぎたり耇雑すぎたりしおはなりたせん。耇雑な堎合は、おそらく耇数の意味がありたす。単玔すぎる堎合、おそらくそれを䜿甚するずきは耇雑なロゞックでハングアップする必芁があり、そのようなナニットを再利甚する必芁があるずきは、プロゞェクトコヌドのさたざたな郚分にコピヌする必芁がありたす。メデュヌサのゲヌム



を䟋にずっおみたしょう。..。圌らはあなたが遊び心のある方法で膚倧な数の物語を語るこずを可胜にしたす。それらは、特に議題のために、たたは広告䞻の芁求に応じお䜜成するこずができたす。たたは、ゲヌムは、いわゆるメカニズム繰り返し䜿甚される圢匏に基づいお䜜成するこずもできたすたずえば、これらはテストです。



Meduzaのゲヌム蚭蚈、䜜成、および再利甚

の方法これらのゲヌムのコヌドは、サむトのコヌドに含たれおいたせん。それぞれが個別のマむクロサヌビスずしお䜜成され、iframeを介しおサむトに埋め蟌たれ、postMessageを介しおサむト自䜓ず通信したす。そしお、サむトはゲヌムが行われる堎所に䜕を衚瀺するかを本圓に気にしたせん。さらに、ゲヌム自䜓はサむトから芖芚的に分離できない必芁がありたす。タむポグラフィずむンタヌフェむス芁玠は同じである必芁がありたす。







ゲヌムを始めた圓初は、スタむルやボタンなどをコピヌしおいお、もちろん速くお倖芋は良かったのですが、䞭はひどいものでした。



チヌムはこれを倉曎する必芁があるず刀断したした。サむトの通信を䞀時停止し、独自のUIキット繰り返し芁玠ずスタむルをすべお含むラむブラリの䜜成を開始したした。サむト、ゲヌム、メカニックずいう長い芖点を芋逃さないように努めたした。すべおが同じラむブラリを䜿い始める必芁がありたした。



Web䞊のすべおのMeduzaプロゞェクトはReactで蚘述されおおり、UIキットはnpmモゞュヌルであり、珟圚、開発するほずんどすべおのものにプラグむンしおいたす。そしお、開発者は、䜕かをレンダリングする必芁があるずきに、次のようなものを蚘述したすレンダリングブロック。







それは䜕をするためのものか



  1. フロント゚ンド開発者は、䜕かをレンダリングする方法を正確に考えおいたせん。
  2. すべおはすでに蚭蚈郚門によっおレビュヌされおいたす。
  3. : UI-kit, , , . , «», .
  4. — - UI-kit ( ) .


UI-kit



コンポヌネントには、コンテンツずフロント゚ンドの2぀のグルヌプがありたす。埌者は、ボタンやアむコンなどの非垞に単玔なReactコンポヌネントです。











コンテンツコンポヌネントはもう少し耇雑ですが、それでも非垞に単玔です。コンテンツの1぀の単䜍を衚すスタむルを持぀Reactコンポヌネント。たずえば、段萜コンポヌネントは次のようになりたす







。単玔なブロックを「キャッチ」







するコンポヌネントこれは画像をレンダリングするコンポヌネントです。







サむトがデヌタを取埗するAPIには、各マテリアル内に、UIキットを介しお最終的に「レンダリング」されるコンポヌネントの配列が含たれおいたす。 ..。ゲヌムでは、すべおが同じように機胜し、デヌタを取埗するためにAPIのバヌゞョンにアクセスするだけです。



やったヌ、再起動したした



以䞋は、平均ペヌゞ読み蟌み時間を瀺すグラフです。これは非垞に䞍正確な指暙であり、すべおのデバむスのすべおのペヌゞが考慮されたすが、それでも傟向のアむデアを提䟛したす。







グラフは、Meduzaの存圚党䜓にわたっおサむトの速床がどのように倉化したかを瀺しおいたす。2014幎に非垞にシンプルなサむトで最初に立ち䞊げたずき、それは非垞に高速でした。しかし、新しい機胜を远加し始めるず、ダりンロヌド速床が䜎䞋したした。



これは同じスケゞュヌルですが、過去2幎間です。これは、サむトの再起動埌にペヌゞの読み蟌み時間がどのように短瞮されたかを瀺しおいたす。







そしお぀いに写真の時が来たした。



画像



画像を扱うスキヌムは圓時でした。写真はAPIを介しお送信され、/ images / attachments /.../random.jpgのようなアドレスがありたした。ファむル自䜓は、AWSクラりドストレヌゞからCDNを介しお提䟛されたした。







新しいシステムの芁件を次のように策定したした。



  • この゜リュヌションでは、送信する画像のサむズず品質をすばやく倉曎できるはずです。
  • 高䟡である必芁はありたせん
  • 倧量のトラフィックを凊理できる必芁がありたす


私たちが目指しおいた蚈画は、このようになりたした。バック゚ンドは、クラむアントブラりザたたはアプリケヌションによっお取埗されるURLを生成したす。 URLには、必芁な画像、品質、サむズに関する情報が含たれたす。



このURLの画像がすでに゚ッゞサヌバヌ䞊にある堎合は、すぐにクラむアントに提䟛されたす。そうでない堎合、゚ッゞサヌバヌは次のサヌバヌを「ノック」したす。次のサヌバヌはすでに芁求をサヌビスに枡したす。このサヌビスは、画像のURLを受信するず、それをデコヌドしお、元の画像のアドレスずその操䜜のリストを刀別したす。その埌、サヌビスは倉換されたむメヌゞを提䟛し、CDNに保存され、芁求に応じお提䟛されるようにしたす。







Meduzaにはすでに同様の゜リュヌションがありたす。たずえば、゜ヌシャルネットワヌク䞊の玠材やゲヌムのスニペットの写真も同様に䜜成したす。このサヌビスでは、ヘッドレスChromeを介しおHTMLペヌゞのスクリヌンショットを䜜成したす。



新しいサヌビスは、画像を操䜜し、簡単な効果を適甚し、高速で埩元力があるはずでした。私たちはすべおを自分で曞くのが倧奜きなので、もずもずそのようなサヌビスをElixir蚀語で曞くこずが蚈画されおいたした。しかし、チヌムの誰も十分な時間がありたせんでした、そしお確かに誰もjpg、png、gifの玠晎らしい䞖界に飛び蟌むこずを望んでいたせんでした。



画像を圧瞮するラむブラリを芋぀ける必芁がありたした。私たちがすでに経隓したImagemagickは最速の解決策ではありたせんでしたが、少なくずも私たちはそれを調理する方法を知っおいたした。他のすべおは新しく、チェックするこずがたくさんあるでしょう。



たた、webp画像圢匏のサポヌトも必芁でした。



時が経ち、私たちはこのプロゞェクトに没頭する準備をしたした。しかし、その埌、私たちのプログラマヌの1はimgproxyラむブラリ、読んからみんな邪悪な火星人がオヌプン゜ヌスにアップロヌド。 説明によるず、それは完璧なヒットでしたGo、Libvps、既補のDockerむメヌゞ、Envを介した構成。同じ日に、私たちはラップトップにラむブラリを展開し、DevOpsにもそれで遊ぶように䟝頌したした。圌の仕事は、サヌビスを起動しお匷制終了するこずでした。これにより、サヌバヌでどのような負荷に耐えられるかを理解できたす。この間、バック゚ンドチヌムは自分のコンピュヌタヌでプロゞェクトに手を出し続けたした。私たちは、Rubyスクリプトを䜜成し、䜿甚可胜な機胜を習埗したした。







ラむブラリを本番環境で䜿甚できるずいう刀断でDevOpsが戻っおきたずき、私たちはimgproxyを通過した倚数の画像を収集し䞻にwebpに関心がありたした、写真の挔出を行いたした。技術郚門の埓業員は、この品質が私たちに適しおいるかどうかを自分で刀断するこずはできたせん。写真線集者からコメントが寄せられ、䜕かを調敎し、画像の重さがあたりないこずを確認しお、バック゚ンドコヌドを䜜成したした。



ここでは、すべおが非垞に単玔であるこずがわかりたした。サむトのAPIのバヌゞョンでは、画像はすでにコンポヌネントによっお他のすべおから分離されおいたため、JSONを拡匵し、さたざたなサむズず圢匏でアドレスを远加したした。











䜕も倉曎せず、远加しただけなので、曎新されたものはすぐに本番環境に移行したした。フロント゚ンドの担圓者は、すべお同じバヌゞョンのAPIで関数を開発できたした。圌らは、機胜の芳点から画像コンポヌネントを拡匵し、さたざたなサむズの画像セットを远加し、Safari甚の特別な「クラッチ」を远加したした。サむズの衚を数回倉曎し、線集局の目で結果を確認したした。このために、サむトの珟圚のバヌゞョンず、レビュヌ甚の新しい画像の耇補を圌女に枡したした。



コメントが届かなくなったずき、私たちはようやく展開し、キャッシュを削陀しお、本番環境に展開したした。



出力



倉曎の本質は次のように芁玄できたす。コンテキストをより適切に考慮し、実装ずサポヌトを実装しやすい堎所に、どの画像をどの圢匏で提䟛するかに぀いおの意思決定の堎所をシフトしたした。



珟圚、Meduzaに衚瀺されるほずんどすべおの写真は、imgproxyの䜜業の結果であり、いずれの堎合もサむズが異なり、品質も異なる堎合がありたす。これは、応答を生成するAPIサヌビスが認識しおいるコンテキストコンテンツがWeb、モバむルアプリ、たたはAMPで開かれおいるかどうかによっお決たりたす。



All Articles