Najnowsza wersja Solr, która zbliża się do nas wielkimi krokami w chwili publikacji tego posta, przynosi wiele zmian, nowych funkcjonalności, usprawnień i poprawek. Jedną z nowych funkcjonalności wprowadzonych w Solr 9.0 jest możliwość kontrolowania liczby zapytań wykonywanych w tym samym czasie w ramach danej instancji JVM i Solr działającej na niej. Przyjrzyjmy się szybko tej funkcjonalności.
Podstawy
Podstawowy pomysł jest dość prosty – Solr powinien umożliwiać określenie maksymalnej liczby żądań wykonywanych w tym samym czasie, np. takich jak zapytania, indeksowanie danych, czy streaming. To powinno pozwolić chronić klaster Solr, aby nie możliwe było przeładowanie liczbą żądań, a tym samym zapewnienie większej stabilności całego środowiska. Łatwo wyobrazić sobie sytuację, w której liczba zapytań jest wystarczająco duża, aby zaburzyć indeksowanie, czy odwrotnie – indeksujemy tak dużo danych, że nasze zapytania wykonują się bardzo wolno, a tym samym zauważają to nasi użytkownicy.
Limity, które wprowadzone zostały wraz z wersją 9.0 Solr są globalne dla całej instancji JVM. Oznacza to, że mając dwa Solr działające na tej samej JVM limity są globalne dla obu działających Solr. Warto o tym pamiętać.
Warto także pamiętać, iż obecna implementacja limitera jest dedykowana obsłudze zapytań.
Konfiguracja – API
Konfiguracja limitera możliwa jest w Solr na dwa sposoby – za pomocą plików konfiguracyjnych oraz za pomocą Cluster API. Przyjrzyjmy się najpierw tej drugiej opcji, czyli API. Aby skonfigurować limiter możemy wykorzystać następujące polecenie:
curl -X POST -H 'Content-type:application/json' 'http://localhost:8983/api/cluster' -d '{
"set-ratelimiter": {
"enabled": true,
"allowedRequests": 20,
"guaranteedSlots": 5,
"slotBorrowingEnabled": true,
"slotAcquisitionTimeoutInMS": 50
}
}'
Wysyłamy żądnie POST do /api/cluster i korzystamy z komendy set-ratelimiter w celu przekazania odpowiednich parametrów definiujących zachowanie Solr.
Spójrzmy na te parametry:
- enabled – czy funkcjonalność rate limiting jest włączona (wartość true), czy nie (wartość false)
- allowedRequests – maksymalna liczba żądań możliwych do obsługi w tym samym czasie
- guaranteedSlots – liczba slotów, które są zarezerwowane ponad te, które zostały określone przez allowedRequests, warto pamiętać, iż działa to tylko w chwili kiedy opcja slotBorrowingEnabled jest ustawiona na true
- slotBorrowingEnabled – kiedy jest ustawiona na wartość true możliwe jest „wypożyczanie” slotów z innych limiterów, które mają wolne zasoby
- slotAcquisitionTimeoutInMS – czas, w milisekundach, jakie wątek będzie czekał w kolejce na wykonanie. Po tym czasie Solr odrzuci wykonanie wątku i zwróci status 429 w odpowiedzi.
Konfiguracja – web.xml
Oprócz skorzystania z API Solr pozwala na wykorzystanie bardziej statycznej metody konfiguracji limitera – za pomocą zmian w pliku web.xml. Tak, w pliku web.xml, nie w pliku solrconfig.xml. W pliku web.xml możemy dodać jedną lub wiele parametrów do konfiguracji SolrRequestFilter, na przykład te odpowiedzialne za zapytania to:
- isQueryRateLimiterEnabled – kiedy wartość ustawiona jest na true limiter jest aktywny
- maxQueryRequests – maksymalna liczba zapytań, które mogą być wykonywane w tym samym momencie
- queryWaitForSlotAllocationInMS – czas, w milisekundach, jakie wątek będzie czekał w kolejce na wykonanie. Po tym czasie Solr odrzuci wykonanie wątku i zwróci status 429 w odpowiedzi
- queryAllowSlotBorrowing – kiedy jest ustawiona na wartość true możliwe jest „wypożyczanie” slotów z innych limiterów, które mają wolne zasoby
- queryGuaranteedSlots – liczba slotów, które są zarezerwowane ponad te, które zostały określone przez allowedRequests
Podsumowanie
Pomimo tego, że jest to pierwsza wersja tej funkcjonalności, wraz z Solr 9.0 dostajemy w swoje ręce dość potężne narzędzie, które na pewno będzie wspomagać uzyskanie jeszcze większej stabilności od naszych klastrów Solr. Ale już nawet z tą funkcjonalnością, będziemy mogli ograniczyć liczbę wykonywanych zapytań pozwalając na zareagowanie oraz ewentualnie zwiększenie potrzebnych zasobów.