如何根据其他区域的更改更新 GemFire 区域
How to update a GemFire Region based on changes in some other Region
我的零售应用程序有各种上下文,如接收、传输等。对这些上下文的请求由使用 Spring Boot 开发的 RESTful 微服务处理。持久层是 Cassandra。这是所有服务共享的,因为我们无法在数据库级别对微服务进行垂直扩展,因为这些服务在概念上是紧密耦合的。
我们希望通过为不同的上下文创建不同的区域来在 GemFire 端进行垂直缩放。
比如Cassandra中的一个BOXtable会被Region Box-Receive(接收上下文)和Region Box-Transfer(传输上下文)通过CacheWriter
更新。
我们的问题是如何保持这两个Region之间的数据同步?
请建议任何其他方法也用于在 GemFire 端进行分离。
gemfire 版本-
<dependency>
<groupId>com.gemstone.gemfire</groupId>
<artifactId>gemfire</artifactId>
<version>8.2.6</version>
</dependency>
您可以使用 transactions。这样的事情应该有效:
txMgr = cache.getTransactionManager();
txMgr.begin();
boxReceive.put();
...
boxtransfer.put();
txMgr.commit();
如果您co-locate box-receive 和 box-transfer 区域并使用相同的密钥,或者使用 PartitionResolver 来定位数据,这将有效。
另一种方法,因为您使用的是 Spring Boot,将执行以下操作:
- 首先将
@SpringBootApplication
class 注释为 @EnableGemfireCacheTransactions
...
示例:
@SpringBootApplication
@EnableGemfireCacheTransactions
@EnableGemfireRepositories
class YourSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(YourSpringBootApplication.class, args);
}
...
}
@EnableGemfireCacheTransactions
注释启用 Spring Data GemFire 的 GemfireTransactionManager
, which integrates GemFire's CacheTransactionManager
with Spring Transaction Management infrastructure 然后允许您这样做...
现在,只需使用核心 Spring 的 @Transactional
注释来注释您的 @Service
应用程序组件事务服务方法, 像这样...
@服务
class YourBoxReceiverTransferService {
@Transactional
public <return-type> update(ReceiveContext receiveContext,
TransferContext transferContext {
...
receiveContextRepository.save(receiveContext);
transferContextRepository.save(transferContext);
...
}
}
正如您在这里看到的,我还使用了 Spring Data (GemFire's) Repository 基础设施来管理持久性操作(例如 CRUD),[= 将在事务范围上下文设置中适当地使用它89=].
Spring 方法的
2 优势,优于使用 GemFire 的 public API,它不必要地将您与 GemFire 耦合(一个确定的代码气味,特别是在 Spring 环境中),是...
您不必在您的应用程序组件中放置一堆样板、垃圾代码,不属于那里!
使用Spring的事务管理基础设施,改变您的事务管理策略,例如从 GemFire 的仅本地缓存事务切换到全局,JTA-based Transactions 如果每次都需要(例如,哦,好吧,现在我需要在 GemFire 区域和 Cassandra BOX Table 更新后通过 JMS 消息队列发送消息以通知某些下游进程 Receiver/Transfer 上下文已更新)。使用 Spring 的事务管理 基础架构,您不需要 需要更改单行应用程序代码来更改事务管理策略(例如本地到全球,或全球到本地等)。
希望对您有所帮助!
-约翰
我的零售应用程序有各种上下文,如接收、传输等。对这些上下文的请求由使用 Spring Boot 开发的 RESTful 微服务处理。持久层是 Cassandra。这是所有服务共享的,因为我们无法在数据库级别对微服务进行垂直扩展,因为这些服务在概念上是紧密耦合的。
我们希望通过为不同的上下文创建不同的区域来在 GemFire 端进行垂直缩放。
比如Cassandra中的一个BOXtable会被Region Box-Receive(接收上下文)和Region Box-Transfer(传输上下文)通过CacheWriter
更新。
我们的问题是如何保持这两个Region之间的数据同步? 请建议任何其他方法也用于在 GemFire 端进行分离。
gemfire 版本-
<dependency>
<groupId>com.gemstone.gemfire</groupId>
<artifactId>gemfire</artifactId>
<version>8.2.6</version>
</dependency>
您可以使用 transactions。这样的事情应该有效:
txMgr = cache.getTransactionManager();
txMgr.begin();
boxReceive.put();
...
boxtransfer.put();
txMgr.commit();
如果您co-locate box-receive 和 box-transfer 区域并使用相同的密钥,或者使用 PartitionResolver 来定位数据,这将有效。
另一种方法,因为您使用的是 Spring Boot,将执行以下操作:
- 首先将
@SpringBootApplication
class 注释为@EnableGemfireCacheTransactions
...
示例:
@SpringBootApplication
@EnableGemfireCacheTransactions
@EnableGemfireRepositories
class YourSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(YourSpringBootApplication.class, args);
}
...
}
@EnableGemfireCacheTransactions
注释启用 Spring Data GemFire 的 GemfireTransactionManager
, which integrates GemFire's CacheTransactionManager
with Spring Transaction Management infrastructure 然后允许您这样做...
现在,只需使用核心 Spring 的
@Transactional
注释来注释您的@Service
应用程序组件事务服务方法, 像这样...@服务 class YourBoxReceiverTransferService {
@Transactional public <return-type> update(ReceiveContext receiveContext, TransferContext transferContext { ... receiveContextRepository.save(receiveContext); transferContextRepository.save(transferContext); ... }
}
正如您在这里看到的,我还使用了 Spring Data (GemFire's) Repository 基础设施来管理持久性操作(例如 CRUD),[= 将在事务范围上下文设置中适当地使用它89=].
Spring 方法的
2 优势,优于使用 GemFire 的 public API,它不必要地将您与 GemFire 耦合(一个确定的代码气味,特别是在 Spring 环境中),是...
您不必在您的应用程序组件中放置一堆样板、垃圾代码,不属于那里!
使用Spring的事务管理基础设施,改变您的事务管理策略,例如从 GemFire 的仅本地缓存事务切换到全局,JTA-based Transactions 如果每次都需要(例如,哦,好吧,现在我需要在 GemFire 区域和 Cassandra BOX Table 更新后通过 JMS 消息队列发送消息以通知某些下游进程 Receiver/Transfer 上下文已更新)。使用 Spring 的事务管理 基础架构,您不需要 需要更改单行应用程序代码来更改事务管理策略(例如本地到全球,或全球到本地等)。
希望对您有所帮助!
-约翰