当队列存储在与执行代码的那个节点不同的节点上(并且设置为0时),在hazelcast中将项目添加到分布式队列中的速度非常慢(读取:66个项目/秒;这正常吗?)在此队列的配置中)。有什么方法可以从所有者节点添加项目?我使用Hazelcast的方法有什么根本的错误吗?
此操作大约需要15秒:
public static void main(String[] args) throws ExecutionException {
HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
IQueue<String> configs = hazelcastInstance.getQueue("configs");
for(int i = 0; i<1000;i++) {
configs.add("Some string"+i);
}
}
更改值和在配置中(请参见下文)对执行速度没有任何影响。我假设增加将阻止插入操作,而增加将不会(实际上,循环应像#add操作在本地队列中一样快地运行)。但是,执行for循环的时间相同。即使我将两个值都设置为0。我是否缺少某些东西?
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast xsi:schemaLocation=
"http://www.hazelcast.com/schema/config hazelcast-config-3.7.xsd"
xmlns="http://www.hazelcast.com/schema/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<network>
<port auto-increment="true" port-count="20">5701</port>
<join>
<multicast enabled="false">
</multicast>
<tcp-ip enabled="true">
<member>172.105.66.xx</member>
</tcp-ip>
</join>
</network>
<queue name="configs">
<statistics-enabled>false</statistics-enabled>
<max-size>0</max-size>
<backup-count>0</backup-count>
<async-backup-count>1</async-backup-count>
<empty-queue-ttl>-1</empty-queue-ttl>
</queue>
</hazelcast>
答案 0 :(得分:2)
有几种方法可以优化队列。队列可以二进制或对象形式存储您的条目。最重要的是,您可以定义备份数量,备份越多,速度越慢。默认的复制备份数为1。这意味着对于每个pu,除了put之外,您还将有一个复制。使用二进制形式的条目存储时,可能最大程度地提高性能的是序列化。 Java序列化非常慢。改用DataSerializeable或IdentifiedDataserializeable。
对于某些慢速网络,您还需要检查网络延迟,而仅用于1000次插入的网络通信才需要1-2MS延迟,这将是1000-2000毫秒,这仅是1-2秒的网络等待时间。
对于批处理,只要插入顺序不重要,就可以并行执行插入操作。
并且Queue可以具有异步备份,这将再次提高性能。
更新:
在应用程序的正常运行期间,您几乎不会遇到一个单一的场景。因此,不要一一插入这1000个值,请执行以下操作:
列表arrayList = new ArrayList();
for(int i=0;i<1000;++i) {
arrayList.add("myString " + i);
}
arrayList.paralelstream().forEach(t->configs.put(t));
现在您要插入paralel中。