如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