복붙노트

[REDIS] 어떻게 모든 MQ 플랫폼에서 큐 분산이 하나의 동시성을 구현할 수있다?

REDIS

어떻게 모든 MQ 플랫폼에서 큐 분산이 하나의 동시성을 구현할 수있다?

나는 다음과 같은 특성을 필요로 큐의 특정 종류를 구현하기위한 해결책을 찾기 위해 투쟁 현재입니다 :

기본적으로 그것은 하나의 프로세스 FIFO 큐이며, 이는 곧 내가이 노동자로 확장, 그것은 단지이 경우 이후 일을하지 않는 등의 ActiveMQ 또는 RabbitMQ,하지만 같은 적격 심사 다른 메시지 큐 소프트웨어는 내가 그것을 할 때 내가 원하는 정확히입니다 확장하고 단일 프로세스 큐의 동일한 기능을 유지합니다. 아래 나는 여러 노동자와 분산 된 환경에서 작업하는 방법에 대한 설명을 첨부합니다.

같은 방법 토폴로지 외모의 예 : (주는 큐와 노동자 사이의 많은 관계로 많은 있다는)

이 실행됩니다 방법의 예 :

+------+-----------------+-----------------+-----------------+
| Step | Worker 1        | Worker 2        | Worker 3        |
+------+-----------------+-----------------+-----------------+
| 1    | Fetch Q/1/Job/1 | Fetch Q/2/Job/1 | Waiting         |
+------+-----------------+-----------------+-----------------+
| 2    | Running         | Running         | Waiting         |
+------+-----------------+-----------------+-----------------+
| 3    | Running         | Done Q/2/Job/1  | Fetch Q/2/Job/2 |
+------+-----------------+-----------------+-----------------+
| 4    | Done Q/1/Job/1  | Fetch Q/1/Job/2 | Running         |
+------+-----------------+-----------------+-----------------+
| 5    | Waiting         | Running         | Running         |
+------+-----------------+-----------------+-----------------+

아마이 가장 좋은 표현은 아니지만 그것도 큐 1, 큐 2, 그것을 보여, 거기에 더 많은 일자리, 그러나 노동자 3은 이전 마무리 될 때까지 다음 작업을 가져 오는 시작되지 않습니다.

이것은 내가 좋은 솔루션을 찾기 위해 투쟁하는 것이다.

나는 아폴로 ...이 날 대기열의 수천을 만들 수 rabbitMQ, ActiveMQ를, 같은 다른 솔루션을 많이 시도하지만, 그들 모두는 내가 큐의 다음 작업을 실행 노동자 3를 사용, 시도한다. 그리고 동시성은 노동자 당입니다

ZeroMQ 등 모든 MQ 플랫폼에서이 가능하게 할 수 거기 모든 솔루션, 예를 ActiveMQ를, RabbitMQ가 있습니까?

감사합니다 :)

해결법

  1. ==============================

    1.당신은 모든 근로자가 자신의 작업에 대해에 BRPOP 것을 추가 "파견"큐 레디 스 목록을 사용하여이 작업을 수행 할 수 있습니다. 디스패치 큐의 각 작업은 원래 큐 ID 태그, 및 작업자가 작업을 완료 할 때이 원래 대기열로 이동하고 수행하는 다른 근로자의 다음 작업이 가능하도록 디스패치 큐에 RPOPLPUSH된다. 디스패치 큐 따라서 num_queues 소자의 최대있을 것이다.

    당신은 모든 근로자가 자신의 작업에 대해에 BRPOP 것을 추가 "파견"큐 레디 스 목록을 사용하여이 작업을 수행 할 수 있습니다. 디스패치 큐의 각 작업은 원래 큐 ID 태그, 및 작업자가 작업을 완료 할 때이 원래 대기열로 이동하고 수행하는 다른 근로자의 다음 작업이 가능하도록 디스패치 큐에 RPOPLPUSH된다. 디스패치 큐 따라서 num_queues 소자의 최대있을 것이다.

    소스 큐가 비어있을 때 당신이 핸들해야 한 가지 디스패치 큐의 초기 인구입니다. 이것은 단지 초기에 설정하고, 또한 파견 원래 큐에 남아 아무것도 없다 작업자에 의해 설정된다 각 큐에 대해 "빈"플래그에 대해 게시자에 의해 수행 체크 될 수 있습니다. 이 플래그가 설정되어있는 경우, 게시자는 디스패치 큐에 직접 첫 번째 작업을 LPUSH 수 있습니다.

  2. from https://stackoverflow.com/questions/41979438/how-can-i-implement-this-single-concurrency-distributed-queue-in-any-mq-platform by cc-by-sa and MIT license