(我本打算在DBA SE上发布这篇文章,但没有时间刻度标记。)
我使用TimescaleDB来存储大约每秒500-1000个插入的实时流,并且需要在这些数据传入时立即将其传递给客户端应用程序。
我不一定要处理原始的毫秒数据(我可能),但我肯定需要客户端接收1,5,10,30秒(等等)此实时数据的聚合,因为每个时间段/时段都已就绪。因此,每秒钟、每5秒、每10秒等(值可能是每个时间段的max、min等)。
我本来打算使用Postgres的触发器来聚合数据,并以瀑布类型的方式将其放入一个新的表中,然后使用listen/notify告诉客户端每次块“就绪”的时间,但后来我遇到了PipelineDB。
但是,我并不清楚如何设置该体系结构。我是否希望PipelineDB获取初始数据流,然后将其传递给时间刻度超级表?我是否希望Timescale将数据传递到Pipeline?我认为Pipeline应该是客户的联系人。
性能最好的通用架构是什么?我如何在Timescale和Pipeline之间传递数据?
发布于 2019-01-04 03:10:31
目前,PipelineDB和TimescaleDB之间还没有本机集成,但在不远的将来很可能会有。就性能而言,目前最好的选择是简单地将TimescaleDB和PipelineDB的写操作分开。
发布于 2019-04-29 15:27:14
这当然是可能的(使用来自测试设置的实际结构):
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)
......which将导致生成为流s_tracking定义的所有指标以及(超级)表t_tracking中的完整原始数据。
但是,由于使用基于行的触发器函数的变通方法,涉及到的每个INSERT都会受到惩罚。
如果你能接受,上述可能是你最好的机会自动取款机。
https://stackoverflow.com/questions/53999037
复制相似问题