繁体   English   中英

lagom 如何管理事件版本控制?

[英]How does lagom manage event versioning?

假设我们修改了一个事件以添加一个新字段。 我知道我们可以处理本文档https://www.lagomframework.com/documentation/1.5.x/scala/Serialization.html 中事件映射更改的序列化,但是 lagom 如何知道事件是哪个版本? 在声明和定义案例类事件时,我们不指定事件版本。 那么 lagom 序列化是如何知道使用哪个事件版本映射的呢?

在下图中,有一个名为 fromVersion 的字段。 lagom 如何知道从事件存储数据存储中提取的事件的当前版本?

在此处输入图片说明

因此,要实现迁移,您需要添加以下代码:

  private val itemAddedMigration = new JsonMigration(2) {
    override def transform(fromVersion: Int, json: JsObject): JsObject = {
      if (fromVersion < 2) {
        json + ("discount" -> JsNumber(0.0d))
      } else {
        json
      }
    }
  }

  override def migrations = Map[String, JsonMigration](
    classOf[ItemAdded].getName -> itemAddedMigration
  )
}

这意味着现在所有ItemAdded类型的新事件都将具有版本 2。所有以前的事件将被视为版本 1。它在类PlayJsonSerializer 中定义请参见以下代码:

  private def parseManifest(manifest: String) = {
    val i = manifest.lastIndexOf('#')
    val fromVersion = if (i == -1) 1 else manifest.substring(i + 1).toInt
    val manifestClassName = if (i == -1) manifest else manifest.substring(0, i)
    (fromVersion, manifestClassName)
  }

此外,您可以在数据库中检查它。 我使用 Cassandra,如果我打开我的数据库,在 eventsbytag1 集合中,我可以找到描述版本的字段 ser_manifest。 简单类在哪里 - 它是版本 1,您在其中指定了额外的'#2' ,这意味着版本 2 等等。

如果您需要有关其工作原理的更多信息,可以检查PlayJsonSerializer类中的fromBinary方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM