Search

Home

Konfiguracja notyfikacji dla PostgreSQL

Konfiguracja notyfikacji dla PostgreSQL

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

Jest to wbudowana funkcja, która jako parametry przyjmuje dwa argumenty: channel i payload (zobacz dokumentację: PostgreSQL).

Channel to kanał, na którym będzie nasłuchiwać gravity, natomiast 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 takim przypadku 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 następującej 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 notyfikację 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, po dodaniu rekordu 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 nasłuchujący na tym kanale, uruchomi on projekt z parametrami odpowiadającymi polom obiektu JSON, który został przesłany w ładunku notyfikacji.

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

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;

i tym samym 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 którym będzie odbywał się nasłuch.
  • Wykorzystaj parametry o nazwach odpowiadających strukturze obiektu JSON w ładunku notyfikacji lub operator INPUT DATA.