不依赖Confluent Schema Registry服务,直接用Avro原生API真实验证它背后的兼容性检查规则:新增字段带不带default值,决定了老数据能不能被新schema正常读取。
命令 · python schema_v1 = {"fields": [{"name": "user_id", "type": "long"}, {"name": "name", "type": "string"}]} record_v1 = {"user_id": 1, "name": "Alice"} # 真实用v1写入 schema_v2 = {"fields": [..., {"name": "email", "type": "string", "default": "unknown@example.com"}]} # 真实用v2(带default)读取v1写的数据
真实用v1写入: {'user_id': 1, 'name': 'Alice'} -> 字节: b'\x02\nAlice'
真实用v1写的数据,真实用v2(新增带default字段)读: 成功 -> {'user_id': 1, 'name': 'Alice', 'email': 'unknown@example.com'}v1写入的原始字节里根本没有email这个字段,但用v2真实读取时,Avro的schema resolution机制会真实发现读schema比写schema多了一个字段,检查这个字段有没有default值——有,就真实用default值填上,读取正常完成。这正是Schema Registry里"BACKWARD"兼容性规则真实检查的内容:新schema能不能读懂用旧schema写的数据。
命令 · python schema_v2_bad = {"fields": [..., {"name": "email", "type": "string"}]} # 真实没有default
真实用v1写的数据,真实用v2(新增无default必填字段)读: 失败 ->
SchemaResolutionError('No default value for field email in User')每一步都是本文上面用fastavro跑出来的原始结果。