2017-05-23 2 views
0

저는 두 명의 구독자가있는 pub-sub 채널을 가진 스프링 통합 응용 프로그램을 가지고 있습니다. 하나는 Kafka에 메시지를 게시하고 다른 하나는 메시지를 파일에 씁니다. 문제는 파일에 메시지를 쓰는 서비스 활성자가 카프카에게 생산하는 다른 서비스 활성기의 속도를 따라갈 수 없다는 것입니다. 이로 인해 전체 메시지 처리 속도가 느려집니다. 이를 극복하기 위해 pub-sub 채널과 파일에 기록하는 service-activator 사이에 여분의 레이어를 추가했습니다. 트랜스포머는 아무것도하지 않지만 메시지를 소비하고 메시지를 파일 작성자가 소비하는 직접 채널에 넣습니다. 이 경우 성능이 향상되었지만 이것이 올바른 방법인지 궁금합니다. 아래의 샘플 구성 : 정말 당신의 설정에 의해 <queue> 때문에 모든버퍼링 스프링 통합 게시 - 구독 채널

<int:publish-subscribe-channel id="pschannel"/> 
<int:service-activator id="kafkaSA" ref="producer" input- channel="pschannel" method="publish"/> 
<int:transformer input-channel="pschannel" ref="dummytransformer" method="doNothing" output-channel="directChannel"/> 
<bean id="dummytransformer" class="org.test.DummyTransformer"/> 
<int:channel id="directChannel"> 
    <int:queue capacity="200000" /> 
<int:channel> 
<int:service-activator id="fileSA" ref="filewriter" input-channel="directChannel" method="publish" > 
    <int:poller max-messages-per-poll="10000" fixed-delay="100" /> 
</int:service-activator> 

답변

0

우선은하지 직접입니다.

글쎄, 이것은 정말로 한 가지 방법이며, 카프카 제작자 (첫 번째 구독자)를 차단하지 않아도됩니다. 그 directChannel에 소비자가 최고의 속도가 다른 장소에서 시차를 일으키지 않는 메시지를 처리합니다

<int:channel id="directChannel"> 
    <int:queue/> 
<int:channel> 
... 
<int:poller fixed-delay="100" /> 

이 방법 :

당신은 큐와 폴러에 대한 무한한 설정을 고려해야합니다.

배포를 수행하는 또 다른 방법은 publish-subscribe-channeltask-executor입니다. 모든 가입자는 하나의 스레드에서 실행됩니다.

그러나 그래, 당신은 항상 카프카와 그 파일 제작자 사이에 지체가있을 것이라는 점을 염두에 두어야합니다.

너는 DummyTransformer, BTW가 필요하지 않습니다. 이 문제에 대해서는 <bridge> 구성 요소가 있습니다. http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#bridge