У меня есть около 200 тысяч записей для хранения. Я реализовал Java-клиент для поиска записей с карты hazelcast. Я не получаю результат поиска в ожидаемое время.
Как только я делаю запрос Hazelcast Like или In, он занимает от 400 до 500 мс.
Можно ли изменить конфигурацию на стороне клиента и сервера, чтобы улучшить эту пропускную способность?
Я сохранил информацию о Java Bean внутри Map с ключом-значением. Я также создал индекс по одному полю. Также реализован механизм сериализации идентификаторов.
Конфигурация на стороне сервера (используется файл XML для настройки сервера):
<map name="app-data">
<in-memory-format>BINARY</in-memory-format>
<statistics-enabled>false</statistics-enabled>
<optimize-queries>false</optimize-queries>
<cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
<backup-count>0</backup-count>
<async-backup-count>0</async-backup-count>
<time-to-live-seconds>0</time-to-live-seconds>
<max-idle-seconds>0</max-idle-seconds>
<eviction-policy>NONE</eviction-policy>
<max-size policy="PER_NODE">2147483647</max-size>
<eviction-percentage>25</eviction-percentage>
<min-eviction-check-millis>100</min-eviction-check-millis>
<merge-policy batch-size="100">com.hazelcast.map.merge.LatestUpdateMapMergePolicy</merge-policy>
<read-backup-data>false</read-backup-data>
<hot-restart enabled="false">
<fsync>false</fsync>
</hot-restart>
<map-store enabled="false" initial-mode="LAZY">
<write-delay-seconds>0</write-delay-seconds>
<write-batch-size>1</write-batch-size>
</map-store>
<indexes>
<index ordered="true">index</index>
</indexes>
</map>
<data-serializable-factories>
<data-serializable-factory factory-id="1">com.tmobile.services.cacheserver.config.hazelcast.cache.serialization.CacheServerDataSerializableFactory</data-serializable-factory>
Код клиента:
ClientConfig config = new ClientConfig();
config.getSerializationConfig()
.addDataSerializableFactory(
CacheServerDataSerializableFactory.FACTORY_ID,
new CacheServerDataSerializableFactory());
config.getNetworkConfig().setAddresses(addresses).setConnectionAttemptPeriod(3000)
.getSocketOptions().setBufferSize(256 * SocketOptions.KILO_BYTE);
HazelcastInstance hazelcastInstance = HazelcastClient.newHazelcastClient(config);
return hazelcastInstance;
Я использовал версию Hazelcast как 3.11.
Ниже представлен объект, который я использовал для хранения информации.
public class AppData implements IdentifiedDataSerializable {
private static final long serialVersionUID = 1L;
@JsonIgnore
private Long index = 0l;
private Integer appId = 0;
public void setIndex(Integer index) {
this.index = index;
}
public Integer getIndex() {
return this.index;
}
public void setAppId(Integer appId) {
this.appId = appId;
}
public Integer getAppId() {
return this.appId;
}
@Override
public final int hashCode() {
return Objects.hash(this.getAppId());
}
@Override
public void writeData(ObjectDataOutput out) throws IOException {
out.writeLong(index);
out.writeInt(appId);
}
@Override
public void readData(ObjectDataInput in) throws IOException {
this.index = in.readLong();
this.appId = in.readInt();
}
@Override
@JsonIgnore
public int getFactoryId() {
return CacheServerDataSerializableFactory.APP_DATE_FACTORY_TYPE;
}
@Override
@JsonIgnore
public int getId() {
return CacheServerDataSerializableFactory.APP_DATE_ID;
}
}
Я использовал ниже запрос / предикат для фильтрации данных.
Predicate pred = new InPredicate(attribute, (Comparable[]) ((List) filterValue).toArray(new String[0]));
Collection<Object> items = map.values(predicate);
<in-memory-format>OBJECT</in-memory-format>
? Это поможет некоторым запросам, но замедлитput()/get()
операции. - person Neil Stevenson   schedule 31.12.2018