2009-06-16 6 views
0

비동기 큐 소비자 스레드에 대한 알고리즘을 조합하는 데 문제가 있습니다. 즉, 하나의 큐에서 항목을 읽음으로써 길게 수행해야하는 경우 적어도 몇 초 정도 작동해야합니다. 메시지 유형에 따라 처리 리소스가 다른 큐의 메시지 사용

는 근본적으로 볼 수있는 큐는 다음과 같다 : A, A, A, A, A, B, B, A, B, A, A, A, A, A, C, B, A.

예. A 메시지는 다른 메시지보다 훨씬 더 일반적입니다.

Google 시스템의 각 메시지 유형마다 다른 동시성 값이 있습니다 (예 : 한 번에 3 x A 메시지 만 실행할 수 있지만 5 x B 및 4 x C 메시지를 한 번에 실행할 수 있습니다.

현재의 (깨진) 알고리즘은 큐의 전면에서 단일 스레드를 읽고 각 작업의 본문을 실제 페이로드를 실행하기 전에 사용할 수있을만큼 충분한 리소스를 기다리는 상태로 각 작업을 스레드 풀로 디스패치하는 것입니다.

즉, 충분한 A 메시지가 먼저 도착하면 스레드 풀 대기열을 "채울"수 있으며 B + C 메시지는 필요한 것보다 훨씬 오래 지연됩니다.

지금까지 각 메시지 유형 (상당히 낮은 유형 수)에 대해 별도의 스레드 풀을 사용하는 것에 대해 생각해 보았습니다.하지만 많은 스레드를 유지하는 효율성에 대해 우려하고 있습니다.

내가 어떻게 개선 할 수 있을지에 대한 제안 사항이 있으십니까?

답변

4

단일 발송자가없는 이유는 메시지 유형을 기반으로하는 별도의 대기열로 발송해야하는 이유입니다. 따라서 총 4 명의 디스패처가 있고 첫 번째 메시지는 세 개의 다른 대기열로 메시지를 보냅니다.

그런 다음 독자적인 규칙에 따라 메시지를 큐에서 빼내는 별도의 큐 리더가 있습니다.

0

각 메시지 유형에 대해 별도의 스레드 풀을 사용하는 것이 나쁘지는 않습니다. 당신은 단순히 그것을하고 무슨 일이 일어나는가를보아야 할 것입니다.

대체 방법으로는 스레드 풀 주위에 래퍼를 만들고 우선 순위 큐 (http://en.wikipedia.org/wiki/Priority_queue)를 구현할 수 있습니다. 이 함축성은 특정 메시지에 우선 순위를 부여합니다. 귀하의 경우, C는 가장 보편적이지 않으므로 항상 C보다 우선 순위가 높습니다. 나는 당신이 요점을 얻은다고 생각합니다.

0

먼저 다음과 같은 가정이 유효합니까?

  • 이 작업이 실제로에서 실행 주문할 중요하지 않습니다.
  • 큐가 수행하는 작업을 기록 단지 메커니즘입니다.
  • 작업은 모두 독립적입니다.
  • 항상 처리 대기중인 여러 작업입니다.

이 경우 나는 이것이 작업장 예약 문제의 한 예라고 생각합니다. 나는 이것들이 보통 bin packing 알고리즘을 사용하여 모델링된다고 생각한다. 위의 주제들에 대한 구글 검색은 많은 참고 문헌을 찾는다.

귀하의 제약 조건이 너무 간단하기 때문에 배낭 포장 알고리즘이 배낭 포장보다 적합하다는 사실을 알 수 있습니다. 배낭 문제는 Google에 문의하십시오.

+0

* 특정 클래스의 작업을 순서대로 실행하는 것이 좋습니다. * 작업 대기열을 유지하기 위해 대기열이 예입니다. * 그 (것)들은입니다. * 항상 그렇지는 않지만 큐가 비어있을 수 있습니다. 적용되는 빈 포장에 대한 특정 링크가 있습니까? 나는 그 문제 영역에 대한 아이디어를 얻었고 그것이 어떻게 관련되어 있는지 보지 못한다고 확신한다. 감사! –

+0

주어진 시간에 실행할 작업 집합과이를 실행할 리소스가 있습니다. 각 작업에는 비용이 들며 초과하지 않고 실행중인 작업의 가치를 극대화 할 수있는 최상의 작업 집합을 실행하려고합니다 이용 가능한 자원. 배낭 문제는 값을 최대화하도록 작업 집합을 선택하는 방법을 보여줍니다. – Jackson