Мы пытаемся использовать Hazelcast в качестве распределенного кеша в нашем приложении. Вот наш конфиг:
<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">
<group>
<name>sample_dev</name>
<password>dev@123</password>
</group>
<management-center enabled="false">http://localhost:8080/mancenter</management-center>
<properties>
<property name="hazelcast.logging.type">slf4j</property>
<property name="hazelcast.socket.bind.any">false</property>
</properties>
<serialization>
<serializers>
<global-serializer override-java-serialization="true">com.prasanth.common.KryoSerializer</global-serializer>
</serializers>
</serialization>
<network>
<join>
<multicast enabled="false"/>
<tcp-ip enabled="true">
<member-list>
<member>127.0.0.1:5701</member>
</member-list>
</tcp-ip>
</join>
<interfaces enabled="false">
<interface>192.168.3.*</interface>
</interfaces>
</network>
<map name="com.prasanth.cache.CachedAsset">
<in-memory-format>BINARY</in-memory-format>
<backup-count>1</backup-count>
<async-backup-count>1</async-backup-count>
<time-to-live-seconds>86400</time-to-live-seconds>
<max-idle-seconds>1200</max-idle-seconds>
<eviction-policy>LRU</eviction-policy>
<max-size policy="PER_NODE">4500</max-size>
<merge-policy>com.hazelcast.map.merge.LatestUpdateMapMergePolicy</merge-policy>
<!--<read-backup-data>true</read-backup-data>-->
<near-cache>
<in-memory-format>OBJECT</in-memory-format>
<cache-local-entries>true</cache-local-entries>
<time-to-live-seconds>86400</time-to-live-seconds>
<max-idle-seconds>1200</max-idle-seconds>
<invalidate-on-change>true</invalidate-on-change>
</near-cache>
</map>
</hazelcast>
Из документации я вижу, что каждый раз, когда делается вызов Hazelcast, происходит десериализация. Следовательно, чтобы оптимизировать вызовы, мы использовали Kryo в качестве сериализатора по умолчанию и внедрили почти кэш. Мы должны поместить объекты размером 500 КБ каждый в карту, и у нас может быть около 400-500 таких активных объектов в памяти. Мы очень часто используем кеш в приложении.
Раньше мы использовали EhCache с JGroups, сконфигурированными для реализации кэша. Операции прошли намного быстрее. Но когда мы попробовали использовать Hazelcast, я увидел существенную разницу во времени работы. Я могу понять, что Hazelcast — это больше, чем реализация кеша. Но просто интересно, почему операции стали очень медленными по сравнению с EhCache (с jgroups). Что-то не так с нашей конфигурацией? Пожалуйста, предложите!
Также обратите внимание, что я тестирую это на машине с одним узлом.