在我的应用程序中连接到 GemFire 服务器需要很长时间

It takes a long time to connect to a GemFire server in my application

我正在工作场所的项目中设置 spring-data-gemfire。但是,连接到 GemFire 服务器并从我的应用程序检索数据需要很长时间。

2020-Mar-13 09:00:10 | TRACE | annotation.ScheduledAnnotationPostProcessor | No @Scheduled annotations found on bean class: class org.springframework.gemfire.client.CLientCacheFactoryBean
2020-Mar-13 09:00:10 | TRACE | support.DefaultListableBeanFactory |Finished creating instance of bean 'gemfireCache'
2020-Mar-13 09:00:42 | TRACE | internal.ClassPathLoader | getResource(gemfire.properties)
2020-Mar-13 09:00:42 | TRACE | internal.ClassPathLoader | getResource trying: sun.misc.Launcher$AppClassLoader@73d16e93
2020-Mar-13 09:00:42 | TRACE | internal.ClassPathLoader | getResource trying: java.net.Launcher$AppClassLoader@73d16e93
.....

我可以知道为什么从 "Finished creating instance of bean.." 到 "getResource.." 需要 40 多秒吗?

当前版本

  1. Spring 数据 GemFire 2.2.1.RELEASE
  2. Spring开机2.2.1.RELEASE
  3. 3 个服务器和 2 个定位器(安装在虚拟机上)
  4. 私人本地网络
  5. 使用Java序列化
  6. 为我的客户端使用缓存代理

当我在家里尝试一个简单的 gemfire 应用程序时,大约需要 5 秒钟。

[TRACE] 2020-03-14 16:54:58.623 [main] CachedIntrospectionResults - Found bean property 'propertiesPersister' of type [org.springframework.util.PropertiesPersister]
[TRACE] 2020-03-14 16:54:58.623 [main] CachedIntrospectionResults - Found bean property 'singleton' of type [boolean]
[TRACE] 2020-03-14 16:54:58.626 [main] TypeConverterDelegate - Converting String to [class [Lorg.springframework.core.io.Resource;] using property editor [org.springframework.core.io.support.ResourceArrayPropertyEditor@669253b7
[TRACE] 2020-03-14 16:54:58.627 [main] PathMatchingResourcePatternResolver - Resolved classpath location [META-INF/gemfire-named-queries.properties] to resources []
[TRACE] 2020-03-14 16:54:58.627 [main] DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name '(inner bean)#6cc0bcf6'
[TRACE] 2020-03-14 16:54:58.628 [main] DefaultListableBeanFactory - Finished creating instance of bean '(inner bean)#6cc0bcf6'
[TRACE] 2020-03-14 16:54:58.630 [main] DefaultListableBeanFactory - Finished creating instance of bean '(inner bean)#1a6f5124'
[TRACE] 2020-03-14 16:54:58.631 [main] DefaultListableBeanFactory - Creating instance of bean '(inner bean)#49a64d82'
[TRACE] 2020-03-14 16:54:58.635 [main] DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name '(inner bean)#49a64d82'
[TRACE] 2020-03-14 16:54:58.635 [main] DefaultListableBeanFactory - Finished creating instance of bean '(inner bean)#49a64d82'
[TRACE] 2020-03-14 16:54:58.636 [main] DefaultListableBeanFactory - Returning cached instance of singleton bean 'gemfireCache'
[TRACE] 2020-03-14 16:55:03.415 [main] ClassPathLoader - getResource(gemfire.properties)
[TRACE] 2020-03-14 16:55:03.418 [main] ClassPathLoader - getResource trying: sun.misc.Launcher$AppClassLoader@73d16e93
[TRACE] 2020-03-14 16:55:03.418 [main] ClassPathLoader - getResource trying: java.net.URLClassLoader@1500e009
[TRACE] 2020-03-14 16:55:03.418 [main] ClassPathLoader - getResource(gfsecurity.properties)
[TRACE] 2020-03-14 16:55:03.419 [main] ClassPathLoader - getResource trying: sun.misc.Launcher$AppClassLoader@73d16e93
[TRACE] 2020-03-14 16:55:03.419 [main] ClassPathLoader - getResource trying: java.net.URLClassLoader@1500e009
[TRACE] 2020-03-14 16:55:03.429 [main] ClassPathLoader - forName(org.apache.logging.log4j.core.impl.Log4jContextFactory)
[TRACE] 2020-03-14 16:55:03.429 [main] ClassPathLoader - forName trying: sun.misc.Launcher$AppClassLoader@73d16e93
[TRACE] 2020-03-14 16:55:03.429 [main] ClassPathLoader - forName found by: sun.misc.Launcher$AppClassLoader@73d16e93 2020-03-14 16:55:03,432 main INFO Log4j Core is available and using Log4jProvider
[TRACE] 2020-03-14 16:55:03.434 [main] ClassPathLoader - forName(org.apache.geode.internal.logging.log4j.Log4jAgent)
[TRACE] 2020-03-14 16:55:03.434 [main] ClassPathLoader - forName trying: sun.misc.Launcher$AppClassLoader@73d16e93
[TRACE] 2020-03-14 16:55:03.435 [main] ClassPathLoader - forName found by: sun.misc.Launcher$AppClassLoader@73d16e93 020-03-14 16:55:03,436 main INFO Using org.apache.geode.internal.logging.log4j.Log4jAgent by default for service org.apache.geode.internal.logging.ProviderAgent
[TRACE] 2020-03-14 16:55:03.848 [main] ThreadContext - get() - in thread [main]
[DEBUG] 2020-03-14 16:55:03.854 [main] geode - LogWriter is created.
[DEBUG] 2020-03-14 16:55:03.854 [main] security - SecurityLogWriter is created.
[TRACE] 2020-03-14 16:55:03.858 [main] ClassPathLoader - getResource(org/apache/geode/internal/GemFireVersion.properties)
[TRACE] 2020-03-14 16:55:03.858 [main] ClassPathLoader - getResource trying: sun.misc.Launcher$AppClassLoader@73d16e93
[TRACE] 2020-03-14 16:55:03.858 [main] ClassPathLoader - getResource found by: sun.misc.Launcher$AppClassLoader@73d16e93

我的简单 gemfire 应用程序

@SpringBootApplication
@ClientCacheApplication(locators = {@ClientCacheApplication.Locator(host = "192.167.0.5", port = 10311) }, socketBufferSize = 90000, subscriptionEnabled = true)
@EnableEntityDefinedRegions(basePackageClasses = Person.class, clientRegionShortcut = ClientRegionShortcut.CACHING_PROXY)
@EnableGemfireRepositories(basePackageClasses = PersonRepository.class)
public class Application {

好吧,这是一个有内容的问题。

在客户端(缓存)连接到集群(或服务器)之前和之后都会发生很多事情。很多问题浮现在脑海中,因为您的描述在这种情况下不够描述性。

  1. 你提到你正在连接到服务器,所以这意味着你的 Spring Boot, Spring Data for Pivotal GemFire (SDG) 应用程序是一个客户端,特别是一个ClientCache?如果是这样,您要访问哪种网络(本地主机、专用内部网络、VPN、云网络等)?

  2. 是否涉及防火墙、代理、NAT(例如路由器、交换机)或其他网络设备?如果您注意到延迟,则很可能是网络问题。

  3. 客户端和服务器之间的Pool是怎么配置的?例如,您是连接到 1 个或多个定位器,还是连接到单个定位器。您是直接连接到服务器吗?

  4. 你的集群有多大?是否有超过 1 个服务器?您是否启用了单跳?

  5. 您正在执行哪种数据访问操作?结果集有多大(即有多少对象)?对象有多大?

  6. 您使用什么形式的序列化(例如,您是应用程序域模型类型实现 java.io.Serializable?您是否偶然使用 PDX?您是否使用 GemFire Deltas 和 DataSerialization?

  7. 您是否尝试过运行在不同环境下使用相同的应用程序?

  8. 您的应用程序是否可以在某个地方公开访问,例如 GitHub?

  9. 能否分享您的配置、客户端和服务器的完整日志文件、客户端和服务器的线程转储等?

  10. 您正在从您的应用程序访问数据的区域是分区区域吗?是否启用了持久化?如果是多节点(服务器)集群,是否所有托管 PR 的成员都起来了?

  11. 等等等等等等...

您分享的一小段日志内容...

2020-Mar-13 09:00:42 | TRACE | internal.ClassPathLoader | getResource(gemfire.properties)
2020-Mar-13 09:00:42 | TRACE | internal.ClassPathLoader | getResource trying: sun.misc.Launcher$AppClassLoader@73d16e93
2020-Mar-13 09:00:42 | TRACE | internal.ClassPathLoader | getResource trying: java.net.Launcher$AppClassLoader@73d16e93

似乎表明它正在尝试解析 gemfire.properties 文件。您是否配置了 gemfire.properties?如果是这样,最好定义一个 Spring 引导 application.properties 资源并使用相应的等效 spring.data.gemfire.* 属性。

您的文件系统是否健康?

ClassPathLoader class 是一个 Pivotal GemFire 内部 class,所以无论发生什么,都在 Spring (Data GemFire) 的控制之外,并且完全处理 GemFire 本身。

您还应该知道,仅仅因为创建了 GemFireCache(例如 ClientCache)实例,并不一定意味着缓存或一般的 GemFire 系统已经创建还没有完全初始化。在创建某些 GemFire 对象(例如缓存,然后是区域,然后是索引和磁盘存储等)后,后台会发生许多异步任务(例如创建最小池大小)。

此外,创建的缓存(例如 ClientCache)实例只是一个容器,用于保存所有其他 GemFire 对象,例如实际保存数据的区域。在任何数据访问操作发生之前,必须创建和初始化区域。但是,为了创建区域,您需要一个缓存(即首先是一个 ClientCache 实例)。

您的客户区域是什么类型(例如 ClientRegionShortcut.PROXYClientRegionShortcut.CACHING_PROXY)?

您的详细信息中有太多空白,无法给您更准确的答案。

在某些情况下,这可能只是您遇到了 DNS 查找问题 - 特别是因为您家和其他位置之间的性能似乎有所不同。

你可以试试这个:

使用 hostname 命令获取您的主机名。 将此作为别名添加到 127.0.0.1/etc/hosts 文件中。例如,如果您的主机名看起来像 foobar.local,那么您的 /etc/hosts 应该调整为包括:

127.0.0.1   localhost  foobar foobar.local

请注意,我添加了 FQDN(包括 hostname 返回的 .local)以及较短的版本。