Vkontakteから住宅広告を収集および分類するためのサービスのアーキテクチャ





この記事では、Vkontakteから住宅広告を検索するサービスの編成と開発、サービス指向アーキテクチャが選択された理由、およびその開発で使用されたテクノロジーとソリューションについて説明します。



このサービスは9か月以上実行されています。



この期間中:





さらに本文では、Webサービス全体ではなく、 SOAモジュールとしてサービスという言葉を使用します。



SOAアーキテクチャを選択したのは、それが可能になったためです。





マイクロサービスアーキテクチャと呼ぶこともできますが、わずかな違いがありました。 サービス間では、 MDBWPプロトコルを使用した「共通データベース」に基づくデータ交換が、マイクロサービス用の通常のHTTP APIの代わりに使用され 、各サービスのデータを独自のデータベースに保存します。 このアプローチは、記述されたSOAアプローチのすべての利点を維持する能力を備えた開発の速度によるものでした。



Ansibleは、展開を自動化するために選択されました。

これは、エントリーしきい値が低い構成管理システムの1つです。



MongoDBがデータベースとして選択されました。 このドキュメント指向のデータベースは、地下鉄駅のリスト、家主の連絡先の詳細、広告の説明を含む広告を保存するのに最適でした。



現時点では、サービスの相互作用の一般的なスキームは次のとおりです。







サービス:






rent-view-広告を表示して検索するためのサービス



github.com/mrsuh/rent-view







サービスはNodeJSで記述されているため、 その品質の最も重要な基準は、ユーザーへのサーバーの応答速度でした。



サービスはMongoDBで広告を呼び出し、 doT.jsテンプレートエンジンを使用してHTMLページをレンダリングし、ブラウザーに提供します。



サービスはGruntを使用して構築されます。



ブラウザで動作するように、スクリプトは純粋なJSで記述され、スタイルはLESSで記述されました。 プロキシサーバーとして、応答の一部をキャッシュし、 HTTPS接続を提供するNginxが使用されます



rent-collector-広告収集サービス



github.com/mrsuh/rent-collector







このサービスは広告を収集して分類し、データベースに書き込みます。



それはいくつかの理由でPHPで書かれています :サービスを書くために必要なライブラリの知識、および高い開発速度。



symfony 3フレームワークを使用します。



Beanstalkがキューサービスとして選択されました。 彼は軽量ですが、自分のメッセージブローカーはいません。 これは、小規模な仮想サーバーや、損失にとって重要ではないデータに必要なものです。



beanstalkを使用して、 4つのメッセージングチャネルが作成されました。





rent-parser-クラシファイド広告サービス



github.com/mrsuh/rent-parser

サービスはGolangで書かれています



テキストから構造化データを抽出するために、サービスはYandexの Tomitaパーサーを使用します。 テキストの予備処理と解析結果の後続処理を実行します。



サービスをテストできるように、オープンAPIを作成しまし



パーサーをオンラインで試す
リクエスト:

curl -X POST -d '   30   .  + 7 999 999 9999' 'http://api.socrent.ru/parse'
      
      





答えは:



 {"type":2,"phone":["9999999999"],"price":30000}
      
      





広告タイプ:

+ 0-部屋

+ 1-1ベッドルームアパートメント

+ 2-2ベッドルームアパートメント

+ 3-3ベッドルームアパートメント

+ 4-4 +部屋のアパート

+ 5-スタジオ

+ 6-発表ではありません



アナウンスメントの分類の詳細については、ここに書いたhabrahabr.ru/post/328282



家賃管理-設定管理サービス



github.com/mrsuh/rent-control







それはいくつかの理由でPHPで書かれています :サービスを書くために必要なライブラリの知識、および高い開発速度。

symfony 3フレームワークを使用します。

ブートストラップ3スタイルライブラリ



サービスが制御する設定は次のとおりです。





最初は、コントロールを解析するためのすべてのデータが構成ファイルにありました。 都市の数の増加に伴い、都市を視覚化し、レコードの編集を簡素化する必要がありました。 さらに、新しいパラメーターの追加を簡素化する必要がありました。



rent-notifier-TelegramおよびVkontakteで新しいアナウンスを送信するためのボットサービス。



github.com/mrsuh/rent-notifier



広告を購読する例:







ユーザーへの応答速度が重要であるため、サービスはGolangで記述されています。

サービスの本質は次のとおりです。新しいアナウンスを受信するためにサブスクライブし、ボットを追加するとそれらに関するメッセージを送信します。 このサービスは、メッセージテキストに元の広告へのリンクを挿入します。



ヘルパーレポ






PHPの共有データベースのコード



github.com/mrsuh/rent-schema



一般的なデータベーススキーマ:







家賃管理サービスの追加により、データベーススキーマコードの重複が現れました。 したがって、コードを別のパッケージに入れることが決定されました。 これで、 PHPのサービスについてはコンポーザーによってこのパッケージを追加するだけで十分です。



 composer require mrsuh/rent-schema
      
      







mongoDBのODM



github.com/mrsuh/mongo-odm



私が考えた最初のPHP MongoDB用ODMはDoctrine 2でした。 Symfony 3に付属し、優れたドキュメントがあります。



しかし、このODMMongo PHPの最新ドライバーで動作するためには、サービスの作成時に、新しいAPIと古いAPIの間にレイヤーとして別のパッケージを配置する必要がありました。 Doctrine 2自体はかなり大きなプロジェクトであり、追加のパッケージによりさらに大きくなりました。 代わりに、軽量のものが欲しかった。 そのため、最小限の機能セットでODMを自分で作成することにしました。 そして、私はそれをしました-ODMはその責任に完全に対処します。



いくつかの統計






このサービスは、1日あたり平均519.41の広告をサイトに追加します。



ロシアの大都市の中で最も人気のある地下鉄駅は次のとおりです。





より多くの統計はサイト自体で見つけることができます。



おわりに






SOAアーキテクチャが必要かどうかまだ決定していない場合は、モジュールに分類したモノリシックアプリケーションを作成します。 そのため、必要に応じてアプリケーションをサービスに簡単に転送できます。 ただし、 SOAアーキテクチャを引き続き使用することに決めた場合、これにより開発の複雑さ、デプロイメントの複雑さ、コードの量、およびサービス間のメッセージの量が増加する可能性があることを理解する必要があります。



PS私は私のサービスを使用して最後の2つのアパートを見つけました。 彼もあなたを助けることを願っています。



All Articles