「私の靎で歩いおいたす」 - 埅っおください、靎にマヌクは付いおいたすか

ロシアでは2019幎から衚瀺矩務に関する法埋が斜行されおいる。 この法埋はすべおの商品グルヌプに適甚されるわけではなく、商品グルヌプごずに衚瀺矩務の発効日も異なりたす。 タバコ、靎、医薬品が最初に矩務衚瀺の察象ずなり、銙氎、繊維補品、牛乳などの他の補品も埌に远加される予定です。 この法的革新により、補品の生産から最終消費者による賌入、そしおそのプロセスのすべおの参加者囜自䜓ず、商品を販売するすべおの組織の䞡方に至る補品のラむフチェヌン党䜓を远跡できる新しい IT ゜リュヌションの開発が促されたした。矩務的なラベル衚瀺。

X5 では、ラベル付き商品を远跡し、囜やサプラむダヌずデヌタを亀換するシステムは「マヌカス」ず呌ばれたす。 誰がどのように開発したのか、その技術スタックはどのようなものなのか、そしおなぜ圓瀟が誇るべきものがあるのか​​を順番に説明したしょう。

「私の靎で歩いおいたす」 - 埅っおください、靎にマヌクは付いおいたすか

リアルハむロヌド

「マヌカス」は倚くの問題を解決したすが、䞻な問題は、ラベル付き補品の移動を远跡するための、X5 情報システムずラベル付き補品の状態情報システム (GIS MP) 間の盞互䜜甚の統合です。 このプラットフォヌムは、圓瀟が受け取ったすべおのラベル コヌドず、オブゞェクト間でのこれらのコヌドの移動履歎党䜓も保存し、ラベル付き補品の再グレヌディングを排陀するのに圹立ちたす。 ラベル付き商品の最初のグルヌプに含たれおいたタバコ補品の䟋を䜿甚するず、トラック 600 台分のタバコに玄 000 パックが含たれおおり、それぞれに独自のコヌドが付いおいたす。 そしお、私たちのシステムの圹割は、倉庫ず店舗の間でのそのような各パックの移動の合法性を远跡および怜蚌し、最終的に最終賌入者ぞの販売の蚱容性を怜蚌するこずです。 たた、125 時間あたり玄 000 件の珟金取匕を蚘録しおおり、そのような各パックがどのようにしお店内に搬入されたかも蚘録する必芁がありたす。 したがっお、オブゞェクト間のすべおの移動を考慮するず、幎間数癟億のレコヌドが発生するず予想されたす。

チヌムM

Marcus は X5 内のプロゞェクトずみなされおいるにもかかわらず、補品アプロヌチを䜿甚しお実装されおいたす。 チヌムはスクラムに埓っお䜜業したす。 このプロゞェクトは昚幎の倏に始たりたしたが、最初の結果が埗られたのは 16 月になっおからでした。私たち自身のチヌムが完党に線成され、システム アヌキテクチャが開発され、機噚が賌入されたした。 珟圚、チヌムは XNUMX 名で構成されおおり、そのうち XNUMX 名はバック゚ンドずフロント゚ンドの開発に携わっおおり、そのうち XNUMX 名はシステム分析に携わっおいたす。 さらに XNUMX 人が手動テスト、負荷テスト、自動テスト、および補品メンテナンスに携わっおいたす。 さらに、圓瀟には SRE スペシャリストがいたす。

私たちのチヌムでコヌドを曞くのは開発者だけではありたせん。ほが党員が、自動テスト、ロヌド スクリプト、自動化スクリプトのプログラミングず䜜成方法を知っおいたす。 補品サポヌトでも高床な自動化が必芁なため、私たちはこれに特に泚意を払っおいたす。 私たちは垞に、これたでプログラミングをしたこずがない同僚にアドバむスしお手助けし、取り組むための小さなタスクをいく぀か䞎えるよう努めおいたす。

コロナりむルスのパンデミックにより、私たちはチヌム党䜓をリモヌトワヌクに移行したしたが、開発管理甚のすべおのツヌルが利甚可胜になり、Jira ず GitLab で構築されたワヌクフロヌにより、この段階を簡単に通過するこずができたした。 数か月間リモヌトで過ごした結果、チヌムの生産性が䜎䞋するこずはなかったこずがわかりたした。倚くの人にずっお、職堎での快適さは向䞊したしたが、唯䞀欠けおいたのはラむブコミュニケヌションでした。

リモヌトチヌムミヌティング

「私の靎で歩いおいたす」 - 埅っおください、靎にマヌクは付いおいたすか

リモヌトワヌク䞭の䌚議

「私の靎で歩いおいたす」 - 埅っおください、靎にマヌクは付いおいたすか

゜リュヌションの技術スタック

X5 の暙準リポゞトリおよび CI/CD ツヌルは GitLab です。 コヌドの保存、継続的なテスト、テスト サヌバヌず運甚サヌバヌぞの展開にこれを䜿甚したす。 たた、開発者がコヌドに加えた倉曎を少なくずも 2 人の同僚が承認する必芁がある堎合には、コヌド レビュヌを実斜したす。 静的コヌド アナラむザヌ SonarQube ず JaCoCo は、コヌドをクリヌンに保ち、必芁なレベルの単䜓テスト カバレッゞを確保するのに圹立ちたす。 コヌドぞのすべおの倉曎は、これらのチェックを通過する必芁がありたす。 手動で実行されるすべおのテスト スクリプトは、その埌自動化されたす。

「Marcus」によるビゞネス プロセスの実装を成功させるには、倚くの技術的問題を順番に解決する必芁がありたした。

タスク 1. システムの氎平方向のスケヌラビリティの必芁性

この問題を解決するために、私たちはアヌキテクチャに察しおマむクロサヌビス アプロヌチを遞択したした。 同時に、サヌビスの責任範囲を理解するこずが非垞に重芁でした。 プロセスの内容を考慮しお、業務に分割しおみたした。 たずえば、倉庫での受け入れはそれほど頻繁ではありたせんが、非垞に倧芏暡な䜜業であり、その際、受け入れられる商品の単䜍に関する情報を州芏制圓局から迅速に取埗する必芁があり、その数は600000回の配送でXNUMX䞇個に達したす。 、この補品を倉庫に受け入れるこずができるかどうかを確認し、倉庫自動化システムに必芁なすべおの情報を返したす。 ただし、倉庫からの出荷ははるかに匷床が高くなりたすが、同時に少量のデヌタで動䜜したす。

私たちはすべおのサヌビスをステヌトレス ベヌスで実装し、Kafka セルフトピックず呌ばれるものを䜿甚しお内郚操䜜をステップに分割しようずさえしおいたす。 これは、マむクロサヌビスがそれ自䜓にメッセヌゞを送信するずきであり、これにより、リ゜ヌスを倧量に消費する操䜜の負荷のバランスが取れ、補品のメンテナンスが簡玠化されたす。これに぀いおは埌ほど説明したす。

私たちは、倖郚システムず察話するためのモゞュヌルを別のサヌビスに分離するこずにしたした。 これにより、業務機胜を持぀サヌビスにほずんど圱響を䞎えるこずなく、倖郚システムのAPIが頻繁に倉曎される問題を解決するこずができたした。

「私の靎で歩いおいたす」 - 埅っおください、靎にマヌクは付いおいたすか

すべおのマむクロサヌビスは OpenShift クラスタヌにデプロむされおいるため、各マむクロサヌビスのスケヌリングの問題が解決され、サヌドパヌティの Service Discovery ツヌルを䜿甚しなくおも枈みたす。

タスク 2. プラットフォヌム サヌビス間で高負荷および非垞に集䞭的なデヌタ亀換を維持する必芁性: プロゞェクトの立ち䞊げフェヌズだけでも、600 秒あたり玄 5000 の操䜜が実行されたす。 小売店が圓瀟のプラットフォヌムに接続するに぀れお、この倀は XNUMX ops/秒たで増加するず予想されたす。

この問題は、Kafka クラスタヌをデプロむし、プラットフォヌムのマむクロサヌビス間の同期察話をほが完党に攟棄するこずで解決されたした。 すべおの操䜜を非同期にできるわけではないため、システム芁件を非垞に泚意深く分析する必芁がありたす。 同時に、ブロヌカヌを通じおむベントを送信するだけでなく、必芁なすべおのビゞネス情報もメッセヌゞで送信したす。 したがっお、メッセヌゞのサむズは数癟キロバむトに達する可胜性がありたす。 Kafka のメッセヌゞ サむズ制限では、メッセヌゞ サむズを正確に予枬する必芁があり、必芁に応じおメッセヌゞを分割したすが、分割は論理的なものであり、ビゞネス オペレヌションに関連しおいたす。
たずえば、車で到着した商品を箱に分けたす。 同期操䜜の堎合、個別のマむクロサヌビスが割り圓おられ、培底的な負荷テストが実行されたす。 Kafka を䜿甚するず、別の課題が発生したした。Kafka の統合によりすべおの単䜓テストが非同期になるこずを考慮しおサヌビスの動䜜をテストするずいうこずです。 私たちは、Embedded Kafka Broker を䜿甚しお独自のナヌティリティ メ゜ッドを䜜成するこずで、この問題を解決したした。 これにより、個々のメ゜ッドの単䜓テストを䜜成する必芁がなくなるわけではありたせんが、Kafka を䜿甚しお耇雑なケヌスをテストするこずを奜みたす。

サヌビスの操䜜䞭たたは Kafka バッチの操䜜䞭に䟋倖が発生したずきに TraceId が倱われないように、トレヌス ログには现心の泚意が払われたした。 最初のケヌスで特別な問題がなかった堎合、XNUMX 番目のケヌスでは、バッチに付属するすべおの TraceId をログに蚘録し、トレヌスを続行する XNUMX ぀を遞択する必芁がありたす。 その埌、元の TraceId で怜玢するず、どのトレヌスが継続されたのかが簡単にわかりたす。

タスク 3. 倧量のデヌタを保存する必芁がある: タバコだけでも幎間 1 億以䞊のラベルが X5 に集たりたす。 継続的か぀迅速なアクセスが必芁です。 合蚈するず、システムはこれらのラベル付き商品の移動履歎の玄 10 億件の蚘録を凊理する必芁がありたす。

5 番目の問題を解決するために、NoSQL デヌタベヌス MongoDB が遞択されたした。 3 ぀のノヌドのシャヌドを構築し、各ノヌドには XNUMX 台のサヌバヌのレプリカ セットがありたす。 これにより、システムを氎平方向に拡匵しおクラスタヌに新しいサヌバヌを远加し、フォヌルト トレランスを確保できたす。 ここで、氎平方向にスケヌラブルなマむクロサヌビスの䜿甚を考慮しお、mongo クラスタヌでのトランザクション性を確保するずいう別の問題が発生したした。 たずえば、私たちのシステムのタスクの XNUMX ぀は、同じラベル コヌドを䜿甚しお補品を再販売しようずする詊みを識別するこずです。 ここでは、レゞ係による誀ったスキャンたたは誀った操䜜によっおオヌバヌレむが衚瀺されたす。 このような重耇は、凊理されおいる XNUMX ぀の Kafka バッチ内ず、䞊行しお凊理されおいる XNUMX ぀のバッチ内で発生する可胜性があるこずがわかりたした。 したがっお、デヌタベヌスにク゚リを実行しお重耇をチェックしおも䜕も埗られたせんでした。 マむクロサヌビスごずに、このサヌビスのビゞネス ロゞックに基づいお問題を個別に解決したした。 たずえば、チェックに぀いおは、バッチ内にチェックを远加し、挿入時の重耇の出珟に぀いお別の凊理を远加したした。

ナヌザヌによる操䜜履歎の操䜜が最も重芁なこず、぀たりビゞネス プロセスの機胜にいかなる圱響も及がさないようにするため、すべおの履歎デヌタを別個のデヌタベヌスを備えた別個のサヌビスに分離し、Kafka を通じお情報も受け取りたす。 。 このようにしお、ナヌザヌは、進行䞭の操䜜でデヌタを凊理するサヌビスに圱響を䞎えるこずなく、分離されたサヌビスを操䜜できたす。

タスク 4: キュヌの再凊理ず監芖:

分散システムでは、デヌタベヌス、キュヌ、倖郚デヌタ ゜ヌスの可甚性に関しお問題や゚ラヌが必然的に発生したす。 Marcus の堎合、そのような゚ラヌの原因は倖郚システムずの統合です。 タむムアりトを指定しお誀った応答に察するリク゚ストを繰り返し実行できるようにしながら、同時にメむン キュヌ内の成功したリク゚ストの凊理を停止しない゜リュヌションを芋぀ける必芁がありたした。 この目的のために、いわゆる「トピックベヌスの再詊行」コンセプトが遞択されたした。 メむン トピックごずに、誀ったメッセヌゞが送信される XNUMX ぀以䞊のリトラむ トピックが䜜成され、同時にメむン トピックからのメッセヌゞ凊理の遅延が解消されたす。 むンタラクションスキヌム -

「私の靎で歩いおいたす」 - 埅っおください、靎にマヌクは付いおいたすか

このようなスキヌムを実装するには、この゜リュヌションを Spring ず統合し、コヌドの重耇を避ける必芁がありたした。 Web サヌフィン䞭に、Spring BeanPostProccessor に基づく同様の゜リュヌションを芋぀けたしたが、それは私たちにずっお䞍必芁に面倒に思えたした。 私たちのチヌムは、コンシュヌマを䜜成するための Spring サむクルに統合し、さらに Retry Consumer を远加できる、よりシンプルな゜リュヌションを䜜成したした。 私たちは Spring チヌムに゜リュヌションのプロトタむプを提䟛したした。ご芧のずおりです。 ここで。 再詊行コンシュヌマの数ず各コンシュヌマの詊行回数は、ビゞネス プロセスのニヌズに応じおパラメヌタを通じお蚭定されたす。すべおが機胜するには、あずはアノテヌション org.springframework.kafka.annotation.KafkaListener を远加するだけです。これは、すべおの Spring 開発者にずっお銎染みのあるものです。

すべおの再詊行埌にメッセヌゞを凊理できなかった堎合、メッセヌゞは Spring DeadLetterPublishingRecoverer を䜿甚しお DLT (デッド レタヌ トピック) に送られたす。 サポヌトの芁請に応じお、この機胜を拡匵し、DLT、stackTrace、traceId に含たれるメッセヌゞ、およびそれらに関するその他の有甚な情報を衚瀺できる別のサヌビスを䜜成したした。 さらに、すべおの DLT トピックに監芖ずアラヌトが远加され、実際に、DLT トピックにメッセヌゞが衚瀺されるず、欠陥を分析しお修正する必芁がありたす。 これは非垞に䟿利です。トピックの名前によっお、問題がプロセスのどの段階で発生したかがすぐにわかり、根本原因の怜玢が倧幅にスピヌドアップされたす。

「私の靎で歩いおいたす」 - 埅っおください、靎にマヌクは付いおいたすか

最近では、原因を排陀し (倖郚システムの機胜を埩元するなど)、もちろん分析のために察応する欠陥を確立した埌、サポヌトを利甚しおメッセヌゞを再送信できるむンタヌフェむスを実装したした。 ここでセルフトピックが圹に立ちたす。長い凊理チェヌンを再起動しないように、目的のステップから再起動できたす。

「私の靎で歩いおいたす」 - 埅っおください、靎にマヌクは付いおいたすか

プラットフォヌムの運甚

このプラットフォヌムはすでに生産的に皌働しおおり、毎日配送ず出荷を実行し、新しい配送センタヌず店舗を接続しおいたす。 パむロットの䞀環ずしお、このシステムは「タバコ」ず「靎」の補品グルヌプで動䜜したす。

圓瀟のチヌム党䜓がパむロットの実斜に参加し、新たな問題を分析し、ログの改善からプロセスの倉曎に至るたで、補品を改善するための提案を行っおいたす。

私たちの間違いを繰り返さないために、パむロット䞭に芋぀かったすべおのケヌスが自動テストに反映されたす。 倚数の自動テストず単䜓テストが存圚するため、文字通り数時間以内に回垰テストを実斜し、ホットフィックスをむンストヌルできたす。

珟圚、私たちはプラットフォヌムの開発ず改善を続けおおり、垞に新しい課題に盎面しおいたす。 ご興味がございたしたら、次の蚘事で゜リュヌションに぀いお説明したす。

出所 habr.com

コメントを远加したす