如何根据其他区域的更改更新 GemFire 区域

How to update a GemFire Region based on changes in some other Region

我的零售应用程序有各种上下文,如接收、传输等。对这些上下文的请求由使用 Spring Boot 开发的 RESTful 微服务处理。持久层是 Cassandra。这是所有服务共享的,因为我们无法在数据库级别对微服务进行垂直扩展,因为这些服务在概念上是紧密耦合的。

我们希望通过为不同的上下文创建不同的区域来在 GemFire 端进行垂直缩放。

比如Cassandra中的一个BOXtable会被Region Box-Receive(接收上下文)和Region Box-Transfer(传输上下文)通过CacheWriter更新。

我们的问题是如何保持这两个Region之间的数据同步? 请建议任何其他方法也用于在 GemFire 端进行分离。

gemfire 版本-

<dependency>
        <groupId>com.gemstone.gemfire</groupId>
        <artifactId>gemfire</artifactId>
        <version>8.2.6</version>
</dependency>

您可以使用 transactions。这样的事情应该有效:

txMgr = cache.getTransactionManager();
txMgr.begin();
boxReceive.put();
...
boxtransfer.put();
txMgr.commit();

如果您co-locate box-receive 和 box-transfer 区域并使用相同的密钥,或者使用 PartitionResolver 来定位数据,这将有效。

另一种方法,因为您使用的是 Spring Boot,将执行以下操作:

  1. 首先将 @SpringBootApplication class 注释为 @EnableGemfireCacheTransactions...

示例:

@SpringBootApplication
@EnableGemfireCacheTransactions
@EnableGemfireRepositories
class YourSpringBootApplication { 

    public static void main(String[] args) {
        SpringApplication.run(YourSpringBootApplication.class, args);
    }

    ...
}

@EnableGemfireCacheTransactions 注释启用 Spring Data GemFire 的 GemfireTransactionManager, which integrates GemFire's CacheTransactionManager with Spring Transaction Management infrastructure 然后允许您这样做...

  1. 现在,只需使用核心 Spring 的 @Transactional 注释来注释您的 @Service 应用程序组件事务服务方法, 像这样...

    @服务 class YourBoxReceiverTransferService {

    @Transactional
    public <return-type> update(ReceiveContext receiveContext, 
            TransferContext transferContext {
    
        ...
        receiveContextRepository.save(receiveContext);
        transferContextRepository.save(transferContext);
        ...
    }
    

    }

正如您在这里看到的,我还使用了 Spring Data (GemFire's) Repository 基础设施来管理持久性操作(例如 CRUD),[= 将在事务范围上下文设置中适当地使用它89=].

Spring 方法的

2 优势,优于使用 GemFire 的 public API,它不必要地将您与 GemFire 耦合(一个确定的代码气味,特别是在 Spring 环境中),是...

  1. 您不必在您的应用程序组件中放置一堆样板、垃圾代码,属于那里!

  2. 使用Spring的事务管理基础设施,改变您的事务管理策略,例如从 GemFire 的仅本地缓存事务切换到全局,JTA-based Transactions 如果每次都需要(例如,哦,好吧,现在我需要在 GemFire 区域和 Cassandra BOX Table 更新后通过 JMS 消息队列发送消息以通知某些下游进程 Receiver/Transfer 上下文已更新)。使用 Spring 的事务管理 基础架构,您不需要 需要更改单行应用程序代码来更改事务管理策略(例如本地到全球,或全球到本地等)。

希望对您有所帮助!

-约翰