我的零售应用程序有各种上下文,如接收,传输等。对这些上下文的请求由使用 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>
答案 0 :(得分:2)
一种替代方法,因为您使用 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的 @Service
注释注释您的@Transactional
应用程序组件事务服务方法,就像这样......
@服务 class YourBoxReceiverTransferService {
@Transactional
public <return-type> update(ReceiveContext receiveContext,
TransferContext transferContext {
...
receiveContextRepository.save(receiveContext);
transferContextRepository.save(transferContext);
...
}
}
正如您在此处所看到的,我还使用Spring Data (GemFire's) Repository基础结构来管理持久性操作(例如CRUD),这些操作将在 Spring 的事务范围上下文设置中正确使用。
Spring 方法的2个优点,而不是使用GemFire的公共API,它不必要地将您与GemFire(一个明确的代码气味,特别是在 Spring 上下文中)结合在一起,是...您不必将大量的样板代码,废话代码放入您的应用程序组件中,不属于那里!
使用 Spring的事务管理基础架构,可以非常轻松地更改事务管理策略,例如从GemFire的本地缓存事务切换到比如说Global,基于JTA的交易如果每次都需要的话(比如哦,好吧,现在我需要在更新GemFire Region和Cassandra BOX表之后通过JMS消息队列发送消息通知某个下游进程已更新Receiver / Transfer上下文。使用 Spring的事务管理基础结构,不需要更改单行应用程序代码以更改事务管理策略(例如本地到全局,或全局到本地等) )。
希望这有帮助!
-John
答案 1 :(得分:0)
您可以使用transactions。这样的事情应该有效:
txMgr = cache.getTransactionManager();
txMgr.begin();
boxReceive.put();
...
boxtransfer.put();
txMgr.commit();
这将为您提供co-locate盒子接收和盒子传输区域并使用相同的密钥,或使用PartitionResolver来共置数据。