Influxdb для финансового приложения

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

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

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

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

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

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

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


person c0nf1ck    schedule 23.05.2018    source источник


Ответы (2)


Есть несколько вариантов использования 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')

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

person Katy Farmer    schedule 30.05.2018

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

О: Зависит.

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

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

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

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

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

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

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

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

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

person Samuel Toh    schedule 01.06.2018