首页 文章

CQRS和ElasticSearch - 使用ElasticSearch构建读取模型

提问于
浏览
3

有没有人使用ElasticSearch在CQRS方法中构建读取模型?我有一些与此类解决方案相关的问题:

  • 您在哪里存储域名活动?在JDBC数据库中?在ElasticSearch?

  • 您是否通过处理域事件或使用ElasticSearch River功能的事件处理程序构建索引?

  • 如何处理视图模型的完全重建 - 例如在视图损坏的情况下?您是否处理所有事件以重建视图?

1 回答

  • 1

    位于域事件的权威存储库的位置是实现细节 . 例如,您可以在S3或CouchDB或任何其他数量的存储实现上存储序列化版本 . 如果您刚刚开始,最简单的是关系数据库 .

    通常,人们使用事件处理程序来理解每条消息背后的业务意图,然后可以将消息正确地反规范化为适合视图需求的读取模型结构 .

    如果视图模型已损坏或者您在视图模型处理程序中有错误,则修复错误后需要遵循几个简单的步骤:

    • 暂时将来自域的事件流排入队列 - 这些是您的域正在工作时发布的典型消息 . 我们仍然想要这些消息,但不仅如此 . 这可以通过关闭任何消息总线或不使用连接到排队基础结构来完成 .

    • 从事件存储中读取所有事件 . 收到每个事件(这可以通过简单的数据库查询完成),通过适当的消息处理程序运行每个消息 . 确保跟踪所有处理过的消息的最后10,000个(或左右)标识符 .

    • 现在重新连接到队列并开始正常处理 . 如果已看到消息的标识符,请删除该消息 . 否则,正常处理 .

    跟踪标识符的原因是为了避免竞争情况,即您从事件存储中获取所有事件,但是通过消息队列传递相同的消息 .

    可以在此处找到另一种高度相关但涉及跟踪所有消息标识符的技术:http://blog.jonathanoliver.com/2011/03/removing-2pc-two-phase-commit.html

相关问题