2010-12-14 2 views
1

Моя потребность - агрегировать статистику в реальном времени сервера веб-приложений. Например:Как реализовать базу данных статистики Java/Scala в памяти?

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

И так далее.

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

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

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

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

Спасибо.

+0

Я только что открыл RRDtool. Интересно, если это предпочтительный способ пойти, а не изобретать колесо. Существует также реализация Java rrd4j (https://rrd4j.dev.java.net/) –

ответ

3

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

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

0

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

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

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

contentTypeCount.increment(contentType); 

Сколько времени требуется, чтобы обработать запрос типа Y

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

contentTypeTime.adjustValue(processType, processTime); 

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

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

0

Я также заметил о Twitter Ostrich что библиотека статистики для Scala.

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

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

Смежные вопросы