代码之家  ›  专栏  ›  技术社区  ›  Arun Kishor

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

  •  2
  • Arun Kishor  · 技术社区  · 7 年前

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

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

    例如,Cassandra中的框表将通过以下方式由区域框接收(接收上下文)和区域框传输(传输上下文)更新: CacheWriter .

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

    gemfire版本-

    <dependency>
            <groupId>com.gemstone.gemfire</groupId>
            <artifactId>gemfire</artifactId>
            <version>8.2.6</version>
    </dependency>
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   John Blum    7 年前

    一种替代方法,因为您正在使用 弹簧防尘套 将执行以下操作:

    1. 第一次注释您的 @SpringBootApplication 与一起上课 @EnableGemfireCacheTransactions ...

    例子:

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

    这个 @启用FirecacheTransactions 注释启用 Spring Data GemFire的 GemfireTransactionManager ,它集成了GemFire的 CacheTransactionManager 具有 Spring Transaction Management infrastructure 这样你就可以做到这一点。。。

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

      @服务 分类YourBoxReceiverTransferService{

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

      }

    Spring Data (GemFire's) Repository 用于管理持久性操作(例如CRUD)的基础结构,该操作将在事务范围上下文设置中适当使用 春天 .

    2使用 春天 方法,过度使用GemFire的公共API,这不必要地将您与GemFire(一种明确的代码气味,尤其是在 春天 上下文),是。。。

    1. 属于那里!

    2. 使用 基础架构,非常容易更改您的 事务管理策略 ,例如从GemFire的仅本地缓存事务切换到全局缓存事务, 如果每次都需要(例如,哦,好吧,现在我需要在更新GemFire区域和Cassandra BOX表后通过JMS消息队列发送消息,以通知一些下游进程接收器/传输上下文已经更新)。具有 Spring的事务管理 基础设施,你 不要 需要更改单行应用程序代码来更改事务管理策略(例如本地到全局,或全局到本地等)。

    希望这有帮助!

        2
  •  0
  •   Swapnil    7 年前

    您可以使用 transactions

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

    只要你愿意,这会有用的 co-locate 长方体接收和长方体传输区域并使用相同的键,或使用分区解析器对数据进行同位。