В настоящее время мы используем бережливость для разработки наших микросервисов. Когда я недавно столкнулся с этим вопросом ниже.Как обеспечить, чтобы объекты экономии были обратно совместимы?
Предположим, что приведенный ниже сократительный договор для Сводного объекта, и существует 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 договор Резюме.
В следующем выпуске мы добавляем еще один объект, называемый список суммарных значений.
Так что новый контракт будет выглядеть
Версия - 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);
- Так что, когда это ниже список заполняется, мы сохраняем список значений
summaryValues
aganist этогоsummaryId
. - И когда клиент отправляет этот список как
null
, мы удаляем существующие значения, сохраненные для этого «summaryId».
Теперь проблема возникает, когда другие услуги, которые используют СТАРШЕ версию контракта бережливость (Version 1.0) попытаться вызвать getSummary и updateSummary.
Целью Старого клиента путем вызова updateSummary было установить другое значение для summaryCost
. Однако, поскольку этот клиент не содержит объект summaryValues
, он отправляет объект Summary с summaryValues
как null на сервер.
В результате Сервер удаляет все существующие значения summaryValues
за это summaryId
.
Есть ли способ справиться с этим в бережливости? Методы isSet() здесь не работают, поскольку они пытаются выполнить простую нулевую проверку.
Каждый раз, когда мы выпускаем нового клиента с модификацией существующих объектов, нам приходится принудительно обновлять клиентские версии других серверов, даже если изменение не связано с ними.
Создание другого API сделает обслуживание кода очень громоздким, потому что нам нужно помнить, какая функция была добавлена как часть API. Все может легко выйти из-под контроля. Кроме того, наличие emptylist может оказаться невозможным, так как мы должны сообщать обо всех зависимых клиентах, чтобы добавить это поведение, даже если они не заинтересованы в этом поле. –
«нам нужно запомнить, какая функция была добавлена как часть API» -> Это похоже на то, что вам, вероятно, придется делать в контексте API с несколькими версиями :). Я обновил ответ с помощью другого варианта. – Shastick
@BandiKishore -> любая обратная связь по второму варианту? :) – Shastick