Доповідь присвячена рішенню проблеми зміни структури даних сутності в REST API на Node.js, а також міграції даних в MongoDB
Як елегентно не поламати сумісність з існуючими користувачами API
Як підтримувати сумісність кількох версії структур даних одної сутності
Які варіанти міграції даних в MongoDB з і без downtime
Історія втрати даних при міграції даних в MongoDB
Які інструменти і підходи забезпечать максимальну виживаємість даних при неуспішних міграціях
10. GET
/document/:id/v2
Find document in
DB
Return this
document
GET
/document/:id/v1
Assuming for now that document has v2
structure in DB/business logic
Find document in
DB
Transform v2 -> v1
Return this
document
13. transformObject(documentVX, 'v1|2', 'v2', options, (err, documentV2) => {
//business logic with documentV2
//maybe save in db with V2
transformObject(document, 'v2', 'v2|v1', options, (err, documentVx) => {
res.json(documentVx) // same version as we receive
});
});
First “Upgrade”, then “Downgrade”
16. const through2 = require('through2');
let stream = through2.obj((obj, encoding, callback) => {
//async transform single object here
through.push();
callback();
});
Transform stream
17. function getTransformStream(options) {
return through2.obj(function(obj, encoding, callback){
var through = this;
if(!preparedDataSets) {// Do all async stuff once
prepareTransform(options, (err, dataSets) => {
through.push(syncTransformReadyData(obj, dataSets, options));
callback();
});
} else {
through.push(syncTransformReadyData(obj, dataSets));
callback();
}
});
18. POST and PUT/api/entity/v1
/api/entity/v2
Transform v1 to v2
data format
/api/entity/v3
Transform v2 to v3
data format
Business logic (only accepts
v3 data format in)
API version
layer
GET and result of POST and PUT
/api/entity/v1 /api/entity/v2
Transform v1 to v2
data format
/api/entity/v3
Transform v2 to
v3 data format
Business logic (only returns
v3 data format out)
API version
layer
v2, v3Handle different
versions in DB
v2, v3
Handle different
versions in DB
v3
v3
24. API request
(POST, PUT,GET document)
Patch user
data
Document is
“patched”?
Proceed with business logic
No
documents.findOne({id, schema: ‘v2’}) ?
Yes
documets.update({...,id, schema: ‘v2’})
25. Any API REQUEST
Patch user
data
User data is
“patched”?
Proceed with business logic
No
settings.findOne({id, patched: true})
Yes
invoices.update({..., patched: true})
transactions.update({..., patched: true})
expenses.update({..., patched: true})