Hazelcast Client - блокирана нишка

Сблъсквам се с проблем с увиснала нишка, използвайки 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