【问题标题】:How does lagom manage event versioning?lagom 如何管理事件版本控制?
【发布时间】:2019-09-09 01:36:15
【问题描述】:

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

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

【问题讨论】:

    标签: scala lagom


    【解决方案1】:

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

      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

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 1970-01-01
      • 2012-11-10
      • 2015-12-15
      • 2018-02-05
      • 2016-12-13
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多