TimescaleDB和PipelineDB集成

问题描述 投票:2回答:2

(我打算在DBA SE上发布这个,但是没有时间刻度标记。)

我正在使用TimescaleDB来存储每秒大约500-1000个插入的实时流,并且需要在它进入时立即将此数据传递给客户端应用程序。

我不一定要处理原始毫秒数据(我可能),但我肯定需要客户端接收此实时数据的1个,5个,10个,30秒(等)聚合,因为每个时间桶/插槽都是准备。所以,每秒,每5秒,每10秒等(对于每个时隙,值将是最大值,最小值等)。

我将使用Postgres的触发器来聚合数据并以瀑布式方式将其放入新表中,并使用listen / notify告诉客户端每次块“准备就绪”时,然后我遇到了PipelineDB。

但是,我并不清楚如何设置该架构。我是否希望PipelineDB获取初始数据流,然后将其传递给Timescale超级表?我是否希望Timescale将数据传递给Pipeline?我假设Pipeline将成为客户的联系人。

最高效的通用架构是什么;以及如何在Timescale和Pipeline之间传递数据?

streaming aggregation real-time-data pipelinedb timescaledb
2个回答
2
投票

目前PipelineDB和TimescaleDB之间没有本地集成,但可能会在不远的将来出现。性能方面,目前最好的选择是简单地将写入分为TimescaleDB和PipelineDB。


2
投票

当然可以(使用测试设置中的实际结构):

  1. 创建一个流,例如:
CREATE FOREIGN TABLE s_tracking (
    c_timestamp TIMESTAMPTZ,
    c_session BIGINT,
    c_request BIGINT,
    c_client VARCHAR,
    c_gender VARCHAR,
    c_path VARCHAR
) SERVER pipelinedb;
  1. 创建一个插入条目的触发器函数,例如:
CREATE FUNCTION func_tracking_insert_pipe() RETURNS trigger
    LANGUAGE plpgsql AS
$$BEGIN
    INSERT INTO
        t_tracking (c_timestamp, c_session, c_request, c_client, c_gender, c_path)
    VALUES
        (NEW.c_timestamp, NEW.c_session, NEW.c_request, NEW.c_client, NEW.c_gender, NEW.c_path)
    ;
    RETURN NEW;
END;$$
;
  1. 创造一个continuous transform,例如:
CREATE VIEW v_t_forward_raw_data
    WITH (action=transform, outputfunc=func_tracking_insert_pipe)
    AS
        SELECT c_timestamp, c_session, c_request, c_client, c_gender, c_path FROM s_tracking
;
  1. 插入流而不是表:
INSERT INTO s_tracking
    (c_timestamp, c_session, c_request, c_client, c_gender, c_path)
...

...这将导致生成流s_tracking定义的所有度量以及完整的原始数据到(超)表t_tracking

但是,由于使用基于行的触发器功能的解决方法,所涉及的每个INSERT都会受到惩罚。

如果你可以忍受,那么上述可能是你最好的机会。

© www.soinside.com 2019 - 2024. All rights reserved.