Postgres:Post语句(或插入)异步,非阻塞处理

时间:2010-03-06 13:29:16

标签: events postgresql concurrency asynchronous nonblocking

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

我正在处理大量的事件,我可以保证插入后的逻辑不会失败 - 我只想在我的事件源中有一个插入线程,我希望这个线程能够保持不变阻止,并且不对任何交付后的簿记负责。

我可以告诉你,我可能会同时执行100个这样的作业,每个作业可能在5个表上运行,每个表上的每个表都有200-1000个插入。

正确方向的暗示应该足够了。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我会以某种方式添加不同的答案。

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

也许是时候检查Kafka或亚马逊的Kinesis了。它是更高级的服务,可以让你做我上面提到的类似的事情。

答案 2 :(得分:-1)

由于您实际上只是简单地批量处理大量行,为什么不让cron作业在您完成行后处理这些行?

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