Hazelcast: ฉันสามารถกำหนดค่า Map ต่อ JVM ได้หรือไม่

มีตัวเลือกบางอย่างใน Hazelcast เพื่อสร้างค่าแคชแผนที่ต่อโหนดและไม่จำลองสถานะของเขาหรือไม่ ฉันคิดว่านี่คือความแตกต่างระหว่าง getMap() และ getDistributedMap() แต่ดูเหมือนว่าทั้งสองจะถูกจำลองแบบระหว่างโหนด

ฉันมีแอปพลิเคชันในคลัสเตอร์ Weblogic การกำหนดค่าของฉันคือ:

<?xml version="1.0" encoding="UTF-8"?>
<hazelcast>
    <properties>
        <property name="hazelcast.logging.type">slf4j</property>
    </properties>
    <network>
        <port auto-increment="true">5107</port>
        <join>
            <multicast enabled="false" />
            <tcp-ip enabled="true">
                <members>127.0.0.1:5701, 127.0.0.2:5702</members>
            </tcp-ip>
        </join>
    </network>
    <map name="default">
        <time-to-live-seconds>1800</time-to-live-seconds>
        <backup-count>0</backup-count>
        <eviction-policy>LRU</eviction-policy>
    </map>
</hazelcast>

ในบันทึกฉันเห็นได้ว่าโหนดทั้งสองทำงานแล้ว

Members [2] {
        Member [127.0.0.1]:5107
        Member [127.0.0.1]:5108 this
}

เมื่อฉันเรียกใช้เมธอดของฉันในโหนดแรก ฉันจะเห็นว่ามีการเพิ่มแคชแล้ว

.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Hazelcast instance HazelcastInstance{name='my-instance', node=Address[127.0.0.1]:5107}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Cache map IMap{name='MY_APP.Cache.cacheName'}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - adding object in the cache with key 2342425

แต่ในโหนดที่สอง ฉันเห็นเฉพาะบันทึกชื่อแคช ดังนั้นจึงใช้แคชที่เพิ่มไว้แล้ว...

.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Hazelcast instance HazelcastInstance{name='my-instance', node=Address[127.0.0.1]:5108}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Cache map IMap{name='MY_APP.Cache.cacheName'}

ฉันขาดการกำหนดค่าบางอย่างหรือไม่? เป็นไปได้ไหมที่จะบรรลุผลสำเร็จด้วย Hazelcast?


person Community    schedule 01.04.2015    source แหล่งที่มา
comment
ทำไมคุณถึงต้องการใช้ Hazelcast สำหรับสิ่งนี้แทนที่จะเป็นแผนที่ Java ปกติ (หรือแคช Guava หรืออะไรที่คล้ายกัน)   -  person Mateusz Dymczyk    schedule 01.04.2015
comment
ข้อกำหนดคือต้องสามารถดำเนินการขับไล่แบบกระจายได้ แต่ไม่สามารถแชร์ข้อมูลแคชได้   -  person    schedule 01.04.2015
comment
ดังนั้นคุณต้องการที่จะวางสิ่งต่าง ๆ ไว้ในเครื่องเท่านั้น แต่เมื่อคุณขับไล่มันควรจะถูกไล่ออกบนโหนดทั้งหมด? นั่นฟังดูไม่เหมือนวิธีแก้ปัญหาที่โปร่งใสนัก อย่าคิดว่า Hazelcast รองรับสิ่งนั้น ลองเดาดูว่าคุณสามารถนำไปใช้งานได้อย่างง่ายดายโดยใช้ ITopic ของ Hazelcast เผยแพร่การขับไล่และมีผู้ฟังในแต่ละโหนด   -  person Mateusz Dymczyk    schedule 01.04.2015
comment
@MateuszDymczyk ใช่ฉันต้องการใช้เครือข่ายเพื่อดำเนินการเมื่อจำเป็นจริงๆเท่านั้น ฉันจะลองใช้ ITopic ขอบคุณ!   -  person    schedule 01.04.2015
comment
@ SérgioMichels บอกฉันทีว่าคุณจะกำหนดค่า slf4j ให้เข้าสู่ระบบในโหมด DEBUG ได้อย่างไร คุณสามารถดูที่นี่ stackoverflow.com/questions/30391834/ ได้ไหม   -  person VB_    schedule 22.05.2015


คำตอบ (1)


ดังที่ฉันได้กล่าวไว้ในความคิดเห็นเกี่ยวกับกรณีการใช้งานที่:

  • put(key, value) เพิ่มทูเพิลเฉพาะในเครื่องเท่านั้น
  • evict(key) ขับไล่มันออกจากแผนที่ทั้งหมด

ไม่โปร่งใสจริงๆ และฉันสงสัยว่า Hazelcast (หรือตารางในหน่วยความจำยอดนิยม) รองรับมันนอกกรอบ แต่สิ่งที่คุณสามารถทำได้คือใช้งาน pub-sub ที่ง่ายมากกับ Hazelcast ในแต่ละโหนด Hazelcast คุณเริ่มฟังหัวข้อ:

ITopic<String> eviction = hazelcast.getTopic("evict");
eviction.addMessageListener(new EvictionListener());

โดยที่ EvictionListener จะมีลักษณะดังนี้:

public class EvictionListener implements MessageListener<String> {

   @Override
   public void onMessage(Message<String> message) {
      // Gets the local (per JVM) cache and evicts an entry from it
      Cache.getCache().evict(message.getMessageObject());
   }
}

จากนั้นคุณสามารถใช้วิธีการขับไล่ของคุณเป็น:

public void evict(String key) {
    hazelcast.getTopic("evict").publish(key);
}

บางอย่างเช่นนี้ จากนั้นคุณต้องสร้างแคช (ดังที่ฉันพูดถึง Java Map แบบง่ายหรือแคช Guava) ต่อ JVM และใช้วิธีการขับไล่เพื่อขับไล่

person Mateusz Dymczyk    schedule 01.04.2015
comment
ขอบคุณ! ฉันจำได้ว่าการรวมระบบไฮเบอร์เนตจะสร้างแคชในเครื่อง อาจจะดำเนินการตามนั้นรวมกับคำแนะนำของคุณ - person ; 01.04.2015