Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程十二

原标题:Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程十二(Spring中国教育管理中心)

6.12.1.配置特定于类型的区域
Apache Geode 支持多种不同类型的 Regions。每种类型对应于 Region 的DataPolicy,它确切地决定了 Region 中的数据将如何管理(即分布式、复制等)。

其他配置设置(例如区域的scope)也会影响数据的管理方式。有关 更多详细信息,请参阅Apache Geode 用户指南中的“存储和分发选项”。

当您使用通用@Region映射注释对应用程序域对象类型进行注释时,Spring Data for Apache Geode 决定要创建哪种类型的区域。SDG 的默认策略在确定要创建的 Region 类型时会考虑缓存类型。

例如,如果您ClientCache使用@ClientCacheApplication注解将应用程序声明为 a ,则 SDGPROXY Region默认会创建一个客户端。或者,如果您Cache使用 the@PeerCacheApplication或@
CacheServerApplicationannotations将应用程序声明为对等体,SDGPARTITION Region默认会创建一个服务器。

当然,您始终可以在必要时覆盖默认值。为了覆盖 Spring Data for Apache Geode 应用的默认值,引入了四个新的 Region 映射注释:

@ClientRegion
@LocalRegion
@PartitionRegion
@ReplicateRegion
该@ClientRegion映射的注释是针对客户端应用程序。上面列出的所有其他 Region 映射注释只能在具有嵌入式 peer 的服务器应用程序中使用Cache。

客户端应用程序有时需要创建和使用仅限本地的 Region,也许是为了聚合来自其他 Region 的数据,以便在本地分析数据并代表用户执行应用程序执行的某些功能。在这种情况下,除非其他应用程序需要访问结果,否则不需要将数据分发回服务器。该区域甚至可能是临时的并在使用后被丢弃,这可以通过区域本身的空闲超时 (TTI) 和生存时间 (TTL) 过期策略来实现。(有关过期策略的更多信息,请参阅“配置过期”。)

区域级空闲超时 (TTI) 和生存时间 (TTL) 过期策略独立于并不同于入门级 TTI 和 TTL 过期策略。

在任何情况下,如果您想创建一个仅限本地的客户端 Region,其中数据不会分发回服务器上具有相同名称的相应 Region,您可以声明@ClientRegion映射注释并将shortcut属性设置为
ClientRegionShortcut.LOCAL,如如下:

ClientCache具有仅限本地的客户端区域的Spring应用程序

@ClientRegion(shortcut = ClientRegionShortcut.LOCAL)
class ClientLocalEntityType { .. }
所有特定于 Region 类型的注释都提供了额外的属性,这些属性在 Region 类型之间是通用的,并且仅特定于该类型的 Region。比如注解中的collocatedWith和redundantCopies属性PartitionRegion,PARTITION只适用于服务端,Regions。

可以在此处找到有关 Apache Geode Region 类型的更多详细信息 。

6.12.2.配置的集群定义区域
除了@
EnableEntityDefinedRegions注解之外,Spring Data for Apache Geode 还提供了反向注解 @EnableClusterDefinedRegions. 与其根据应用程序用例 (UC) 和需求(最常见和合乎逻辑的方法)定义和驱动的实体类来创建您的区域,您还可以根据ClientCache应用程序所在集群中已定义的区域来声明您的区域将连接。

这允许您使用服务器集群作为数据定义的主要来源来集中配置,并确保集群的所有客户端应用程序具有一致的配置。这在快速扩展同一客户端应用程序的大量实例以处理云管理环境中增加的负载时特别有用。

这个想法是,用户使用 Apache Geode 的Gfsh CLI shell 工具定义区域,而不是驱动数据字典的客户端应用程序。这有一个额外的好处,当额外的对等点被添加到集群时,它们也将拥有并共享相同的配置,因为它被 Apache Geode 的集群配置服务记住 。

Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程十二
例如,用户可能在Gfsh 中定义了一个 Region ,如下所示:

使用 Gfsh 定义区域

gfsh>create region --name=Books --type=PARTITION

Member Status
ServerOne Region "/Books" created on "ServerOne"
ServerTwo Region "/Books" created on "ServerTwo"

gfsh>list regions

List of regions

Books

gfsh>describe region --name=/Books
..........................................................
Name : Books
Data Policy : partition
Hosting Members : ServerTwo

              ServerOne

Non-Default Attributes Shared By Hosting Members

Type Name Value
Region size 0
   | data-policy | PARTITION

使用 Apache Geode 的Cluster Configuration Service,添加到服务器集群以处理增加的负载(在后端)的任何其他对等成员也将具有相同的配置,例如:

向集群添加额外的对等成员

gfsh>list members

Name Id
Locator 10.0.0.121(Locator:68173:locator):1024
ServerOne 10.0.0.121(ServerOne:68242):1025
ServerTwo 10.0.0.121(ServerTwo:68372):1026

gfsh>start server --name=ServerThree --log-level=config --server-port=41414
Starting a Geode Server in /Users/you/geode/cluster/ServerThree...
...
Server in /Users/you/geode/cluster/ServerThree... on 10.0.0.121[41414] as ServerThree is currently online.
Process ID: 68467
Uptime: 3 seconds
Geode Version: 1.2.1
Java Version: 1.8.0_152
Log File: /Users/you/geode/cluster/ServerThree/ServerThree.log
JVM Arguments: -Dgemfire.default.locators=10.0.0.121[10334]
-Dgemfire.use-cluster-configuration=true
-Dgemfire.start-dev-rest-api=false
-Dgemfire.log-level=config
-XX:OnOutOfMemoryError=kill -KILL %p
-Dgemfire.launcher.registerSignalHandlers=true
-Djava.awt.headless=true
-Dsun.rmi.dgc.server.gcInterval=9223372036854775806
Class-Path: /Users/you/geode/cluster/apache-geode-1.2.1/lib/geode-core-1.2.1.jar
:/Users/you/geode/cluster/apache-geode-1.2.1/lib/geode-dependencies.jar

gfsh>list members

Name Id
Locator 10.0.0.121(Locator:68173:locator):1024
ServerOne 10.0.0.121(ServerOne:68242):1025
ServerTwo 10.0.0.121(ServerTwo:68372):1026
ServerThree 10.0.0.121(ServerThree:68467):1027

gfsh>describe member --name=ServerThree
Name : ServerThree
Id : 10.0.0.121(ServerThree:68467):1027
Host : 10.0.0.121
Regions : Books
PID : 68467
Groups :
Used Heap : 37M
Max Heap : 3641M
Working Dir : /Users/you/geode/cluster/ServerThree
Log file : /Users/you/geode/cluster/ServerThree/ServerThree.log
Locators : 10.0.0.121[10334]

Cache Server Information
Server Bind :
Server Port : 41414
Running : true
Client Connections : 0
Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程十二
如您所见,“ServerThree”现在具有“Books”区域。如果任何或所有服务器出现故障,当它们恢复时,它们将具有与“书籍”区域相同的配置。

在客户端,可能会启动许多 Book Store 客户端应用程序实例以针对 Book Store 在线服务处理书籍。“图书”区域可能是实现图书商店应用程序服务所需的许多不同区域之一。SDG 不必单独创建和配置每个区域,而是允许从集群中方便地定义客户端应用程序区域,如下所示:

从集群定义客户端区域 @
EnableClusterDefinedRegions

@ClientCacheApplication
@EnableClusterDefinedRegions
class BookStoreClientApplication {

public static void main(String[] args) {
    ....
}

...

}
@
EnableClusterDefinedRegions 只能在客户端使用。

您可以使用
clientRegionShortcutannotation 属性来控制在客户端上创建的 Region 的类型。默认情况下,PROXY会创建一个客户端区域。设置clientRegionShortcut为ClientRegionShortcut.CACHING_PROXY 实现“近缓存”。此设置适用于从集群定义的区域创建的所有客户端区域。如果您想控制从集群上定义的区域创建的客户端区域的个别设置(如数据策略),那么您可以实现 RegionConfigurer 基于区域名称的自定义逻辑。

然后,在您的应用程序中使用“书籍”区域就变得很简单了。可以直接注入“Books”区域,如下:

使用“书籍”区域

@org.springframework.stereotype.Repository
class BooksDataAccessObject {

@Resource(name = "Books")
private Region books;

// implement CRUD and queries with the "Books" Region

}
或者,甚至根据应用程序域类型(实体)定义一个 Spring Data Repository 定义Book,映射到“Books”区域,如下所示:

将“书籍”区域与 SD 存储库一起使用

interface BookRepository extends CrudRepository {

...

}
然后,您可以将您的自定义BooksDataAccessObject或注入BookRepository到您的应用程序服务组件中,以执行所需的任何业务功能。

6.12.3.配置驱逐
使用 Apache Geode 管理数据是一项活跃的任务。通常需要进行调整,并且您必须结合使用功能(例如, eviction 和expire)来使用 Apache Geode 有效地管理内存中的数据。

鉴于 Apache Geode 是一个内存中数据网格 (IMDG),数据在内存中管理并分发到参与集群的其他节点,以最大限度地减少延迟、最大化吞吐量并确保数据高度可用。由于并非所有应用程序的数据通常都适合内存(即使跨整个节点集群,更不用说在单个节点上),您可以通过向集群添加新节点来增加容量。这通常被称为线性横向扩展(而不是纵向扩展,这意味着添加更多内存、更多 CPU、更多磁盘或更多网络带宽——基本上是增加每个系统资源以处理负载)。

尽管如此,即使有节点集群,通常也必须只将最重要的数据保存在内存中。内存不足,甚至冒险接近满负荷,很少(如果有的话)是一件好事。Stop-the-world GC 或更糟的是OutOfMemoryErrors,将使您的应用程序停止运行。

因此,为了帮助管理内存并保留最重要的数据,Apache Geode 支持最近最少使用 (LRU) 驱逐。也就是说,Apache Geode 根据最近使用最少使用算法访问这些条目的时间来驱逐 Region 条目。

要启用驱逐,请使用 注释应用程序类@EnableEviction,如下所示:

启用驱逐的 Spring 应用程序

@SpringBootApplication
@PeerCacheApplication
@EnableEviction(policies = {

@EvictionPolicy(regionNames = "Books", action = EvictionActionType.INVALIDATE),
@EvictionPolicy(regionNames = { "Customers", "Orders" }, maximum = 90,
    action = EvictionActionType.OVERFLOW_TO_DISK,
    type = EvictonPolicyType.HEAP_PERCENTAGE)

})
class ServerApplication { .. }
驱逐策略通常设置在服务器中的区域上。

如前所述,该policies属性可以指定一个或多个嵌套@EvictionPolicy注释,每个注释都单独满足一个或多个需要应用驱逐策略的区域。

此外,您可以引用 Apache
Geodeorg.apache.geode.cache.util.ObjectSizer接口的自定义实现 ,它可以定义为 Spring 容器中的 bean,并通过使用objectSizerName属性按名称进行引用。

AnObjectSizer允许您定义用于评估和确定区域中存储的对象大小的标准。

有关 驱逐配置选项的完整列表,请参阅@EnableEviction注释 Javadoc。

可以在此处找到有关 Apache Geode 驱逐的更多详细信息 。

6.12.4.配置过期
与eviction 一起,到期还可以通过允许存储在区域中的条目到期来管理内存。Apache Geode 支持生存时间 (TTL) 和空闲超时 (TTI) 条目过期策略。

Spring Data for Apache Geode 的基于注解的过期配置基于 在 Spring Data for Apache Geode 1.5 版中添加的 早期和现有条目过期注解支持。

本质上,Spring Data for Apache Geode 的过期注释支持基于 Apache
Geodeorg.apache.geode.cache.CustomExpiry接口的自定义实现 。此o.a.g.cache.CustomExpiry实现检查存储在区域中的用户应用程序域对象是否存在类型级别的到期注释。

Spring Data for Apache Geode 提供以下过期注释:

Expiration
IdleTimeoutExpiration
TimeToLiveExpiration
一个应用程序域对象类型可以使用一个或多个过期注释进行注释,如下所示:

应用程序域对象特定的过期策略

@Region("Books")
@TimeToLiveExpiration(timeout = 30000, action = "INVALIDATE")
class Book { .. }
要启用过期,请使用 注释应用程序类@EnableExpiration,如下所示:

启用过期的 Spring 应用程序

@SpringBootApplication
@PeerCacheApplication
@EnableExpiration
class ServerApplication { .. }
除了应用域对象类型级别的过期策略外,您还可以直接使用@EnableExpiration注解逐个Region单独配置过期策略,如下:

具有特定于区域的到期策略的 Spring 应用程序

@SpringBootApplication
@PeerCacheApplication
@EnableExpiration(policies = {

@ExpirationPolicy(regionNames = "Books", types = ExpirationType.TIME_TO_LIVE),
@ExpirationPolicy(regionNames = { "Customers", "Orders" }, timeout = 30000,
    action = ExpirationActionType.LOCAL_DESTROY)

})
class ServerApplication { .. }
前面的例子为设置过期策略Books,Customers和Orders地区。

过期策略通常设置在服务器的 Region 上。

有关 到期配置选项的完整列表,请参阅@EnableExpiration注释 Javadoc。

可以在此处找到有关 Apache Geode 到期的更多详细信息 。

6.12.5.配置压缩
除了eviction 和expire 之外,您还可以通过压缩配置数据区域以减少内存消耗。

Apache Geode 允许您使用可插入Compressors或不同的压缩编解码器在内存中压缩区域值 。Apache Geode默认使用 Google 的Snappy压缩库。

要启用压缩,请使用 注释应用程序类@EnableCompression,如下所示:

启用区域压缩的 Spring 应用程序

@SpringBootApplication
@ClientCacheApplication
@EnableCompression(compressorBeanName = "MyCompressor", regionNames = { "Customers", "Orders" })
class ClientApplication { .. }
thecompressorBeanName和theregionNames属性都不是必需的。

该compressorBeanName默认为SnappyCompressor,使阿帕奇的Geode的SnappyCompressor。

该regionNames属性是一个区域名称数组,用于指定启用压缩的区域。默认情况下,如果regionNames未明确设置属性,则所有区域都会压缩值。

或者,您可以使用文件中的
spring.data.gemfire.cache.compression.compressor-bean-name和spring.data.gemfire.cache.compression.region-names属性application.properties来设置和配置这些 EnableCompression注释属性的值。

要使用Apache Geode的区域压缩功能,您必须org.iq80.snappy:snappy在应用程序的pom.xml文件(对于Maven)或build.gradle文件(对于Gradle)中包含依赖项。仅当您使用Apache Geode对区域压缩的默认支持时才需要这样做,默认情况下使用SnappyCompressor。当然,如果您使用另一个压缩库,则需要在应用程序的类路径中包含该压缩库的依赖项。此外,您需要实现Apache Geode的Compressor接口以适应您选择的压缩库,将其定义为Spring压缩器中的bean,并将设置compressorBeanName为这个自定义bean定义。

你可能感兴趣的