Как обновить Регион GemFire на основе изменений в некоторых других Регионах
Мое розничное приложение имеет различные контексты, такие как получение, передача и т. Д. Запросы к этим контекстам обрабатываются микросервисами RESTful, разработанными с использованием Spring Boot. Постоянный слой - Кассандра. Это общее для всех сервисов, поскольку мы не могли выполнить вертикальное масштабирование для микросервисов на уровне БД, поскольку сервисы концептуально тесно связаны.
Мы хотим вертикальное масштабирование в конце GemFire путем создания разных регионов для разных контекстов.
Например, таблица BOX в Cassandra будет обновляться с помощью Region Box-Receive(контекст приема) и Region Box-Transfer(контекст передачи) через CacheWriter
,
Наша проблема в том, как поддерживать синхронизацию данных между этими двумя регионами? Пожалуйста, предложите любой другой подход также для разделения в конце GemFire.
версия Gemfire-
<dependency>
<groupId>com.gemstone.gemfire</groupId>
<artifactId>gemfire</artifactId>
<version>8.2.6</version>
</dependency>
2 ответа
Один из альтернативных подходов, поскольку вы используете Spring Boot, заключается в следующем:
- Первая аннотация твоя
@SpringBootApplication
класс с@EnableGemfireCacheTransactions
...
Пример:
@SpringBootApplication
@EnableGemfireCacheTransactions
@EnableGemfireRepositories
class YourSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(YourSpringBootApplication.class, args);
}
...
}
@EnableGemfireCacheTransactions
аннотация позволяет Spring Data GemFire's GemfireTransactionManager
, который объединяет GemFire's CacheTransactionManager
с инфраструктурой Spring Transaction Management, которая позволяет вам сделать это...
Теперь просто аннотируйте ваш
@Service
методы транзакционной службы компонента приложения с ядром Spring@Transactional
аннотации, вот так...@Service class YourBoxReceiverTransferService {
@Transactional public <return-type> update(ReceiveContext receiveContext, TransferContext transferContext { ... receiveContextRepository.save(receiveContext); transferContextRepository.save(transferContext); ... }
}
Как вы можете видеть здесь, я также использовал инфраструктуру репозитория Spring Data (GemFire's) для управления операциями сохранения (например, CRUD), которые будут соответствующим образом использоваться в настройке контекста транзакционной области в Spring.
2 преимущества подхода Spring по сравнению с использованием открытого API GemFire, который без необходимости связывает вас с GemFire (определенный запах кода, особенно в контексте Spring), заключается в...
Вам не нужно помещать кучу шаблонов, дерьмовых кодов в компоненты вашего приложения, которых там нет!
Используя инфраструктуру Spring Transaction Management, чрезвычайно легко изменить свою стратегию управления транзакциями, например, переключившись с локальных кеш-транзакций GemFire, скажем, на глобальные транзакции на основе JTA, если возникнет такая необходимость (например, ну Теперь мне нужно отправить сообщение через очередь сообщений JMS после обновления таблицы GemFire Region и Cassandra BOX, чтобы уведомить некоторый последующий процесс об обновлении контекста Receiver/Transfer). С инфраструктурой Spring Transaction Management вам не нужно менять одну строку кода приложения, чтобы изменить стратегии управления транзакциями (например, локальную на глобальную или глобальную на локальную и т. Д.).
Надеюсь это поможет!
-John
Вы можете использовать транзакции. Примерно так должно работать:
txMgr = cache.getTransactionManager();
txMgr.begin();
boxReceive.put();
...
boxtransfer.put();
txMgr.commit();
Это сработает при условии, что вы будете совместно размещать ящик-получатель и регион переноса ящика и использовать один и тот же ключ или использовать PartitionResolver для совместного размещения данных.