Stream 如何在pipelinedb中从连续视图流式输出?

Stream 如何在pipelinedb中从连续视图流式输出?,stream,real-time,pipelinedb,Stream,Real Time,Pipelinedb,我已经安装了pipelinedb,它工作得很好!我想知道在视图中的值被更新后,是否有可能从连续视图中流出数据流?也就是说,让一些外部进程对视图的更改起作用 我希望将从视图生成的度量数据流到仪表板中,我不希望使用轮询db来实现这一点。查看我们的技术文档中关于和的部分,以获取有关如何实现这一点的帮助,如果您需要文档以外的帮助,请随时联系我们。我觉得自己有点像个白痴,试图用提供的工具找出答案。也许我是盲人,但我仍然没有找到一条路。我发现了9.3版本的DB,其中包括连续触发器,但这已经被删除,我不希望切

我已经安装了pipelinedb,它工作得很好!我想知道在视图中的值被更新后,是否有可能从连续视图中流出数据流?也就是说,让一些外部进程对视图的更改起作用


我希望将从视图生成的度量数据流到仪表板中,我不希望使用轮询db来实现这一点。

查看我们的技术文档中关于和的部分,以获取有关如何实现这一点的帮助,如果您需要文档以外的帮助,请随时联系我们。

我觉得自己有点像个白痴,试图用提供的工具找出答案。也许我是盲人,但我仍然没有找到一条路。我发现了9.3版本的DB,其中包括连续触发器,但这已经被删除,我不希望切换到旧版本的DB

这有点令人伤心,但我想它已经从该项目的开源版本中移出,以适应同一家公司提供的实时分析仪表板项目

不管怎样。我通过使用存储过程解决了这个问题。与内置函数相比,它的效率可能有点低,但我一分钟要敲上几千次DB,我的VM CPU和RAM只是在打哈欠

CREATE OR REPLACE FUNCTION all_insert(text,text)
  RETURNS void AS
 $BODY$
DECLARE
    result text;
BEGIN
    INSERT INTO all_in (streamid, generalinput) values($1, $2);
    SELECT array_to_json(array_agg(json_build_object('streamId', streamid, 'total', count)))::text into result from totals;
    PERFORM pg_notify('totals', result);
END
$BODY$
LANGUAGE plpgsql;

因此,我的insert和notify是通过查询这个存储过程来完成的。然后,我的应用程序只需侦听PSQL db notify事件并适当地处理它们。在上面的示例中,应用程序将接收一个JSON对象,该对象具有特定的流id以及与之相关联的总数。

从0.9.5开始,为了使用输出流和连续转换,已经删除了连续触发器。(首先由教学论者提出)。连续视图的输出本质上是一个流,这意味着您可以基于它创建连续视图或变换

简单的例子:

  • 首先创建一个流和连续视图
  • 创建流(
    x int
    );
    按以下方式创建连续视图
    挑选
    小时(到达时间戳)作为ts,
    SUM(x)作为SUM
    从s组经ts;
    
  • 现在,每个连续视图都有一个输出流。您可以使用的
    output\u基于视图的输出创建变换。在转换中,您可以访问元组
    old
    new
    ,它们分别表示旧值和新值。(0.9.7有第三个称为
    delta
    ),因此您可以创建使用“hourly_cv”输出的转换,如下所示:
  • 按小时创建连续变换
    挑选
    (新)总数
    从(“每小时”的输出
    然后执行过程update();
    
  • 在这个例子中,我调用了
    update
    ,我们仍然需要定义它。它需要是一个返回触发器的函数
  • 创建或替换函数更新()
    将触发器返回为
    $$
    开始
    //你想在这里做什么都行。
    归还新的;
    结束;
    $$
    语言plpgsql;
    

    我发现这有助于理解输出流以及为什么连续触发器不再存在。

    哇,感谢您的详细回复。这是非常感谢:-)进一步使用后,我发现pg_notify在从连续变换触发时不起作用,请看答案的其余部分仍然有效。