https://www.ausnews.orgで見られるように
AusNews検索は、オーストラリアのいくつかのニュースサイトをインデックス化する高性能のオープンソース検索エンジンです。 5つのコンポーネントで構成されています。
検索サポートは、次のようなおなじみのユーザークエリをサポートします。
covid -china :「China」ではなく「Covid」という言葉を含む記事を検索しますbylines:"Josh Taylor" google :Josh Taylorが書いた「Google」で記事を検索します。source:abc bushfire :「Bushfire」を含むabc.net.auの記事covid source:guardian firstpubtime:>1612211170 Covidの記事は、一定の時間後に公開されたGuardianに関する記事です。Web APIは、サイトで使用されるVespaクエリ(YQL)を構築して、上記のクエリを簡単にするようにしますが、上記のように検索フィールドに入力できます。
ランキングはかなりシンプルで簡単です。非常に優れたステミングやその他の言語機能を備えており、ランキングには「フレッシュネス」と組み合わされたBM-25アルゴリズムを使用しています。これは時間の経過とともに改善することができますが、ここでの目的は、単純にゲームをされることのできないプロパティに関するニュース記事をランク付けすることです。
「トップニュース」のランキングは、公開された時間とソーシャルメディア活動を考慮に入れています。記事は、ドキュメント処理を行う際の関連性によってリンクされ、その後、トップニュースの結果にグループ化されます。これは、ストーリーで「関連」をクリックすることに似ていますが、時間と関連性が厳しくなります。
「トップ記事」のランキングは、関連記事のグループごとではなく、ソーシャルメディアではあるが断続的なランキングも考慮に入れています。
AusNews検索では、2つのVespaコンテナと3つのコンテンツノードで1400以上のクエリ/秒を処理でき、かなり限られたデータセット(〜10,000の記事)があります。 10ミリ秒未満のベスパからの平均応答率。これにはほとんど調整がありません - パフォーマンスは確かに改善できます。パフォーマンスがスケールの影響を受ける可能性は低いです。

Vespaは、ライブスケーリングとコンテンツの自動リバランスをサポートしています。これは、ダウンタイムや手動シャーディングの変更なしに、コンテナまたはコンテンツノードを必要に応じて単純に上下にスケーリングできることを意味します。 VESPAノードをスケーリングするには、bootstrap.shの数字を変更するだけで、実行してdeploy.shを実行します。 2つの追加ノードを追加する際のドキュメントノードのリバランスのスクリーンショットは次のとおりです。

Web APIは独立して実行され、小さなノードで実行されるように設計されています。
サンプルab出力:
Concurrency Level: 50
Time taken for tests: 70.147 seconds
Complete requests: 100000
Failed requests: 0
Keep-Alive requests: 100000
Total transferred: 284740792 bytes
HTML transferred: 271440792 bytes
Requests per second: 1425.57 [#/sec] (mean)
Time per request: 35.074 [ms] (mean)
Time per request: 0.701 [ms] (mean, across all concurrent requests)
Transfer rate: 3964.05 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 6
Processing: 7 35 17.8 31 361
Waiting: 7 35 17.8 31 361
Total: 7 35 17.8 31 361
Percentage of the requests served within a certain time (ms)
50% 31
66% 38
75% 43
80% 46
90% 56
95% 67
98% 81
99% 92
100% 361 (longest request)
アプリケーション全体がKubernetesに展開され、アプリケーションと展開のセットを再現できます。
┌─────────┐ ┌─────────────┐
│ Browser ├─────────────► Static Site │
└─────┬───┘ └─────────────┘
│
└───▲───────┐
GKE Cluster │Ingress│
┌───────────────────────────┼───────┼─────────────────────────────────────┐
│ └───┼───┘ │
│ │ │
│ │ │
│ ┌───────────▲───────┘ │
│ │ Service │ │
│ ├───────────┤ │
│ ┌─────┴───────────┴───────┐ │
│ │ │ ┌───────────┐ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ │ ┌─────┤ Augmenter │ │
│ │ │ Pod │ │ Pod │ │ Pod │ ├───────┐ │ └───────────┘ │
│ │ └─────┘ └─────┘ └─────┘ │ │ │ │
│ │ │ │ │ │
│ └─────────────────────────┘ │ │ ┌─────────┐ │
│ Scalable Web APIs │ │ ┌─────┤ Spiders │ │
│ │ │ │ └─────────┘ │
│ │ │ │ │
│ ┌─▼──▼──▼─┐ │
│ ┌──┤ Service ├──┐ │
│ │ └────┬────┘ │ │
│ Vespa Search Engine │ │ │
│ ┌─────────────┬───────┼───────┼────────────┐ │
│ │ │ │ │ │ │
│ │ ┌────▼───────▼───────▼────┐ │ │
│ │ │ │ │ │
│ │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │
│ ┌───────────┐ │ │ │ Pod │ │ Pod │ │ Pod │ │ │ │
│ │ Monitoring│ │ │ └─────┘ └─────┘ └─────┘ │ │ │
│ │ & ◄─────┤ │ │ │ │
│ │ Alerting │ │ └─────┬────────────┬──────┘ │ │
│ └───────────┘ │ Scalable│search & doc│processing │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ │ ┌─────▼────────────▼──────┐ │ │
│ │ │ │ │ │
│ │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │
│ │ │ │ Pod │ │ Pod │ │ Pod │ │ │ │
│ │ │ └─────┘ └─────┘ └─────┘ │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────┘ │ │
│ │ Scalable content nodes │ │
│ └──────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
スクラピークローラー。現在検索しています
クローラーは定期的に実行され、処理のために検索エンジンにコンテンツを直接送ります。クロールするとき、それは現在、1秒あたり約16の記事を供給しています。
Kotlinで書かれたシンプルなMicronautアプリ。 VESPAアプリケーションは、パブリックインターネットにさらされるように設計されていないため、クライアントと検索エンジンの間のインターフェイス。クエリ言語が公開され、フロントエンドが簡素化されます。また、このコンポーネントを単独でスケーリングすることもできます。
地元のDockerコンテナでVespaを実行し、アプリケーションを展開します(Mavenが必要です):
cd search-engine-app
docker run --detach --name vespa --hostname vespa-container --privileged --volume `pwd`:/apps --publish 8080:8080 vespaengine/vespa
mvn clean package
docker exec vespa bash -c '/opt/vespa/bin/vespa-deploy prepare /apps/target/application.zip &&
/opt/vespa/bin/vespa-deploy activate'
スパイダーを実行し(python3、pipを必要とします)、vespaにフィード
cd crawler
python3 -m venv aunews-spider
source aunews-spider/bin/activate
pip install -r requirements.txt
python spiders.py
Web APIを実行します:
cd web-api
MICRONAUT_ENVIRONMENTS=dev ./gradlew clean run
Webサイトを実行します(Angular-CLIがインストールされる必要があります):
cd site
ng serve
Kubectlをポートに向けて、内部Vespaノードでさえ、ライブK8Sの展開に対して、個々のコンポーネントのローカル開発を行うことができることに注意してください。
Kubectlコンテキストが正しいことを確認してください。クラスターを作成します:
cd search-engine-app
./scripts/create_cluster.sh
検索エンジンの構築と展開:
./scripts/bootstrap.sh && ./scripts/deploy.sh
クモを構築して展開します:
cd ../crawler
docker build -t aunews-scrapy .
docker push aunews-scrapy
kubectl apply -f deployment/scrapy.yml
Web APIをビルドして展開します。
cd ../web-api
./gradlew jibDockerBuild
docker push ausnews-web-api
kubectl apply -f deployment/web-api.yml -f deployment/service.yml
Augmenterを構築および展開します。 Twitter_api_keyと$ twitter_api_secretをTwitterクレジットで設定します。
cd ../augmenter
kubectl create secret generic twitter-secrets
--from-literal=api-key=$TWITTER_API_KEY
--from-literal=api-secret=$TWITTER_API_SECRET
docker build -t aunews-augmenter .
docker push aunews-augmenter
kubectl apply -f deployment/scrapy.yml
サイトをローカルに実行し、外部エンドポイントをWeb APIのサービスに設定します(ポートフォワードのいずれか、またはサービスに注釈を付けて外部IPにする)
cd ../site
ng serve
終わり! LocalHost:4200をご覧ください
Prometheus/Grafanaの監視(これにはVespa統計、クエリレート、ドキュメント統計など)の場合、 helmがインストールされていることを確認してください。
cd monitoring
helm install -f prometheus-stack.yml prometheus-grafana prometheus-community/kube-prometheus-stack
kubectl apply -f master-podmonitor.yml