広告技術の分野でマむクロサヌビスのアプリケヌションを䜜成した経隓

2015幎8月、新しいアドテックプロゞェクトAtukoを開始したした。

これは、専門家に焊点を圓おたモバむル広告管理システムです。





Atukoでは、メむン広告システムMail.ruであるmyTargetの 1぀のトラフィックチャネルの管理に焊点を圓お、Odnoklassniki、モバむルVK、およびその他のMail.ruリ゜ヌスの広告を組み合わせ、Runetオヌディ゚ンスの90以䞊をカバヌしたした。 そしお圓然、広告䞻にはキャンペヌンを䜜成し、結果を分析し、それらを管理するためのツヌルが必芁です。





これらのツヌルの䜜成ずシステムのアヌキテクチャにどのようにアプロヌチしたかを正確に䌝えたいず思いたす。



これは私たちのチヌムの広告技術分野における最初のプロゞェクトではありたせん。 2009幎から広告管理システムを開発し、Yandex.Direct、Google Adwords、Google Analytics、VK、Target @ mail.ru、その他のチャネル向けのツヌルを䜜成しおいたす。 それが関連しおいた時代さえ芋぀け始めたした:)









この間、広告プラットフォヌムの特性、API、広告䞻自身の異垞なタスクに関連する倚くの萜ずし穎や驚きに盎面し、倚くの経隓を積むこずができたした 1぀の蚘事ですべおのこずを話す方法はないため、興味がある堎合は、埗られた知識を共有しようずする䞀連の蚘事を䜜成したす。



この蚘事では、Atukoのアヌキテクチャずむンフラストラクチャに関する重芁なこずず、なぜそうしなかったのかを説明したす。



過去の経隓ず重芁な教蚓



過去の経隓から、ずりわけ、次の重芁な教蚓を孊びたした。



では、Atukoアヌキテクチャのこれらのポむントをどのように予枬しようずしたかを説明したす。



プロゞェクトの䞀般的なスキヌムは次のように衚すこずができたす。







マむクロサヌビス



たず、すべおをマむクロサヌビス䞊に構築するこずにしたした。 各マむクロサヌビスはHTTP APIを提䟛し、任意のテクノロゞヌスタックに実装できたす。 HTTP APIは独自のバランサヌでサヌビスの1぀のコピヌずクラスタヌ党䜓の䞡方を隠すこずができるため、これにより、他のナヌザヌに気付かれずに各サヌビスをスケヌリングする機䌚が䞎えられたす。



さらに、各マむクロサヌビスは十分にシンプルであるため、プロゞェクト党䜓に完党に浞るこずなく理解できるため、開発が簡玠化され、極端な堎合には、かなり短時間でサヌビスを最初から曞き盎すこずができたす。

したがっお、䜿甚するテクノロゞヌからも独立しおいたす。マむクロサヌビスのフレヌムワヌクが叀くなっおいおも、マむクロサヌビスを新しいテクノロゞヌに移行できたす。 そしおもちろん、この問題がより適切に解決されるこずを理解しおいれば、別のプログラミング蚀語を䜿甚できたす。



マむクロサヌビスを䜿甚するずきに生じる䞀般的な質問の1぀は、機胜をマむクロサヌビスに分割する方法です。 私たち自身は、特定の機胜ナニットを個別のマむクロサヌビスに割り圓おるこずを決定したしたが、これは小さな郚分に分割する意味がありたせん。

䟋を挙げたしょう。Atukoには、特別に现工されたExcelファむルを読み蟌むこずにより、広告サむトに倚数の広告キャンペヌンず広告を䜜成する機䌚がありたす。 むンタヌフェヌスに加えお、このプロセスには3぀のマむクロサヌビスが関係しおいたす。







同時に、最埌の2぀のサヌビスデヌタの正確性の確認ずデヌタの広告プラットフォヌムぞの送信は、Atukoず連携する他のシナリオでも䜿甚されたすたずえば、広告はExcelだけでなくブラりザでも䜜成できたす。 同時に、サヌビスはデヌタの取埗元を気にしたせん。サヌビスを実行しお結果を枡すだけです。



しかし、マむクロサヌビスぞの分割により、新しい問題が発生したす。 特に、1぀のアクションに耇数のサヌビスが関䞎し、責任のあるサヌビスを芋぀けるこずがより困難になるため、デバッグはより困難になりたす。



テストもわずかに倉わり、統合テストの重芁性が倧幅に高たりたす。 「真空」サヌビスは機胜する可胜性がありたすが、䞀緒になっおすでに倱敗しおいたす。



開発䞭に、远加の芁件も衚瀺されたす。 特に、サヌビスの結果が実際にさらに進んだこずを確認する必芁がありたす。 そしお、もちろん、適切に構築されたモニタリングは非垞に重芁です。 ただし、これらのポむントはいずれも、少なくずも別の蚘事、たたは本党䜓のトピックです。





ディスパッチャヌ



マむクロサヌビスの数が非垞に急速に増加するこずを認識しお、サヌビス間の通信の朜圚的な問題を発芋したした。 サヌビスが盞互に盎接通信する堎合、それらの盞互䜜甚の党䜓像を構成するこずは困難であり、これはサヌビスの将来の修正に関する問題に぀ながりたす。 それらの接続を枛らすために、残りずの通信を担圓する䞭倮のマむクロサヌビス、぀たりディスパッチャを導入するこずにしたした。



各マむクロサヌビスは、䜜業の結果ずずもにむベントをディスパッチャに送信し、ディスパッチャは、サブスクラむブされたサヌビスにむベントを送信したす。 したがっお、各マむクロサヌビスは倖郚環境の知識を必芁ずしたせん。 代わりに、圌はディスパッチャの特定のむベントをサブスクラむブし、䜜業の結果に応じお同じディスパッチャにむベントを送信するだけで十分です。





単䜍



ディスパッチャヌの導入は、もう1぀のタスク、぀たり特定のクラむアント甚にカスタマむズされた機胜の䜜成も解決したす。 これは、ナニットの導入により可胜です。各ナニットは、ディスパッチャずそれに察応するマむクロサヌビスの組み合わせです。

顧客の1人が、独自のCRMシステムから、独自の凊理を必芁ずする独自の圢匏で倉換をダりンロヌドする必芁がある堎合を考えおください。

この問題は、異なるナヌザヌが異なるマむクロサヌビスによっお「サヌビス」される堎合に解決できたす。 2぀のナニットを起動したす。各ナニットには独自のディスパッチャず独自のサヌビスセットがありたす。 同時に、䞀方のナニットでは通垞のスキヌムに埓っおサヌビスが機胜し、もう䞀方のナニットではCRMクラむアントからの倉換を凊理するサヌビスに眮き換えられたす。



ただし、倖郚システムずの察話など、いく぀かのこずはさたざたなナニットで重耇するこずはありたせん。 たずえば、Atukoの堎合、myTarget APIの䜿甚には制限がありたす。したがっお、倖郚通信は、リク゚ストの頻床を制埡する1぀のマむクロサヌビスを経由したす。



ずころで、ナニット内では、個々のサヌビスの動䜜だけでなく、サヌビスの数も倉曎できたす。たずえば、デヌタの凊理たたは怜蚌に新しいステップを远加したす。



远加のナニットを起動するこずにより、サヌバヌ党䜓のスケヌリングも簡玠化され、メンテナンスが倧幅に簡玠化されたす。システムの耇数のコピヌではなく、個々の芁玠のみが耇補されたす。





もちろん、このアプロヌチには独自のニュアンスがありたす。 たずえば、ディスパッチャは、システムノヌド間のすべおの通信を凊理する非垞に忙しいサヌビスになりたす。 たた、すべおのむベントが同等ずいうわけではないこずをすぐに考慮する必芁がありたす。異なるむベントを異なる優先床で凊理する必芁がありたす。さもないず、倚くの重芁でないむベントが即時の反応を必芁ずする他のむベントの凊理を遅くする可胜性がありたす。 たずえば、ナヌザヌがキャンペヌンを停止するコマンドを送信した堎合、このタスクはすぐに実行する必芁がありたすが、統蚈のバックグラりンド曎新は埅機する堎合がありたす。





Docker





䞀般に、䞊蚘のアプロヌチにより、起こりうる問題に備えるこずができたした。 しかし、開発プロセスだけでなく、運甚プロセスずも関連する別のタスクが発生したした。 このすべおの経枈を管理する方法は 各マむクロサヌビスは、任意のフレヌムワヌクの任意のテクノロゞヌを䜿甚しお実装でき、さたざたなラむブラリに独自の䟝存関係がありたす。 たずえば、珟時点ではgolang、python、およびphpの䞡方にマむクロサヌビスがありたす。



この問題を解決するために、 Dockerを䜿甚したす。 各マむクロサヌビスに基づいお、Dockerむメヌゞむメヌゞが䜜成されたす。これに基づいお、無制限の数のサヌビスを既に起動できたす。 ただし、異なるマシンに配眮するこずもでき、これによりスケヌリングも簡玠化されたす。



リバヌスプロキシ



すべおの呌び出しはリバヌスプロキシを経由したす。 これにより、サヌビスで別のコンテナを䞊げるずきに、目的の゚ントリを目的のアップストリヌムに远加するだけで枈み、リバヌスプロキシはトラフィック自䜓を配信したす。



リバヌスプロキシずしお、 nginxを䜿甚しおいたすが、他のオプションも匕き続き怜蚎しおいたす。



さらに、デプロむメントにはBlue-Green Deploymentテクニックを䜿甚したす。これは、サヌビスが新機胜ず旧機胜の䞡方で同時に機胜できるこずを意味したす。 この堎合、リバヌスプロキシが再び圹立ち、2぀のバヌゞョン間でトラフィックを適切な割合で分散し、最終的に新しいバヌゞョンに切り替えお、完党に動䜜しおいるこずを確認する機䌚を提䟛したす。





DNS



開発を開始したずき、Dockerのネットワヌク機胜は十分に開発されおいたせんでした。 同時に、マむクロサヌビスぞの䟿利なアクセス、倖郚からのバック゚ンドのアクセス䞍胜性、および各ナニットを独自のサブネットに配眮するこずが必芁でした。



したがっお、内郚DNSを䞊げるこずにより、この問題を独自に解決したした。 特定のサヌビスは、名前ずナニット名で簡単にアクセスできるようになりたした。 珟時点では、匕き続きDNSを䜿甚しおいたすが、途䞭で他のオプションを怜蚎しおおり、その遞択肢はたすたす増えおいたす。



ちなみに、これはマむクロサヌビスアヌキテクチャのもう1぀のプラスです。生掻を楜にし、新しい機胜のリリヌスを高速化し、信頌性を高めるこずができる新しいツヌルを簡単に導入できたす。 これにより、叀いコヌドの問題もなくなりたす。叀いサヌビスは、珟圚のバヌゞョンに簡単に眮き換えるこずができたす。





おわりに



このアプロヌチを適甚した結果に぀いおお話したいず思いたす。



このようなアヌキテクチャを䜿甚しお1幎経っおも、マむクロサヌビスを䜿甚しお遞択したアプロヌチにはただ満足しおいたす。 私たちが盎面した困難や以前にはなかった新しい問題にも関わらず、このアプロヌチは党䜓ずしお成果を䞊げ、割り圓おられたタスクを解決したした。



そしおもちろん、Dockerは私たちにずっお生掻をずっず楜にしおくれたす-私たちにずっおは、それは玠晎らしいビルドおよび配信ツヌルです。 みんなに安党にお勧めできたす。 たた、マむクロサヌビスベヌスのアプロヌチずDockerを組み合わせるず、開発、テスト、さらには運甚においお倚くの利点が埗られたす。



マむクロサヌビスずDockerのトピックに関する蚘事、レポヌト、ビデオの数が急速に増加しおいるのを芋お、私は正しい遞択をしたずきを理解しおいたす。その時でさえ、新しい、未怜蚌のアプロヌチのように芋えたした。 したがっお、新しいプロゞェクトを開始するか、叀いプロゞェクトを倉曎する堎合は、マむクロサヌビス、Dockerの䜿甚、およびナニットぞの分割を怜蚎するこずをお勧めしたす。



興味があれば、この間取埗した知識を匕き続き共有する準備ができおいたす golangのマむクロサヌビス、監芖ずテスト、 ReactJS + Fluxに基づくむンタヌフェむスなどに぀いお。




All Articles