Influxdb для финансового приложения - PullRequest
0 голосов
/ 23 мая 2018

Я перенесу данные своего приложения финансового анализа из MongoDB в InfluxDB, потому что данные и анализ растут в геометрической прогрессии.

Мой текущий сценарий:

1) Получайте галочку каждую секундуиз бирж и сохраните его в измерении под названием «тик»;

2) каждые 10 секунд выполняйте непрерывный запрос, группируя эти данные «тика» по минутам в измерение, называемое «ohlc» (данные подсвечника);

И вот мои сомнения .. Когда я использовал Mongo в качестве базы данных, в тот момент, когда я получаю тики, я уже преобразовываю его в данные свечей и вычисляю некоторые индикаторы (MACD, EMA, BB, RSI)и сохраните его.

Я вижу, что InfluxDB использует Kapacitor в качестве процессора данных, есть способ написать несколько сценариев в Kapacitor для расчета этих показателей или я должен передать данные в NodeJS и рассчитать их сам?

Если мне нужно передать данные, как лучше всего это сделать?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Q: InfluxDB использует Kapacitor в качестве своего процессора данных, который работает посредством написания tick сценариев, сравнивая его с написанием простого приложения NodeJS, выполняя вычисления там и записывая результаты обратно в influxdb.Что лучше?

A: Зависит.

Все сводится к тому, насколько сложным будет ожидаемый расчет, сколько данных и достаточно ли вы предприимчивы, чтобы выучить сценарий tick.

Короче говоря, Kapacitor определенно является способомидти как он предназначен для обработки сложных расчетов, с масштабом.Его недостаток в том, что;

  1. tick сценарий имеет крутую кривую обучения
  2. это все еще относительно новая технология, если ваши вычисления включают в себя что-то необычное, что Kapacitor не поддерживает, вам придется создать свойсобственные UDF.
  3. более высокая вероятность появления неизвестных ошибок

Когда вы используете Kapacitor, вы в основном используете его конвейерную среду стиля для обработки данных.Что это за стиль "конвейер"?Я не буду вдаваться в подробности, но вкратце, каждый node, который вы определили в своем tick сценарии, является объединением в виде последовательной цепочки узлов обработки данных.Во время выполнения данные будут одновременно проходить через отдельную станцию ​​непрерывным образом (для большинства узлов), чтобы выполнить работу.

Эта структура также является причиной, по которой kapacitor является настолько быстрым.

NodeJS с другой стороны.Если вы уже знакомы с ним, то практически не тратите время на его изучение.Javascript довольно просто.Множество ссылок, в отличие от Tick script.

Самым недостатком NodeJS является то, что Javascript является однопоточным.То есть за один раз может быть обработана только одна точка данных или одна область данных.Если ваш расчет требует дорогостоящей вычислительной процедуры, то NodeJS не рекомендуется.

Однако, если вычисление является простым одношаговым, например, if X is True then: write back to influxdb as Y, то с вами все будет в порядке.

NodeJS или нет.Я думаю, для начала, если ваш расчет будет простым, тогда быстрое и грязное Javascript должно сделать это.Также сэкономьте ваше время от головной боли tick.Но учтите, что если вы собираетесь выполнить какой-то сумасшедший расчет на более позднем этапе, ваше приложение NodeJS может не масштабироваться.Вы можете в конечном итоге вернуться к Kapacitor.

0 голосов
/ 30 мая 2018

Есть несколько вариантов, когда вы используете InfluxDB.С Kapacitor вы можете включать пользовательские функции на любом языке, который поддерживает поддержку буфера протокола, или вы можете написать TICKscript для преобразования данных.

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

Если вы хотите написать свою собственную функцию в NodeJS,вы просто пишете некоторый код, который прослушивает сокет домена unix, Kapacitor подключается к этому сокету, и затем данные могут быть записаны через это сокетное соединение (полные документы здесь ).

Если выхочу написать TICKscript, вот пара примеров:

// {alert_name}

// metric: {alert_metric}
// available_fields: [[other_telegraf_fields]]

// TELEGRAF CONFIGURATION
// [inputs.{plugin}]
//   # full configuration

// DEFINE: kapacitor define {alert_name} -type batch -tick 
//{plugin}/{alert_name}.tick -dbrp telegraf.autogen
// ENABLE: kapacitor enable {alert_name}

// Parameters
var info = {info_level} 
var warn = {warn_level}
var crit = {crit_level}
var infoSig = 2.5
var warnSig = 3
var critSig = 3.5
var period = 10s
var every = 10s

// Dataframe
var data = stream
  |from()
    .database('telegraf')
    .retentionPolicy('autogen')
    .measurement({plugin})
    .groupBy('host')
  |window()
    .period(period)
    .every(every)
  |mean({alert_metric})
    .as("stat")

// Thresholds
var alert = data
  |eval(lambda: sigma("stat"))
    .as('sigma')
    .keep()
  |alert()
    .id('{{ index .Tags "host"}}/{alert_metric}')
    .message('{{ .ID }}:{{ index .Fields "stat" }}')
    .info(lambda: "stat" > info OR "sigma" > infoSig)
    .warn(lambda: "stat" > warn OR "sigma" > warnSig)
    .crit(lambda: "stat" > crit OR "sigma" > critSig)

// Alert
alert
  .log('/tmp/{alert_name}_log.txt')

Надеюсь, это поможет!

...