【问题标题】:Postgresql LISTEN / NOTIFY recapPostgresql LISTEN / NOTIFY 回顾
【发布时间】:2016-11-26 01:35:45
【问题描述】:

我创建了以下触发器来跟踪 postgres 表上的所有更改。

DROP TRIGGER tr_request_update_notify ON requests;

CREATE OR REPLACE FUNCTION request_update_notify() RETURNS trigger as $$
BEGIN  
  PERFORM pg_notify('request_update_notify', json_build_object('table', TG_TABLE_NAME, 'id', NEW.id, 'event', NEW.event, 'type', TG_OP)::text);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER tr_request_update_notify AFTER UPDATE or INSERT ON requests FOR EACH ROW EXECUTE PROCEDURE request_update_notify();

另一个应用程序将监听连接并对每个事件应用适当的处理。

如果发生事件而我的应用程序未启动,则永远不会处理该事件。有没有办法回顾所有错过的通知?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    通知不会存储在任何地方,它们只是发送到在同一通知通道上侦听的任何会话。但是看到您在数据库中,为什么不将通知存储在表中,然后侦听器在它们处于活动状态时简单地轮询该表。然后,您也可以直接使用json,而不是将其转换为text。不像NOTIFY/LISTEN 那样“自动”,但在其他方面非常简单。

    CREATE OR REPLACE FUNCTION request_update_notify() RETURNS trigger as $$
    BEGIN  
      INSERT INTO my_notifications (channel, message_time, notification)
      VALUES ('request_update_notify', CURRENT_TIME,
              json_build_object('table', TG_TABLE_NAME,
                                'id',    NEW.id,
                                'event', NEW.event,
                                'type',  TG_OP)
      );
      RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    

    【讨论】:

    • 或者甚至合并表的概念并通知,以便新事件作为通知出现,旧事件可以从表中读取。这样就不需要投票了
    • 使用 NOTIFY/LISTEN 背后的想法是避免轮询表。我可能会部分使用建议的解决方案并管理一个序列号。因此,在启动时,我的应用程序将处理它之前错过的所有通知(可以使用序列号找到),然后再次收听 DB。
    猜你喜欢
    • 2023-04-01
    • 2014-02-04
    • 2013-04-30
    • 2018-01-07
    • 2015-12-31
    • 2016-10-21
    • 2023-04-09
    • 2014-11-07
    • 1970-01-01
    相关资源
    最近更新 更多