V minulém roce jsem se pokoušel replikovat změny v datach pod MSSQL. Šlo mi o to něajak v reálném čase odchytávat SQL příkazy INSERT, UPDATE a DELETE, abych mohl na úrvni změněných řádků v tabulce provedené změny exportovat ven z MSSQL databáze. Našel jsem nějakou nativní implementaci Microsoftu přímo v aplikaci databázového server… Funkcionalita dostupná až v poslední verzi serveru… Práce s ní strašný opruz s nutnou dávkou dalšího úsilí jak se k datům dostat. A o tom, že to budou data v skoro reálném čase si nechte zdát…
Change Stream
O to větší radost jsem měl radost z jedné z mnoho novinek v MongoDB verze 3.6, kterou je Change Stream, což je přesně to, co jsem chtěl po MSSQL. Elegance s kterou to řeší MongoDB je úžasná. Celá logika a funkcionalita je postavena nad oplogem (kde jinde…) a chová se přesně jak byste čekali: oplog je zpracováván na úrovni replica setu pro migraci informací mezi jednotlivými servery od primárního serveru k sekundárům. Ovladač MongoDB má nově funkci watch ,nad objektem collection, která vrací data z oplogu. Jak jednoduché.
Apka pro vkládáni dat do MongoDB databáze
Touto jednoduchou aplikací jen vkládám jednotlivé dokumenty do sledované kolekce. Stejně tak bych to mohl dělat přímo přes Mongo shell, nebo v reálu se mi o toto bude starat samotná aplikace, která daná data přímo spravuje.
{
if (err) console.error(err);
else {
let db = connecion.db(dbName);
let coll = db.collection(collectionName);
coll.insert(uzivatel, (err, res) => {
if (err) console.error(err);
else {
console.log('vlozena nova firma');
}
connecion.close(err => {
if (err) console.error('nepodarilo se odpojit od monga...');
});
});
}
});
Nic složitého: připojíte se MongoDB replica setu a vložíte do dané collection jeden záznam.
Apka pro sledování změněných dat
'use strict';
const mongodb = require('mongodb');
const mongoUrl = 'mongodb://localhost:27017,localhost:27018,localhost:27019?replicaSet=rs';
const dbName = 'test';
const collectionName = 'uzivatel';
mongodb.MongoClient.connect(mongoUrl, (err, connecion) => {
if (err) console.error(err);
else {
let db = connecion.db(dbName);
let coll = db.collection(collectionName);
const changeStream = coll.watch({ full_document: 'updateLookup' });
changeStream.on('change', change => {
console.log(change);
});
}
});
Apka se opět připojuje k MongoDB a ve funcki watch nad sledovanou collection dostává dat o provedených změnách. Jednodušeji to snad už nejde…
Kód jsem napsal v JavaScriptu pro NodeJS. Přepsat jej do Pythonu je brnkačka a výsledný kód, vzhledem k absenci obslužných callbackových funkcí bude mnohem kratší. Nicméně příjdete o asynchronní zpracování, které vám nabízí NodeJS.