2017-04-27 5 views
0

Hazelcast를 사용하면 소비자가 세계의 현재 상태 (현재 현재지도에있는 것)에 대해 알고 싶어하며 그 사이에 아무 것도 잃지 않는 일반적인 시나리오가 있다고 상상해 봅니다. 리스너가있는 세계의 HazelCast지도

는 Hazelcast 맵이 리스너에서 소비자가 (아마도 수신을 통해) 스트리밍하고자하는 데이터의 일부 다양한 현재 상태 및 다음의 최신 소식을 들고 시나리오를 상상해보십시오.

이 API

우리가 업데이트에 대한 리스너를 추가하고 보통 인 ConcurrentMap로지도를 치료하는 것이 좋습니다. 그러나 Map을 열거하는 동안 청취자를 통해 업데이트가 들어올 수 있으므로 올바른 항목 순서를 보장하는 것은 어렵습니다.

우리는지도 열거와 청취자 사이에 잠금 장치를 공유 할 수 있지만 그 코드 냄새가 조금 보인다. 우리가 SoTW 다음 업데이트를 스트리밍하려면

그래서 일반적으로 내 질문에 우리가이 작업을 수행 할 수있는 방법이다? 우리를 도울 수있는 Hazelcast에 내장 된 것이 있습니까?

도움 모든

+0

이것은 http://stackoverflow.com/questions/29304623/hazelcast-map-listener-with-replay와 비슷합니다. –

답변

0

먼저 주셔서 감사합니다, 나는 그냥 불행하게도 설명 추측,지도에는 순서가 없습니다!

제 물건은 Hazelcast지도 비 스냅 숏, 비 지속 데이터 구조이다. ConcurrentHashMap와 마찬가지로 데이터 구조의 변경 사항은 반복자에 반영되며 그 반대의 경우도 마찬가지입니다.

이벤트는, 다른 측면에서, 이벤트가 비동기 적으로 전달 특히 이후, 완전히 독립적 인 시스템이다. 따라서 iterator를 같은 요소 나 다른 라운드로 향상시키기 전에 이벤트가 실제로 도착할 수도 있습니다.

더 나은 보증이 필요한 경우 먼저 반복하고 수신기를 추가하고 처음 실행 시작과 놓친 이벤트 사이에 변경 사항을 적용합니다 (두 번째 반복에서 델타를 수행해야합니다). 실제로 그것을 처리하는 좋은 방법은 아니지만 다른 방법이 있다고 생각하지 않습니다.

+0

감사합니다. @noctarius. Map의 순서에 관해서는, 나는 상관하지 않지만 열거 형의 순서이며 업데이트됩니다. 좋은 보증이 초기 열거 주위에 잠금을 가지고 있으며 또한 이벤트를 잠글 수 있는지 궁금하네요. 최소한 –

+0

뒤에 막혀 있습니다. 이벤트를 잃어 버릴 수있는 이벤트 스레드를 차단해야합니다. 가장 좋은 방법은지도를 처음 읽는 동안 들어오는 모든 이벤트를 수집하고 초기 읽기가 완료된 후 모든 이벤트를 재생하는 것입니다. 즉, 일부 업데이트는 "중복"일 수 있지만 최종 상태는 동일합니다. – noctarius

+0

차단하면 이벤트가 "대기해야"합니다. 두 번째 제안은 우리가 해낸 것입니다. :) –