AACsearch
Connecteurs & Widget

Synchronisation PostgreSQL

Synchronisez vos tables PostgreSQL avec le moteur AACsearch en temps réel grâce à pg_notify, le polling ou la réplication logique.

Connecteur de synchronisation PostgreSQL

Le connecteur de synchronisation PostgreSQL maintient vos index AACsearch à jour avec vos tables de base de données PostgreSQL. Il prend en charge trois stratégies de déploiement.

Stratégie 1 : pg_notify (recommandée)

Synchronisation à faible latence basée sur des déclencheurs utilisant LISTEN/NOTIFY natif de PostgreSQL.

Configuration

Tout d'abord, créez une fonction de déclencheur et attachez-la à votre table :

CREATE OR REPLACE FUNCTION notify_aacsearch()
RETURNS trigger AS $$ BEGIN
  PERFORM pg_notify('aacsearch_sync', row_to_json(NEW)::text);
  RETURN NEW;
END; $$ LANGUAGE plpgsql;

CREATE TRIGGER products_aacsearch_trigger
AFTER INSERT OR UPDATE ON products
FOR EACH ROW EXECUTE FUNCTION notify_aacsearch();

Connexion

import { startPgNotifyListener } from "@aacsearch/postgres-sync";

const pg = await startPgNotifyListener({
	aacsearch: {
		baseUrl: process.env.AACSEARCH_URL!,
		token: process.env.AACSEARCH_TOKEN!,
		projectId: process.env.AACSEARCH_PROJECT_ID!,
	},
	connectionString: process.env.DATABASE_URL!,
	table: "products",
	idColumn: "id",
	initialFullSync: true,
	debug: true,
});

process.on("SIGTERM", () => pg.end());

L'écouteur va :

  1. Effectuer une synchronisation initiale complète de toutes les lignes existantes
  2. S'abonner aux événements pg_notify pour les mises à jour en temps réel
  3. Envoyer chaque modification à AACsearch dès qu'elle arrive

Stratégie 2 : Curseur par polling

Le polling est utile lorsque vous ne pouvez pas ajouter de déclencheurs à vos tables de base de données.

import { startPollingSync } from "@aacsearch/postgres-sync";

const poller = startPollingSync({
	aacsearch: { baseUrl: process.env.AACSEARCH_URL!, token, projectId },
	connectionString: process.env.DATABASE_URL!,
	table: "orders",
	cursorColumn: "updated_at",
	pollIntervalMs: 5000,
});

// Arrêter plus tard :
// poller.stop();

Le poller exécute SELECT * FROM table WHERE cursorColumn > $1 ORDER BY cursorColumn à l'intervalle configuré et envoie les lignes nouvelles/modifiées à AACsearch.

Stratégie 3 : Sequin CDC

Pour une réplication logique de qualité production sans déclencheurs, utilisez Sequin pour diffuser les événements CDC :

import { startSequinCdcSync } from "@aacsearch/postgres-sync";

const sequin = startSequinCdcSync({
	aacsearch: { baseUrl: process.env.AACSEARCH_URL!, token, projectId },
	streamUrl: "https://api.sequin.io/streams/YOUR_STREAM_ID",
	accessToken: "seq_xxx",
	table: "products",
});

Mappage personnalisé de documents

Toutes les stratégies acceptent une fonction mapper personnalisée :

startPgNotifyListener(config, (row) => ({
	external_id: String(row.id),
	title: row.title,
	content: row.body || row.description,
	price: row.price,
	category: row.category_name,
	tags: row.tags ? JSON.parse(row.tags) : [],
}));

Rappels

Surveillez l'activité de synchronisation avec des rappels :

startPgNotifyListener(config, undefined, {
	onSync: (event) => {
		console.log(`Synchronisé ${event.action} sur ${event.table}`);
	},
	onError: (error, context) => {
		console.error(`Erreur sur ${context?.table} :`, error);
	},
	onConnected: () => console.log("Connecté à PostgreSQL"),
	onDisconnected: () => console.log("Déconnecté de PostgreSQL"),
});

Comparaison des stratégies

StratégieLatenceNécessite un déclencheurSurchargeIdéal pour
pg_notify~100msOuiMinimale (NOTIFY est asynchrone)Tables de production que vous contrôlez
Curseur polling~5-60sNonSELECT par intervalleTables sans accès en écriture
Sequin CDC~1-5sNonEmplacement de réplication logiqueHaute disponibilité, zéro configuration

Liens connexes

On this page