Нужна помощь по версионированию / переносу данных
Я работаю над проектом, в котором я буду использовать Membase (например, Memcached + persistence) в качестве нашего слоя постоянства с многоузловым кластером. Мы используем клиент Enyim для связи с кешем и используем двоичную сериализацию для сериализации / десериализации объектов в кеш и из него.
Одна из проблем, с которыми мы сталкиваемся, заключается в том, как нам эффективно управлять изменениями в нашей модели данных, если мы работаем с обычной базой данных SQL, мы можем запустить скрипт обновления для обновления ваших таблиц.
Используя Membase и имея дело с кэшированными двоичными объектами, мы МОЖЕМ захватить все кэшированные объекты и загрузить оба двоичных файла:
- версия кода, которая использовалась для сериализации кэшированных объектов
- новая версия кода, которая определяет различные свойства
и эффективно переносить данные подобным образом, но это вряд ли желательно, когда мы потенциально можем иметь десятки миллионов объектов в кеше. В идеале мы хотели бы иметь возможность переносить данные только тогда, когда это необходимо, и иметь некоторый итерационный процесс, который мы можем запустить перенести данные версии 1 в версию 2, а затем 3 и т. д., но я изо всех сил пытаюсь придумать способ сделать это с двоичными данными..
Просто выстрел в темноте, кто-нибудь имел опыт решения подобных проблем раньше? Мы более чем рады использовать другие формы сериализации и могли бы вместо этого просто хранить строковые (возможно сжатые) данные в кэше и сами обрабатывать сериализацию.
Спасибо,
1 ответ
Рассмотрим исправление парадигмы чтения, когда новая версия вашей библиотеки понимает, как распознавать объекты V1 или V2, использует соответствующий десериализатор на основе версии, в которой был сохранен объект, но затем повторно касается объектов V1 в формате V2 после касания их.
Таким образом, нет необходимости пакетно обновлять все ваши объекты, но вы в конечном итоге перенесете все объекты в формат V2. Вы можете запустить фоновый процесс, чтобы медленно захватывать объекты V1 и преобразовывать их в объекты V2, если это необходимо, чтобы избежать сложности, с которой в конечном итоге придется обращаться с V1 по Vn в алгоритме исправления при чтении.