我的零售应用程序具有各种上下文,例如接收、传输等。对这些上下文的请求由使用 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,因此另一种方法是执行以下操作:
- 首先使用
@EnableGemfireCacheTransactions
注释您的@SpringBootApplication
类...
示例:
@SpringBootApplication
@EnableGemfireCacheTransactions
@EnableGemfireRepositories
class YourSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(YourSpringBootApplication.class, args);
}
...
}
@EnableGemfireCacheTransactions
注释启用 Spring Data GemFire 的 GemfireTransactionManager
,它集成了 GemFire 的 CacheTransactionManager
与 Spring 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 上下文中) ...
您不必将一堆样板、垃圾代码放入应用程序组件中,这些组件不不属于那里!
使用 Spring 的事务管理基础设施,可以非常轻松地更改事务管理策略,例如从 GemFire 的仅限本地缓存事务切换为比如说,全局,基于 JTA 的事务,如果每次出现需要(例如,哦,好吧,现在我需要在 GemFire 区域和 Cassandra BOX 表更新后通过 JMS 消息队列发送消息通知某些下游进程接收/传输上下文已更新)。借助 Spring 的事务管理基础架构,您不需要更改一行应用程序代码即可更改事务管理策略(例如本地到全局,或全局到本地等) )。
希望这有帮助!
-约翰
关于microservices - 如何根据其他区域的更改更新 GemFire 区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47271002/