如https://www.ausnews.org所示
Ausnews搜索是高性能的開源搜索引擎,索引了一些澳大利亞新聞網站。它由5個組成部分組成:
搜索支持熟悉的用戶查詢,例如:
covid -china :搜索包含“ covid”一詞而不是“中國”一詞的文章bylines:"Josh Taylor" google :通過Josh Taylor撰寫的“ Google”搜索文章。source:abc bushfire :來自abc.net.au的文章,包含“叢林大火”covid source:guardian firstpubtime:>1612211170 COVID文章在一定時間後發表。Web API構建了網站使用的VESPA查詢(YQL),以使上述查詢更加容易,但是您仍然可以按上述輸入到搜索字段中。
排名相當簡單明了。它具有非常好的Stemming和其他語言能力,並使用BM-25算法與文章“ Freshness”進行排名。隨著時間的流逝,這可以改善,但是這裡的目的是將新聞文章對無法簡單的認可的屬性進行排名。
“頂級新聞”的排名考慮到已發表的時間和社交媒體活動。文章處理文檔處理時,文章與相關性聯繫在一起,然後將其分組為首要新聞結果。這類似於單擊故事中的“相關” - 但時間和相關性更為嚴格。
“頂級文章”的排名還考慮了社交媒體,但每個相關文章的排名不是。
Ausnews搜索只能在兩個Vespa容器和三個內容節點上處理1400+查詢,其中數據集相當有限(約10,000篇文章)。 VESPA低於10ms的平均響應率。這幾乎沒有調整 - 肯定可以提高性能。性能不太可能受到規模的影響。

Vespa支持實時擴展和自動重新平衡內容。這意味著可以簡單地根據需要對容器或內容節點進行縮放/向下縮放,而無需停機或手動碎片更改。要縮放Vespa節點,只需更改Bootstrap.sh中的數字,將其運行並再次運行Deploy.sh。添加兩個額外的節點時,這是文檔節點重新平衡的屏幕截圖:

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 │ │
│ └──────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
擦傷軌。當前搜索
爬蟲定期運行,並將內容直接饋送到搜索引擎中進行處理。爬行時,它目前每秒食用約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
運行網站(需要安裝Angular-CLI):
cd site
ng serve
請注意,您可以通過使用kubectl進行端口來對實時K8部署,甚至內部VESPA節點進行各個組件的本地開發。
確保您的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
構建和部署增強器。設置$ 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服務(port-forward,或者註釋服務以使其成為外部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