在设计微服务时,请记住每个服务都应该拥有自己的数据,并可以直接访问数据库。然后,其他服务应该使用服务API与之进行数据交互。不能在不同的服务之间共享数据库,因为这会导致服务之间的耦合过于紧密。这样,每个微服务都在一个明确的边界内操作,类似于领域驱动设计中的限界上下文的模式。
为了实现这种解耦的架构,Lagom的持久性模块使用了事件溯源和CQRS。事件溯源是将所有更改捕获为领域事件,领域事件是已经发生的不可变事实。例如,一个系统当Mike从他的银行账户撤回钱,该事件可以仅仅存储为“100.00美元取消”,而不像在CRUD应用程序中复杂的相互作用,在事务提交之前各种各样的读取和更新操作发生。
事件溯源用于聚合根,例如具有给定客户标识符(Mike)的客户,在前面的示例中(有关更多详细信息,请参阅什么是聚合)。写侧在聚合中是完全一致的。这使得对诸如维护不变量和验证传入命令之类的事情进行推理变得很容易。在采用此模型时需要注意的一个区别是,聚合可以响应针对特定标识符的查询,但不能用于为跨越多个聚合的查询提供服务。因此,您需要为服务提供的查询创建另一个数据视图。
Lagom将事件流保存在数据库中。事件流处理器(其他服务或客户端)读取和处理存储的事件。Lagom支持读侧处理器持久化操作和消息主题订阅。您还可以使用原始事件流创建自己的事件流处理器。
如果您不想使用事件溯源和CQRS,那么您可能应该使用Lagom持久化模块以外的东西。(但是,我们建议您先阅读事件溯源的优点)您可能还想观看演示,Lagom能为您做什么?,它大约有50分钟的时间解释了使用Lagom Persistence API的好处。
如果你选择不使用Lagom的持久化模块,Lagom持久化模块中的CassandraSession
提供了一个异步API,用于在Cassandra中存储数据。但是,您可以使用任何数据存储解决方案来实现Lagom服务。如果您选择使用Lagom的持久性模块以外的其他模块,请记住使用异步API来实现更好的可伸缩性。如果您正在使用阻塞API,如JDBC或JPA,那么您应该通过为调用这些阻塞API的组件使用固定/有限大小的专用线程池来小心地管理阻塞。不要通过几个异步调用(比如服务API调用)来级联阻塞。