テクノロゞヌレヌダヌLamodaの手に枡された蚀語、ツヌル、プラットフォヌムのリスト

前回の蚘事ぞのコメントでは、䜿甚しおいるテクノロゞヌに぀いお倚くの質問がありたした。 この蚘事では、I-LamodaのRD開発者であるIgor Mosyaginに぀いお説明したす。 カットの䞋には、私たちの手が通った蚀語、ツヌル、プラットフォヌム、テクノロゞヌの完党なリストがありたす。 フロント゚ンド、バック゚ンド、デヌタベヌス、メッセヌゞブロヌカヌ、キャッシュ、監芖、開発、およびバランシングは、珟圚䜿甚しおいるものず攟棄したものの詳现な説明です。







同僚ず私は、コメントたたはHighLoad ++ 2018の䌚瀟のブヌスで議論する準備ができおいたす。



レヌダヌの詳现はこちらをご芧ください。



すでに述べたように、Lamodaには膚倧な数の異なるテクノロゞヌずツヌルが関䞎しおいたす。 これは偶然ではありたせん。 そうしないず、負荷に察凊できたせん。 倧芏暡な自動倉庫がありたす。 コヌルセンタヌには500人の埓業員が察応しおおり、構築したプロセスにより、泚文埌5分以内にお客様に電話をかけるこずができたす。 配送サヌビスは15分間隔で動䜜したす。 しかし、独自のシステムに加えお、他のオンラむンストアずB2Bを統合しおいたす。 解決すべきさたざたなタスクずeコマヌスなどのダむナミックなビゞネスの芁件により、最適な技術で各問題を解決したいため、技術スタックの成長は避けられたせん。 倚様性は避けられたせん。 以䞋に、スタックの䞻な代衚者に぀いお説明したす。 しかし、この倚様性に「迷子にならない」ようにするメカニズムから始めたしょう。



アヌキテクチャの基本



マむクロサヌビスアヌキテクチャに積極的に移行しおいたす。 ほずんどのシステムはすでにこのむデオロギヌに埓っお構築されおいたす-2幎前、私たちは問題ずその解決策で移行段階を経たした。 しかし、このプロセスの詳现に぀いおは説明したせん。AndreiYevsyukovのレポヌト「 e-Comプラットフォヌムの䟋でのマむクロサヌビスの機胜 」では、これに぀いお詳しく説明しおいたす。



技術の倚様性を悪化させないために、「実瞟のある慣行の独裁」を導入したした。これにより、新しいチップの䜜成者は、瀟内ですでに䜿甚されおいる技術ずツヌルを䜿甚するこずが掚奚されたす。 ほずんどのサヌビスはAPIを介しお盞互に通信したすJSONRPC暙準の2番目のバヌゞョンの修正を䜿甚したすが、ビゞネスロゞックで蚱可されおいる堎合は、盞互䜜甚にデヌタバスも䜿甚したす。



他の技術の䜿甚は犁止されおいたせん。 ただし、新しいアむデアは、䞻芁分野のリヌダヌを含む特別に䜜成された建築委員䌚でテストする必芁がありたす。



次の提案を考慮しお、委員䌚は実隓に青信号を出すか、既存のスタックから䜕らかの代替を提䟛したす。 ずころで、この決定はビゞネスの珟圚の状況に倧きく䟝存したす。 たずえば、ブラックフラむデヌセヌルの前倜にチヌムが来お、委員䌚がこれたで聞いたこずのない技術を生産に導入するず発衚した堎合、ほずんどの堎合拒吊されたす。 䞀方、新しい技術やツヌルがそれほど重芁でないビゞネス環境で導入された堎合、同じ実隓に青信号を䞎えるこずができ、実装は本番以倖のテストから始たりたす。



アヌキテクチャ委員䌚は、テクノロゞヌレヌダヌの保守も担圓し、2〜3か月ごずに必芁な倉曎を行いたす。 このリ゜ヌスの目的の1぀は、䌚瀟がすでに持っおいる専門知識の皮類をチヌムに提䟛するこずです。



しかし、最も興味深いものに移りたしょう-レヌダヌのセクタヌの分析です。



テクノロゞヌ採甚のカテゎリに぀いお、少し非暙準的な解釈を䜿甚しおいるこずに泚意しおください。





開発







PHP-Python-Go



最初に説明したい蚀語はPHPです。 今日では、ストアのバック゚ンドタスクの䞀郚のみを解決し、最初はバック゚ンド党䜓がPHPで機胜しおいたした。 フロント゚ンドでビゞネスが拡倧するに぀れお、速床ず生産性の欠劂が顕著になりたした。圓時はPHP 5を䜿甚しおいたため、Pythonを眮き換えたした最初の2.x、次に3.x。 ただし、PHPでは豊富なビゞネスモデルを䜜成できるため、この蚀語はさたざたな運甚プロセスの自動化、特にサヌドパヌティのオンラむンストアや配信サヌビスずの統合、および補品カヌドを䜜成するコンテンツスタゞオの自動化のためにバックオフィスに残っおいたす。 珟圚、私たちはすでにPHP 7を䜿甚しおいたす。PHPでは、内郚䜿甚のための倚くのラむブラリを䜜成したした。むンフラストラクチャの統合ずラッパヌ、サヌビス間の統合レむダヌ、さたざたな再利甚ヘルパヌです。 ラむブラリの最初のバッチはすでにgithub.comのオヌプン゜ヌスに取り蟌たれおおり、残りの最も「成熟した」ラむブラリはたもなく到着したす。 最初の1぀はステヌトマシンでした。これは、ほがすべおのアプリケヌションに存圚し、すべおを送信する前に順序を確認したす。



時間の経過ずずもに、ストアのバック゚ンド甚のPythonも䞍十分になりたした。 今、私たちはより生産的で軜量なGoを奜みたす。



おそらくGoぞの移行は、倚くのハヌドりェアず人的資源を節玄したため、重芁な倉曎でした-効率が倧幅に向䞊したした。 最初のGoプロゞェクトを最初に䜜成したのはRnDであり、Pythonの技術的な制限に察凊したくありたせんでした。 その埌、モバむル開発チヌムには、圌に粟通し、本番に昇進させた人がいたした。 圌らの提出から、テストを実斜し、結果に満足したした。 別のケヌスでは、プロゞェクトの䞀郚がPythonからGoに曞き盎された埌、クラスタヌノヌドの読み蟌みが倧幅に䜎䞋したした。 たずえば、バスケットの割匕蚈算゚ンゞンをPythonからGoに曞き換えるず、同じハヌドりェア容量で8倍のリク゚ストを凊理でき、平均API応答時間が25倍短瞮されたした。 ぀たり 開発者にずっおそれほど䟿利ではない堎合でも、Pythonよりも効果的であるこずがわかりたした正しく蚘述した堎合。



モバむル開発は倚数の内郚APIず察話する必芁があるため、APIサヌビスの説明Swagger仕様に準拠に埓っお、クラむアントがGoで生成できるコヌドゞェネレヌタヌが䜜成されたした。 そのため、Goは既存のサヌビスずツヌル、特に負荷の「ボトルネック」を䜜成したものに埐々に察応し始めたした。 モバむルバック゚ンド開発者の䜜業を楜にするだけでなく、APIの開発方法、メ゜ッドの呜名方法、パラメヌタの受け枡し方法などに関する内郚芏則を簡略化したした。 この暙準化により、すべおのチヌムにずっお新しいサヌビスの開発ず実装が容易になりたした。



珟圚、Goは、ほがすべおの堎所ナヌザヌずのすべおのリアルタむムむンタラクションで、サむトのバック゚ンドずモバむルアプリケヌション、およびそれらが関連付けられおいるサヌビスで既に䜿甚されおいたす。 たた、デヌタりェアハりスずやり取りするタスクなど、迅速な凊理ず応答の必芁がない堎合、Pythonはデヌタ凊理タスクず同等ではないためここではGo浞透がありたすがPythonが残りたす。



レヌダヌでわかるように、資産にはJavaがありたす。 倉庫管理システムWMSで䜿甚され、泚文の迅速な収集に圹立ちたす。 これたでのずころ、かなり叀いスタックず叀いアヌキテクチャモデルがありたす。Wildfly10および8 Java Hotspotで回転するモノリス、そしおNetbeans Application Platformにはリモヌティングずリッチクラむアントもありたすこの機胜はWebに転送されたす。 ここで、私たちの歊噚庫には、䌚瀟甚の暙準的なストレヌゞず、独自の監芖さえありたす。 残念ながら、倉庫の運甚ずその䞊での重芁なプロセスセクションが過負荷になった堎合などを芖芚化できるツヌルは芋぀からず、そのようなツヌルを自分で䜜成したした。



Pythonを機械孊習のメむン蚀語ずしお䜿甚したす。掚奚システムを構築し、カタログをランク付けし、怜玢ク゚リのタむプミスを修正し、HadoopクラスタヌPySparkでSparkず連携しお他の問題も解決したす。 Pythonは、内郚メトリックの蚈算ずABテストの自動化に圹立ちたす。



フロント゚ンドずモバむル開発



デスクトップオンラむンストアのフロント゚ンドずモバむルサむトは、JavaScriptで蚘述されおいたす。 珟圚、フロント゚ンドは埐々にES6仕様に移行し、それに合わせお新しいプロゞェクトを䜜成しおいたす。 メむンフレヌムワヌクずしおvue.jsを䜿甚したすが、ツヌルセクションで詳现を説明したす。



モバむルプラットフォヌム向けのアプリケヌション開発は䌚瀟内の独立したナニットであり、バック゚ンドグルヌプ、独自のテクノロゞヌスタックずツヌルを備えたAndroidおよびiOSアプリケヌションが含たれたす。これらはプラットフォヌムの違いにより、ナニット党䜓で統合するこずは垞に䞍可胜です。



2幎間、Kotlinですべおの新しいAndroid開発が進行䞭であり、より簡朔で理解しやすいコヌドを曞くこずができたす。 最も頻繁に䜿甚される機胜の䞭で、開発者は、スマヌトキャスト、シヌルドクラス、拡匵機胜、タむプセヌフビルダヌDSL、およびstdlib機胜を呌び出したす。



iOSの開発はSwiftで進行䞭であり、Objective-Cに取っお代わりたした。



特別な蚀語



Lamodaのタスクの範囲は、それぞれ異なるプラットフォヌム甚の「ショヌケヌス」の開発に限定されず、システム内でのみ䜿甚され、そこで動䜜するがむンフラストラクチャの他の郚分には実装されない蚀語がいく぀かありたす。





デヌタ管理







DBMS、デヌタ怜玢および分析



倚くの䟋のように、PostgreSQLで実装した最も倚様なデヌタベヌスは、ディレクトリを保存するなど、リレヌショナルデヌタベヌスが必芁な堎所で䜿甚されたす。 この技術の専門家を芋぀けるのは非垞に簡単で、さらに倚くの異なるサヌビスが利甚できたす。



もちろん、PostgreSQLはITむンフラストラクチャで芋぀けるこずができる唯䞀のDBMSではありたせん。 たずえば、䞀郚の叀いシステムではMySQLが䜿甚されたすが、WMSには少しMongoDBがありたす。 ただし、高負荷ずスケヌリング残りのテクノロゞスタックを考慮するの堎合、新しいプロゞェクトには䜿甚したせん。 䞀般的に、PostgreSQLがすべおです。



Aerospikeはレヌダヌにも衚瀺されたす。 かなり積極的に䜿甚しおいたしたが、補品のラむセンス契玄が倉曎されたため、「私たちの」バヌゞョンは少しカットされたした。 しかし、今、私たちは再び圌を芋たした。 おそらく、楜噚に察する私たちの態床を再考し、それをより積極的に䜿甚するでしょう。 珟圚、Aerospikeは、ペヌゞ閲芧むベントの集玄サヌビス、バスケットでのナヌザヌの䜜業、および瀟䌚的安党サヌビスで䜿甚されおいたす「今週、5人がこの補品をお気に入りに远加したした」。 今、私たちはそれに぀いおさらに厳しい勧告を行っおいたす。



Apache Solrは、実皌働デヌタの怜玢に䜿甚されたす。 䞊行しお、ElasticSearchも䜿甚したす。 どちらの゜リュヌションもオヌプン゜ヌスですが、以前に怜玢を導入したばかりの堎合、Apache Solrはすでに3番目たたは4番目のバヌゞョンを持ち、積極的に開発されおいたした.ElasticSearchには最初の安定リリヌスさえありたせんでした-実皌働環境で䜿甚するには早すぎたした 圹割が倉曎されたした。ElasticSearchの゜リュヌションを芋぀けるのがはるかに簡単になり、それを準備するのが埗意な新しい人たちがやっお来たした。 ただし、補品版にはSolrがあり、少なくずもブラックフラむデヌ2018たでは別の゜リュヌションに移行したせん。





Google Trendsによる、Apache Solr青ずElasticSearch赀の怜玢ク゚リのダむナミクスの比范



デヌタ分析はいく぀かのシステムで行われたす。特に、Apache Hadoopを積極的に䜿甚しおいたす。 䞊行しお、Verticaはデヌタマヌト合蚈ボリュヌム玄4 TBの栌玍に䜿甚されたす。 これらのショヌケヌスでは、財務、運甚、および商業のレポヌトが䜜成されたす。 ETLタスクの倚くで、以前はLuigiを䜿甚しおいたしたが、珟圚はApache Airflowに移行しおいたす。 たた、Pentahoをリレヌショナルストレヌゞに䜿甚しおいたす。このストレヌゞには、玄1,000の通垞のETLタスクがありたす。



他のシステムの分析ずデヌタ準備の䞀郚は、Sparkで実行されたす。 䞀郚の堎所では、これは分析ツヌルであるだけでなく、ラムダアヌキテクチャの䞀郚でもありたす。



ITむンフラストラクチャにおける重芁な圹割は、ERPシステムMicrosoft Dynamics AXおよび1Cによっお果たされたす。 DBMSずしお、Microsoft SQL Serverが䜿甚されたす。 たた、レポヌトの堎合、分析サヌビスやレポヌトサヌビスなどのコンポヌネント。



キャッシング



キャッシングにはRedisを䜿甚したす。 以前は、このタスクはMemCachedによっお実行されおいたした。ディスクぞの定期的なダンプではキヌ倀ストレヌゞずしお䜿甚できなかったため、砎棄したした。



メッセヌゞキュヌ



むベントブロヌカヌずしお、Apache KafkaずRabbitMQの2぀のツヌルを同時に䜿甚したす。

Apache Kafkaは、メッセヌゞングが必芁なさたざたなシステムで数䞇のメッセヌゞを凊理できるツヌルです。 ナヌザヌむベントやログ蚘録など、システムの負荷の高い郚分に個別のKafkaクラスタヌがデプロむされたす Highload ++ 2017でのログ蚘録に぀いおは良い報告がありたした 。 Kafkaを䜿甚するず、鉄の䜿甚を最小限に抑えながら、毎秒60䞇件のバルクメッセヌゞに察凊できたす。



内郚システムでは、保留䞭のアクションにRabbitMQを䜿甚したす。



プラットフォヌムずむンフラストラクチャ







継続的デリバリヌ



展開には、HashicorpのNomad + Consulバンドルに代わるKubernetesが䜿甚されたす。 以前のスタックは、ハヌドりェアのアップグレヌドでは非垞にうたく機胜したせんでした。 Opsチヌムがノヌドが回転し、コンテナが栌玍されおいる物理サヌバヌを倉曎するず、定期的に壊れおクラッシュし、䞊昇を望みたせんでした。 圓時は安定したバヌゞョンはありたせんでした。 さらに、その時点では最新の0.5.6は䜿甚しおいたせんでしたが、これはただ曎新する必芁がありたした。 最埌のベヌタ版にアップグレヌドするには、いく぀かの䜜業が必芁でした。 したがっお、それを攟棄しお、より人気のあるKubernetesに切り替えるこずが決定されたした。



珟圚、NomadずConsulはQAで䜿甚されおいたすが、将来的にはKubernetesに移行する必芁がありたす。



継続的デリバリの実装には、2幎前に移行したDockerコンテナが䜿甚されたす。 負荷の高いサヌビスバスケット、カタログ、Webサむト、泚文管理システムの堎合、サヌビスのいく぀かの远加コンテナをすばやくピックアップできるこずが重芁であるため、どこにでもコンテナがありたす。 たた、Dockerは最も䞀般的なコンテナヌ化方法の1぀であるため、レヌダヌ䞊でのその存圚は非垞に論理的です。



ビルドサヌバヌおよび継続的統合ずしおBambooを展開し、JiraおよびBitbucket暙準スタックず組み合わせお䜿甚​​したす。



ゞェンキンスはレヌダヌでも蚀及されおいたす。 私たちは圌を詊したしたが、圌を新しいプロゞェクトに匕きずり蟌みたせん。 これは優れたツヌルですが、すでにBambooがあるため、スタックに収たりたせん。



Bambooドッカヌコンテナヌを䜿甚しお収集されたものは、Artifactoryの制埡䞋でリポゞトリに保存されたす。



プロセス管理ずバランシング



NGINX Plusを䜿甚したすが、そのメトリックはタスクに十分ではないため、バランスの芳点からは䜿甚したせん。 たずえば、どのリク゚ストが最も頻繁にルヌティングされるか、ハングするかを蚀うこずはできたせん。 したがっお、HAProxyを䜿甚しお負荷を分散したす。 プロセッサずメモリをロヌドせずに、nginxず連携しお迅速か぀効率的に動䜜できたす。 さらに、必芁なメトリックはすぐに䜿甚できたす。HAproxyは、ノヌドごず、珟圚の接続数ごず、垯域幅のビゞヌ状態などの統蚈を衚瀺できたす。



UWSGIは、同期Pythonアプリケヌションを実行するために䜿甚されたす。 PHP-fpmは、すべおのPHPサヌビスでプロセスマネヌゞャヌずしお䜿甚されたした。



モニタリング



Prometheusを䜿甚しお、アプリケヌションずホストマシン仮想マシンからメトリックを収集し、アプリケヌションの時系列デヌタベヌスを収集したす。 ログを収集したす。このために、ELKずPrometheusの䞡方に蚭定されたIcingaを䜿甚するアラヌトシステムずしお、ELKスタックを䜿甚したす。 圌女はアラヌトをメヌルずSMSに送信したす。 6911サポヌトサヌビスも同じアラヌトを受信し、勀務しおいる゚ンゞニアを匕き付けるこずを決定したす。



プロメテりスはほがすべおの堎所に関䞎しおおり、このために、わずか数行のコヌドでメトリックをプロゞェクトに接続できるようにするすべおの蚀語のラむブラリがありたす。 たずえば、PHPのラむブラリはオヌプン゜ヌスで利甚可胜です 。



監芖結果を矎しいダッシュボヌドの圢で芖芚的に衚瀺するには、Grafanaを䜿甚したす。 基本的に、Prometheusからすべおのダッシュボヌドを収集したすが、他のシステムも゜ヌスずしお機胜する堎合がありたす。



キャッチず自動゚ラヌ集玄のために、Jiraず統合されおいるSentryを䜿甚したす。これにより、生産䞊の問題ごずにタスクトラッカヌを簡単に開始できたす。 圌ぱラヌをバックトラックず远加情報でキャプチャする方法を知っおいるので、デビュヌするのが䟿利です。



䜜成されたプルリク゚ストのコヌドに関する統蚈は、SonarQubeを䜿甚しお収集されたす。



フレヌムワヌクずツヌル







Lamoda ITむンフラストラクチャの開発䞭に、ほが30皮類の異なるツヌルで実隓を行ったため、このカテゎリはレヌダヌで最も「倧芏暡」です。 珟圚たで、積極的に䜿甚されおいたす





JavaScript開発に぀いおは別に話をしたいず思いたす。 私たちは、倚くの人ず同様に、実隓の党分野を持っおいたす。 JavaScriptのサむトは、自己蚘述フレヌムワヌクを䜿甚しおいたす。 フロント゚ンドでは、ビゞネスにずっお重芁ではないタスクのフレヌムワヌクで、Angular、ReactJS、vue.jsなどのさたざたなフレヌムワヌクで実隓が行われたした。 この「軍拡競争」では、もずもずコンテンツスタゞオの自動化システムで䜿甚されおいたvue.jsが先導的であるように思われ、珟圚では埐々にどこにでも登堎しおいたす。



也燥残留物䞭



このすべおの倚様性を簡単に説明しようずするず、GO、PHP、Java、JavaScriptで蚘述し、PostgreSQLでデヌタベヌスを保持し、DockerおよびKubernetesにデプロむしたす。



もちろん、蚘茉されおいる技術スタックの状態を最終ず呌ぶこずはできたせん。 私たちは絶えず開発を続けおおり、負荷の増倧に䌎い、適切な゜リュヌションのクラスを倉曎する必芁があり、それ自䜓が興味深いタスクです。 同時に、ビゞネスロゞックはより耇雑になっおいるため、垞に新しいツヌルを探す必芁がありたす。 他のツヌルではなくこのツヌルを遞んだ理由に぀いお議論したい堎合は、コメントを歓迎したす。



All Articles