
42
|
第
3
章
字段来代替它。
新的
schema
如下:
{"namespace": "customerManagement.avro",
"type": "record",
"name": "Customer",
"fields": [
{"name": "id", "type": "int"},
{"name": "name", "type": "string"},
{"name": "email", "type": ["null", "string"], "default": "null"}
]
}
更新到新版的
schema
后,旧记录仍然包含 faxNumber 字段,而新记录则包含 email 字段。
部分负责读取数据的应用程序进行了升级,那么它们是如何处理这些变化的呢?
在应用程序升级之前,它们会调用类似 getName()、getId() 和 getFaxNumber() 这样的方
法。如果碰到使用新
schema
构建的消息,getName() 和 getId() 方法仍然能够正常返回,
但 getFaxNumber() 方法会返回 null,因为消息里不包含传真号码。
在应用程序升级之后,getEmail() 方法取代了 getFaxNumber() 方法。如果碰到一个使用旧
schema
构建的消息,那么
getEmail() 方法会返回
null
,因为旧消息不包含邮件地址。
现在可以看出使用
Avro
的好处了:我们修改了消息的
schema
,但并没有更新所有负责读
取数据的应用程序,而这样仍然不会出现异常或阻断性错误,也不需要对现有数据进行大 ...