Postgres 알림 실시간 계기판

6475 단어 eventdrivenpostgres
우리는 내가 어떻게 Postgres 기능pg_notify을 사용하여 한 제조업체의 업무 계획에 지원을 제공하는지 볼 것이다.이런 특수한 제품은 십여 개의 제조 단계를 거쳤고 매번 제품이 다음 단계에 들어갈 때마다 노동자들은 그들의 작업장에서 이 과정을 기록한다.본고에서 구축한 응용 프로그램은 이 시간표를 표시하고 모든 사람이 하루의 진도를 볼 수 있도록 합니다.

SQL의 관찰자 모드


Postgres에서만 SQL 표준을 사용하는 것에 익숙하지 않다면, NOTIFY 명령과 LISTEN 명령은 익숙하지 않을 수도 있습니다.하지만 이 두 가지 명령이 있으면 관찰자 모드와 비슷한 것을 실현할 수 있지만, 당신의 SQL 엔진에서!
관찰자 모드에서는 한 종류의 대상이 이벤트를'감청'하고 다른 종류는 이 탐지기에 이벤트를 보낼 수 있다.이 모드는 데이터가 업데이트되거나 변경되고 있는 실례에 사용되며, 관련되지 않을 수 있는 몇 개의 대상이 이러한 변경에 반응해야 한다.

관찰자 예


React 구성 요소 내부에서 Redux 스토리지의 상태 변경을 수신하는 것이 이 모드의 일반적인 예입니다.많은 React 구성 요소는 Redux 스토어의 일부만 수신합니다.안드로이드의 라이브데이터는 이런 패턴의 또 다른 좋은 예로 관찰자를 만들어 변화를 관찰하고 응용 프로그램의 상태와 UI를 즉시 업데이트할 수 있다.

PostgreSQL에서 관찰


NOTIFYLISTEN가 함께 작업하여 Postgres 데이터베이스에서 이 설계를 실현할 수 있도록 합니다.보통NOTIFY은 SQL 쿼리에서 호출되고 트리거에서 호출됩니다.Triggers and event-based models go together well . LISTEN 당신의 Postgres 고객에게서 전화가 왔습니다.NOTIFY가 이벤트를 트리거하면 클라이언트에게 알립니다.이 이벤트는 유효한 부하를 포함하기 때문에 클라이언트는 어떤 이벤트를 촉발했는지 판단할 수 있습니다. (이것은 메타데이터나 데이터베이스에서 온 실제 데이터도 포함할 수 있습니다.)고객이 이 통지를 받는 방법과 고객이 이 통지를 처리하는 방법은 고객에 따라 다릅니다.우리의 예시에서 클라이언트는 웹소켓을 사용하여 pg_notify으로부터의 신호를 받은 후에 모든 연결된 스케줄링 클라이언트를 업데이트할 것이다.

작업 일정 응용 프로그램 구축


모델 디자인


박사 후부터 시작합시다.우리는 지금 제조 중인 제품을 모델링하고 있다.production 중의 항목은 production_item표에 표시될 것이다.각production_item마다 관련product_id과 현재의 생산 단계가 있다.Arctype's Free Figma ERD Template를 사용하여 생성한 다음 그림은 이 모드를 보여 줍니다.

현재 생산 단계를 production_item 표의 열로 저장할 수 있지만 프로젝트의 현재 단계만 볼 수 있습니다.반대로 우리는 production_item_wip(work in progress)표를 사용할 것이다. 이 표에는 줄마다 시간 스탬프가 포함되어 있으며 프로젝트가 생산 단계에서 진전됨에 따라.테이블, 스토리지production, production_stage의 모든 가능한 단계를 만듭니다.production_stage는 단계가 발생하는 순서를 저장하기 위해 idx의 정수열을 가지고 있다.예를 들어 아래의 조회 창설production_item_wip표.
create table production_item_wip (  
  id serial primary key,  
  insert_time timestamp default NOW(),  
  production_item_id int references production_item(id),  
  production_stage_id int references production_stage(id),  
  employee_id int references employee(id)  
);
프로티프:너는 내가 모든 책상에 insert_time를 넣었다는 것을 알 수 있을 거야.insert_time이 특정한 예에 대해 우리는 현재 모든 표에서 이 열을 사용할 필요가 없지만, 나는 그것이 장래에 자주 유용하다는 것을 발견할 수 있다.나는 조회를 구축하고 유용한 통계 데이터를 추출하는 데 많은 시간을 들였다. 왜냐하면 데이터가 부족하기 때문이다. pg_notify만약 당신이 이렇게 해야 하는지 아닌지를 확정하지 못한다면, 나는 보통 데이터베이스 모델을 설계할 때 그것을 추가할 것이다.

Postgres 알림 구문


NOTIFY를 사용하여 이벤트를 보내는 것은 매우 간단합니다!다음은 order progress 이벤트 채널에 알림을 보내는 트리거 프로세스입니다.
create
or replace function fn_production_stage_modified() returns trigger as $psql$
begin
  perform pg_notify(
    'order_progress_event',
    'Time to refresh those screens!'
  );return new;
end;$psql$ language plpgsql;
select pg_notify('order_progress_event', 'Hello world!'); 실시간 데이터 흐름을 전송할 때 트리거에 사용하기에 적합하다.그러나 일반 SQL 쿼리를 통해 pg notify: SELECT를 쉽게 호출할 수도 있습니다.
PL/pgSQL 과정 중 pg_notify과 같은 함수를 사용하여void를 되돌릴 수 없습니다.이렇게 하면 Postgres 오류가 발생합니다.이것이 바로 첫 번째 예에서 우리는 PERFORM를 사용하고 두 번째 예에서 우리는 간단하게 사용할 수 있는 이유SELECT다.
이 과정을 만든 후에 실제 트리거를 추가합니다. 이렇게 하면 프로젝트가 생산 과정에서 이동하여 production_item_wip에 다른 줄을 삽입할 때마다 위의 과정을 호출합니다.
create trigger production_stage before
insert
  on production_item_wip for each row execute procedure fn_production_stage_modified();
이렇게!이 예에서 매번의 유효 하중은 모두 같다.경보가 아닌 실제 데이터를 보낼 수 있지만, 이 예에서 클라이언트 프로그램이 그것을 받아들일 수 있도록 기본 알림을 보내고, 순서대로 단독 조회에서 필요한 내용을 선택하는 것을 좋아합니다.
알림에서 데이터를 인코딩하려면 푸시 알림이든 pg_notify로부터 온 알림이든 모두 알림의 원본을 추상화해야 한다. 만약에 데이터가 보통 HTTP API를 통해 전달된다고 가정한다.알림을 소프트웨어로 사용하여 HTTP API에서 새 데이터를 가져오는 "프롬프트"로 사용하면 프로세스를 단순화하고 유지 보수가 필요한 다양한 데이터 소스의 수를 줄일 수 있습니다.

박사후 듣기 문법


보다 간편한 시청 채널: LISTEN order_progress_event;그뿐이야.
이 이벤트를 호출할 때, 우리는 당일의 최신 생산 데이터를 선택할 것입니다.다음은 현재 생산 단계별로 얼마나 많은 제품이 향상되었는지 보여주는 뷰입니다.
create view view_daily_production_stats as
select
  count(1) as stage_count,
  ps.name as stage_namefrom production_item_wip piw
  join production_stage ps on ps.id = piw.production_stage_idwhere date(piw.insert_time) = date(now())
group by
  ps.id
기왕 당신의 고객이 경청하고 있는 이상, 당신은 그것이 받은 사건에 어떻게 대응합니까?이것은 클라이언트에 따라 다르다. 왜냐하면 비동기 이벤트에 서비스되는 프로그래밍 언어의 기능 집합의 차이가 매우 크기 때문이다.이 예에서는 JavaScriptpg 클라이언트를 사용합니다.JavaScript는 일반적으로 비동기식 웹 프로그래밍에 사용됩니다.
var clients = [];
function eventCallback(event) {
  query('select * from view_daily_production_stats', (data) => {
    clients.map(c => {
      c.send(data);
    });
  });
}
client.connect(function(err, client) {
  var query = client.query("LISTEN order_progress_event");
  client.on("notification", eventCallback);
});
;  
PostgreSQL 클라이언트가 새 이벤트를 수신할 때마다 eventCallback 의 유효 부하 호출 함수 NOTIFY 를 사용합니다.그런 다음 이전에 작성한 뷰를 리디렉션하여 최신 프로덕션 단계 데이터를 선택하고 모든 스누핑 클라이언트(Raspberry Pis)에 새 데이터를 전송합니다.클라이언트가 데이터를 수신하여 HTML을 렌더링합니다.

이 모든 것을 함께 놓아라


pg_notify는 간단한 PostgreSQL 내장 기능으로 다양한 잠재적인 용례가 있다.만약 당신이 간단한 실시간 알림을 필요로 한다면, 단지 몇 개의 특정한 사건만 있으면, 한번 고려해 볼 수 있습니다.Arctype는 이러한 응용 프로그램을 구축하고자 하는 개발자를 위해 구축된 것으로 자바스크립트와 SQL을 실행하는 기능이 있다.

좋은 웹페이지 즐겨찾기