Клиент Hazelcast — зависший поток

Я столкнулся с проблемой зависания потока, используя Hazelcast 3.5.1.

Мои приложения будут запускаться, а затем молча перестанут работать.

Похоже, у меня есть несколько застрявших потоков в клиенте HZ.

Трассировка клиента

State:TIMED_WAITING
Priority:5
java.lang.Object.wait(Native Method)
com.hazelcast.client.spi.impl.ClientInvocationFuture.get(ClientInvocationFuture.java:104)
com.hazelcast.client.spi.impl.ClientInvocationFuture.get(ClientInvocationFuture.java:89)
com.hazelcast.client.spi.ClientProxy.invoke(ClientProxy.java:130)
com.hazelcast.client.proxy.ClientMapProxy.get(ClientMapProxy.java:197)

Ошибка сервера

    [ERROR] [2015-07-29 18:20:12,812] [hz._hzInstance_1_dev.partition-operation.thread-0] [][c.h.m.i.o.GetOperation] [[198.47.158.82]:5900 [dev] [3.5.1] io.protostuff.UninitializedMessageException]
com.hazelcast.nio.serialization.HazelcastSerializationException: io.protostuff.UninitializedMessageException
at com.hazelcast.nio.serialization.SerializationServiceImpl.handleException(SerializationServiceImpl.java:380) ~[hazelcast-3.5.1.jar:3.5.1]
at com.hazelcast.nio.serialization.SerializationServiceImpl.toData(SerializationServiceImpl.java:235) ~[hazelcast-3.5.1.jar:3.5.1]
at com.hazelcast.map.impl.record.DataRecordFactory.newRecord(DataRecordFactory.java:47) ~[hazelcast-3.5.1.jar:3.5.1]

Конфигурация клиента

public ClientConfig config() {
    final ClientConfig config = new ClientConfig();
    config.setExecutorPoolSize(100);
    setupLoggingConfig(config);
    setupNetworkConfig(config);
    setupGroupConfig(config);
    setupSerializationConfig(config);
    setupAdvancedConfig(config);
    return config;
}

private void setupAdvancedConfig(final ClientConfig config) {
    config.setProperty(GroupProperties.PROP_OPERATION_CALL_TIMEOUT_MILLIS, String.valueOf(5000));
}

private void setupLoggingConfig(final ClientConfig config) {
    config.setProperty("hazelcast.logging.type", "slf4j");
}

private void setupNetworkConfig(final ClientConfig config) {
    final ClientNetworkConfig networkConfig = config.getNetworkConfig();

    networkConfig.setConnectionTimeout(1000);
    networkConfig.setConnectionAttemptPeriod(3000);
    networkConfig.setConnectionAttemptLimit(2);
    networkConfig.setRedoOperation(true);
    networkConfig.setSmartRouting(true);
    setupNetworkSocketConfig(networkConfig);
}

private void setupNetworkSocketConfig(final ClientNetworkConfig networkConfig) {
    final SocketOptions socketOptions = networkConfig.getSocketOptions();
    socketOptions.setKeepAlive(false);
    socketOptions.setBufferSize(32);
    socketOptions.setLingerSeconds(3);
    socketOptions.setReuseAddress(false);
    socketOptions.setTcpNoDelay(false);
}

Конфигурация сервера

private void init(final Config config) {
    setupExecutorConfig(config);
    setupLoggingConfig(config);
    setupMapConfigs(config);
    setupNetworkConfig(config);
    setupGroupConfig(config);
    setupAdvancedConfig(config);
    setupSerializationConfig(config);
}

private void setupAdvancedConfig(final Config config) {
    config.setProperty(GroupProperties.PROP_OPERATION_CALL_TIMEOUT_MILLIS, String.valueOf(5000));
}

private void setupExecutorConfig(final Config config) {
    final ExecutorConfig executorConfig = new ExecutorConfig();
    executorConfig.setPoolSize(300);
    config.addExecutorConfig(executorConfig);

}

private void setupLoggingConfig(final Config config) {
    config.setProperty("hazelcast.logging.type", "slf4j");
}

private void setupNetworkConfig(final Config config) {
    final NetworkConfig networkCfg = config.getNetworkConfig();
    networkCfg.setPort(5900);
    networkCfg.setPortAutoIncrement(false);

    final JoinConfig join = networkCfg.getJoin();
    join.getMulticastConfig().setEnabled(false);
    for (final String server : getServers()) {
        join.getTcpIpConfig().addMember(server);
    }
}

private String[] getServers() {
    return PROPS.getProperty("store.servers").split(",");
}

private void setupMapConfigs(final Config config) {
    setupMapConfigXXX(config);
}

private void setupMapConfigXXX(final Config config) {
    final MapConfig mapConfig = setupMapConfigByName(config, XXX.class.getName());
    setupMapStoreConfigDummy(mapConfig);
    setupEvictionPolicy(mapConfig);
}


private void setupMapStoreConfigDummy(final MapConfig mapConfig) {
    final MapStoreConfig mapStoreConfig = new MapStoreConfig();
    mapStoreConfig.setClassName(DummyStore.class.getName()).setEnabled(true);
    mapConfig.setMapStoreConfig(mapStoreConfig);
}

private void setupEvictionPolicy(final MapConfig mapConfig) {
    mapConfig.setEvictionPolicy(EvictionPolicy.LFU);
    mapConfig.setMaxSizeConfig(oneGBSize());
}

private MapConfig setupMapConfigByName(final Config config, final String mapName) {
    final MapConfig mapConfig = new MapConfig();
    mapConfig.setName(mapName);
    mapConfig.setBackupCount(1);

    final NearCacheConfig nearCacheConfig = new NearCacheConfig();
    nearCacheConfig.setMaxSize(1000).setMaxIdleSeconds(300).setTimeToLiveSeconds(300);
    mapConfig.setNearCacheConfig(nearCacheConfig);

    config.addMapConfig(mapConfig);

    return mapConfig;
}

private MaxSizeConfig oneGBSize() {
    final MaxSizeConfig config = new MaxSizeConfig();
    config.setMaxSizePolicy(MaxSizePolicy.USED_HEAP_SIZE);
    config.setSize(1024);
    return config;
}

Я бы ожидал, что клиент истечет тайм-аут, но, похоже, этого не происходит.


person Shaun Thompson    schedule 30.07.2015    source источник


Ответы (1)


Я считаю, что вы должны настроить тайм-аут на стороне клиента через свойство ClientProperties.PROP_INVOCATION_TIMEOUT_SECONDS

Однако это всего лишь пластырь. Вы должны выяснить настоящую основную причину сбоя вашей сериализации.

person Jaromir Hamala    schedule 31.07.2015
comment
Согласен, и я сделал это с тех пор, как опубликовал это. Я попробую установить это и посмотреть, смогу ли я воспроизвести проблему. - person Shaun Thompson; 31.07.2015