2016-09-19 4 views
0

죄송합니다. 문제를 해결하기 전에 약간 설명해야합니다.신뢰할 수있는 메시지 전달

카프카 클라이언트 0.9.0.0을 사용하여 카프카 클러스터에 메시지를 보내고 있습니다. 이 시스템은 일종의 파이프 라인으로, JMS에서 메시지를 소비하여이를 Kafka로 보냅니다. 메시지 신뢰성을 보장하기 위해 JMS 확인 모드가 CLIENT_ACKNOWLEDGE로 설정되어 메시지가 소비되어 성공적으로 처리 될 때 응용 프로그램이 메시지 수신을 확인합니다.

메시지가 소비되면 메시지가 카프카에게 전송되며 이것이 문제의 원인입니다.

비동기 :

내가 비동기 콜백와 함께 보낼 카프카 생산을 사용할 수 있으며, 카프카에 메시지를 전송 오류가있을 경우,이 메시지를 확인하지 않도록 JMS 소비자를 알려 너무 늦을 것 소비. 이를 극복하기 위해 내가 생각해 낸 유일한 것은 예외가있을 경우 콜백의 메시지를 페리스트하고 나중에 메시지를 보내려는 것입니다. 하지만 너무 많은 오버 헤드가 될 것이라고 생각합니다.

비동기 호출을 사용하여이 상황을 처리 할 수있는 다른 방법이 있습니까?

동기 : 카프카에 메시지를 전송하고 수 있지만 어떤 문제가있을 경우

, 동기 호출을 사용 Producer.send()에 의해 반환되는 미래의 get()를 호출, 예외가 발생합니다 나중에 메시지를 확인하지 않고 나중에 다시 시도하도록 JMS 소비자에게 다시보고됩니다.

분명히 성능 저하가있을 것입니다. 이는 차단 호출이 될 것이고, 나쁜 부분은 카프카가 각 메시지를 확인하기 때문에 메시지의 일괄 처리가 없을 것이기 때문입니다.

추가 지속성을 원하지 않기 때문에 나는 동기 호출쪽으로 기울어 져있다.

동기화 호출을 사용할 수 있고 동기 호출의 영향을 최소화 할 수있는 방법이나 구성이 있습니까? 내가 만든 한 가지 구성은 JMS 소비자 풀을 갖는 것입니다.

답변

1

비동기 방법 :

유지하는 것보다 다른 방법은 없습니다. 당신은 성과를 내기 위해 상충 관계가 있습니다.

JMS로부터 메시지를 수신했습니다. 당신이 그것을 읽었다는 것을 인정했습니다. 카프카에서 주제를 푸시하려고 할 때 어떤 이유로 실패했습니다. 이것이 신뢰성을 가지려면 두 가지 일을해야합니다.

  1. 실패한 경우 kafka로 푸시하기위한 재 전달 메커니즘이 있습니다. 간헐적 인 문제를 해결할 수있는 다시 시도 메커니즘을 사용할 수 있습니다 (예 : 네트워크 중단)
  2. kafka 푸시가 실패한 경우 메시지를 보내는 kafka 또는 JMS에 오류 항목을 만듭니다. 오류 항목을 파이프 라인의 입력으로 다시 가져옵니다. 어떤 이유로 인해 푸시가 반복적으로 실패하는 경우 응용 프로그램에 과부하가 걸릴 수 있으므로 오류 항목에서 소비를 제한해야합니다.

이렇게하면 훨씬 신뢰할 수 있습니다.

동기 방법 :

나는 당신이이 경우에 성능을 개선 할 수있는 방법을 모르겠습니다. 응용 프로그램에서 성능이 문제가되지 않는다면이 방법이 가장 빠르고 쉬운 방법이기 때문에이 방법을 사용하는 것이 좋습니다.

콜백을 유지하면서 어떤 의미인지 잘 모르겠습니다. 메모리에 메시지를 저장한다는 의미 일 경우 앱이 종료되거나 어떤 이유로 중지되면 메시지를 잃어 버리는 것이 좋지 않습니다.

+0

콜백으로 지속하면 데이터베이스 또는 다른 카프카 주제와 같은 영구 저장소에 메시지를 저장하는 것이 좋습니다. –

관련 문제