Как обновить Регион 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, заключается в следующем:

  1. Первая аннотация твоя @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, которая позволяет вам сделать это...

  1. Теперь просто аннотируйте ваш @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), заключается в...

  1. Вам не нужно помещать кучу шаблонов, дерьмовых кодов в компоненты вашего приложения, которых там нет!

  2. Используя инфраструктуру 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 для совместного размещения данных.

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