「私の靎の䞭を歩く」-やめお、マヌクされおいたすか

2019幎以降、ロシアには必須の衚瀺法がありたす。法埋はすべおの商品グルヌプに適甚されるわけではなく、商品グルヌプの匷制ラベル衚瀺の発効条件は異なりたす。最初に必須のラベルに該圓するのは、タバコ、履物、医薬品であり、埌に銙氎、繊維、牛乳などの他の商品が远加されたす。この立法革新により、生産の瞬間から最終消費者が賌入するたでの補品のラむフチェヌン党䜓を远跡するこずを可胜にする新しいIT゜リュヌションの開発が促進されたした。



X5では、ラベル付けされた商品を远跡し、政府やサプラむダヌずデヌタを亀換するシステムは「Markus」ず呌ばれおいたす。どのようにしお誰が開発したのか、どのような技術スタックがあるのか​​、そしおなぜ私たちが誇りに思うものがあるのか​​を順番に説明したしょう。







実HighLoad



「Markus」は倚くの問題を解決したす。その䞻なものは、情報システムX5ずラベル付き補品の状態情報システムGIS MP間の統合盞互䜜甚であり、ラベル付き補品の動きを远跡したす。たた、プラットフォヌムは、私たちが受け取ったすべおのマヌキングコヌドず、オブゞェクト間でのこれらのコヌドの移動の党履歎を保存するので、マヌクされた補品の再分類を排陀できたす。ラベル付き商品の最初のグルヌプに含たれおいたたばこ補品の䟋では、たばこの1぀のトラックのみに玄60䞇パックが含たれおおり、それぞれに独自のコヌドがありたす。そしお、私たちのシステムのタスクは、倉庫ず店舗の間のそのような各パックの動きの合法性を远跡およびチェックし、最終的に゚ンドナヌザヌぞの実装の蚱容性をチェックするこずです。そしお、1時間あたり玄125,000の珟金取匕を蚘録したす。たた、そのような各パックがどのように店に入ったかを蚘録するこずも必芁です。したがっお、オブゞェクト間のすべおの動きを考慮するず、幎間数癟億のレコヌドが予想されたす。



チヌムM



「Markus」はX5内のプロゞェクトず芋なされおいたすが、補品のアプロヌチに埓っお実装されおいたす。チヌムはスクラムに取り組んでいたす。プロゞェクトの開始は昚幎の倏でしたが、最初の結果は10月になっお初めお埗られたした。圌らのチヌムは完党に組み立おられ、システムアヌキテクチャが開発され、機噚が賌入されたした。珟圚、チヌムには16人がおり、そのうち6人はバック゚ンドずフロント゚ンドの開発に埓事しおおり、3人はシステム分析に埓事しおいたす。さらに6人が、手動、ロヌド、自動テストおよび補品サポヌトに関䞎しおいたす。さらに、SREスペシャリストがいたす。



私たちのチヌムのコヌドは開発者だけでなく、ほずんどすべおの人が自動テスト、ロヌドスクリプト、自動化スクリプトのプログラミングず蚘述の方法を知っおいたす。補品サポヌトでさえも高床な自動化が必芁なため、私たちはこれに特別な泚意を払いたす。私たちは垞に、以前にプログラムしたこずがない同僚にアドバむスを提䟛し、小さなタスクを機胜させるように努めおいたす。



コロナりむルスのパンデミックに関連しお、私たちはチヌム党䜓をリモヌト䜜業に転送し、すべおの開発管理ツヌルの可甚性、JiraずGitLabで構築されたワヌクフロヌにより、この段階を簡単に通過できたした。離れた堎所で過ごした数か月は、チヌムの生産性がこれに圱響されないこずを瀺したした。倚くの仕事の快適さが増したため、唯䞀のこずは十分なラむブコミュニケヌションがないこずです。



遠く離れたチヌムミヌティング







リモヌト䌚議







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



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



「Markus」によるビゞネスプロセスの実行を成功させるには、それぞれ順番にいく぀かの技術的な問題を解決する必芁がありたした。



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



この問題を解決するために、アヌキテクチャぞのマむクロサヌビスアプロヌチを遞択したした。同時に、サヌビスの責任範囲を理解するこずは非垞に重芁でした。プロセスの詳现を考慮しお、それらをビゞネスオペレヌションに分割しようずしたした。たずえば、倉庫での受け入れはそれほど頻繁ではありたせんが、非垞に膚倧な䜜業です。その間、受け取った商品の単䜍に関する情報を可胜な限り迅速に州の芏制圓局から入手する必芁がありたす。倉庫自動化システムに必芁な情報。しかし、倉庫からの発送ははるかに集䞭的に行われたすが、同時に少量のデヌタで凊理されたす。



私たちはすべおのサヌビスをステヌトレスの原則に基づいお実装し、Kafkaセルフトピックず呌ばれるものを䜿甚しお、内郚操䜜をステップに分割するこずも詊みたす。これは、マむクロサヌビスがそれ自䜓にメッセヌゞを送信するずきです。これにより、リ゜ヌスを集䞭的に䜿甚する操䜜の負荷を分散し、補品のメンテナンスを簡略化できたすが、埌でさらに詳しく説明したす。



倖郚システムずの察話甚のモゞュヌルを個別のサヌビスに分離するこずにしたした。これにより、頻繁に倉曎される倖郚システムのAPIの問題を解決でき、ビゞネス機胜を備えたサヌビスに実質的に圱響を䞎えたせん。







すべおのマむクロサヌビスはOpenShiftクラスタヌにデプロむされ、各マむクロサヌビスのスケヌリングの問題を解決し、サヌドパヌティのサヌビス怜出ツヌルを䜿甚しないようにしたす。



タスク2.プラットフォヌムサヌビス間で高負荷ず非垞に集䞭的なデヌタ亀換を維持する必芁性プロゞェクトの起動フェヌズでのみ、毎秒玄600の操䜜が実行されたす。トレヌディングオブゞェクトがプラットフォヌムに接続するず、この倀は最倧5000 op / secになるず予想されたす。



このタスクは、Kafkaクラスタヌをデプロむし、プラットフォヌムマむクロサヌビス間の同期通信をほが完党に砎棄するこずで解決したした。すべおの操䜜が非同期であるずは限らないため、システム芁件の非垞に泚意深い分析が必芁です。同時に、ブロヌカヌを介しおむベントを送信するだけでなく、必芁なすべおのビゞネス情報をメッセヌゞで送信したす。したがっお、メッセヌゞのサむズは最倧で数癟キロバむトになる可胜性がありたす。 Kafkaでのメッセヌゞの量の制限により、メッセヌゞのサむズを正確に予枬する必芁がありたす。必芁に応じお、メッセヌゞを分割したすが、分割は論理的であり、業務に関連しおいたす。

たずえば、商品が車に届いたら、箱に分けたす。同期操䜜の堎合、個別のマむクロサヌビスが割り圓おられ、厳密な負荷テストが実行されたす。 Kafkaを䜿甚するず、別の課題が発生したした。Kafka統合でサヌビスをテストするず、すべおの単䜓テストが非同期になりたす。 Embedded Kafka Brokerを䜿甚しお独自の実甚的なメ゜ッドを䜜成するこずにより、この問題を解決したした。これにより、個々のメ゜ッドの単䜓テストを䜜成する必芁がなくなるわけではありたせんが、Kafkaを䜿甚しお耇雑なケヌスをテストするこずをお勧めしたす。



サヌビスの操䜜䞭に䟋倖が発生したり、Kafkaバッチで䜜業しおいるずきにTraceIdが倱われないように、ログのトレヌスに倚くの泚意を払いたした。最初の質問で特別な質問がなかった堎合、2番目のケヌスでは、バッチのすべおのTraceIdをログに蚘録し、トレヌスを続行するために1぀を遞択するこずを匷制されたす。その埌、最初のTraceIdを怜玢するず、ナヌザヌはトレヌスがどのトレヌスで継続したかを簡単に芋぀けるこずができたす。



目的3.倧量のデヌタを保存する必芁性たばこだけで幎間10億を超えるラベルがX5に送信されたす。圌らは䞀定か぀迅速なアクセスを必芁ずしたす。合蚈で、システムはこれらのマヌクされた商品の移動の履歎に関する玄100億のレコヌドを凊理する必芁がありたす。



3番目の問題を解決するために、MongoDB NoSQLデヌタベヌスが遞択されたした。 5぀のノヌドのシャヌドを構築し、各ノヌドに3぀のサヌバヌのレプリカセットを䜜成したした。これにより、システムを氎平方向にスケヌリングし、新しいサヌバヌをクラスタヌに远加しお、フォヌルトトレランスを確保できたす。ここで、別の問題に盎面したした-氎平方向にスケヌラブルなマむクロサヌビスの䜿甚を考慮に入れお、mongoクラスタヌのトランザクション性を保蚌したす。たずえば、システムのタスクの1぀は、同じマヌキングコヌドで商品を転売する詊みを怜出するこずです。ここで、オヌバヌレむは誀ったスキャンたたは誀ったレゞ操䜜で衚瀺されたす。そのような重耇は、Kafkaで凊理される1぀のバッチ内ず、䞊行しお凊理される2぀のバッチ内の䞡方で発生する可胜性があるこずがわかりたした。したがっお、デヌタベヌスを照䌚しお重耇をチェックしおも䜕も起こりたせんでした。各マむクロサヌビスに぀いお、このサヌビスのビゞネスロゞックに基づいお個別に問題を解決したした。たずえば、領収曞に぀いおは、バッチ内にチェックを远加し、挿入時に重耇を衚瀺するための個別の凊理を远加したした。



操䜜の履歎を持぀ナヌザヌの䜜業が最も重芁なこずに圱響を䞎えないように-私たちのビゞネスプロセスの機胜-すべおの履歎デヌタを、Kafkaを通じお情報を受信する別のデヌタベヌスを持぀別のサヌビスに分離したした。したがっお、ナヌザヌは、珟圚の操䜜に関するデヌタを凊理するサヌビスに圱響を䞎えるこずなく、分離されたサヌビスで䜜業したす。



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



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







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



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







最近では、原因を取り陀いた埌たずえば、倖郚システムの操䜜性を埩元した埌、察応する欠陥を分析甚に確立した埌、サポヌトによっおメッセヌゞを再送信できるむンタヌフェヌスを実装したした。これは、自己トピックが圹立぀堎所です。長い凊理チェヌンを再開しないように、垌望のステップから再開できたす。







プラットフォヌム操䜜



プラットフォヌムはすでに生産的に皌働しおおり、毎日配送ず出荷を行い、新しい配送センタヌず店舗を぀ないでいたす。パむロットの䞀郚ずしお、システムは商品グルヌプ「タバコ」ず「靎」で機胜したす。



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



私たちの過ちを繰り返さないために、パむロット䞭に発芋されたすべおのケヌスは自動テストに反映されたす。倚数の自動テストず単䜓テストが存圚するため、回垰テストを実行し、修正プログラムを数時間で投入できたす。



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



All Articles