如何高效地将对象添加到hazelcast中的分布式队列中?

时间:2019-06-15 18:30:31

标签: java networking distributed-computing hazelcast

当队列存储在与执行代码的那个节点不同的节点上(并且设置为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>

1 个答案:

答案 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中。