Самое важное — по минимуму трогать текущий и работающий функционал, при этом изолировав его. Звучит очевидно, но на деле мало кто применяет. Фактически, нам нужно в рамках существующего Keeper сервиса, основываясь и реализуя его интерфейсы, создать новый persistent-слой — слой хранения данных в Cassandra, изменяя существующий контракт по минимуму. Данный подход потребует от вас дополнительных абстракций и для каждого конкретного продукта/проекта/микросервиса может быть принципиально иным; в нашем (и подавляющем большинстве) случае — должна быть легкая и тонкая “прослойка”, между функционалом и вызывающей его частью. Говоря проще (или абстрактней) — любой функционал так или иначе сводится к общему интерфейсу для его вызова и работы с ним. Иначе такие сервисы называют черными ящиками — мы знаем, какую информацию он принимает и отдает, каких контрактов обработки придерживается, однако, конкретика механизмов и алгоритмов анализа и преобразования полученных данных для нас невидима, а самое главное — не важна в принципе. За счет такой прослойки, четких контрактов и качественных интерфейсов, мы можем менять их реализации настолько гибко, насколько мы ограничены рамками методов наших интерфейсов.