Я смотрю на добавление коллекции данных StatD в мое приложение grails и оглядываясь на существующие библиотеки и код, оставив меня немного запутанным относительно того, что будет хорошим масштабируемым решением. Чтобы немного поставить вопрос в контекст, я работаю над проектом типа онлайн-игр, где я, естественно, буду следить за взаимодействием пользователей с движком игры, они, естественно, будут группироваться вокруг определенных моментов времени, когда пользователи X будут выполнять взаимодействия внутри окна секунды или два, затем повторяется после паузы в 10-20 секунд.
Вот мой анализ опций, доступных сегодня.
Пример клиента Etsy StatsD
https://github.com/etsy/statsd/blob/master/examples/StatsdClient.java
"Самое простое, что могло бы работать", я мог бы поместить этот класс в свой проект и запустить экземпляр singleton как spring bean и использовать его напрямую. Однако, заметив, что плагин grails-statsd создает пул клиентских экземпляров, я начал задаваться вопросом о масштабируемости этого подхода.
Похоже, что метод doSend
может стать узким местом, если многие потоки пытаются отправлять события в одно и то же время, однако, насколько я понимаю, из-за пожара и забывания о природе отправки пакетов UDP это должно произойти быстро, избегая огромных накладных расходов, которые мы обычно связываем с сетевыми подключениями.
плагин grails-statsd
https://github.com/charliek/grails-statsd/
Кто-то уже создал плагин StatD для grails, который включает в себя некоторые интересные функции, такие как аннотации и withTimer
. Однако я вижу, что в реализации отсутствует некоторые исправления ошибок из примера реализации, такие как указание локали при вызовах String.format
. Я также не являюсь огромным фанатом в том, чтобы потянуть в пул Apache только для этого, когда стандартный Executor смог добиться аналогичного эффекта.
Java-statsd-клиент
https://github.com/tim-group/java-statsd-client/
Это альтернативная чистая Java-библиотека, которая работает асинхронно, поддерживая собственный ExecutorService. Он поддерживает весь API статистики, включая наборы и выборку, но не предоставляет никаких привязок для настройки пула потоков и размера очереди. В случае проблем для некритических вещей, таких как мониторинг, я думаю, что предпочел бы конечную очередь и проиграл бы события, чем иметь бесконечную очередь, которая заполняет мою кучу.
Воспроизвести плагин statsd
https://github.com/vznet/play-statsd/
Теперь я не могу использовать этот код непосредственно в моем проекте grails, но я подумал, что стоит посмотреть, как все было реализовано. В общем, мне нравится способ создания кода в StatsdClient.scala
, очень чистый и читаемый. Также появляется ошибка локали, но в остальном функция в комплекте с образцом etsy. Интересно, что, если не существует магии scala, которую я не понял, создается впечатление, что создается новый сокет для каждой точки данных, которая отправляется в StatD. Хотя этот подход хорошо избегает необходимости в пуле объектов или потоке исполнителей, я не могу представить, что это ужасно эффективно, потенциально выполняя поиск DNS в потоке запроса, который должен как можно скорее вернуться к пользователю.
Вопросы
- Судя по тому, что во всех других реализациях реализована еще одна стратегия обработки concurrency, могу ли я предположить, что пример Etsy слишком наивен для использования в производстве?
- Является ли мой анализ здесь правильным?
- Что другие люди используют для statsd в java/ groovy?
До сих пор похоже на лучшее существующее решение - плагин grails, пока я могу принять зависимость от сообщества, но сейчас я серьезно рассматриваю возможность потратить воскресенье на мою собственную версию, которая объединяет лучшие части каждой реализации.