?

Log in

animated-1

109 in ru_sysarchitect

versioning

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

есть, значица, распределённая система, части которой обмениваются данными через pub-sub механизм. producer берёт rich C# object/data contract, бинарно сериализует, сжимает, шифрует, кладёт в queue. consumer, соответственно, читает, дешифрует, разжимает, десериализует и получает опять rich C# object, с которым удобно манипулировать.

теперь, предположим, мы выкатываем апдейт, в котором добавляем в наш data contract ещё одного data мембера. проапдейтить одновременно всех продюсеров и консьюмеров невозможно, их слишком много, у каждого своё maintenance window, и вообще.

поэтому надо как-то сделать, стандартным образом, чтобы не только новый consumer не ломался, когда читает старую версию объекта, но и старый consumer не ломался, когда читает новую.

сериализация - стандартная дотнетовская, с помощью BinaryFormatter, если что.

Update: всем спасибо, взял protobuf.

Comments

BinaryFormatter вроде так не умеет делать. Можешь другую сериализацию попробовать. Что-нибудь такое, например: http://code.google.com/p/protobuf-net/
Проставляйте в каждом сообщении версию протокола.
Или поменяйте сериализатор на какой-нибудь с тегами. Если тег неизвестен потребителю, то он его отбрасывает.
Если DataContract в чистом виде, то WCF эту проблему решил. Если Вы сериализуете сами объекты, это не есть хорошо, подумайте над возможностью передавать только дату, а каждый клиент сериализует в свой объект. Подход не мой :)