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 :
- Effectuer une synchronisation initiale complète de toutes les lignes existantes
- S'abonner aux événements
pg_notifypour les mises à jour en temps réel - 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égie | Latence | Nécessite un déclencheur | Surcharge | Idéal pour |
|---|---|---|---|---|
| pg_notify | ~100ms | Oui | Minimale (NOTIFY est asynchrone) | Tables de production que vous contrôlez |
| Curseur polling | ~5-60s | Non | SELECT par intervalle | Tables sans accès en écriture |
| Sequin CDC | ~1-5s | Non | Emplacement de réplication logique | Haute disponibilité, zéro configuration |
Liens connexes
Synchronisation Supabase
Synchronisez vos tables Supabase avec le moteur AACsearch en temps réel grâce aux abonnements Realtime ou aux Webhooks de base de données.
Zapier — connect and automate
[TODO i18n — see issue #76] "Automate data ingestion from any app into AACsearch with Zapier. Thousands of supported apps."