使用Cassandra存储持久化事件

本页介绍如何配置Cassandra,以便在Lagom服务中与Persistent Entity API或Akka Typed Persistence一起使用。

项目依赖

要使用Cassandra,请在项目的构建中添加以下内容:

  • 在Maven中:

    1. <dependency>
    2. <groupId>com.lightbend.lagom</groupId>
    3. <artifactId>lagom-scaladsl-persistence-cassandra_${scala.binary.version}</artifactId>
    4. <version>${lagom.version}</version>
    5. </dependency>

    在sbt中:

    1. libraryDependencies += lagomScaladslPersistenceCassandra

    配置

    Lagom的持久性需要几个表来存储数据。这些表存储在Cassandra键空间中。Cassandra中的键空间是一个命名空间,用于定义Cassandra节点上的数据复制。每个服务都应该使用唯一的键空间名称,以便不同服务的表不会相互冲突。您需要在每个服务实现项目中配置用于这些表的键空间。
    Cassandra键空间名称必须以字母数字字符开头,并且仅包含字母数字和下划线字符。它们不区分大小写,以小写形式存储。
    Lagom有三个需要键空间配置的内部组件:

  • journal 存储序列化的事件

  • snapshot store 将状态的快照存储,作为一种优化手段以实现更快的恢复(有关详细信息,请参阅快照
  • offset store储用于Cassandra读侧支持,以跟踪每个读取端处理器处理的最新事件(详见读取端设计

您可以在每个服务实现项目的application.conf中配置这些键空间名称。配置文件:

  1. cassandra-journal.keyspace = my_service_journal
  2. cassandra-snapshot-store.keyspace = my_service_snapshot
  3. lagom.persistence.read-side.cassandra.keyspace = my_service_read_side

虽然不同的服务应该通过使用不同的键空间来隔离,但在一个服务中为所有这些组件使用相同的键空间是完全可以的。在这种情况下,可以方便地定义自定义键空间配置属性,并使用属性替换来避免重复。

  1. my-service.cassandra.keyspace = my_service
  2. cassandra-journal.keyspace = ${my-service.cassandra.keyspace}
  3. cassandra-snapshot-store.keyspace = ${my-service.cassandra.keyspace}
  4. lagom.persistence.read-side.cassandra.keyspace = ${my-service.cassandra.keyspace}

当您的服务启动时,默认情况下,如果缺少这些键空间,Lagom会创建这些键空间,并在其中自动创建其内部表。如果希望显式管理架构,可以使用以下属性禁用自动创建:

  1. cassandra-journal {
  2. keyspace-autocreate = false
  3. tables-autocreate = false
  4. }
  5. cassandra-snapshot-store {
  6. keyspace-autocreate = false
  7. tables-autocreate = false
  8. }
  9. lagom.persistence.read-side.cassandra {
  10. keyspace-autocreate = false
  11. }

当这些属性设置为false时,如果启动时缺少键空间或表,则服务将记录错误并无法启动。
Lagom的Cassandra支持由akka-persistence-cassandra 插件提供。插件的reference.conf中有完整的配置参考信息。

关于lagom-persistence-cassandra配置的重要说明

将Cassandra用于持久性实体依赖于akka-persistence,在应用程序启动时,必须从可能记录了持久化实体的第一个事件初始偏移时间戳开始扫描。在akka-persistence configuration中,first-time-bucket在lagom中配置如下:

  1. cassandra-query-journal {
  2. first-time-bucket = "20160225T00:00"
  3. }

对于新应用程序的首次启动,这可能会导致从事件日志读取最新事件的延迟,但这一点并不重要。因此,请确保将first-time-bucket设置为日志完全为空时应用程序首次部署的日期。

Cassandra定位

Lagom将在开发者模式下启动嵌入式Cassandra服务器。您可以在开发模式运行Lagom的Cassandra server部分中查看配置选项或如何禁用嵌入式服务器。
在生产中,为了提高系统扩展性,您通常更喜欢动态定位的Cassandra服务器。如果需要使用静态列表来定位Cassandra服务器,请查看关于在生产中运行Lagom时为Cassandra服务部署静态服务定位的部分。