pg_eventserv 的实现原理并不难,核心还是利用了pg 的特性,只是包装了一个方便的golang server 然后我们可以通过webscoket 发送出去
参考使用
CREATE TABLE people (
pk serial primary key,
ts timestamptz DEFAULT now(),
name text,
age integer,
height real
);
CREATE OR REPLACE FUNCTION data_change() RETURNS trigger AS
$$
DECLARE
js jsonb;
BEGIN
SELECT to_jsonb(NEW.*) INTO js;
js := jsonb_set(js, '{dml_action}', to_jsonb(TG_OP));
PERFORM (
SELECT pg_notify('people', js::text)
);
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';
CREATE OR REPLACE TRIGGER data_change_trigger
BEFORE INSERT OR UPDATE ON people
FOR EACH ROW
EXECUTE FUNCTION data_change();
INSERT INTO people (name, age, height) VALUES ('Paul', 51, 1.9);
INSERT INTO people (name, age, height) VALUES ('Colin', 65, 1.5);
内部机制
实际上就是利用了pg_notify 能力,golang server 使用了 github.com/jackc/pgconn 包提供的通知监听能力,进行数据处理,因为监听可能会多个
server 处理部分使用了goroutine 处理,代码量很少,值得看下
参考资料
https://github.com/CrunchyData/pg_eventserv
https://github.com/CrunchyData/pg_featureserv