【问题标题】:Influxdb for a financial application用于金融应用程序的 Influxdb
【发布时间】:2018-05-23 15:58:45
【问题描述】:

我正在将我的财务分析应用程序数据从 MongoDB 迁移到 InfluxDB,因为数据和分析呈指数级增长。

我目前的情况是:

1) 每秒从交易所获取刻度并将其存储在称为“刻度”的度量中;

2) 每 10 秒运行一次连续查询,按分钟将此“tick”数据分组到称为“ohlc”(烛台数据)的测量中;

我的疑惑来了.. 当我使用 Mongo 作为我的数据库时,在我得到刻度的那一刻,我已经将它转换为烛台数据并计算一些指标(MACD、EMA、BB、RSI)并存储它.

我看到 InfluxDB 有 Kapacitor 作为它的数据处理器,有一种方法可以在 Kapacitor 中编写一些脚本来计算这些指标,还是我应该将数据流式传输到 NodeJS 并自己计算?

如果我必须流式传输数据,最好的做法是什么?

【问题讨论】:

    标签: javascript node.js influxdb stock financial


    【解决方案1】:

    使用 InfluxDB 时有几个选项。使用 Kapacitor,您可以在具有协议缓冲区支持的任何语言中合并用户定义的函数,或者您可以编写 TICKscript 来进行数据转换。

    您还可以使用数据库的连续查询功能,尽管根据查询和时间间隔,它们有时可能是昂贵的查询。

    如果您想在 NodeJS 中编写自己的函数,您基本上只需编写一些代码来侦听 unix 域套接字,Kapacitor 连接到该套接字,然后可以通过该套接字连接写入数据(完整文档here )。

    如果你想写一个 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')
    

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      问: InfluxDB 使用 Kapacitor 作为其数据处理器,通过编写 tick 脚本将其与编写简单的 NodeJS 应用程序进行比较,在那里进行计算并将结果写回 influxdb .哪个更好?

      答:视情况而定。

      这一切都归结为预计计算的复杂程度、数据量以及您是否有足够的冒险精神来学习tick 脚本。

      简而言之,Kapacitor 绝对是要走的路,因为它旨在处理具有规模的复杂计算。它的缺点是;

      1. tick 脚本学习曲线陡峭
      2. 它仍然是一项相对较新的技术,如果您的计算涉及 Kapacitor 不支持的花哨的东西,那么您将不得不构建自己的 UDF
      3. 遇到未知错误的几率更高

      当您使用Kapacitor 时,您基本上是在使用其管道样式框架进行数据处理。这种“管道”风格的东西是什么?我不会深入探讨它,但简而言之,您在tick 脚本中定义的每个node 都作为数据处理节点的顺序链连接起来。在执行期间,数据将同时以不间断的方式(对于大多数节点)流经各个站点以完成工作。

      这个框架也是kapacitor这么快的原因。

      NodeJS 另一方面。如果您已经熟悉它,那么学习它的时间基本上为零。 Javascript 很简单。与Tick 脚本不同的大量引用。

      NodeJS 的最大缺点是Javascript 是单线程的。即一次只能处理一个数据点或 1 个数据桶。如果您的计算涉及一些昂贵的计算过程,则不建议使用NodeJS

      但是,如果计算是简单的单步计算,例如if X is True then: write back to influxdb as Y 那你应该没事。

      NodeJS 与否。我认为首先,如果您的计算预计很简单,那么快速而肮脏的Javascript 应该这样做。还可以节省您的时间,避免遇到tick 脚本问题。但是请注意,如果您打算在后期进行一些疯狂的计算,您的NodeJS 应用程序可能无法很好地扩展。你最终可能会回到Kapacitor

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 2015-05-26
        • 1970-01-01
        • 2019-02-14
        相关资源
        最近更新 更多