나는 수천 개의 소스로부터 이벤트를 받고있는이 시나리오를 가지고있다. 각 소스는 현재 상태에 대한 정보를 전송합니다. 모든 이벤트를 처리하고 싶지만 각 소스의 최신 이벤트를 먼저 처리하여 현재보기가 최신 상태인지 확인하는 것이 더 중요합니다. 그래서 ConcurrentHashMap
을 각 소스의 식별자를 키로 사용하고 LIFO 대기열 (스택)을 값으로 사용하려고 생각했습니다. 그런 다음 Map
의 키를 반복하고 각 소스의 스택에서 한 항목 만 팝합니다.다수의 생산자 키로부터 공정한 dequeing을 가진 큐
키를 반복하고 각 키의 큐에서 항목을 가져 오는 동안 제작자가 대기열에 새 이벤트를 게시하여 잠재적으로 동시성 문제가 발생할 수 있다는 점이 걱정됩니다. 제작자는지도에 새 키를 추가 할 수도 있으며 Map
의 entrySet
을 반복하여 약하게 일치하는 것으로 보입니다. 새 항목이 후속 반복에서 처리되므로 큰 문제는 아닙니다. 이상적으로는 프로세스 속도를 높이기 위해 entrySet
스트림에서 일부 병렬 처리를 사용할 수도 있습니다.
더 깨끗한 접근 방법이 있는지 궁금합니다. 실제로 LIFO BlockingDequeue
을 사용하여 최신 이벤트를 처리 할 수 있었지만이 접근법의 문제점은 한 소스가 다른 이벤트보다 많은 이벤트를 보낼 수 있으므로 다른 이벤트보다 많은 이벤트가 처리 될 위험이 있다는 것입니다.
이러한 종류의 동작을 제공하는 다른 데이터 구조가 있습니까? 본질적으로 내가 찾고있는 것은 각 소스의 이벤트에 우선 순위를 부여하는 동시에 소비자가 처리 할 각 소스에 대한 공정한 기회를 제공하는 방법입니다.
이것은 흥미 롭습니다. 그러나 문제는 특정 소스에 들어올 때 스택 (LIFO 대기열)에 새 이벤트를 추가 할 수 있어야한다는 것입니다. 즉, 대기열에서 해당 스택을 찾아야합니다. 원본의 LIFO 큐에 소스 키를 매핑하는 추가'ConcurrentHashMap '을 사용하여이 문제를 해결할 수있을 것이라고 생각합니다. –
jbx
예, 소스가 이벤트를 넣을 위치를 모르는 경우 HashMap이 수행해야합니다. – Vampire
그래, 그래서 내가 쌓아 올리려는 것은 외부에서 Queue처럼 보이고 그냥 추가하고 제거하는 데이터 구조이지만, 내부적으로는 그에 따라 우선 순위 지정의 논리를하고있다. 귀하의 제안을 해시 맵과 결합 해 보겠습니다. – jbx