Search

Home

Konfiguracja notyfikacji dla PostgreSQL

Konfiguracja notyfikacji dla PostgreSQL

Do obsługi powiadomień z bazy PostgreSQL programowanie GRAVITY wykorzystuje mechanizm pg_notify serwera bazy danych.

Jest to wbudowana funkcja, która jako parametry przyjmuje dwa argumenty: channel i payload https://www.postgresql.org/docs/current/sql-notify.html

Channel to kanał na jakim będzie nasłuchiwać gravity, payload to informacja jaka zostanie odebrana i musi być przesłana w formacie JSON jako obiekt składający się z właściwości klucz: wartość. Każda właściwość zostanie przekazana do projektu uruchomionego przez trigger jako parametr i jeśli projekt ma zdefiniowany parametr o nazwie odpowiadającej kluczowi zostanie uzupełniona jego wartością.

Możliwe jest również przekazanie wartości do operatora DATA INPUT wówczas kluczem jest nazwa operatora, a wartością obiekt JSON odpowiadający szablonowi zdefiniowanemu na operatorze.

Konfiguracja serwera bazy danych

Ponieważ pg_notify jest funkcją i zamierzamy reagować na zmianę rekordu w konkretnej tabeli w bazie najprostszym podejściem jest użycie triggera na tabeli bazy danych.

Załóżmy, że istnieje tabela o strukturze:

CREATE TABLE etl.articles
(
  id integer,
  name character(100),
)
WITH (
  OIDS=FALSE
);

Zamierzamy uruchomić projekt za każdym razem, gdy zostanie dodany nowy lub zmodyfikowany towar w tabeli.

Zdefiniujmy funkcję odpowiedzialną za wysyłanie notyfikacji

CREATE OR REPLACE FUNCTION etl.notify_articles_add()
  RETURNS trigger AS
$BODY$
BEGIN
  PERFORM pg_notify(
	'notify_articles_add',   
	json_build_object(
	'id', NEW.id,
	'name', NEW.name)::text
  );

  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

funkcja wyśle notyfikacje na kanale notify_articles_add z ładunkiem

{
	‘id’: [id nowego rekordu],
	‘name’: [nazwa towaru]
}

Zdefiniujmy triggera dla tabeli articles

CREATE TRIGGER trigger_notify_articles_add
  AFTER INSERT OR UPDATE
  ON etl.articles
  FOR EACH ROW
  EXECUTE PROCEDURE etl.notify_articles_add();

W tym momencie dodając rekord do tabeli articles zdefiniowany trigger wywoła funkcję notify_articles_add, która wyśle notyfikację na kanale notify_articles_add. Jeśli w systemie GRAVITY jest zdefiniowany trigger, który nasłuchuje na wskazanym kanale uruchomi projekt z parametrami jakie odpowiadają polom obiektu JSON, który wysyła w swoim ładunku notyfikacja.

Jeśli chcemy użyć operatora INPUT DATA na projekcie, w celu odebrania informacji z wysłanej notyfikacji, funkcja pg_notify powinna być zdefiniowana następująco

CREATE OR REPLACE FUNCTION etl.notify_articles_add()
  RETURNS trigger AS
$BODY$
BEGIN
  PERFORM pg_notify(
	'notify_articles_add',   
	json_build_object(
	'InputData1',
  	json_build_object(   		 
    	'id', NEW.id,
    	'name', NEW.name,
	)::text)::text
  );

  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

czyli przekazywać obiekt JSON o strukturze

{
	InputData1: {
		"id": [id_nowego_rekodu],
		"name": "[nazwa towaru]"
	}
}

gdzie InputData1 jest nazwą operatora DATA INPUT i operator DATA INPUT ma zdefiniowany szablon danych odpowiadający obiektowi InputData1

Konfiguracja systemu GRAVITY

  • Konfigurując trigger dla projektu po wybraniu połączenia do bazy danych korzystającego z PostgreSQL wpisz kanał na jakim odbywać się będzie nasłuch.
  • Wykorzystaj parametry o nazwach odpowiadających strukturze obiektu JSON w ładunku notyfikacji lub operator INPUT DATA.