Для постоянных данных в Терракоте, как развивать классы?
Мы рассматриваем Терракоту для нашего следующего проекта. Я заинтригован его возможностью обеспечить сохранность данных без необходимости использования отдельной СУБД. (См. Также Об использовании терракоты в качестве постоянного раствора)
Одной из основных проблем эволюции программного обеспечения является приведение существующих производственных данных в соответствие с новой моделью данных. Для СУБД вы, вероятно, будете использовать сценарий изменения SQL в момент развертывания. Для терракотовых данных мне не сразу понятно, как справляться с нетривиальной эволюцией.
В документации по Terracotta есть пара абзацев о ClassEvolution, но она кажется специфической для DSO и остается довольно поверхностной.
- Каковы возможные способы обработки эволюции модели данных для постоянных данных, хранящихся в терракоте? Меня особенно интересует сценарий, не относящийся к DSO (т. Е. Через Terracotta Toolkit API).
- Различаются ли Terracotta DSO и API Инструментария в их реакциях на определения эволюционирующих классов?
- Чтобы понять ограничения эволюции классов, было бы полезно узнать, как Terracotta представляет / передает данные объекта; есть ли спецификация для этого?
- Может быть, есть методы эволюции схемы из мира OODBMS, которые применимы к терракоте?
В качестве тривиального примера, скажем, у меня есть куча Car
объекты хранятся, и я изменил modelYear
поле Car
класс из String
для int
, Согласно документации это не работает "из коробки". Я могу представить решение, где мой старый Car
загружается отдельным загрузчиком классов во время запуска приложения, а затем преобразуется в новый Car
, Будет ли это хорошим подходом и почему (нет)?
1 ответ
Это зависит от вашего сценария использования.
Если стоимость загрузки вашего кеша минимальна (минуты), и вы можете позволить себе время простоя... тогда я не вижу проблемы просто перестроить ваш кеш для новой версии.
Если у вас высокая стоимость заполнения кеша (часы / дни) и вы не можете позволить себе сколько-нибудь значительных простоев, то вам придется обрабатывать новую и старую версию одновременно в течение переходного периода. За это:
- Я бы определил отдельное определение кэша для любой новой версии кэшируемого класса и позволил бы старой версии истечь в кэше.
- Код приложения также должен иметь поддержку "старой / новой версии".
- Имейте экземпляр, который все еще будет работать со старой версией, пока данные не устареют / устарели (на основе старого имени кэша)
- Имейте экземпляр, который обработал все новые запросы / потоки с новой версией (основанной на новом имени кэша)
например, в ehcache.xml вы бы определили 2 кэша (на основе вашего примера):
<cache name="com.xyz.Car" timeToLiveSeconds="600"/>
<!--New version goes here-->
<cache name="com.xyz.Car2" timeToLiveSeconds="600"/>
В конечном итоге вы должны выработать соглашение о присвоении имен для ваших кешей, которое включает в себя эволюцию версий.