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

2021-12-27 14:39:29 浏览数 (1)

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

6.12.6.配置堆外内存

另一种降低 JVM 堆内存压力和最小化 GC 活动的有效方法是使用 Apache Geode 的堆外内存支持。

不是将 Region 条目存储在 JVM 堆上,而是将条目存储在系统的主内存中。堆外内存通常在存储的对象大小一致、大多数小于 128K 且不需要经常反序列化时效果最佳,如 Apache Geode 用户指南 中所述。

要启用堆外,请使用 注释应用程序类@EnableOffHeap,如下所示:

启用了堆外的 Spring 应用程序

代码语言:javascript复制
@SpringBootApplication
@PeerCacheApplication
@EnableOffHeap(memorySize = 8192m regionNames = { "Customers", "Orders" })
class ServerApplication { .. }

该memorySize属性是必需的。该memorySize属性的值以兆字节 ( m) 或千兆字节 ( g)为单位指定区域可以使用的主内存量。

该regionNames属性是一个区域名称数组,用于指定在主内存中存储条目的区域。默认情况下,如果regionNames未明确设置该属性,则所有区域都使用主内存。

或者,您可以使用文件中的 spring.data.gemfire.cache.off-heap.memory-size 和spring.data.gemfire.cache.off-heap.region-names属性application.properties来设置和配置这些@EnableOffHeap注释属性的值。

6.12.7.配置磁盘存储

或者,您可以配置 Regions 以将数据持久化到磁盘。您还可以将 Region 配置为在驱逐 Region 条目时将数据溢出到磁盘。在这两种情况下,DiskStore都需要 a 来持久化和/或溢出数据。当DiskStore尚未为具有持久性或溢出的区域配置显式时,Apache Geode 使用DEFAULT DiskStore.

我们建议在将DiskStores数据持久化和/或溢出到磁盘时定义特定于区域的。

Spring Data for Apache GeodeDiskStores 通过使用@EnableDiskStore和@EnableDiskStores注释对应用程序类进行注释,为定义和创建应用程序区域提供注释支持。

@EnableDiskStores是用于聚合一个或多个@EnableDiskStore注释的复合注释。

例如,虽然Book信息可能主要由来自某些外部数据源(例如 Amazon)的参考数据组成,但Order数据很可能在本质上是事务性的,并且是应用程序需要保留的东西(甚至可能溢出到磁盘,如果交易量足够高)——无论如何,任何图书出版商和作者都希望如此。

使用@EnableDiskStore注解,你可以定义和创建一个DiskStore如下:

Spring 应用程序定义了一个 DiskStore

代码语言:javascript复制
@SpringBootApplication
@PeerCacheApplication
@EnableDiskStore(name = "OrdersDiskStore", autoCompact = true, compactionThreshold = 70,
    maxOplogSize = 512, diskDirectories = @DiskDiretory(location = "/absolute/path/to/order/disk/files"))
class ServerApplication { .. }

同样,DiskStore可以使用复合@EnableDiskStores注释定义多个。

正如在Spring数据其他注释为Apache的Geode的基于注解配置模型中,@EnableDiskStore 并@EnableDiskStores有相关的配置属性一起许多属性自定义DiskStores创建在运行时。

此外,@EnableDiskStores注释定义了某些通用DiskStore属性,这些属性适用于DiskStores从@EnableDiskStore由@EnableDiskStores注释本身组成的注释创建的所有内容 。单个DiskStore配置覆盖特定的全局设置,但@EnableDiskStores注释方便地定义了通用配置属性,这些属性适用于DiskStores注释聚合的所有内容。

Spring Data for Apache Geode 还提供了DiskStoreConfigurer回调接口,可以在 Java 配置中声明,代替配置属性DiskStore在运行时自定义一个,如下例所示:

具有自定义 DiskStore 配置的 Spring 应用程序

代码语言:javascript复制
@SpringBootApplication
@PeerCacheApplication
@EnableDiskStore(name = "OrdersDiskStore", autoCompact = true, compactionThreshold = 70,
    maxOplogSize = 512, diskDirectories = @DiskDiretory(location = "/absolute/path/to/order/disk/files"))
class ServerApplication {

  @Bean
  DiskStoreConfigurer ordersDiskStoreDiretoryConfigurer(
          @Value("${orders.disk.store.location}") String location) {

      return (beanName, diskStoreFactoryBean) -> {

          if ("OrdersDiskStore".equals(beanName) {
              diskStoreFactoryBean.setDiskDirs(Collections.singletonList(new DiskDir(location));
          }
      }
  }
}

有关可用属性以及相关配置属性的更多详细信息,请参阅Javadoc@EnableDiskStore和@EnableDiskStores注解。

可以在此处找到有关 Apache Geode Region 持久性和溢出(使用 DiskStores)的更多详细信息 。

6.12.8.配置索引

除非可以访问数据,否则将数据存储在 Region 中没有太大用处。

除了Region.get(key)操作之外,特别是在预先知道键的情况下,通常通过对包含数据的 Region 执行查询来检索数据。使用 Apache Geode,查询是使用对象查询语言 (OQL) 编写的,客户端希望访问的特定数据集在查询的谓词中表示(例如,SELECT * FROM /Books b WHERE b.author.name = 'Jon Doe')。

通常,没有索引的查询效率低下。在没有索引的情况下执行查询时,Apache Geode 执行等效于全表扫描。

索引是为查询谓词中使用的对象上的字段创建和维护的,以匹配感兴趣的数据,如查询的投影所表达的那样。可以创建不同类型的索引,例如 键索引 和哈希索引。

Spring Data for Apache Geode 可以轻松地在存储和访问数据的区域上创建索引。Index我们可以像以前一样使用 Spring config显式声明bean 定义,而不是使用IndexJava创建一个bean 定义,如下所示:

使用 Java 配置索引 bean 定义

代码语言:javascript复制
@Bean("BooksIsbnIndex")
IndexFactoryBean bookIsbnIndex(GemFireCache gemfireCache) {

    IndexFactoryBean bookIsbnIndex = new IndexFactoryBean();

    bookIsbnIndex.setCache(gemfireCache);
    bookIsbnIndex.setName("BookIsbnIndex");
    bookIsbnIndex.setExpression("isbn");
    bookIsbnIndex.setFrom("/Books"));
    bookIsbnIndex.setType(IndexType.KEY);

    return bookIsbnIndex;
}

或者,我们可以使用XML来创建Indexbean 定义,如下所示:

使用 XML 的索引 bean 定义

代码语言:javascript复制
<gfe:index id="BooksIsbnIndex" expression="isbn" from="/Books" type="KEY"/>

但是,现在您可以直接在您知道将在查询谓词中使用的应用程序域对象类型的字段上定义索引,以加速这些查询。您甚至可以在应用程序的存储库接口上为从用户定义的查询方法生成的 OQL 查询应用索引。

重新使用之前的示例Book实体类,我们可以注释Book我们知道在我们使用BookRepository接口中的查询方法定义的查询中使用的字段,如下所示:

使用索引对一本书建模的应用程序域对象类型

代码语言:javascript复制
@Region("Books")
class Book {

  @Id
  private ISBN isbn;

  @Indexed
  private Author author;

  private Category category;

  private LocalDate releaseDate;

  private Publisher publisher;

  @LuceneIndexed
  private String title;

}

在我们的新Book类的定义,我们诠释了author与现场@Indexed和title与现场@LuceneIndexed。此外,该isbn字段之前已使用 Spring Data 的@Id注释进行了注释,该注释标识包含Book实例唯一标识符的字段,并且在 Spring Data for Apache Geode 中,@Id 注释的字段或属性在存储条目时用作 Region 中的键.

  • @Id带注释的字段或属性会导致创建 Apache GeodeKEY索引。
  • @Indexed带注释的字段或属性会导致创建 Apache Geode HASHIndex(默认值)。
  • @LuceneIndexed 带注释的字段或属性会导致创建 Apache Geode Lucene 索引,在基于文本的搜索中使用 Apache Geode 的 Lucene 集成和支持。

当在@Indexed不设置任何属性的情况下使用注释时,索引name、expression和fromClause 派生自@Indexed添加了注释的类的字段或属性。的expression 正是字段或属性的名称。该fromClause从派生@Region的域对象的类注释,或域对象类的简单名称,如果@Region没有指定注释进行。

当然,您可以显式设置任何@Indexed注释属性来覆盖 Spring Data for Apache Geode 提供的默认值。

应用程序域对象类型使用自定义索引对 Book 进行建模

代码语言:javascript复制
@Region("Books")
class Book {

  @Id
  private ISBN isbn;

  @Indexed(name = "BookAuthorNameIndex", expression = "author.name", type = "FUNCTIONAL")
  private Author author;

  private Category category;

  private LocalDate releaseDate;

  private Publisher publisher;

  @LuceneIndexed(name = "BookTitleIndex", destory = true)
  private String title;

}

该name指数,这是自动生成的,当没有明确设置的,也被用作索引的Spring容器注册的bean的名字。如有必要,这个索引 bean 甚至可以按名称注入到另一个应用程序组件中。

生成的索引名称遵循以下模式:<Region Name><Field/Property Name><Index Type>Idx. 例如,author索引的名称将是,BooksAuthorHashIdx。

要启用索引,请使用 注释应用程序类@EnableIndexing,如下所示:

启用索引的 Spring 应用程序

代码语言:javascript复制
@SpringBootApplication
@PeerCacheApplication
@EnableEntityDefinedRegions
@EnableIndexing
class ServerApplication { .. }

该@EnablingIndexing注解没有影响,除非@EnableEntityDefinedRegions也声明。本质上,索引是根据实体类类型的字段或属性定义的,并且必须扫描实体类以检查实体的字段和属性是否存在索引注释。如果没有这个扫描,就找不到索引注释。我们还强烈建议您限制扫描范围。

虽然 Spring Data for Apache Geode 存储库(尚不)支持 Lucene 查询,但 SDG 确实通过使用熟悉的 Spring 模板设计模式为 Apache Geode Lucene 查询提供了全面 支持。

最后,我们在本节结束时提供一些使用索引时要记住的额外提示:

  • 虽然执行 OQL 查询不需要 OQL 索引,但执行基于 Lucene 文本的搜索需要 Lucene 索引。
  • OQL 索引不会持久化到磁盘。它们只保存在内存中。因此,当 Apache Geode 节点重新启动时,必须重建索引。
  • 您还需要了解与维护索引相关的开销,特别是因为索引专门存储在内存中,尤其是在更新 Region 条目时。索引“维护”可以 配置 为异步任务。

在重新启动必须重建索引的 Spring 应用程序时,您可以使用的另一种优化是首先预先定义所有索引,然后一次性创建它们,在 Spring Data for Apache Geode 中,当刷新 Spring 容器时会发生这种情况.

您可以预先定义索引,然后通过将注释define上的属性设置为 来一次性创建它们。@EnableIndexingtrue

有关 更多详细信息,请参阅Apache Geode 用户指南中的“一次创建多个索引”。

创建合理的索引是一项重要的任务,因为设计不当的索引可能弊大于利。

有关配置选项的完整列表,请参阅@Indexed注释和@LuceneIndexed注释 Javadoc。

6.13.配置连续查询

Apache Geode 的另一个非常重要和有用的特性是 连续查询。

在支持 Internet 的事物的世界中,事件和数据流来自各处。能够处理和处理大量数据并实时对事件做出反应是许多应用程序越来越重要的要求。一个例子是自动驾驶汽车。能够实时接收、过滤、转换、分析和处理数据是实时应用程序的关键区别和特征。

幸运的是,Apache Geode 在这方面走在了时代的前面。通过使用连续查询 (CQ),客户端应用程序可以表达它感兴趣的数据或事件,并注册侦听器以在事件发生时处理和处理事件。客户端应用程序可能感兴趣的数据表示为 OQL 查询,其中查询谓词用于过滤或识别感兴趣的数据。当数据被更改或添加并且它与注册的 CQ 的查询谓词中定义的标准相匹配时,客户端应用程序会收到通知。

Spring Data for Apache Geode 可以轻松定义和注册 CQ,以及相关的侦听器来处理和处理 CQ 事件,而无需 Apache Geode 的所有繁琐工作。SDG 针对 CQ 的新的基于注释的配置建立在连续查询侦听器容器中现有的连续查询支持之上。

例如,假设银行应用程序在每个客户的支票帐户中注册利息以检测透支取款并通过应用透支保护或通知客户来处理此事件。然后,应用程序可能会注册以下 CQ:

ClientCache具有注册 CQ 和侦听器的Spring应用程序。

代码语言:javascript复制
@SpringBootApplication
@ClientCacheApplication(subcriptionEnabled = true)
@EnableContinuousQueries
class PublisherPrintApplication {

    @ContinuousQuery(name = "OverdraftProtection", query = "SELECT * FROM /CheckingAccount ca WHERE ca.balance < 0.0")
    void handleOverdraft(CqEvent event) {
        // Quick!!! Put more money into the checking account or notify the customer of the checking account!
    }
}

要启用连续查询,请使用@EnableContinuousQueries.

定义连续查询包括@Component使用@ContinuousQuery注释(以类似于 SDG 的函数注释 POJO 方法的方式)注释任何 Spring 注释的POJO 类方法。@ContinuousQuery任何时候添加或更改与查询谓词匹配的数据时,都会调用使用注释通过 CQ 定义的 POJO 方法。

此外,该POJO方法签名要坚持对部分中列出的要求 中ContinuousQueryListener和 ContinuousQueryListenerAdapter。

有关可用属性和配置设置的更多详细信息,请参阅Javadoc@EnableContinuousQueries和@ContinuousQuery注释。

可以在此处找到有关 Spring Data for Apache Geode 的连续查询支持的更多详细信息 。

可以在此处找到有关 Apache Geode 的连续查询的更多详细信息 。

6.14.配置 Spring 的缓存抽象

使用 Spring Data for Apache Geode,Apache Geode 可以用作 Spring缓存抽象中的缓存提供者 。

在 Spring 的 Cache Abstraction 中,缓存注解(例如@Cacheable)标识在调用潜在昂贵操作之前执行缓存查找的缓存。在调用操作后缓存应用程序服务方法的结果。

在 Spring Data for Apache Geode 中,SpringCache直接对应于 Apache Geode Region。在调用任何缓存注释的应用程序服务方法之前,该区域必须存在。对于识别要在服务操作中使用的缓存的任何 Spring 缓存注解(即@Cacheable、@CachePut和@CacheEvict),都是如此。

举例来说,我们的出版商的定点销售点(POS)应用程序可能有一个特点,确定或查找的Price 的Book销售交易过程中,如下面的示例所示:

代码语言:javascript复制
@Service
class PointOfSaleService

  @Cacheable("BookPrices")
  Price runPriceCheckFor(Book book) {
      ...
  }

  @Transactional
  Receipt checkout(Order order) {
      ...
  }

  ...
}

当您将 Spring Data for Apache Geode 与 Spring 的缓存抽象结合使用时,为了使您的工作更轻松,我们向基于注解的配置模型添加了两个新功能。

考虑以下 Spring 缓存配置:

使用 Apache Geode 作为缓存提供者启用缓存

代码语言:javascript复制
@EnableCaching
class CachingConfiguration {

  @Bean
  GemfireCacheManager cacheManager(GemFireCache gemfireCache) {

      GemfireCacheManager cacheManager = new GemfireCacheManager();

      cacheManager.setCache(gemfireCache);

      return cacheManager;
  }

  @Bean("BookPricesCache")
  ReplicatedRegionFactoryBean<Book, Price> bookPricesRegion(GemFireCache gemfireCache) {

    ReplicatedRegionFactoryBean<Book, Price> bookPricesRegion =
        new ReplicatedRegionFactoryBean<>();

    bookPricesRegion.setCache(gemfireCache);
    bookPricesRegion.setClose(false);
    bookPricesRegion.setPersistent(false);

    return bookPricesRegion;
  }

  @Bean("PointOfSaleService")
  PointOfSaleService pointOfSaleService(..) {
      return new PointOfSaleService(..);
  }
}

使用 Spring Data for Apache Geode 的新特性,您可以将相同的缓存配置简化为以下内容:

启用 Apache Geode 缓存

代码语言:javascript复制
@EnableGemfireCaching
@EnableCachingDefinedRegions
class CachingConfiguration {

  @Bean("PointOfSaleService")
  PointOfSaleService pointOfSaleService(..) {
      return new PointOfSaleService(..);
  }
}

首先,该@EnableGemfireCaching注解取代了 Spring@EnableCaching注解和CacheManager在 Spring 配置中声明显式bean 定义(名为“cacheManager”)的需要。

其次,@EnableCachingDefinedRegions注解,就像@EnableEntityDefinedRegions“配置区域”中描述的注解一样,检查整个 Spring 应用程序,缓存带注解的服务组件以识别应用程序在运行时需要的所有缓存,并在应用程序启动时在 Apache Geode 中为这些缓存创建区域.

创建的区域对于创建区域的应用程序进程来说是本地的。如果应用程序是 peer Cache,则区域仅存在于应用程序节点上。如果应用程序是ClientCache,则 SDG 会创建客户端PROXY区域,并期望集群中的服务器上已存在这些具有相同名称的区域。

SDG 无法使用 Spring 确定服务方法所需CacheResolver 的缓存,以在运行时解析操作中使用的缓存。

SDG 还支持应用程序服务组件上的 JCache (JSR-107) 缓存注释。请参阅核心Spring 框架参考指南, 了解用于替代 JCache 缓存注释的等效 Spring 缓存注释。

0 人点赞