Как реализовать базу данных статистики Java / Scala в памяти? - PullRequest
1 голос
/ 14 декабря 2010

Мне нужно собрать статистику в реальном времени о сервере веб-приложений.Например:

  • Сколько запросов типа контента X было выполнено
  • Сколько времени занимает обработка запроса типа Y

И так далее.

Эти данные должны быть полностью в памяти, а не в файле, для лучшей производительности.Он не регистрирует каждый запрос, а хранит только счетчики различных аспектов.

Самый простой способ, который я знаю, - хранить значения в SQL-подобной таблице и выполнять SQL-подобные запросы.Преимущество заключается в том, что индексация идет без готовых усилий.Я предполагаю, что некоторые встроенные базы данных Java, такие как Apache Derby , сработают.

Другой путь - реализовать сбор (скажем, список) и хеш-таблицу для каждого «столбца индекса».Таким образом, все это делается с помощью API Java / Scala collection, но на самом деле мне нужно самому внедрить механизм индексации, протестировать его, поддерживать и т. Д.

Поэтому мой вопрос заключается в том, какой способ, по вашему мнению, предпочтительнее, иЕсть ли другие способы легко и быстро реализовать эту функцию?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 14 декабря 2010

Я бы выбрал Н2 базу данных , у меня очень положительный опыт работы с ней, также отличная производительность.

Вы уверены, что база данных SQL хорошо подходит для ваших нужд, и имеетевы посмотрели на javamelody , чтобы увидеть, подходит ли вам это или нет, и посмотрите на JRobin для реализации скользящей базы данных.

0 голосов
/ 15 декабря 2010

Меня также заметили о Twitter Ostrich , который является статистической библиотекой для Scala.

Содержит счетчики, датчики и измерители времени.

Данные доступны из HTTP REST API.

0 голосов
/ 14 декабря 2010

Я полагаю, вам нужна только одна коллекция для каждого типа информации, которая вам нужна для сбора. Чтобы повысить производительность, упростить код, я бы использовал TObjectIntHashMap. например,

Сколько запросов типа контента X было сделано

TObjectIntHashMap<ContentType> contentTypeCount 
     = new TObjectIntHashMap<ContentType>();

contentTypeCount.increment(contentType); 

Сколько времени занимает обработка запроса типа Y

TObjectLongHashMap<ProcessType> contentTypeTime 
    = new TObjectLongHashMap<ProcessType>();

contentTypeTime.adjustValue(processType, processTime);

Я не понимаю, как вы можете сделать это короче / проще / быстрее, используя другие упомянутые вами подходы.

Среднее время выполнения приращения (ключа) на моих машинах занимает 15 нс (миллиардных долей секунды)

...