この記事では、Vkontakteから住宅広告を検索するサービスの編成と開発、サービス指向アーキテクチャが選択された理由、およびその開発で使用されたテクノロジーとソリューションについて説明します。
このサービスは9か月以上実行されています。
この期間中:
- ロシアの21の大都市をカバーすることができました。 その中には、モスクワ、サンクトペテルブルク、エカテリンブルク、カザンなどがあります。
- 地下鉄駅の総数を65から346に増やすことが判明しました。
- 広告の平均数は1日あたり131.2から519.41に増加しました。
- 設定コントロールパネルが追加されました。
- ボットがTelegramとVkontakteに追加されました。 新しいアナウンスをサブスクライバーに自動的に通知します。
さらに本文では、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つのメッセージングチャネルが作成されました。
- パーサー -テキストから広告タイプ、価格、説明、リンクなどの事実を抽出します。 データ処理を高速化するために、このチャネルの複数のコンシューマーを起動しました。
注:コンシューマーは、レントパーサーサービスと通信します。 - collector-広告に関する処理済みデータをデータベースに書き込みます。
- notifier-新しいお知らせをユーザーに通知します。 注:消費者はrent-notifierサービスと通信します。
- パブリッシャー -複数のVkontakteグループで広告を発行します。
rent-parser-クラシファイド広告サービス
github.com/mrsuh/rent-parser
サービスはGolangで書かれています 。
テキストから構造化データを抽出するために、サービスはYandexの Tomitaパーサーを使用します。 テキストの予備処理と解析結果の後続処理を実行します。
サービスをテストできるように、オープンAPIを作成しました 。
パーサーをオンラインで試す
リクエスト:
答えは:
広告タイプ:
+ 0-部屋
+ 1-1ベッドルームアパートメント
+ 2-2ベッドルームアパートメント
+ 3-3ベッドルームアパートメント
+ 4-4 +部屋のアパート
+ 5-スタジオ
+ 6-発表ではありません
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に付属し、優れたドキュメントがあります。
しかし、このODMがMongo PHPの最新ドライバーで動作するためには、サービスの作成時に、新しいAPIと古いAPIの間にレイヤーとして別のパッケージを配置する必要がありました。 Doctrine 2自体はかなり大きなプロジェクトであり、追加のパッケージによりさらに大きくなりました。 代わりに、軽量のものが欲しかった。 そのため、最小限の機能セットでODMを自分で作成することにしました。 そして、私はそれをしました-ODMはその責任に完全に対処します。
いくつかの統計
このサービスは、1日あたり平均519.41の広告をサイトに追加します。
ロシアの大都市の中で最も人気のある地下鉄駅は次のとおりです。
- サンクトペテルブルク -デビャチノ
- モスクワ -コムソモールスカヤ
- カザン -ビクトリーアベニュー
- エカテリンブルグ -ウラルマッシュ
- ニジニ・ノヴゴロド -アフトザヴォーツカヤ
- ノボシビルスク -マルクス広場
- サマラ -モスクワ
より多くの統計はサイト自体で見つけることができます。
おわりに
SOAアーキテクチャが必要かどうかまだ決定していない場合は、モジュールに分類したモノリシックアプリケーションを作成します。 そのため、必要に応じてアプリケーションをサービスに簡単に転送できます。 ただし、 SOAアーキテクチャを引き続き使用することに決めた場合、これにより開発の複雑さ、デプロイメントの複雑さ、コードの量、およびサービス間のメッセージの量が増加する可能性があることを理解する必要があります。
PS私は私のサービスを使用して最後の2つのアパートを見つけました。 彼もあなたを助けることを願っています。