如何根据其他某些地区的变化更新GemFire地区

时间:2017-11-13 18:21:05

标签: microservices gemfire spring-data-gemfire

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

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

例如,Cassandra中的BOX表将由Region Box-Receive(接收上下文)和Region Box-Transfer(传输上下文)通过CacheWriter更新。

我们的问题是如何在这两个区域之间保持数据同步? 请在GemFire结束时建议任何其他方法进行分离。

宝石版 -

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

2 个答案:

答案 0 :(得分:2)

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

  1. 首先使用@EnableGemfireCacheTransactions ...
  2. @SpringBootApplication课程注释

    示例:

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

    @EnableGemfireCacheTransactions注释启用 Spring Data GemFire的 GemfireTransactionManager,它将GemFire的CacheTransactionManagerSpring Transaction Management infrastructure集成,然后允许您执行此操作。

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

      @服务 class YourBoxReceiverTransferService {

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

      }

    2. 正如您在此处所看到的,我还使用Spring Data (GemFire's) Repository基础结构来管理持久性操作(例如CRUD),这些操作将在 Spring 的事务范围上下文设置中正确使用。

      Spring 方法的2个优点,而不是使用GemFire的公共API,它不必要地将您与GemFire(一个明确的代码气味,特别是在 Spring 上下文中)结合在一起,是...

      1. 您不必将大量的样板代码,废话代码放入您的应用程序组件中,属于那里!

      2. 使用 Spring的事务管理基础架构,可以非常轻松地更改事务管理策略,例如从GemFire的本地缓存事务切换到比如说Global,基于JTA的交易如果每次都需要的话(比如哦,好吧,现在我需要在更新GemFire Region和Cassandra BOX表之后通过JMS消息队列发送消息通知某个下游进程已更新Receiver / Transfer上下文。使用 Spring的事务管理基础结构,需要更改单行应用程序代码以更改事务管理策略(例如本地到全局,或全局到本地等) )。

      3. 希望这有帮助!

        -John

答案 1 :(得分:0)

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

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

这将为您提供co-locate盒子接收和盒子传输区域并使用相同的密钥,或使用PartitionResolver来共置数据。