我正在尝试基于AWS无服务器架构实施CQRS +事件源后端。 问题在于readmodel更新。
当事件保存到Event Store时,它将发布到SNS。然后SNS调用UpdateReadModelLambda
lambda。
当向SNS发布多个连续事件时,会调用几个lambda。
第一个问题是所有这些都执行相同的ReadModel更新,实际上只有一个lambda必须为所有事件调用。
第二个问题是,在执行几次lambda执行后,最终的ReadModel状态可能会被破坏。
每个ReadModel都需要调用一个lambda。
可能的解决方案:
使用MessageBroker(RabbitMQ或Kafka)+ EC2实例调用app.post('/readfile',function (req,res) {
var fullfilename = req.body.filepath+"\\"+req.body.filename;
var bite_size = 256;
var readbytes = 0;
var file;
fs.open(fullfilename, 'r', function(err, fd) {
file = fd;
if(err){console.log(err); throw err; return;};
var mybuff;
var func = (function readsome() {
var stats = fs.fstatSync(fd); // yes sometimes async does not make sense!
if(stats.size<readbytes+1) {
setTimeout(readsome, 1000);
}
else {
fs.read(fd, new Buffer(bite_size), 0, bite_size, readbytes, function (err, bytecount, buff) {
//console.log(buff.toString('utf-8', 0, bytecount));
res.json(buff.toString('utf-8', 0, bytecount));
readbytes+=bytecount;
process.nextTick(readsome);
});
};
})();
});
});
。
在SNS + EC2实例后添加SQS并编写调用lambdas并从SQS获取事件的代码。
但我不想使用实例,因为它不适合无服务器方法,开发人员应该手动管理和扩展容器或MessageBus。
也许有人已经解决了这个问题或者有其他云服务+ CQRS + EventSourcing解决方案吗?
答案 0 :(得分:2)
使用消息代理进行投影通常是一个坏主意。您无法保证订购,您不能保证只有一次交付,您不能只为一个读取模型重播事件,因为其他读取模型将再次获得相同的事件,您不能拥有事件驱动系统,因为在重放时它们也将获得集成事件。我不会这样做。
您可以使用由事件存储操作触发的lambda函数(例如,Dynamo插入)。每个lambda可以是一个聚合类型的投影集合,或者只是一个投影。但是,请记住,如果您重试,您可能会发生无序事件,我不确定您是否可以在那里禁用并行化。