Для постоянных данных в Терракоте, как развивать классы?

Мы рассматриваем Терракоту для нашего следующего проекта. Я заинтригован его возможностью обеспечить сохранность данных без необходимости использования отдельной СУБД. (См. Также Об использовании терракоты в качестве постоянного раствора)

Одной из основных проблем эволюции программного обеспечения является приведение существующих производственных данных в соответствие с новой моделью данных. Для СУБД вы, вероятно, будете использовать сценарий изменения SQL в момент развертывания. Для терракотовых данных мне не сразу понятно, как справляться с нетривиальной эволюцией.

В документации по Terracotta есть пара абзацев о ClassEvolution, но она кажется специфической для DSO и остается довольно поверхностной.

  1. Каковы возможные способы обработки эволюции модели данных для постоянных данных, хранящихся в терракоте? Меня особенно интересует сценарий, не относящийся к DSO (т. Е. Через Terracotta Toolkit API).
  2. Различаются ли Terracotta DSO и API Инструментария в их реакциях на определения эволюционирующих классов?
  3. Чтобы понять ограничения эволюции классов, было бы полезно узнать, как Terracotta представляет / передает данные объекта; есть ли спецификация для этого?
  4. Может быть, есть методы эволюции схемы из мира OODBMS, которые применимы к терракоте?

В качестве тривиального примера, скажем, у меня есть куча Car объекты хранятся, и я изменил modelYear поле Car класс из String для int, Согласно документации это не работает "из коробки". Я могу представить решение, где мой старый Car загружается отдельным загрузчиком классов во время запуска приложения, а затем преобразуется в новый Car, Будет ли это хорошим подходом и почему (нет)?

1 ответ

Решение

Это зависит от вашего сценария использования.

Если стоимость загрузки вашего кеша минимальна (минуты), и вы можете позволить себе время простоя... тогда я не вижу проблемы просто перестроить ваш кеш для новой версии.

Если у вас высокая стоимость заполнения кеша (часы / дни) и вы не можете позволить себе сколько-нибудь значительных простоев, то вам придется обрабатывать новую и старую версию одновременно в течение переходного периода. За это:

  1. Я бы определил отдельное определение кэша для любой новой версии кэшируемого класса и позволил бы старой версии истечь в кэше.
  2. Код приложения также должен иметь поддержку "старой / новой версии".
  3. Имейте экземпляр, который все еще будет работать со старой версией, пока данные не устареют / устарели (на основе старого имени кэша)
  4. Имейте экземпляр, который обработал все новые запросы / потоки с новой версией (основанной на новом имени кэша)

например, в ehcache.xml вы бы определили 2 кэша (на основе вашего примера):

<cache name="com.xyz.Car" timeToLiveSeconds="600"/>
<!--New version goes here-->
<cache name="com.xyz.Car2" timeToLiveSeconds="600"/>

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

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