Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Hazelcast中使用客户端服务器面临性能问题_Java_Performance_Kubernetes_Hazelcast_Hazelcast Imap - Fatal编程技术网

Java 在Hazelcast中使用客户端服务器面临性能问题

Java 在Hazelcast中使用客户端服务器面临性能问题,java,performance,kubernetes,hazelcast,hazelcast-imap,Java,Performance,Kubernetes,Hazelcast,Hazelcast Imap,我将hazelcast配置为客户机服务器时面临性能问题。 我有一个K8S集群,由5个节点和1个主节点组成。每个节点都有64 GB的RAM和16芯(Hazelcast版本3.12.4) Hazelcast服务器部署在K8S上,其中一个POD位于集群中可用的一个节点上 我的客户端部署在K8S上,K8S通过智能客户端连接到上述Hazelcast(为K8S启用Hazelcast发现)。我的应用程序总共有10个吊舱,每个节点由我的应用程序的2个吊舱组成 我正在运行不同的API,并对我的应用程序执行负载测试

我将hazelcast配置为客户机服务器时面临性能问题。 我有一个K8S集群,由5个节点和1个主节点组成。每个节点都有64 GB的RAM和16芯(Hazelcast版本3.12.4) Hazelcast服务器部署在K8S上,其中一个POD位于集群中可用的一个节点上 我的客户端部署在K8S上,K8S通过智能客户端连接到上述Hazelcast(为K8S启用Hazelcast发现)。我的应用程序总共有10个吊舱,每个节点由我的应用程序的2个吊舱组成

我正在运行不同的API,并对我的应用程序执行负载测试(在所有10个POD中一次共享大约110个线程)

我在我的应用程序中有下面的一段代码来获取缓存

public Map<Object, Object> get(String cacheId, Long lTenantId) {
     String strMethodName="get";
     long t1 = System.currentTimeMillis();
     Map<Object,Object> cacheDataMap=hazelcastInstance.getMap(cacheId);
     long totalTimeTaken = (System.currentTimeMillis()-t1);
     if(totalTimeTaken > 10){
         logger.warnLog(CLASSNAME, strMethodName,"Total time taken by "+cacheId+" identifier for get operation is : "+totalTimeTaken+" ms");
      }
      return cacheDataMap;
}
(二)

当我的所有API都开始加载时,我会将这些日志打印到一个应用程序中(总时间为……),其中每个缓存访问时间>10毫秒,这会导致性能问题,因此我无法实现所有API的预期TPS

缓存中存储了大约300个地图,其中缓存的总大小为4.22 MB

我正在使用近缓存配置,而且在管理中心上,它显示了100%的有效性。(这是在启用hazelcast.client.statistics.enabled时进行的)

我也尝试过在Hazelcast服务器的4个节点和1个专用节点上部署8个吊舱,但问题仍然是一样的。当我将Hazelcast连接为嵌入式时,没有发现任何问题,并且我能够为所有API实现所需的TPS

我是否缺少导致此问题的任何配置或任何其他东西

这是我的hazelcast-client.xml

<hazelcast-client
xmlns="http://www.hazelcast.com/schema/client-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hazelcast.com/schema/client-config
                  http://hazelcast.com/schema/client-config/hazelcast-client-config-3.11.xsd">

<group>
<name>dev</name>
</group>
<instance-name>hazelcast</instance-name>
<properties>
<property name="hazelcast.client.shuffle.member.list">true</property>
<property name="hazelcast.client.heartbeat.timeout">600000</property>
<property name="hazelcast.client.heartbeat.interval">180000</property>
<property name="hazelcast.client.event.queue.capacity">1000000</property>
<property name="hazelcast.client.invocation.timeout.seconds">120</property>
<property name="hazelcast.client.statistics.enabled">false</property>
<property name="hazelcast.discovery.enabled">true</property>
<property name="hazelcast.map.invalidation.batch.enabled">false</property>
</properties>

<network>
<discovery-strategies>
<discovery-strategy enabled="true"
class="com.hazelcast.kubernetes.HazelcastKubernetesDiscoveryStrategy">
<properties>
<property name="service-name"><service-name></property>
<property name="namespace"><namespace></property>
</properties>
</discovery-strategy>
</discovery-strategies>
<smart-routing>true</smart-routing>
<redo-operation>true</redo-operation>
<connection-timeout>90000</connection-timeout>
<connection-attempt-period>100</connection-attempt-period>
<connection-attempt-limit>0</connection-attempt-limit>

</network>

<near-cache name="default">
                <in-memory-format>OBJECT</in-memory-format>
                <serialize-keys>true</serialize-keys>
                <invalidate-on-change>true</invalidate-on-change>
                <eviction eviction-policy="NONE" max-size-policy="ENTRY_COUNT"/>
        </near-cache>
</hazelcast-client>

发展
黑兹卡斯特
真的
600000
180000
1000000
120
假的
真的
假的
真的
真的
90000
100
0
对象
真的
真的
这是我的hazelcast.xml

<?xml version="1.0" encoding="UTF-8"?>

<hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.11.xsd"
           xmlns="http://www.hazelcast.com/schema/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <management-center enabled="${hazelcast.mancenter.enabled}">${hazelcast.mancenter.url}</management-center>

</hazelcast>

${hazelcast.mancenter.url}

缓存的目标是尽可能快地从键中获取值。通常,您已经拥有该键,并请求该值。这意味着您向任何节点发送请求,这将在分区表中查找密钥所属的分区,并将查询转发到相关节点

在第二个用例中,您尝试从所有节点获取所有密钥:

Set keys = map.keySet();
Iterator iterator = keys.iterator();
while (iterator.hasNext()) {
    // doing stuff
}
为了尽可能快地返回,Hazelcast将返回
迭代器的延迟实现。对于每次调用
next()
,它首先需要按照上述过程检索密钥。另外,我假设
//doing stuff
代码实际上从键加载值


总之,请不惜一切代价避免使用
map.keySet()
。除非我对您的上下文和用例了解更多,否则很遗憾,我无法提供相关的替代方案。

最后,我通过一些调整获得了性能。我有通用代码将数据放入缓存并从缓存中访问数据。我所做的是在将数据放入最终地图之前,我又添加了一个伪键“ALL”。所以,当我的数据被访问时,我总是从所有键中检索数据,然后对其进行迭代。虽然这不是一个合适的解决方案,但却节省了很多努力。将此作为答案发布,可能对其他处于相同情况的人有用


感谢大家抽出时间帮助我找到可能的选项。

您能尝试启动多个Hazelcast成员作为服务器部件,并检查问题是否仍然存在吗?谢谢您的建议。尝试使用3、4和5名Hazelcast成员作为服务器,但无法实现我想要的TPS。这与单吊舱的情况基本相同。是//在这个块中执行操作时,我访问缓存中每个项的值。有些缓存我无法通过它的键访问,必须迭代所有值,直到找到匹配项。帮助我帮助你:请提供更多上下文。否则,另一种选择很有可能解决您的问题。为什么不能通过密钥访问缓存?您是否看到所有Hazelcast服务器都成功连接并组成集群?您可以从任何服务器日志中的成员列表中确认这一点。随后,您还可以确认您的客户机连接到群集中的所有服务器吗?同样,您可以在客户端的控制台日志中检查此项。@Nicolas例如,我有一个名为STAFF_cache的缓存,此缓存包含键作为STAFF Id,现在我的所有API都可以接受STAFF username或STAFF Id作为输入参数。若在API中我传递了员工ID,我可以通过密钥直接访问,若传递了用户名,那个么我需要迭代缓存来查找我的员工。有很多类似的场景。我不想创建另一个以密钥作为工作人员用户名和重复数据的缓存。@wildnez是的,我可以在日志和管理中心中看到所有客户端成员都已连接。此外,所有Hazelcast服务器也在集群中,通过Hazelcast日志进行验证。
<?xml version="1.0" encoding="UTF-8"?>

<hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.11.xsd"
           xmlns="http://www.hazelcast.com/schema/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <management-center enabled="${hazelcast.mancenter.enabled}">${hazelcast.mancenter.url}</management-center>

</hazelcast>
Set keys = map.keySet();
Iterator iterator = keys.iterator();
while (iterator.hasNext()) {
    // doing stuff
}