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

标签 microservices gemfire spring-data-gemfire

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

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

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

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

gem 火版-

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

最佳答案

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

  1. 首先使用 @EnableGemfireCacheTransactions 注释您的 @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然后您就可以执行此操作...

  • 现在,只需使用 Spring 的核心 @Transactional 注释来注释您的 @Service 应用程序组件事务服务方法,如下所示。 .

    @服务 类 YourBoxReceiverTransferService {

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

    }

  • 正如你在这里看到的,我还使用了 Spring Data (GemFire's) Repository管理持久性操作(例如 CRUD)的基础设施,将在 Spring 的事务范围上下文设置中适当使用。

    与使用 GemFire 的公共(public) API 相比,Spring 方法的 2 个优势是,后者不必要地将您与 GemFire 耦合在一起(明显的代码味道,特别是在 Spring 上下文中) ...

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

    2. 使用 Spring 的事务管理基础设施,可以非常轻松地更改事务管理策略,例如从 GemFire 的仅限本地缓存事务切换为比如说,全局,基于 JTA 的事务,如果每次出现需要(例如,哦,好吧,现在我需要在 GemFire 区域和 Cassandra BOX 表更新后通过 JMS 消息队列发送消息通知某些下游进程接收/传输上下文已更新)。借助 Spring 的事务管理基础架构,您不需要更改一行应用程序代码即可更改事务管理策略(例如本地到全局,或全局到本地等) )。

    希望这有帮助!

    -约翰

    关于microservices - 如何根据其他区域的更改更新 GemFire 区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47271002/

    相关文章:

    SpringXD - Gemfire 作为接收器时出错

    java - 将数据从数据库导入到 GemFire

    java - 如何在 Gemfire 区域创建复合主键场景?

    mongodb - 如何在微服务架构中将默认数据播种到Mongo数据库(或任何数据库)?

    java - 如何保持两个 Web 应用程序的数据库同步?

    spring-boot - 无法在 spring-boot 应用程序中从 Consul 读取配置

    caching - 无法使用 apache geode wan 复制复制大值

    java - 如何定义本地关键 GemFire 区域的持久性?

    java - Gemfire 本地缓存过期

    ruby - 如何从 gRPC 服务返回错误?