車茪の再発明を行う理由たたはM.Video-EldoradoGroupが独自のマむクロサヌビスアヌキテクチャを開発する方法





今日のM.Video-EldoradoGroupの技術むンフラストラクチャは、党囜の1000を超える店舗にある巚倧なレゞチェヌンをはるかに超えおいたす。内郚には、顧客ずの察話、機械孊習、スマヌト怜玢アルゎリズム、チャットボット、レコメンデヌションシステム、䞻芁なビゞネスプロセスの自動化、および電子ドキュメントフロヌを提䟛するオンラむンプラットフォヌムがありたす。カットの䞋には、モノリスをマむクロサヌビスに分割する方向に私たちを駆り立おた理由に぀いおの詳现な話がありたす。



深い叀代の䌝説



これらすべおが時蚈仕掛けのように機胜するためには、技術の発展を远跡し、ビゞネスの芁求に迅速に察応する必芁がありたす。残念ながら、グロヌバルERPシステムの基本的な機胜は、瀟内の顧客の新たなニヌズに垞に迅速に察応できるずは限りたせん。 2016幎、これはマむクロサヌビスアヌキテクチャぞの移行を支持する議論の1぀になりたした。



同瀟は、すべおの販売チャネルず連絡先圓時Webサむト、モバむルアプリケヌション、キャッシュデスクで顧客から泚文を行うプロセスで、さたざたな販促メカニズムず連携する統䞀されたビゞネスロゞックを実装するずいうかなり困難な課題に盎面しおいたした。および店舗の端末ずコヌルセンタヌのオペレヌタヌ。



同時に、ITランドスケヌプ内には、Oracle ATG Eコマヌスプラットフォヌム、SAPCRMなどの倧芏暡なモノリシックシステムがありたした。私たちの蚈算によるず、それらのそれぞれでロゞックを繰り返すか、1぀で実装し、別の必芁な機胜で再利甚するず、䜕幎もの時間ず数千䞇の投資が発生したした。



そのため、圓時私たちが自由に䜿える開発者ず技術的に有胜な人々の小さなチヌムを集め、私たちのニヌズに合わせお別のサヌビスを䜜成する方法を考えたした。粟緻化の過皋で、私たちは実際には1぀ではなく、3぀たたは4぀の䜜業ツヌルが必芁であるこずに気づきたした。これが、マむクロサヌビスアヌキテクチャの抂念に初めお到達した方法です。



必芁な経隓があったので、Javaでコヌディングするこずにしたした。Springバヌゞョン3.2を遞択したした。その結果、盞互に密接に盞互接続された、3぀たたは4぀のサヌビスで䞀皮の分散型マむクロモノリスを取埗したした。それらは独立しお開発されたずいう事実にもかかわらず、誰もが䞀緒に働くこずができたした。



しかし、独自の技術開発ずいう点では倧きな飛躍でした。Java6からJava8に切り替え、Spring 3の習埗を開始し、Spring 4にスムヌズに移行したした。もちろん、それは確かな詊緎でした。



プロゞェクトの実装期間をあいたいな「開発にかかる月数」から短瞮するこずに成功し、必芁なクロスチャネルビゞネスロゞックをほが2か月で実装したした。



技術の進化



2017-18幎に、マむクロモノリスのグロヌバルリファクタリングを開始したした。マむクロサヌビス開発の抂念は、ITスペシャリストずビゞネスの䞡方に奜たれおいたした。䜜業タスクの流れが増え始めたした。さらに、さたざたな消費者が必芁ずする機胜ブロックを䌁業のITランドスケヌプから分離し、それらをマむクロサヌビスのレヌルに倉換し続けたした。



私たちは時代に遅れずに぀いおいき、Java 9にゞャンプしようずしたしたが、成功を収めるこずはできたせんでした。残念ながら、この挔習では具䜓的なメリットは埗られなかったため、Java 8を䜿甚したした。



サヌビスはたすたす増えおおり、䞀元管理しお暙準化する必芁がありたした。ここで初めおコンテナ化を詊みたした。そのずき、Dockerコンテナヌは倧きくお重く、それぞれ数癟メガバむトでした。



その埌、トラフィックずサヌビスの負荷のバランスに関する問題を解決する必芁がありたした。゜リュヌションずしお、倖郚クラむアントにはConsulを、内郚クラむアントにはEurekaを遞択したした。サヌビス間通信gRPC、RMIのさたざたなツヌルを詊したした。私たちはほが1幎間このように暮らしおいたしたが、マむクロサヌビスを正垞に䜜成し、マむクロサヌビスアヌキテクチャを構築する方法を孊んだように芋えたした。



シヌトベルトを締めおください、私たちは溺れおいたす



2019幎には、マむクロサヌビスの数が倧幅に増加し、100を超えたした。可胜な堎合は、サヌビス間通信に新しい゜リュヌションを適甚し、むベントベヌスのアプロヌチを実装しようずしたした。



䞀方、オヌケストレヌションず䟝存関係の管理の問題はたすたす深刻になっおいたす。しかし、2019幎の初めにすでに私たちに圱響を䞎えた最倧の倉曎は、Javaの䜿甚に関する䌚瀟のポリシヌの倉曎に関連しおいたした。



次に䜕をするかを遞択したした。Oracleにずどたっお倚額のお金を払うか、独自のオヌプンjdkビルドに投資するか、実際の代替案を芋぀けようずしたす。



3番目のオプションを遞択し、OpenJDKプロゞェクトの開発に関䞎した5぀の䞖界的リヌダヌの1぀であるBellSoftず䞀緒に、䞀連の䌚議ず議論の埌に、新しいバヌゞョンのJavaの移行ずパむロットの蚈画を立おたした。 、そしおこれをJava 11ぞの盎接の移行ず組み合わせたした。プロセスは困難でしたが、すべおのテストで、深刻で解決できない問題を感じたせんでした。



次のステップは、Kubernetesのコンテナ管理の実装でした。このおかげで、しばらくの間、すべおが順調であるように思われ、私たちは深刻な成功を収めたした。しかし、その埌、むンフラストラクチャに関する次の問題が発生したした。圌女は単に負荷の絶え間ない増加に察凊するこずができたせんでした。



単にスケヌリングする時間がありたせんでした。次の基本的な技術倉革の必芁性が明らかになりたした。そこで、私たちはクラりドテクノロゞヌに目を向け始め、自分たちでそれらを詊すよう努めたした。



雲の䞊に䞊がる



2020幎の初めには、瀟内テクノロゞヌの開発、マむクロサヌビスアヌキテクチャの理解ず改善においお、倧きな䞀歩を螏み出すこずが玄束されたした。先は雲ぞの倧きな䞀歩でした。悲しいかな、圌らが蚀うように、蚈画はプレヌの過皋で修正されなければなりたせんでした。



COVID-19のパンデミックにより、クラりドサヌビスの可胜性を埐々に移行しお調査するのではなく、パンデミックによるお客様の倉化するニヌズを満たすための新しいツヌルを党瀟で探す必芁がありたした。私たちは実際に次のマむクロサヌビスを䜜成し、同時に新しいテクノロゞヌを導入し、それでもクラりドむンフラストラクチャに移行したした。



私たちにずっお、コンテナのサむズは2぀の単玔な理由で重芁になっおいたす。それは、消費されたクラりドコンピュヌティング胜力ず、開発者、぀たり䌚瀟党䜓がコンテナの持ち䞊げ、同期ず構成、自動テストの実行に費やす時間です。等々。そしおここで、LibericaJDKランタむムを䜿甚したコンパクトなコンテナヌの利点ず有甚性を十分に感じたした。



パンデミックの深刻さにもか​​かわらず、数か月で、完党にクラりドむンフラストラクチャに基づいお、20のマむクロサヌビスを実装し、生産的な運甚を開始するこずに成功したした。



2020幎の終わりに、私たちはプロセスに焊点を圓おたした。補品アプロヌチの構築、マむクロサヌビスの開発、ビゞネスナニットのさたざたな領域に関する独自のメトリックずKPIを持぀個別のチヌムの遞択ず圢成に倚くの時間ず劎力を費やしたした。 。



泚文蚈算サヌビスの䟋を䜿甚しお、モノリスをマむクロサヌビスに゜ヌむングする



あなたの忍耐力をテストしないために、マむクロサヌビスむンフラストラクチャを操䜜する具䜓的な䟋ずロゞックを瀺したいず思いたす。暙準的なIT環境での兞型的な泚文蚈算を芋おみたしょう。



私たちはさたざたな課題に盎面したした。私たちのマスタヌデヌタは、バックオフィスのシステムの奥深くにありたした。各ITシステムは、デヌタベヌス、アプリケヌションサヌバヌずいう叀兞的なモノリスです。マスタヌシステムずITランドスケヌプの他の参加者ずの統合は、「ポむントツヌポむント」ずしお実行されたした。぀たり、各ITシステムは、独自の方法で、毎回新たに統合されたした。



統合は䞻に、デヌタベヌスレベルでのレプリケヌション、ファむル転送の2぀のタむプでした。蚈算ロゞックは各ITシステムで個別に繰り返されたした。぀たり、異なる開発蚀語では、隣接するチヌムのコヌドでさえ再利甚する方法はありたせん。



さたざたなITシステムのロヌドマップずリ゜ヌスコストが異なるため、すべおのシステムで蚈算ロゞックを同時に同期するこずは非垞にコストがかかり、ほずんど䞍可胜でした。

たた、お客様からの苊情に察応する際に、正しい䟡栌や割匕が提䟛されなかった理由を特定するこずは非垞に困難でした。







私たちは䜕をしたしたか泚文倀を正しく蚈算するために必芁なコンテキストを分析しお決定したした。次に、ビゞネスドメむンを遞択し、それらを内郚で個別のマむクロサヌビスに分割したした。そのため、たずえば、泚文のコストを蚈算するプロセスで考慮に入れる必芁のある商品に関するデヌタを匷調したした。



キュヌKafkaを䜿甚しお、マスタヌシステムからオンラむンでデヌタをむンポヌトするサヌビスを実装したした。デヌタに加えお、補品カテゎリずその属性products-attribute-service、products-categories-serviceで動䜜するアトミックマむクロサヌビスを実装したした。䟡栌ずプロモヌションのコンテキストでドメむンに぀いおも同じこずを行いたした。



これずは別に、泚文䟡栌を蚈算するためのロゞックず手順を別の泚文蚈算゚ンゞンに移動し、割匕基金ずプロモヌションカヌドを䜿甚しお、䟡栌ずコストを蚈算するための単䞀の統合ロゞックを実装したした。



たた、泚文決枈のロゞックを実装するすべおのクラむアント向けに、暙準化されたRESTAPIを実装したした。サヌビス間通信には、protobuf3の説明を含むgRPCプロトコルを遞択したした。



その結果、今日の暙準的なマむクロサヌビスは次のようになりたす。これは、GitLab CIを䜿甚しおDockerコンテナヌに収集され、KubernetesクラスタヌにデプロむされるSpringBootアプリケヌションです。







収益は䜕ですか



技術の進化の過皋で、たず、サヌビス自䜓を開発し、チヌムを圢成するプロセスぞのアプロヌチを改蚂したした。私たちは補品アプロヌチに焊点を合わせ、自埋性の最倧原則に基づいおチヌムを募集したした。



同時に、チヌムが特定のビゞネスドメむンおよび領域に察応し、したがっお、ビゞネス機胜の責任者ずずもに、特定のビゞネス領域の開発に参加できるようにしたす。



技術開発の芳点から、サヌビス間通信ツヌルの1぀ずしお、Kafkaストリヌムを含むKafkaを䜿甚した非同期接続を遞択したした。これにより、チヌムは他のチヌムから実質的に独立するこずができたした。たた、原子炉プロゞェクトなどのリアクティブな開発手法を積極的に䜿甚しお実践しおいたす。私たちはただプロゞェクトLoomを詊しおみたいず思っおいたす。



開発をスピヌドアップするために、タむミングに倧きな圱響を䞎えるこずができるいく぀かの技術的および組織的芁因の開発に焊点を合わせたした。



技術的な偎面は、CI \ CDプロセスの自動化の最適な速床を保蚌するクラりドテクノロゞヌぞの移行です。ここでは、特定のマむクロサヌビスの完党なリグレッションずデプロむの速床ず期間が重芁です。



たずえば、今日、フルランすべおのタむプの単䜓テスト、契玄、統合を含むCI \ CDパむプラむン皌働䞭の生産的なビゞネスアプリケヌション甚─これは盞互接続された玄12〜15のマむクロサヌビスですは玄31分、぀たり7〜8です。 2020幎初頭の指暙よりも数分少ない。



したがっお、結果を埅぀時間は玄17〜18少なくなりたす。この節玄により、他の食料品の仕事に取り組むこずができたす。これは䞻に、Alpine Linuxをベヌスにしたコンパクトなコンテナヌを䜿甚しおいるためです。このコンテナヌは、1時間ごずに高速化および軜量化されおいたす。



䞀般的に、マむクロサヌビス開発の面でより効率的になっおいたす。そしお、これはお客様のナヌザヌ゚クスペリ゚ンスにプラスの効果をもたらしたす。速床は珟圚、圓瀟のオンラむン補品Webサむトおよびモバむルアプリの䞻芁な指暙の1぀であり、Liberica JDKを䜿甚するず、この向䞊を実珟するこずもできたす。これは、パフォヌマンスの芳点から、お客様に良い䜓隓をもたらしたす。



さらに、マむクロサヌビス開発ぞの適切なアプロヌチにより、補品を垂堎に投入するたでの時間を倧幅に短瞮するこずができたした。必芁に応じお、展開A \ B、猶詰工堎などのさたざたな戊略を䜿甚しお、個々のサヌビスを本番環境に導入する方法を孊びたした。これにより、マむクロサヌビスの䜜業に関するフィヌドバックをすばやく受け取るこずができたす。



2か月で、ショッピング䜓隓にいく぀かの新しいサヌビスを開発しお実装したした。 2時間以内のいわゆる高速配達さたざたなタクシヌず配達アグリゲヌタヌを䜿甚ず、最も予期しない堎所Pyaterochkaストアやロシアの郵䟿局、倧きな駐車堎でもでの泚文の発行に぀いお話したす。ビゞネスセンタヌ。



私たちのマむクロサヌビスのおかげで、M.Video-Eldorado Groupのクラむアントの䞭には、店から盎接家に商品を持っおタクシヌに乗る機䌚がありたす。



クリ゚むティブプラン



2021幎の蚈画には、クラりドむンフラストラクチャの積極的な開発ず、完党にコヌドずしおのむンフラストラクチャの抂念「コヌドずしおのむンフラストラクチャ」ぞの移行が含たれたす。



IstioずAdmiralに基づくサヌビスメッシュ゜リュヌションの圢で、マむクロサヌビスの制埡ず盞互䜜甚のための透過的な゜リュヌションの構築に倧きな泚意を払う予定です。 Observabilityスタック党䜓を埮調敎および改善し、リク゚ストトレヌスずメッセヌゞログを監芖するために、私たちの前には倚くの䜜業がありたす。



たた、Javaで詊しおみたいずいう願望を含め、サヌバヌレステクノロゞヌの䜿甚を詊みる予定です。さらに、マルチクラりドむンフラストラクチャず゚コシステムを構築するずいう、これたでのずころ遠いが非珟実的ではないアむデアがありたす。



私たちのテクノロゞヌスタックに手で觊れるこずに興味がある堎合は、遠慮なく、誰にずっおも十分な䜜業がありたす。ボランティア登録は24時間幎䞭無䌑で行われたす こちら。 どういたしたしお。



犏利厚生、ラむフハック、個人的な経隓



画像

ドミトリヌChuikoのJava microservicesのための小さなドッカヌコンテナの秘密に、BellSoftシニアパフォヌマンスアヌキテクト、

─ . , . Docker-. , : , .



Linux , . JDK. , , .



1.

CentOS CentOS slim. ? Debian. Alpine musl. BellSoft Alpine Linux, — Linux. Liberica JDK 11.0.10 + 11.0.10 Linux.







Liberica EA 3–6 14,7 % Alpine musl java.base. 7,6 %. Docker-, JRE java.base. Liberica JRE EA — 16 %.



Liberica Lite . , , — . - Java SE JVM, Standart, JIT- (C1, C2, Graal JIT Compiler), (Serial, Parallel, CMS, G1, Shenandoah, ZGC) serviceability, .



2. JDK

— jdeps JLINK. . Java (JDeps). - Java, . . JAR, , . JDeps JDK, Java-. , , .







jdeps , java.base. jlink. , BellSoft Docker- java.base. DockerHub, .



docker run –rm bellsoft/liberica – openjdk -demos- asciiduke.







CLI-like java.base. Liberica JDK Lite Alpine Linux musl 40,4 .



.



Enjoy!



All Articles