2017-12-27 30 views
1

업데이트 : 한마디로자바 중첩 된 큐

, 내가 서비스에 대한 사용자의 메시지를 보내는 큐가 있습니다. 그러나 하나의 서비스가 1000s의 메시지를 받으면 큐보다 이 우세합니다. 큐가 비게 될 때까지 다른 서비스는 메시지를받지 못합니다. 이 접근 방법에 대한 해결책이 필요합니다.

BlockingQueue 's에 문제가 있습니다. 내가 그들에게 메시지를 전달할 책임이있는 100 개의 외부 서비스가 사용자로부터 나온다고 가정 해 보겠습니다.

사용자 -> 저 -> 제 3 자.

내 응용 프로그램에 대기열을 사용하고 있습니다. 타사 서비스 중 하나를 사용할 수없는 경우 문제가 발생합니다.

  • 사용자가 제 3 자에게 보낸 메시지가 있습니다. Q1과 같은 대기열에 저장하십시오.
  • 대기열을 소비하고 타사 서비스를 식별하여 해당 타사에 보냅니다.
  • 타사 중 하나가 응답하지 않고 시간이 초과되었습니다.
  • DB에 배달 할 수없는 메시지를 저장합니다.
  • DB에서 배달되지 않은 메시지를 정기적으로 받아 내 Q1에 넣으십시오. 그 제 3 자 트래픽을 많이 들어갔을 경우
  • 는 5000 다른 서비스의 비보다 내 큐를 채우고 메시지 큐가 비워 질 때까지 나로부터 메시지를받을 말할 수 있습니다. 하지만이 대기열이 비어 있으면 DB에서 메시지를 다시 가져 와서 대기열에 넣을 것이므로 다른 서비스는 다시 차단됩니다. 내가 지금까지 생각

Solutiouns :

  • 서비스 아이디의에 의해 중첩 된 큐를 사용하여, 그래서 난 5000 메시지를 한 번에 서비스를 차단 시간은 큐에서 메시지를 5000없이 DB에 저장 식별 (5 월

(중첩 된 동시 큐 (BlockingQueue를 사용함)를 사용하는 것이 얼마나 효율적입니까? 아니면이 시나리오에서 더 나은 솔루션을 생각하십니까? 기본적으로 나는 내 대기열을 지배하는 제 3자를 내버려 두지 않기를 원합니다. 그리고 그 대기열을 분리하는 영리한 방법이 필요합니다. 수천 개의 대기열이있을 수 있으므로 각 대기열을 만들면 비효율적 일 수 있습니다.

+0

RxJava와 같은 반응 프레임 워크를 사용 해본 적이 있습니까? –

+0

시간이 초과 된 항목을 어떻게 든 표시 할 수 있으며 시간이 갈수록 대기열에 다시 넣지 않아도됩니다. 두 번째로 10 초, 20 초, 40 초, 1 초, 2 초 등으로 5 초 후에 만 ​​다시 시작한다고 가정 해보십시오. 당신은 아이디어를 얻습니다. 시스템을 유휴 상태로 만들지 않으려면 큐가 비어 있으면 위의 내용을 무시하십시오. –

+0

RxJava를 먼저 연구해야합니다. 제안 해 주셔서 감사합니다. 나는 이미 시간 초과 된 맵을 가지고 있는데, 만약 X 개의 메시지가 새로운 메시지보다 시간 초과 되었다면, Y는 큐 대신 DB에 쓰여지고 Z 시간 동안 차단 될 것입니다. 새로운 메시지가 Z + 1 번까지 차단되는 것보다 여전히 차단 된 경우 Z 시간이 지나면 차단됩니다.하지만 반대쪽에서는 서비스가 DB에서 처리 대기중인 메시지를 많이받습니다. 이러한 메시지가 처리 될 DB에서 검색되면 내 대기열이 다시 차단됩니다. – cmlonder

답변

0

모든 타사 서비스에 대한 메시지를 보관하는 단일 BlockingQueue를 사용하는 것으로 보입니다. 대신

,이 각각의 제 3 자 서비스 대신 큐에 추가로, 사용자로부터 메시지를받을 때

  • , 식별 제 3 자 서비스에 대한

    • 를 사용하여 별도의 차단의 대기열 및 대기열 소비자 그에 따라 제 3 자 서비스 특정 차단 대기열에 메시지를 추가합니다.