Solr 9.0 – Rate Limits

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *