Comme on le voit sur https://www.ausnews.org
AUSNEWS Search est un moteur de recherche open-performant de haute performance indexant certains sites d'information australiens. Il se compose de 5 composants:
La recherche prend en charge les requêtes utilisateur familières telles que:
covid -china : recherche d'articles contenant le mot "covide" et non "Chine"bylines:"Josh Taylor" google : recherche d'articles avec "Google" écrit par Josh Taylor.source:abc bushfire : Articles d'ABC.net.au contenant "feu de brousse"covid source:guardian firstpubtime:>1612211170 Articles Covid sur The Guardian publiés après un certain temps.L'API Web construit des requêtes Vespa (YQL) telles qu'utilisées par le site, pour faciliter les requêtes ci-dessus, mais vous pouvez toujours taper comme ci-dessus dans le champ de recherche.
Le classement est assez simple et simple pour commencer. Il a extrêmement bon et d'autres capacités linguistiques, et utilise l'algorithme BM-25 combiné à l'article "Fraîchement" pour le classement. Cela peut être amélioré au fil du temps, mais le but ici est de classer les articles de presse sur des propriétés qui ne peuvent pas être simplement jouées.
Le classement des "Top News" prend en compte l'heure publiée et l'activité des médias sociaux. Les articles sont liés par la pertinence lors du traitement des documents, puis regroupés dans les principaux résultats des nouvelles. Ceci est similaire à cliquer sur "lié" sur une histoire - mais il est plus strict dans le temps et la pertinence.
Le classement des «meilleurs articles» prend également en compte les médias sociaux, mais par article - pas par groupe d'articles pertinents.
La recherche AUSNews peut gérer 1400+ requêtes / seconde sur seulement deux conteneurs Vespa et trois nœuds de contenu, avec un ensemble de données assez limité (~ 10 000 articles). Taux de réponse moyen de VESPA inférieur à 10 ms . C'est avec presque aucun réglage - les performances peuvent certainement être améliorées. Il est peu probable que les performances soient affectées par l'échelle.

VESPA prend en charge la mise à l'échelle en direct et le rééquilibrage automatique du contenu. Cela signifie que les nœuds de conteneur ou de contenu peuvent simplement être mis à l'échelle vers le haut / vers le bas selon les besoins, sans les modifications de rupture de temps d'arrêt ou manuelles. Pour mettre à l'échelle les nœuds Vespa, modifiez simplement les nombres dans bootstrap.sh, exécutez-le et exécutez à nouveau Deploy.sh. Voici une capture d'écran du rééquilibrage du nœud de document lors de l'ajout de deux nœuds supplémentaires:

L'API Web s'exécute également indépendamment et est conçue pour fonctionner sur des nœuds plus petits.
Exemple de sortie 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)
L'ensemble de l'application est déployé sur Kubernetes et l'ensemble des applications et le déploiement peuvent être reproduits.
┌─────────┐ ┌─────────────┐
│ 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 │ │
│ └──────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Un robot de scracy. Recherches actuellement
Le Crawler s'exécute périodiquement et alimente le contenu directement dans le moteur de recherche pour le traitement. Lorsqu'il rampe, il alimente actuellement environ 16 articles par seconde.
Une application MicronAut simple écrite en Kotlin. Une interface entre les clients et le moteur de recherche, car les applications VESPA ne sont pas conçues pour être exposées à Internet public. Il résume le langage de requête exposé et simplifie le frontend. Permet également à ce composant d'être mis à l'échelle seul.
Exécutez Vespa dans un conteneur Docker local et déployez l'application à lui (nécessite 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'
Exécutez les araignées (nécessite Python3, PIP) et se nourrir à Vespa
cd crawler
python3 -m venv aunews-spider
source aunews-spider/bin/activate
pip install -r requirements.txt
python spiders.py
Exécutez l'API Web:
cd web-api
MICRONAUT_ENVIRONMENTS=dev ./gradlew clean run
Exécutez le site Web (nécessite Angular-CLI installé):
cd site
ng serve
Notez que vous pouvez effectuer un développement local de composants individuels par rapport aux déploiements K8 en direct, même les nœuds Vespa internes, par le port de port avec Kubectl.
Assurez-vous que vous avez un contexte Kubectl correct. Créez votre cluster:
cd search-engine-app
./scripts/create_cluster.sh
Créer et déployer le moteur de recherche:
./scripts/bootstrap.sh && ./scripts/deploy.sh
Créer et déployer les araignées:
cd ../crawler
docker build -t aunews-scrapy .
docker push aunews-scrapy
kubectl apply -f deployment/scrapy.yml
Créer et déployer l'API Web:
cd ../web-api
./gradlew jibDockerBuild
docker push ausnews-web-api
kubectl apply -f deployment/web-api.yml -f deployment/service.yml
Créer et déployer l'augmentation. Définissez $ Twitter_API_KEY et $ Twitter_API_SECRET avec vos crédits 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
Exécutez le site localement, en définissant le point de terminaison externe sur le service de l'API Web (soit le port de port, soit annoter le service pour en faire une IP externe)
cd ../site
ng serve
Fait! Visitez LocalHost: 4200
Pour la surveillance de Prometheus / Grafana (cela inclut les statistiques VESPA; tarifs de requête, statistiques de document, etc.), assurez-vous que vous avez installé helm et:
cd monitoring
helm install -f prometheus-stack.yml prometheus-grafana prometheus-community/kube-prometheus-stack
kubectl apply -f master-podmonitor.yml