我们的系统由多个微服务组成,这些微服务发出和使用以avro格式编码的事件(请参阅底部的架构)。以下是一个特定的用例:服务A发出有关主题T1的事件(类型为InvoiceEvents),服务B和C(不同的开发团队)正在使用T1。例如。服务B是税务小组的一部分,而服务C是产品执行小组的一部分。
我期望以下是正确的(但似乎并非如此):
但是服务C无法反序列化InvoiceCreated类型的新事件。具体来说,它会抛出:
org.apache.avro.AvroTypeException: Found com.elsevier.q2c.schema.avro.invoice.InvoiceCreated, expecting unionorg.apache.avro.AvroTypeException: Found com.elsevier.q2c.schema.avro.invoice.InvoiceCreated, expecting union at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:292) at
Avro联合类型是否不向前兼容(如上所述)?它们是否仅是Confluent Schema Registry tests所暗示的向后兼容。建议的避免微服务耦合的方法是什么?我猜不能使用avro联合。.
谢谢!
没有明确答案的相关链接:Avro-union-compatibility-mode-enhancement-proposal
模式v1:
[
...
{
"type":"record",
"name":"InvoiceEvents",
"namespace":"bla.bla.schema.avro.invoice",
"fields":[
{
"name":"payload",
"type":[
"null",
"bla.bla.schema.avro.invoice.InvoiceDrafted"
],
"default":null
}
]
}
]
模式v2(添加了新的联合体类型:InvoiceCreated):
[
...
{
"type":"record",
"name":"InvoiceEvents",
"namespace":"bla.bla.schema.avro.invoice",
"fields":[
{
"name":"payload",
"type":[
"null",
"bla.bla.schema.avro.invoice.InvoiceDrafted",
"bla.bla.schema.avro.invoice.InvoiceCreated",
],
"default":null
}
]
}
]
答案 0 :(得分:0)
经过一番思考,我们可能会选择选项3,因为不跳过/丢失事件对项目而言比解耦更为重要:
如果有更好的选择,请评论,我错过了!