我们目前正在使用节俭来开发我们的微服务.
当我最近遇到这个问题时.
下面假设是摘要对象的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的Summary摘要.
在下一个版本中,我们添加另一个名为summaryvalues列表的Object.
所以新合同看起来像
版本 – 2.0
struct Summary {
1: required string summaryId,
2: required i32 summaryCost,
3: optional list summaryValues
}
Summary getSummary(1: string summaryId);
void updateSummary(1: Summary summary);
>因此,当填充下面的列表时,我们保存值列表summaryValues aganist summaryId.
>当客户端将此列表发送为null时,我们删除为该’summaryId`保存的现有值.
现在,当使用旧版本的thrift契约(版本1.0)的其他服务尝试调用getSummary和updateSummary时,会出现问题.
通过调用updateSummary来调用旧客户端的目的是为summaryCost设置另一个值.但是,由于此客户端不包含对象summaryValues,因此它将Summary对象的summaryValues作为null发送到Server.
这导致服务器删除该summaryId的summaryValues的所有现有值.
有没有办法在节俭中处理这个问题? isSet()方法在这里不起作用,因为它们尝试执行简单的空检查.
每次我们通过修改现有对象来发布更新的客户端时,即使更改与它们无关,我们也必须强制升级其他服务器的客户端版本.