https://www.ausnews.org에서 볼 수 있듯이
Ausnews Search는 일부 호주 뉴스 사이트를 인덱싱하는 고성능 오픈 소스 검색 엔진입니다. 5 개의 구성 요소로 구성됩니다.
검색은 다음과 같은 친숙한 사용자 쿼리를 지원합니다.
covid -china : "Covid"라는 단어가 포함 된 기사를 검색합니다.bylines:"Josh Taylor" google : Josh Taylor가 작성한 "Google"이 포함 된 기사를 검색합니다.source:abc bushfire : ABC.net.au의 기사 "Bushfire"를 포함하는 기사covid source:guardian firstpubtime:>1612211170 특정 시간 후에 출판 된 Guardian에 대한 Covid 기사.Web API는 위의 쿼리를보다 쉽게 만들기 위해 사이트에서 사용하는 Vespa 쿼리 (YQL)를 구성하지만 여전히 검색 필드에 위에서 입력 할 수 있습니다.
순위는 상당히 간단하고 간단합니다. 그것은 매우 우수한 줄기 및 기타 언어 기능을 가지고 있으며, 순위를 위해 "Freshness"와 결합 된 BM-25 알고리즘을 사용합니다. 이것은 시간이 지남에 따라 개선 될 수 있지만 여기서 목표는 단순히 변명 할 수없는 속성에 대한 뉴스 기사를 평가하는 것입니다.
"Top News"의 순위는 게시 된 시간과 소셜 미디어 활동을 고려합니다. 기사는 문서 처리를 수행 할 때 관련성에 의해 연결된 다음 상단 뉴스 결과로 그룹화됩니다. 이것은 스토리에서 "관련"을 클릭하는 것과 유사하지만 시간과 관련성이 더 엄격합니다.
"Top Articles"의 순위는 소셜 미디어를 고려하지만 관련 기사 그룹 별이 아닌 아카티클 당을 고려합니다.
AusNews 검색은 2 개의 VESPA 컨테이너와 3 개의 컨텐츠 노드에서 1400 개 이상의 쿼리/초를 처리 할 수 있으며 상당히 제한된 데이터 세트 (~ 10,000 기사). 10ms 미만의 Vespa의 평균 응답 속도. 이것은 튜닝이 거의 없습니다. 성능은 확실히 향상 될 수 있습니다. 성능은 규모에 영향을받지 않을 것입니다.

Vespa는 컨텐츠의 라이브 스케일링 및 자동 재조정을 지원합니다. 즉, 다운 타임 또는 수동 샤드 변경없이 컨테이너 또는 컨텐츠 노드를 필요에 따라 단순히 확장/다운 할 수 있습니다. Vespa 노드를 확장하려면 bootstrap.sh의 숫자를 변경하고 실행하고 deploy.sh를 다시 실행하십시오. 다음은 두 개의 추가 노드를 추가 할 때 문서 노드 재조정의 스크린 샷입니다.

웹 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
웹 API 실행 :
cd web-api
MICRONAUT_ENVIRONMENTS=dev ./gradlew clean run
웹 사이트를 실행하십시오 (Angular-Cli 설치 필요) :
cd site
ng serve
Kubectl을 사용하여 포트 포워드를 통해 라이브 K8S 배포, 내부 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
웹 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을 설정하십시오.
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
로컬로 사이트를 실행하거나 외부 엔드 포인트를 웹 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