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

时间:2010-12-13 10:41:47

标签: cqrs elasticsearch

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

  1. 您在哪里存储您的域名 事件?在JDBC数据库中?在 ElasticSearch?
  2. 您是否通过处理域事件或使用ElasticSearch River功能的事件处理程序构建索引?
  3. 如何处理视图模型的完全重建 - 例如在视图损坏的情况下?您是否处理所有事件以重建视图?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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

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