Como se ve en https://www.ausnews.org
Ausnews Search es un motor de búsqueda de código abierto de alto rendimiento indexando algunos sitios de noticias australianos. Consiste en 5 componentes:
La búsqueda admite consultas de usuarios familiares como:
covid -china : Búsqueda de artículos que contienen la palabra "covid" y no "China"bylines:"Josh Taylor" google : Búsqueda de artículos con "Google" escritos por Josh Taylor.source:abc bushfire : Artículos de ABC.net.au que contienen "Fire Bush"covid source:guardian firstpubtime:>1612211170 Artículos Covid sobre The Guardian publicados después de un cierto tiempo.La API web construye consultas Vespa (YQL) según lo utilizado por el Sitio, para facilitar las consultas, pero aún puede escribir como anteriormente en el campo de búsqueda.
La clasificación es bastante simple y directa para empezar. Tiene capacidades lingüísticas extremadamente buenas y otras capacidades lingüísticas, y utiliza el algoritmo BM-25 combinado con la "frescura" del artículo para la clasificación. Esto se puede mejorar con el tiempo, pero el objetivo aquí es clasificar los artículos de noticias sobre propiedades que no se pueden simplemente jugar.
La clasificación de "Top News" tiene en cuenta el tiempo publicado y la actividad de las redes sociales. Los artículos están vinculados por relevancia al hacer un procesamiento de documentos, y luego se agrupan en los principales resultados de noticias. Esto es similar a hacer clic en "Relacionado" en una historia, pero es más estricto en el tiempo y la relevancia.
La clasificación de "artículos principales" también tiene en cuenta las redes sociales, pero por archivo, no por grupo de artículos relevantes.
La búsqueda de AusNews puede manejar más de 1400 consultas/segundo en solo dos contenedores Vespa y tres nodos de contenido, con un conjunto de datos bastante limitado (~ 10,000 artículos). Tasa de respuesta media de Vespa bajo 10 ms . Esto es casi sin ajuste: el rendimiento ciertamente se puede mejorar. Es poco probable que el rendimiento se vea afectado con la escala.

Vespa admite escala en vivo y reequilibrio automático de contenido. Esto significa que los nodos de contenedor o contenido simplemente se pueden escalar hacia arriba/hacia abajo según sea necesario, sin tiempo de inactividad o cambios manuales de fragmentación. Para escalar nodos Vespa, simplemente altere los números en bootstrap.sh, ejecutarlo y ejecutar implement.sh nuevamente. Aquí hay una captura de pantalla de reequilibrio de nodos de documentos al agregar dos nodos adicionales:

La API web también se ejecuta de forma independiente y está diseñada para ejecutarse en nodos más pequeños.
Muestra de salida 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)
Toda la aplicación se implementa en Kubernetes y se puede reproducir el conjunto de aplicaciones e implementación.
┌─────────┐ ┌─────────────┐
│ 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 rastreador de chamillera. Actualmente busca
El rastreador funciona periódicamente y alimenta el contenido directamente al motor de búsqueda para su procesamiento. Al rastrear, actualmente alimenta unos 16 artículos por segundo.
Una aplicación simple de Micronaut escrita en Kotlin. Una interfaz entre los clientes y el motor de búsqueda, ya que las aplicaciones Vespa no están diseñadas para estar expuestas a Internet público. Abraza el lenguaje de consulta expuesto y simplifica el frontend. También permite que este componente se escala por sí solo.
Ejecute Vespa en el contenedor de Docker local e implementa la aplicación (requiere 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'
Ejecutar las arañas (requiere python3, pip) y alimentar a vespa
cd crawler
python3 -m venv aunews-spider
source aunews-spider/bin/activate
pip install -r requirements.txt
python spiders.py
Ejecute la API web:
cd web-api
MICRONAUT_ENVIRONMENTS=dev ./gradlew clean run
Ejecute el sitio web (requiere cli angular instalado):
cd site
ng serve
Tenga en cuenta que puede hacer un desarrollo local de componentes individuales contra implementaciones de K8 live, incluso los nodos Vespa internos, por puerto con Kubectl.
Asegúrese de tener el contexto Kubectl correcto. Crea tu clúster:
cd search-engine-app
./scripts/create_cluster.sh
Construir e implementar el motor de búsqueda:
./scripts/bootstrap.sh && ./scripts/deploy.sh
Construir e implementar las arañas:
cd ../crawler
docker build -t aunews-scrapy .
docker push aunews-scrapy
kubectl apply -f deployment/scrapy.yml
Construya e implementa la API web:
cd ../web-api
./gradlew jibDockerBuild
docker push ausnews-web-api
kubectl apply -f deployment/web-api.yml -f deployment/service.yml
Construir e implementar el aumento. Establezca $ twitter_api_key y $ twitter_api_secret con sus credibilidad de 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
Ejecute el sitio localmente, configurando el punto final externo en el servicio de la API web (ya sea puerto hacia adelante, o anote el servicio para que sea una IP externa)
cd ../site
ng serve
¡Hecho! Visite Localhost: 4200
Para el monitoreo de Prometheus/Grafana (esto incluye estadísticas de Vespa; tarifas de consulta, estadísticas de documentos, etc.), asegúrese de tener helm instalado y:
cd monitoring
helm install -f prometheus-stack.yml prometheus-grafana prometheus-community/kube-prometheus-stack
kubectl apply -f master-podmonitor.yml