我的零售应用程序有各种上下文,如接收、传输等。对这些上下文的请求由使用Spring Boot开发的RESTful微服务处理。持久层是Cassandra。这是所有服务共享的,因为我们无法在DB级别对微服务进行垂直扩容,因为服务在概念上是紧密耦合的。
我们希望通过为不同的上下文创建不同的区域来在GemFire端进行垂直扩容。
例如,Cassandra中的BOX表将通过CacheWriter
由Region Box-Recect(接收上下文)和Region Box-Transfer(传输上下文)更新。
我们的问题是如何保持这两个区域之间的数据同步?请建议任何其他方法也用于在GemFire端进行分离。
金火版本-
<dependency>
<groupId>com.gemstone.gemfire</groupId>
<artifactId>gemfire</artifactId>
<version>8.2.6</version>
</dependency>
由于您使用的是Spring Boot,一种替代方法是执行以下操作:
@EnableGemfire CacheTransaction
注释您的@SpringBootApplication
类…示例:
@SpringBootApplication
@EnableGemfireCacheTransactions
@EnableGemfireRepositories
class YourSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(YourSpringBootApplication.class, args);
}
...
}
@EnableGemfire CacheTransaction
注解启用Spring Data GemFire的Gemfire TransactionManager
,它将GemFire的CacheTransactionManager
与Spring Transaction Management基础架构集成,然后允许您执行此操作…
现在,只需使用核心Spring的@Transactional
注释注释您的@Service
应用程序组件事务服务方法,如下所示…
@服务类YourBoxReceiverTransferService{
@Transactional
public <return-type> update(ReceiveContext receiveContext,
TransferContext transferContext {
...
receiveContextRepository.save(receiveContext);
transferContextRepository.save(transferContext);
...
}
}
正如您在这里看到的,我还使用了Spring Data(GemFire的)存储库基础结构来管理持久性操作(例如CRUD),这将在Spring设置的事务范围上下文中适当使用。
Spring方法的2个优点是,与使用gemFire的公共API相比,它不必要地将您耦合到gemFire(一种明确的代码气味,尤其是在Spring上下文中)…
>
您不必将一堆样板代码、垃圾代码放入您的应用程序组件中,这些代码不属于那里!
使用Spring的事务管理基础结构,更改事务管理策略非常容易,例如,如果需要,可以从GemFire的仅本地缓存事务切换到全局的、基于JTA的事务(例如,哦,好吧,现在我需要在GemFire区域和Cassandra BOX表更新后通过JMS消息队列发送消息,以通知某些下游进程接收/传输上下文已更新)。使用Spring的事务管理基础结构,您不需要更改一行应用程序代码来更改事务管理策略(例如本地到全局,或全局到本地等)。
希望这有帮助!
-约翰
您可以使用事务。这样的东西应该可以工作:
txMgr = cache.getTransactionManager();
txMgr.begin();
boxReceive.put();
...
boxtransfer.put();
txMgr.commit();
如果您将box接收和box传输区域放在一起并使用相同的密钥,或者使用分区解析器来托管数据,这将有效。