2017-11-29 48 views
0

구독자가 제작자보다 느린 시스템을 설계해야합니다. 예산 제약으로 인해 MQ 솔루션을 사용할 수 없습니다. 제작자가 데이터를 대기열에 넣고 구독자가 특정 간격으로 폴링하는 메모리 내장 대기열을 사용할 수 있습니까? Java 7을 사용하여 구현하는 방법.Java 이벤트 기반 Pub/Sub 시스템 구독자가 제작자보다 느림

동일한 용도로 Google Guava EventBus를 사용할 수 있습니까?

예인 경우 솔루션 또는 다른 저가 솔루션을 구현하는 방법. 생산자 만 EventBus을 알고 소비자는 그것이 register를 호출 할 수 있도록 몇 가지 코드는 소비자와 EventBus을 모두 알고 있어야합니다 (@Subscribe에 의해 간접적으로 알 수 있도록

+1

BlockingQueue를 사용하여 역압을 적용하십시오. – Sneh

+0

좀 더 설명해 주시겠습니까? – Debopam

+0

Google Guava EventBus와 함께 사용할 수 있습니까? – Debopam

답변

0

EventBus, 시스템의 일부 디커플링에 대한 좋은).

이러한 디커플링이 필요할 수도 있고 필요하지 않을 수도 있습니다. EventBus은 동일한 스레드 (기본값)에서 동 기적으로 이벤트를 전달하거나 제공된 을 사용하여 이벤트를 전달할 수 있습니다. 구독자가 제작자의 작업 속도를 저하시키지 않으려면 비동기 버전을 사용할 수 있습니다.

생산자가 속도를 늦추지 않으려면 BlockingQueuejava.util.concurrent에서 사용할 수 있습니다. 배압을 적용하려면 LinkedBlockingQueueArrayBlockingQueue을 확인하십시오 (예 : 대기열이 커지면 생산량을 줄이십시오).

생산자와 고객 모두가 대기열을보아야하는 경우에는 EventBus이 필요하지 않습니다. 그렇게하면 제작자가 대기열을 채우는 스레드에 의해 구독 된 이벤트를 게시 할 수 있도록 예를 들어이를 사용할 수 있습니다. 또는 대기열을 폴링하고 버스에 게시하는 스레드가있을 수 있습니다.

또는 둘 모두를 사용하지만 과도하게 조작하지 마십시오. 단지 KISS입니다.

AFAICT, 올바른 메시지 큐는 단일 Java 프로세스 내부에서 작업 할 때 overkill입니다.

권장 사항을 얻으려면 자세한 내용을 추가해야합니다.

+0

제안 해 주셔서 감사합니다. 내 요구 사항은 제작자이며 가입자는 서로를 알지 않아야합니다. 주어진 입력 유형에 대해 여러 가입자가있을 수 있습니다. 제작자가 메시지를 푸시하고 구독자가 자신의 페이스에 따라 메시지를 하나씩 읽습니다. 다른 제안이 있으면 알려주십시오. Spring 4, Java 7 등을 사용하고 있습니다. – Debopam