Нужна помощь по версионированию / переносу данных

Я работаю над проектом, в котором я буду использовать Membase (например, Memcached + persistence) в качестве нашего слоя постоянства с многоузловым кластером. Мы используем клиент Enyim для связи с кешем и используем двоичную сериализацию для сериализации / десериализации объектов в кеш и из него.

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

Используя Membase и имея дело с кэшированными двоичными объектами, мы МОЖЕМ захватить все кэшированные объекты и загрузить оба двоичных файла:

  1. версия кода, которая использовалась для сериализации кэшированных объектов
  2. новая версия кода, которая определяет различные свойства

и эффективно переносить данные подобным образом, но это вряд ли желательно, когда мы потенциально можем иметь десятки миллионов объектов в кеше. В идеале мы хотели бы иметь возможность переносить данные только тогда, когда это необходимо, и иметь некоторый итерационный процесс, который мы можем запустить перенести данные версии 1 в версию 2, а затем 3 и т. д., но я изо всех сил пытаюсь придумать способ сделать это с двоичными данными..

Просто выстрел в темноте, кто-нибудь имел опыт решения подобных проблем раньше? Мы более чем рады использовать другие формы сериализации и могли бы вместо этого просто хранить строковые (возможно сжатые) данные в кэше и сами обрабатывать сериализацию.

Спасибо,

1 ответ

Решение

Рассмотрим исправление парадигмы чтения, когда новая версия вашей библиотеки понимает, как распознавать объекты V1 или V2, использует соответствующий десериализатор на основе версии, в которой был сохранен объект, но затем повторно касается объектов V1 в формате V2 после касания их.

Таким образом, нет необходимости пакетно обновлять все ваши объекты, но вы в конечном итоге перенесете все объекты в формат V2. Вы можете запустить фоновый процесс, чтобы медленно захватывать объекты V1 и преобразовывать их в объекты V2, если это необходимо, чтобы избежать сложности, с которой в конечном итоге придется обращаться с V1 по Vn в алгоритме исправления при чтении.

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