【问题标题】:Postgres : Post statement (or insert) asynchronous, non-blocking processingPostgres:发布语句(或插入)异步、非阻塞处理
【发布时间】:2017-08-17 18:15:01
【问题描述】:

我想知道是否有可能,在插入一组行之后,启动一个异步执行的操作,是非阻塞的,并且不需要通知请求的发起者 - 的结果。

我正在处理大量事件,我可以保证插入后逻辑不会失败——我只想在我的事件源中有一个插入线程,我希望这个线程在没有的情况下继续运行阻止,并且不负责任何交付后的簿记。

我可以告诉你,我可能会同时执行 100 个这样的作业,每个作业可能在 5 个表上操作,每个表上的插入次数在 200-1000 之间。

一个正确方向的提示就足够了。

【问题讨论】:

  • 你能告诉我你是如何解决这个问题的吗?通常这是我会在 oracle 中使用 dbms_job /schedule 完成的任务,但我在 pg 中缺少此功能。所以我遇到了这个非常古老的线程有一个非常相似的问题......
  • 我正在编写自己的数据处理引擎:D
  • 谢谢信息。我现在使用 dblink_send_query。但我的“问题”是,我必须确保触发触发器的连接必须打开,直到每个 dblink 查询完成。

标签: events postgresql concurrency asynchronous nonblocking


【解决方案1】:

LISTEN/NOTIFY 可能是您需要的,让一个单独连接上的侦听器运行 LISTEN notifyname(它可以使用非阻塞套接字并使用 poll,或者您的应用程序正在运行),并且您的代码在处理后运行 NOTIFY notifyname,但是您需要通过某种方式让您的 LISTENing 线程知道已完成的记录,可能使用某种日志表.另外值得注意的是,libpq 支持asynchronous mode(至少,DBD::Pg 也支持,可能还有其他 Pg 驱动程序)。

【讨论】:

    【解决方案2】:

    我会添加一些不同的答案。

    您可以使用 Redis 临时存储您的请求,然后您可以每隔 X 秒对它们进行批处理。 (至少你可以一次插入多行 - 通常你可以做更多......)。

    也许是时候检查一下 Kafka 或 Amazon 的 Kinesis。它是一种更高级的服务,可以让你做与我上面提到的类似的事情。

    【讨论】:

      【解决方案3】:

      既然您实际上只是简单地对大量行进行批处理,为什么不让 cron 作业发布处理完这些行?

      只需将它们标记为未处理(或将它们重定向到带有触发器的处理表)并在完成后立即处理它们。

      【讨论】:

      • 数据源源不断:/
      • 如何创建一个 cronjob 来替换用于每 n 分钟插入一次的触发器。这样,您可以每n 分钟写入一个新表,替换触发器后,您将处理前一个表并将其写入实际目标表。
      • 这是一种可能性,我将不得不考虑这一点——也许从客户端阻止并直接写入目标表是更好的选择。至少复杂性特征将得到很好的定义。
      猜你喜欢
      • 2014-11-20
      • 2018-04-06
      • 2015-09-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 2015-08-03
      相关资源
      最近更新 更多