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 *

We use cookies to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners. View more
Cookies settings
Accept
Privacy & Cookie policy
Privacy & Cookies policy
Cookie name Active
Save settings
Cookies settings