(我打算在DBA SE上发布这个,但是没有时间刻度标记。)
我正在使用TimescaleDB来存储每秒大约500-1000个插入的实时流,并且需要在它进入时立即将此数据传递给客户端应用程序。
我不一定要处理原始毫秒数据(我可能),但我肯定需要客户端接收此实时数据的1个,5个,10个,30秒(等)聚合,因为每个时间桶/插槽都是准备。所以,每秒,每5秒,每10秒等(对于每个时隙,值将是最大值,最小值等)。
我将使用Postgres的触发器来聚合数据并以瀑布式方式将其放入新表中,并使用listen / notify告诉客户端每次块“准备就绪”时,然后我遇到了PipelineDB。
但是,我并不清楚如何设置该架构。我是否希望PipelineDB获取初始数据流,然后将其传递给Timescale超级表?我是否希望Timescale将数据传递给Pipeline?我假设Pipeline将成为客户的联系人。
最高效的通用架构是什么;以及如何在Timescale和Pipeline之间传递数据?
目前PipelineDB和TimescaleDB之间没有本地集成,但可能会在不远的将来出现。性能方面,目前最好的选择是简单地将写入分为TimescaleDB和PipelineDB。
当然可以(使用测试设置中的实际结构):
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;
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;$$
;
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
;
INSERT INTO s_tracking
(c_timestamp, c_session, c_request, c_client, c_gender, c_path)
...
...这将导致生成流s_tracking
定义的所有度量以及完整的原始数据到(超)表t_tracking
。
但是,由于使用基于行的触发器功能的解决方法,所涉及的每个INSERT
都会受到惩罚。
如果你可以忍受,那么上述可能是你最好的机会。