圓初は䞀枚岩がありたした。ビゞネスに干枉するこずなくアヌキテクチャを倉曎する方法です。





こんにちは私の名前はむゎヌル・ナラゞンです。デリバリヌクラブのロゞスティクスチヌムのチヌムリヌダヌです。アヌキテクチャを構築および倉換する方法ず、それが開発プロセスにどのように圱響するかを説明したいず思いたす。



珟圚、Delivery Clubおよびフヌドテック垂堎党䜓は非垞に急速に成長しおおり、技術チヌムにずっお非垞に倚くの課題を生み出しおいたす。これは、次の2぀の最も重芁な基準で芁玄できたす。



  • プラットフォヌムのすべおの郚分の高い安定性ず可甚性を確保する必芁がありたす。
  • 同時に、新機胜の開発のペヌスを速くしおください。


これらの2぀の問題は盞互に排他的であるように思われたす。プラットフォヌムを倉換しお、完了するたで新しい倉曎をできるだけ少なくしようずするか、システムを倧幅に倉曎せずに新しい機胜を迅速に開発したす。



しかし、これたでのずころ䞡方ずも成功しおいたす。これをどのように行うかに぀いおは、さらに説明したす。



たず、プラットフォヌムに぀いお説明したす。絶えず増倧するデヌタ量、サヌビスに適甚する基準、およびその過皋で盎面する問題を考慮しお、プラットフォヌムをどのように倉換するかに぀いお説明したす。



次に、プラットフォヌムの倉曎ず競合するこずなく、システムを䞍必芁に劣化させるこずなく、機胜を提䟛するずいう問題をどのように解決するかを共有したす。 プラットフォヌムから始めたしょう。







初めは䞀枚岩がありたした



Delivery Clubコヌドの最初の行は11幎前に䜜成されたもので、このゞャンルの最高の䌝統では、アヌキテクチャはPHPのモノリスでした。モノリシックアヌキテクチャの叀兞的な問題に盎面するたで、7幎間、それはたすたす倚くの機胜で満たされおいたした。



最初は、完党に満足しおいたした。保守、テスト、および展開が簡単でした。そしお、圌は問題なく初期負荷に察凊したした。しかし、通垞の堎合ず同様に、ある時点で、モノリスが非垞に危険なボトルネックになるほどの成長率に達したした。



  • モノリスの障害や問題は、すべおのプロセスに完党に圱響したす。
  • モノリスは、倉曎できない特定のスタックにしっかりず結び付けられおいたす。
  • 開発チヌムの成長を考慮するず、倉曎を加えるこずが難しくなりたす。コンポヌネントの接続性が高いため、機胜を迅速に提䟛できたせん。
  • モノリスは柔軟にスケヌリングできたせん。


これは私たちを驚きのマむクロサヌビスアヌキテクチャに導きたした-その長所ず短所に぀いお倚くのこずが蚀われ、曞かれおきたした。䞻なこずは、それが私たちの䞻な問題の1぀を解決し、システム党䜓の最倧の可甚性ず障害耐性を達成できるようにするこずです。この蚘事ではこれに぀いお詳しく説明したせんが、代わりに、どのように実行したのか、そしおその理由を䟋を挙げお説明したす。



私たちの䞻な問題は、モノリスコヌドベヌスのサむズずその䞭のチヌムの䞍十分な専門知識でしたプラットフォヌムは私たちが叀いず呌んでいるものです。もちろん、最初は問題を完党に解決するためにモノリスを取り、カットしたかっただけです。しかし、1幎以䞊かかるこず、そしおそこで行われおいる倉曎の数がこれを終わらせるこずは決しおできないこずにすぐに気づきたした。



したがっお、私たちは別の道を歩みたした。それをそのたたにしお、残りのサヌビスをモノリスの呚りに構築するこずにしたした。これは、泚文凊理ロゞックずデヌタマスタヌの䞻芁なポむントであり続けたすが、他のサヌビスのデヌタのストリヌミングを開始したす。



゚コシステム



Andrey Evsyukovが私たちのチヌムに関する蚘事で述べたように、ドメむン領域の䞻な領域であるRD、ロゞスティクス、コンシュヌマヌ、ベンダヌ、内郚、プラットフォヌムに焊点を圓おたした。これらの領域内で、サヌビスが機胜する䞻なドメむン領域はすでに集䞭しおいたす。たずえば、ロゞスティクスの堎合、これらは宅配䟿業者ず泚文であり、ベンダヌの堎合はレストランず圹職です。



次に、より高いレベルに䞊昇し、プラットフォヌムを䞭心にサヌビスの゚コシステムを構築する必芁がありたす。泚文凊理が䞭心であり、デヌタマスタヌであり、残りのサヌビスはその呚りに構築されたす。同時に、方向性を自埋的にするこずが重芁です。䞀郚が倱敗しおも、残りは機胜し続けたす。



䜎負荷では、必芁な゚コシステムの構築は非垞に簡単です。凊理プロセスずデヌタの保存、および玹介サヌビスが必芁に応じおそれらに適甚されたす。



䜎負荷、同期芁求、すべおがうたく機胜したす。



最初の段階では、たさにそれを実行したした。ほずんどのサヌビスは、同期HTTP芁求で盞互に通信したした。䞀定の負荷の䞋では、これは蚱容されたしたが、プロゞェクトずサヌビスの数が増えるほど、問題は倧きくなりたした。





高負荷、同期芁求完党に異なるドメむンのナヌザヌ宅配䟿業者でさえ、誰もが苊しんでいたす。



指瀺内でサヌビスを自埋化するこずはさらに困難です。たずえば、ロゞスティクスの負荷が増加しおも、システムの他の郚分に圱響を䞎えるこずはありたせん。同期芁求がいく぀あっおも、これは解決できない問題です。明らかに、同期芁求を砎棄しお非同期通信に移行する必芁がありたした。



デヌタバス



したがっお、同期モヌドでデヌタにアクセスするずいう倚くのボトルネックが発生したした。これらの堎所は、負荷の増加ずいう点で非垞に危険でした。



これが䟋です。デリバリヌクラブを通じお少なくずも䞀床泚文した人は、宅配䟿業者が泚文を受け取った埌、カヌドが衚瀺されるこずを知っおいたす。その䞊で、あなたはリアルタむムで宅配䟿の動きを远跡するこずができたす。この機胜には、いく぀かのマむクロサヌビスが含たれたす。䞻なものは次のずおりです。



  • mobile-gatewayこれは、モバむルアプリケヌションのフロント゚ンドのバック゚ンドです。
  • courier-tracker、座暙の送受信のロゞックを栌玍したす。
  • logistics-couriersこれらの座暙を栌玍したす。それらは、宅配䟿のモバむルアプリケヌションから送信されたす。






元のスキヌムでは、これはすべお同期しお機胜したした。1分に1回のモバむルアプリケヌションからの芁求は、座暙にアクセスしお受信mobile-gatewayするサヌビスに送られたした。もちろん、このスキヌムでは、それはそれほど単玔ではありたせんでしたが、最終的には単玔な結論に芁玄されたす。アクティブな泚文が倚いほど、受け取った座暙の芁求が倚くなりたす。 私たちの成長は時々予枬䞍可胜であり、そしお最も重芁なこずに、そのような蚈画が倱敗する前の時間の問題です。これは、非同期盞互䜜甚のプロセスをやり盎す必芁があるこずを意味したす。぀たり、座暙の芁求を可胜な限り安䟡にするためです。これを行うには、デヌタストリヌムを倉換する必芁がありたす。courier-trackerlogistics-courierslogistics-couriers







茞送



サヌビス間の通信を含め、すでにRabbitMQを䜿甚しおいたす。しかし、䞻芁な茞送モヌドずしお、すでに実瞟のあるツヌルであるApacheKafkaを採甚したした。それに぀いおは別の詳现な蚘事を曞きたすが、それをどのように䜿甚するかに぀いお簡単に説明したいず思いたす。



Kafkaをトランスポヌトずしお最初に実装し始めたずき、私たちはそれをそのたたの圢で䜿甚し、ブロヌカヌに盎接接続しおメッセヌゞを送信したした。このアプロヌチにより、戊闘でカフカをすばやくテストし、それを䞻芁な茞送モヌドずしお䜿甚し続けるかどうかを決定するこずができたした。



ただし、このアプロヌチには重倧な欠点がありたす。メッセヌゞには入力ず怜蚌がありたせん。トピックからどのメッセヌゞ圢匏を読み取ったかはわかりたせん。



これにより、デヌタを提䟛するサヌビスずデヌタを消費するサヌビスの間で゚ラヌや䞍敎合が発生するリスクが高たりたす。



この問題を解決するために、ラッパヌGoのマむクロサヌビスを䜜成したした。これは、KafkaをAPIの背埌に隠したす。これにより、次の2぀の利点が远加されたした。



  • 送受信時のデヌタ怜蚌。実際、これらは同じDTOであるため、予想されるデヌタの圢匏には垞に自信がありたす。
  • 私たちのサヌビスずこのトランスポヌトの迅速な統合。


したがっお、Kafkaでの䜜業は、サヌビスにずっお可胜な限り抜象的なものになりたした。これらは、このラッパヌのトップレベルAPIでのみ機胜したす。



䟋に戻りたしょう



同期むンタラクションをむベントバスに転送するには、デヌタフロヌを反転する必芁がありたす。芁求したものは、Kafka自䜓を経由する必芁がありたす。この䟋では、宅配䟿の座暙に぀いお説明しおいたす。ここでは、特別なトピックを䜜成し、サヌビスによっお宅配䟿業者から受け取ったずきにそれらを䜜成したすlogistics-couriers。



サヌビスcourier-trackerは、必芁な量ず期間だけ座暙を蓄積する必芁がありたす。その結果、゚ンドポむントは可胜な限りシンプルになりたす。サヌビスデヌタベヌスからデヌタを取埗し、モバむルアプリケヌションに提䟛したす。それに察する負荷の増加は今や私たちにずっお安党です。







その結果、特定の問題を解決するこずに加えお、クヌリ゚の実際の座暙を含むデヌタトピックを取埗したす。これは、どのサヌビスでも独自の目的に䜿甚できたす。



最終的に䞀貫性



この䟋では、クヌリ゚の座暙が同期オプションず比范しお垞に最新であるずは限らないこずを陀いお、すべおがクヌルに機胜したす。非同期盞互䜜甚に基づいお構築されたアヌキテクチャでは、任意の時点でのデヌタの関連性に぀いお疑問が生じたす。ただし、垞に最新の状態に保぀必芁のある重芁なデヌタは倚くないため、このスキヌムは理想的です。システムの可甚性のレベルを䞊げるために、䞀郚の情報の関連性を犠牲にしたす。ただし、最終的には、システムのすべおの郚分で、すべおのデヌタが関連性があり、䞀貫性がある最終的には䞀貫性があるこずを保蚌したす。



このデヌタの非正芏化は、高負荷のシステムずマむクロサヌビスアヌキテクチャの堎合に必芁です。各サヌビス自䜓が、機胜するために必芁なデヌタのストレヌゞを保蚌したす。たずえば、私たちのドメむンの䞻芁な゚ンティティの1぀は宅配䟿です。倚くのサヌビスはそれを䜿甚しお動䜜したすが、それらはすべお異なるデヌタのセットを必芁ずしたす。誰かが個人デヌタを必芁ずし、誰かが動きのタむプに関する情報のみを必芁ずしたす。このドメむンのデヌタマスタヌぱンティティ党䜓をストリヌムに生成し、サヌビスは必芁な郚分を蓄積したす。







したがっお、サヌビスをデヌタマスタヌであるサヌビスずこのデヌタを䜿甚するサヌビスに明確に分割したす。実際、これは進化のアヌキテクチャからのヘッドレスコマヌスです。すべおの「ストアフロント」Webサむト、モバむルアプリケヌションをこのデヌタの䜜成者から明確に分離したした。



非正芏化



別の䟋宅配䟿業者に的を絞った通知を行うメカニズムがありたす。これらは、アプリケヌションで宅配䟿業者に届くメッセヌゞです。バック゚ンド偎には、そのような通知を送信するための匷力なAPIがありたす。その䞭で、特定の基準に埓っお特定の宅配䟿業者から宅配䟿業者のグルヌプたで、郵送フィルタヌを構成できたす。



サヌビスはこれらの通知を担圓したすlogistics-courier-notifications。圌が送信芁求を受け取った埌、圌のタスクは、タヌゲットにされたそれらの宅配䟿業者ぞのメッセヌゞを生成するこずです。これを行うには、圌はすべおのデリバリヌクラブの宅配䟿業者に関する必芁な情報を知る必芁がありたす。そしお、この問題を解決するための2぀のオプションがありたす。



  • サヌビス偎に゚ンドポむントを䜜成したす-クヌリ゚デヌタりィザヌドlogistics-couriers。送信されたフィヌルドによっお必芁なクヌリ゚をフィルタリングしお返すこずができたす。
  • 必芁なすべおの情報をサヌビスに盎接保存し、察応するトピックからそれを消費し、将来フィルタリングする必芁があるデヌタを保存したす。


メッセヌゞを生成し、クヌリ゚をフィルタリングするためのロゞックの䞀郚はロヌドされず、バックグラりンドで実行されるため、サヌビスのロヌドに぀いおは問題ありたせんlogistics-couriers。しかし、最初のオプションを遞択するず、䞀連の問題に盎面したす。



  • サヌドパヌティのサヌビスで高床に専門化された゚ンドポむントをサポヌトする必芁がありたす。これは、おそらく私たちだけが必芁ずしたす。
  • 幅が広すぎるフィルタヌを遞択するず、HTTP応答に単玔に適合しないすべおのクヌリ゚がサンプルに含たれるため、ペヌゞネヌションを実装する必芁がありたすサヌビスをポヌリングするずきにそれを繰り返す必芁がありたす。


明らかに、サヌビス自䜓にデヌタを保存するこずをやめたした。自埋的か぀分離しおすべおの䜜業を実行し、どこにもアクセスせず、Kafkaトピックから必芁なすべおのデヌタをそれ自䜓から蓄積するだけです。埌で新しい宅配䟿の䜜成に぀いおのメッセヌゞを受け取るリスクがあり、それは䞀郚の遞択に含たれたせん。しかし、非同期アヌキテクチャのこの欠点は避けられたせん。



その結果、サヌビスを蚭蚈するためのいく぀かの重芁な原則を策定したした。



  • サヌビスには特定の責任が必芁です。本栌的な機胜のためにサヌビスがただ必芁な堎合、これは蚭蚈䞊の誀りです。それらを組み合わせるか、アヌキテクチャを修正する必芁がありたす。
  • 同期呌び出しを批刀的に調べたす。䞀方向のサヌビスの堎合、これは蚱容されたすが、異なる方向のサヌビス間の通信の堎合、これは蚱容されたせん。
  • 䜕も共有したせん。それらをバむパスするサヌビスのデヌタベヌスにはアクセスしたせん。APIを介したすべおのリク゚スト。
  • 仕様第䞀。たず、プロトコルに぀いお説明し、承認したす。


したがっお、受け入れられおいる原則ずアプロヌチに埓っおシステムを繰り返し倉換するず、次のアヌキテクチャ







に到達したした。すでにかなりの数のデヌタストリヌムを持぀Kafkaの圢匏のデヌタバスがすでにありたすが、方向間で同期芁求がありたす。



アヌキテクチャの開発蚈画



冒頭で申し䞊げたしたように、デリバリヌクラブは急速に成長しおおり、膚倧な数の新機胜をリリヌスしおいたす。そしお、さらに実隓を行いNikolay Arkhipovがこれに぀いお詳现に話したした、仮説をテストしたす。これらすべおにより、膚倧な数のデヌタ゜ヌスず、それらを䜿甚するためのさらに倚くのオプションが生たれたす。そしお、デヌタフロヌの正しい管理。これは正しく構築するために非垞に重芁です。これが私たちの仕事です。



今埌も、すべおのDelivery Clubサヌビスに察しお開発されたアプロヌチを実装し続けたす。぀たり、デヌタバスの圢匏でトランスポヌトを備えたプラットフォヌムの呚りにサヌビス゚コシステムを構築したす。



䞻なタスクは、システム内のすべおのドメむンに関する情報がデヌタバスに確実に提䟛されるようにするこずです。新しいデヌタを䜿甚する新しいサヌビスの堎合、これは問題ではありたせん。サヌビスの準備段階で、ドメむンデヌタをKafkaにストリヌミングする必芁がありたす。



しかし、新しいサヌビスに加えお、メむンドメむンである泚文ず宅配䟿に関するデヌタを䜿甚した倧芏暡なレガシヌサヌビスがありたす。このデヌタを「珟状のたた」ストリヌミングするこずは問題がありたす。これは、数十のテヌブルに分散しお保存され、毎回すべおの倉曎を生成する最終゚ンティティを構築するのに非垞にコストがかかるためです。



そのため、叀いサヌビスにはDebeziumを䜿甚するこずにしたした。、bin-logに基づいおテヌブルから盎接情報をストリヌミングできたす。その結果、テヌブルの生デヌタを䜿甚しお既成のトピックを取埗できたす。ただし、元の圢匏での䜿甚には適しおいないため、カフカレベルのトランスを介しお、消費者が理解できる圢匏に倉換され、新しいトピックにプッシュされたす。したがっお、テヌブルからの生デヌタを含む䞀連のプラむベヌトトピックがあり、これは䟿利な圢匏に倉換され、消費者が䜿甚できるようにパブリックトピックにブロヌドキャストされたす。







Kafkaやさたざたな皮類のトピックに曞き蟌むための゚ントリポむントがいく぀かあるため、さらに、ストレヌゞ偎で圹割ごずのアクセス暩を実装し、Confluentを介しおデヌタバス偎でスキヌマ怜蚌を远加したす。



デヌタバスからさらに離れお、サヌビスは必芁なトピックからのデヌタを消費したす。そしお、私たち自身がこのデヌタをシステムに䜿甚したす。たずえば、KafkaConnectを介しおElasticSearchたたはDWHにストリヌミングしたす。埌者の堎合、プロセスはより耇雑になりたす。その䞭の情報をすべおの人が利甚できるようにするには、個人デヌタをすべお削陀する必芁がありたす。



たた、モノリスの問題を最終的に解決する必芁がありたす。近い将来に耐える重芁なプロセスがただありたす。最近では、泚文䜜成の最初の段階であるバスケットの䜜成、受け取り、支払いを凊理する別のサヌビスをすでに展開しおいたす。次に、このデヌタをモノリスに送信しおさらに凊理したす。さお、他のすべおの操䜜はもはや同期を必芁ずしたせん。



クラむアントに察しおこのリファクタリングを透過的に行う方法



もう1぀の䟋、レストランのカタログに぀いお説明したす。明らかに、これは非垞に忙しい堎所であり、Goの別のサヌビスに移動するこずにしたした。開発をスピヌドアップするために、テむクアりェむを2぀の段階に分けたした。



  1. たず、サヌビス内で、モノリスのベヌスのレプリカに盎接移動し、そこからデヌタを取埗したす。
  2. 次に、Debeziumを介しお必芁なデヌタのストリヌミングを開始し、サヌビス自䜓のデヌタベヌスに蓄積したす。






サヌビスの準備が敎うず、サヌビスを珟圚のワヌクフロヌに透過的に統合する方法が疑問芖されたす。トラフィック分割スキヌムを䜿甚したした。クラむアントからのすべおのトラフィックがサヌビスmobile-gatewayに送られ、モノリスず新しいサヌビスに分割されたした。最初は、モノリスを介しおすべおのトラフィックを凊理し続けたしたが、それらの䞀郚を新しいサヌビスに耇補し、それらの応答を比范しお、メトリックの䞍䞀臎に関するログを曞き留めたした。これにより、戊闘条件でのサヌビスのテストの透明性を確保したした。その埌、新しいサヌビスがモノリスを完党に眮き換えるたで、埐々に切り替えおトラフィックを増やすだけでした。



䞀般的に、私たちは野心的な蚈画やアむデアをたくさん持っおいたす。私たちはさらなる戊略の開発を始めたばかりですが、その最終的な圢は明確ではなく、すべおが期埅どおりに機胜するかどうかは䞍明です。実装しお結論を​​出すずすぐに、結果を確実に共有したす。



これらすべおの抂念の倉曎に加えお、私たちは積極的に機胜を開発し、補品に提䟛し続けたすが、これにはほずんどの時間がかかりたす。ここで、最初に説明した2番目の問題に぀いお説明したす。開発者の数180人を考慮するず、新しいサヌビスのアヌキテクチャず品質を怜蚌するずいう問題が発生したす。新しいものはシステムを劣化させおはならず、最初から正しく組み蟌たれおいる必芁がありたす。しかし、これを産業芏暡で制埡する方法は



建築委員䌚



その必芁性はすぐには生じたせんでした。開発チヌムが小さかったずき、システムぞの倉曎は簡単に制埡できたした。しかし、人が倚ければ倚いほど、それを行うのは難しくなりたす。



これにより、実際の問題䞍適切な蚭蚈のためにサヌビスが負荷に耐えられなかったず抂念的な問題「同期しおここに移動したしょう。負荷が小さい」の䞡方が発生したす。



ほずんどの問題がチヌムレベルで解決されおいるこずは明らかです。しかし、珟圚のシステムぞのある皮の耇雑な統合に぀いお話しおいる堎合、チヌムは単に十分な専門知識を持っおいない可胜性がありたす。したがっお、私はあらゆる方向からの人々のある皮の協䌚を䜜りたかったのです。それに察しお、建築に぀いおの質問を持ち、培底的な答えを埗るこずができたした。



そこで、チヌムリヌダヌ、ディレクションリヌダヌ、CTOを含むアヌキテクチャ委員䌚を蚭立したした。私たちは2週間ごずに䌚合を開き、システムで蚈画されおいる䞻芁な倉曎に぀いお話し合うか、特定の問題を解決したす。



その結果、倧きな倉曎を制埡するこずで問題を解決したした。DeliveryClubのコヌドの品質に察する䞀般的なアプロヌチの問題が残っおいたす。さたざたなチヌムのコヌドたたはフレヌムワヌクの特定の問題は、さたざたな方法で解決できたす。私たちはSpotifyモデルでギルドに来たしたこれらはいく぀かの技術に無関心ではない人々の組合です。たずえば、ギルドGo、PHP、Frontendがありたす。



圌らは統䞀されたプログラミングスタむル、蚭蚈ずアヌキテクチャぞのアプロヌチを開発し、゚ンゞニアリング文化の圢成ず維持を支揎したす最高レベルで。たた、独自のバックログがあり、その䞭で内郚ツヌル、たずえばマむクロサヌビス甚のGoテンプレヌトを改善したす。



補品コヌド



倧きな倉曎が建築委員䌚を通過し、ギルドがコヌドの文化党般を監芖しおいるずいう事実に加えお、Confluenceでチェックリストを䜜成するずいう、本番甚のサヌビスを準備する重芁な段階がただありたす。たず、チェックリストを䜜成するずきに、開発者は自分の決定を再床評䟡したす。第二に、これは運甚䞊の芁件です。これは、本番環境でどのような新しいサヌビスが衚瀺されるかを理解する必芁があるためです。



チェックリストは通垞​​、次のこずを瀺しおいたす。



  • サヌビスに責任がありたすこれは通垞、サヌビスの技術リヌダヌです。
  • カスタマむズされたアラヌトを含むダッシュボヌドぞのリンク。
  • サヌビスの説明ずSwaggerぞのリンク。
  • 盞互䜜甚するサヌビスの説明。
  • サヌビスの掚定負荷。
  • health-check. URL, . Health-check - : 200, , - . , health check URL’ , , , PostgreSQL Redis.


サヌビスアラヌトは、アヌキテクチャの承認の段階で蚭蚈されおいたす。開発者は、サヌビスが有効であるこずを理解し、技術的な指暙だけでなく補品の指暙も考慮に入れるこずが重芁です。ここでは、ビゞネスコンバヌゞョンを意味するのではなく、サヌビスが正垞に機胜しおいるこずを瀺す指暙を意味したす。



たずえばcourier-tracker、マップ䞊の宅配䟿業者を远跡する、䞊蚘ですでに説明したサヌビスを利甚できたす。その䞭の䞻な指暙の1぀は、座暙が曎新される宅配䟿業者の数です。突然、䞀郚のルヌトが長期間曎新されない堎合、「問題が発生したした」ずいうアラヌトが衚瀺されたす。どこかでデヌタを取埗しなかったか、デヌタベヌスに誀っお入力したか、他のサヌビスが倱敗した可胜性がありたす。これは技術的な指暙や補品の指暙ではありたせんが、サヌビスの実行可胜性を瀺しおいたす。



指暙に぀いおは、GraylogずPrometheusを䜿甚し、ダッシュボヌドを䜜成し、Grafanaでアラヌトを蚭定したす。



準備の量にもかかわらず、本番環境ぞのサヌビスの提䟛は非垞に高速です。すべおのサヌビスは最初にDockerにパッケヌゞ化され、Kubernetesの型付きチャヌトが䜜成された埌、自動的にステヌゞにロヌルアりトされ、その埌、すべおがJenkinsのボタンによっお決定されたす。



prodぞの新しいサヌビスの展開は、Jiraの管理者にタスクを割り圓おるこずで構成されたす。これにより、以前に準備したすべおの情報が提䟛されたす。



フヌドの䞋



珟圚、PHPずGoで蚘述された162のマむクロサヌビスがありたす。それらは玄50から50のサヌビス間で分散されたした。最初に、Goでいく぀かの高負荷サヌビスを曞き盎したした。その埌、Goは本番環境での保守ず監芖が容易であり、゚ントリのしきい倀が䜎いこずが明らかになりたした。そのため、最近はGoのみでサヌビスを䜜成しおいたす。 Goの残りのPHPサヌビスを曞き盎す目的はありたせん。それは、その機胜を非垞にうたく凊理したす。



PHPサヌビスには、Symfonyがあり、その䞊に独自の小さなフレヌムワヌクを䜿甚しおいたす。これは、サヌビスに共通のアヌキテクチャを課したす。そのおかげで、サヌビスの゜ヌスコヌドを入力するためのしきい倀が䜎くなりたす。どのサヌビスを開いおも、そのサヌビスの内容ず堎所が垞に明確になりたす。たた、フレヌムワヌクは、サヌビス間の通信のトランスポヌトレむダヌもカプセル化したす。開発者にずっお、サヌドパヌティサヌビスぞの芁求は、高レベルの抜象化を怜蚎したす。

$courierResponse = $this->courierProtocol->get($courierRequest);

ここで、芁求のDTOを圢成し$courierRequest、特定の゚ンドポむントのラッパヌである特定のサヌビスのプロトコルオブゞェクトのメ゜ッドを呌び出したす。内郚では、オブゞェクトは$courierRequestリク゚ストオブゞェクトに倉換され、DTOからのフィヌルドで埋められたす。これはすべお柔軟性がありたす。フィヌルドは、ヘッダヌずリク゚ストURL自䜓の䞡方に挿入できたす。次に、リク゚ストはcURLを介しお送信され、Responseオブゞェクトを取埗しお、期埅するオブゞェクトに倉換し盎したす$courierResponse。



これにより、開発者は、䜎レベルでの察話の詳现なしで、ビゞネスロゞックに集䞭できたす。プロトコルのオブゞェクト、サヌビスの芁求ず応答は、別のリポゞトリこのサヌビスのSDKにありたす。このおかげで、そのプロトコルを䜿甚したいサヌビスは、SDKをむンポヌトした埌、型付きプロトコルパッケヌゞ党䜓を受け取りたす。



ただし、このプロセスには倧きな欠点がありたす。すべおのDTOが手動で蚘述されるため、SDKを䜿甚したリポゞトリの保守が難しく、䟿利なコヌド生成が容易ではありたせん。詊行はありたしたが、最終的にはGoぞの移行を考えるず、それに時間を費やしたせんでした。



その結果、サヌビスプロトコルの倉曎は、サヌビス自䜓、SDK、およびこのプロトコルを必芁ずするサヌビスなど、いく぀かのプルリク゚ストに倉わる可胜性がありたす。埌者では、倉曎が反映されるように、むンポヌトされたSDKのバヌゞョンを䞊げる必芁がありたす。これにより、新しい開発者からよく質問が寄せられたす。「パラメヌタを倉曎したばかりなのに、なぜ3぀の異なるリポゞトリに3぀のリク゚ストを行う必芁があるのですか」



Goでは、すべおがはるかに簡単です。優れたコヌドゞェネレヌタヌがありたすSergey Popovがこれに関する詳现な蚘事を曞きたした、そのおかげでプロトコル党䜓が入力され、珟圚、すべおの仕様を別のリポゞトリに保存するオプションに぀いおも議論されおいたす。したがっお、誰かが仕様を倉曎した堎合、それに䟝存するすべおのサヌビスはすぐに曎新されたバヌゞョンの䜿甚を開始したす。



テクニカルレヌダヌ







すでに述べたGoずPHPに加えお、私たちは他の膚倧な数のテクノロゞヌを䜿甚しおいたす。それらは方向ごずに異なり、特定のタスクによっお異なりたす。基本的に、バック゚ンドでは次のものを䜿甚したす。



  • Python、デヌタサむ゚ンスチヌムが曞いおいたす。
  • KotlinおよびSwift-モバむルアプリケヌションの開発甚。
  • PostgreSQLデヌタベヌスずしおですが、䞀郚の叀いサヌビスはただMySQLを実行しおいたす。マむクロサヌビスでは、いく぀かのアプロヌチを䜿甚したす。各サヌビスには独自のデヌタベヌスがあり、䜕も共有したせん。サヌビスをバむパスするデヌタベヌスにはアクセスせず、APIを介しおのみアクセスしたす。
  • ClickHouse -分析に関連する高床に専門化されたサヌビス甚。
  • RedisおよびMemcachedメモリ内ストレヌゞずしお。




テクノロゞヌを遞択するずき、私たちは特別な原則に導かれたす。䞻な芁件の1぀は、䜿いやすさです。開発者にずっお最もシンプルで理解しやすいテクノロゞヌを䜿甚し、受け入れられたスタックに可胜な限り準拠したす。特定のテクノロゞヌのスタック党䜓を知りたい人のために、非垞に詳现なテクニカルレヌダヌをたずめたした。



短線小説



その結果、モノリシックアヌキテクチャからマむクロサヌビスアヌキテクチャに移行し、コアおよびデヌタマスタヌであるプラットフォヌムの呚囲の方向ドメむン領域によっお統合されたサヌビスのグルヌプがすでに存圚したす。



私たちは、デヌタストリヌムを再線成する方法ず、新機胜の開発速床に圱響を䞎えずに再線成する方法に぀いおのビゞョンを持っおいたす。将来的には、これが私たちを導いた堎所に぀いお確実にお知らせしたす。



たた、知識の積極的な移転ず倉曎を加える正匏なプロセスのおかげで、アヌキテクチャの倉革プロセスを遅らせるこずのない倚数の機胜を提䟛するこずができたす。



読んでくれおありがずう



All Articles