Вызывает ли удаление поля из сообщения protobuf проблемы только в случае связи клиент-сервер?

В документах protobuf указано, что:

Удаление полей может вызвать серьезные проблемы, если не будет выполнено должным образом.

Если вам больше не нужно поле и все ссылки удалены из клиентского кода, вы можете удалить определение поля из сообщения. Однако вы должны зарезервировать номер удаленного поля. Если вы не зарезервируете номер поля, разработчик может повторно использовать этот номер в будущем.

Чего я не понимаю, так это того, что я использую кодировку protobuf для связи между моим клиентом и сервером. Таким образом, клиент кодирует данные с помощью protobuf, отправляет запрос по сети, а сервер декодирует тело запроса с помощью protobuf и выполняет некоторую бизнес-логику. И клиент — единственный, кто будет взаимодействовать с этим сервером, поэтому не будет потребителя этого сервера, который, возможно, устарел. Всякий раз, когда сообщения сервера обновляются, клиент, естественно, всегда будет актуальным.

Учитывая все вышесказанное, почему удаление поля или изменение порядка номеров полей сообщений и создание новых прото-сообщений как для клиента, так и для сервера могут вызвать какие-либо проблемы?

Не будет, если вы сделали это внимательно (и пока оно не отмечено required), т. е. сначала убедились, что сервер не использует значение, затем прекратили отправку значения, а затем удалили определение в целом;

Marc Gravell 26.04.2024 12:50

Поэтому я предполагаю, что это более важно и актуально, если прото-сообщение хранится на каком-то диске и его необходимо успешно получить, даже если сообщение изменилось. Или сервер имеет своего рода публичный выход в Интернет, и по этой причине API должен быть обратно совместим. Будет ли это правильным предположением @MarcGravell? Независимо от того, так это или нет, вызывают ли зарезервированные поля какие-либо издержки производительности при кодировании/декодировании?

Ahmet Yazıcı 26.04.2024 12:53

«да» первому, «нет» второму (зарезервированные поля не имеют накладных расходов — они просто делают невозможным случайное добавление нового поля со старым номером, на этапе protoc)

Marc Gravell 26.04.2024 13:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

[...] клиент - единственный, кто будет общаться с этим сервер, поэтому не будет потребителя этого сервера, что, возможно, устаревший. Всякий раз, когда сообщения сервера обновляются, клиент, естественно, быть всегда в курсе событий.

Если вы это предполагаете, вы можете делать все, что захотите, в любой кодировке.

К сожалению, в большинстве случаев это неправильно. Вам просто нужно откатить неисправный клиент или сервер, или у вас небольшая разница во времени обновления клиента и сервера (поскольку сервер все еще завершает работу, а клиент уже новый), и вы находитесь в ситуации, когда версии клиентов и сервера не совпадают.

Одна из прекрасных особенностей протокольных буферов заключается в том, что у вас есть бесплатная обратная и прямая совместимость, если вы просто следуете нескольким простым правилам.

Другие вопросы по теме