Czekam na dodanie kolekcji danych StatsD do mojej aplikacji grails i rozejrzenie się po istniejących bibliotekach i kodu pozostawiło mnie trochę zdezorientowany, co byłoby dobrym rozwiązaniem skalowalnym. Aby trochę umieścić pytanie w kontekście, pracuję nad projektem typu gry online, w którym naturalnie będę monitorował interakcje użytkownika z silnikiem gry, naturalnie skupią się one wokół konkretnych momentów w czasie, w których użytkownicy X będą wykonywać interakcje w oknie sekundy lub dwóch, a następnie powtarzanie po 10-20 sekundowej przerwie.Który klient StatsD powinienem użyć dla projektu java/grails?
Oto moja analiza opcji dostępnych dzisiaj.
przykład klient Etsy StatsD
https://github.com/etsy/statsd/blob/master/examples/StatsdClient.java
W „Najprostszą rzeczą, która mogłaby działać” rozwiązanie, mogę ciągnąć tej klasy w moim projekcie i instanciate singleton instancji jako fasoli wiosny i używać go bezpośrednio. Jednak po zauważeniu, że wtyczka grails-statsd tworzy pulę instancji klienta, zacząłem zastanawiać się nad skalowalnością tego podejścia.
Wydaje się, że metoda doSend
mógłby stać się wąskim gardłem, gdy wiele wątków próbuje wysłać zdarzenia w tym samym czasie, jednak jak rozumiem, z powodu pożaru i zapomnieć naturę wysyłania pakietów UDP, to powinno się zdarzyć szybko, unikając ogromnego obciążenia, które zwykle kojarzymy z połączeniami sieciowymi.
Grails-statsd plugin
https://github.com/charliek/grails-statsd/
Ktoś stworzył już wtyczki StatsD dla Grails, który zawiera kilka ciekawych funkcji, takich jak adnotacje i withTimer
metody. Jednak widzę, że w implementacji brakuje niektórych poprawek z przykładowej implementacji, takich jak określanie ustawień regionalnych dla połączeń z String.format
. Nie jestem też wielkim fanem wciągania do wspólnej puli Apache, gdy standardowy Executor może osiągnąć podobny efekt.
java-statsd-client
https://github.com/tim-group/java-statsd-client/
Jest to alternatywa czysty biblioteki Java, która działa asynchronicznie przez utrzymywanie swojego ExecutorService. Obsługuje cały interfejs API StatsD, w tym zestawy i próbkowanie, ale nie zapewnia żadnych haczyków do konfigurowania puli wątków i wielkości kolejki. W przypadku problemów, dla rzeczy niekrytycznych, takich jak monitorowanie, myślę, że wolałbym skończoną kolejkę i przegrywanie zdarzeń niż posiadanie nieskończonej kolejki, która wypełnia moją stertę.
plugin play statsd
https://github.com/vznet/play-statsd/
Teraz nie mogę użyć tego kodu bezpośrednio w moim projekcie grails, ale myślałem, że to warto zobaczyć, aby zobaczyć, jak zostały wdrożone. Ogólnie uwielbiam sposób, w jaki budowany jest kod w StatsdClient.scala
, bardzo czysty i czytelny. Wygląda na to, że zawiera błąd lokalizacji, ale poza tym funkcja jest kompletna z próbką etsy. Co ciekawe, chyba że jest jakaś magia scala, której nie zrozumiałem, wydaje się, że tworzy ona nowe gniazdo dla każdego punktu danych, który jest wysyłany do StatsD. Chociaż to podejście dobrze unika konieczności tworzenia puli obiektów lub wątków executorów, nie mogę sobie wyobrazić, że jest to bardzo wydajne, potencjalnie wykonując wyszukiwania DNS w wątku żądania, które powinno być jak najszybciej zwrócone do użytkownika.
pytania
- Sądząc po tym, że wszystkie inne implementacje wydają się mieć inną strategię wdrożone do obsługi współbieżności, mogę założyć, że przykład Etsy jest trochę zbyt naiwny do użytku produkcyjnego?
- Czy moja analiza wygląda na poprawną?
- Jakie inne osoby używają statsd w java/groovy?
Do tej pory wygląda na to, że najlepszym istniejącym rozwiązaniem jest wtyczka Grails tak długo, jak długo mogę zaakceptować zależność między wspólnymi zasobami, ale teraz poważnie zastanawiam się nad wydaniem niedzieli, pisząc własną wersję, która łączy najlepsze części. każdej realizacji.
Jeśli zauważysz potrzebę ulepszenia wtyczki, najprawdopodobniej będzie łatwiejsza ścieżka do oddania społeczności w bardziej użyteczny sposób! – cdeszaq