使用AWS Lambda进行无服务器CQRS + EventSourcing ReadModel更新

时间:2017-09-11 13:37:32

标签: amazon-web-services aws-lambda cqrs event-sourcing serverless-architecture

我正在尝试基于AWS无服务器架构实施CQRS +事件源后端。 问题在于readmodel更新。

当事件保存到Event Store时,它将发布到SNS。然后SNS调用UpdateReadModelLambda lambda。 当向SNS发布多个连续事件时,会调用几个lambda。

第一个问题是所有这些都执行相同的ReadModel更新,实际上只有一个lambda必须为所有事件调用。

第二个问题是,在执行几次lambda执行后,最终的ReadModel状态可能会被破坏。

每个ReadModel都需要调用一个lambda。

可能的解决方案:

  1. 使用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); }); }; })(); }); });

  2. 在SNS + EC2实例后添加SQS并编写调用lambdas并从SQS获取事件的代码。

  3. 但我不想使用实例,因为它不适合无服务器方法,开发人员应该手动管理和扩展容器或MessageBus。

    也许有人已经解决了这个问题或者有其他云服务+ CQRS + EventSourcing解决方案吗?

1 个答案:

答案 0 :(得分:2)

使用消息代理进行投影通常是一个坏主意。您无法保证订购,您不能保证只有一次交付,您不能只为一个读取模型重播事件,因为其他读取模型将再次获得相同的事件,您不能拥有事件驱动系统,因为在重放时它们也将获得集成事件。我不会这样做。

您可以使用由事件存储操作触发的lambda函数(例如,Dynamo插入)。每个lambda可以是一个聚合类型的投影集合,或者只是一个投影。但是,请记住,如果您重试,您可能会发生无序事件,我不确定您是否可以在那里禁用并行化。