【发布时间】:2016-12-29 12:26:21
【问题描述】:
我们目前正在使用 thrift 来开发我们的微服务。 当我最近遇到以下问题时。
假设下面是摘要对象的节俭合约,并且有一个 API 使用传递的摘要对象获取和更新摘要。
版本 - 1.0
struct Summary {
1: required string summaryId,
2: required i32 summaryCost
}
Summary getSummary(1: string summaryId);
void updateSummary(1: Summary summary);
现在假设有 5 个服务正在使用这个 1.0 总结合同。
在下一个版本中,我们添加了另一个对象,称为 summaryvalues 列表。
所以新合同看起来像
版本 - 2.0
struct Summary {
1: required string summaryId,
2: required i32 summaryCost,
3: optional list<i32> summaryValues
}
Summary getSummary(1: string summaryId);
void updateSummary(1: Summary summary);
- 因此,当填充下面的列表时,我们会保存
summaryValuesaganist 的值列表summaryId。 - 当客户端将此列表发送为
null时,我们会删除为该“summaryId”保存的现有值。
现在,当使用 OLDER 版本的 thrift 合约(Version 1.0)的其他服务尝试调用 getSummary 和 updateSummary 时,会出现问题 .
旧客户端调用 updateSummary 的目的是为 summaryCost 设置另一个值。但是,由于此客户端不包含对象 summaryValues,它会将带有 summaryValues 为 null 的 Summary 对象发送到服务器。
这会导致服务器删除该 summaryValues 的所有现有值 summaryId。
有没有办法在节俭中处理这个问题? isSet() 方法在这里不起作用,因为它们尝试执行简单的空值检查。
每次我们发布对现有对象进行修改的新客户端时,我们都必须强制升级其他服务器的客户端版本,即使更改与它们无关。
【问题讨论】:
-
FWIW 这里的核心问题:“如果存储对象
{a: 42, b: 99, c: 7}的服务从不知道c字段的客户端接收到将其更新为{a: 0, b: 0}的调用,那么应该分配c的值吗?”不是 Thrift 特有的。
标签: java thrift microservices