lagom 是如何管理事件版本控制的?
How does lagom manage event versioning?
假设我们修改了一个事件以添加一个新字段。我知道我们可以在本文档中处理事件映射更改的序列化 https://www.lagomframework.com/documentation/1.5.x/scala/Serialization.html 但 lagom 如何知道事件是哪个版本?在声明和定义 case 类 事件时,我们不指定事件版本。那么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。
它在 class 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。哪里是简单的 class - 它是版本 1,您在其中指定了额外的 '#2',这意味着版本 2 等等。
如果您需要有关其工作原理的更多信息,可以查看 class PlayJsonSerializer 中的方法 fromBinary。
假设我们修改了一个事件以添加一个新字段。我知道我们可以在本文档中处理事件映射更改的序列化 https://www.lagomframework.com/documentation/1.5.x/scala/Serialization.html 但 lagom 如何知道事件是哪个版本?在声明和定义 case 类 事件时,我们不指定事件版本。那么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。 它在 class 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。哪里是简单的 class - 它是版本 1,您在其中指定了额外的 '#2',这意味着版本 2 等等。
如果您需要有关其工作原理的更多信息,可以查看 class PlayJsonSerializer 中的方法 fromBinary。