2017-09-22 4 views
0

카프카 메시징은 모든 메시지가 처리되도록하기 위해 최소 한 번만 메시지를 전달하며 다음 메시지를 전달할 메시지 오프셋을 사용합니다.Kafka 다중 소비자에서 한번만 메시지를 보내는 메시지

여러 소비자가있는 경우 치명적인 메시지가 메시지 처리 중에 소비자 충돌을 일으키는 경우이 메시지가 다른 소비자에게 재전송되고 사망자가 확산됩니까? 메시지가 단일 사용자를 차단하면 다른 고객이 계속 메시지를 처리하고 후속 메시지를 처리 ​​할 수 ​​있습니까? 심지어 더 나쁜 경우 메시지가 느리고 치명적인 메시지로 인해 소비자 충돌이 발생하면 다른 소비자가 오프셋에서 다시 시작하게됩니까?

답변

1

여기에서 고려해야 할 몇 가지가 있습니다

  1. 카프카 주제 파티션이 한 번에 소비자 그룹의 한 소비자가 소비 할 수있는가. 따라서 두 소비자가 서로 다른 두 그룹에 속해 있으면 같은 파티션에서 동시에 소비 할 수 있습니다.
  2. 저장된 오프셋은 소비자 그룹당입니다. 따라서 각 주제 파티션에는 해당 파티션을 구독하는 소비자가있는 각 활성 (또는 최근 활성화 된) 소비자 그룹에 대한 저장된 오프셋이 있습니다.
  3. 오프셋은 특정 간격으로 자동 커밋되거나 수동으로 커밋 될 수 있습니다 (소비자 응용 프로그램에서).

설명 된 시나리오를 살펴 보겠습니다.

  • 일부 치명적인 메시지가 메시지 처리시 소비자 충돌이 발생 오프셋 자동 최선을 다하고 있다면, 기회는 메시지의 처리가 실패하고 소비자 충돌 시간에 의해입니다
    • , 오프셋이 이미 최선을 다하고 있습니다 및 인수하는 그룹의 다음 소비자는 더 이상 그 메시지를 보지 못할 것입니다.
    • 처리가 완료된 후 오프셋을 수동으로 커밋하면 해당 메시지의 오프셋은 커밋되지 않습니다 (단순성을 위해 한 번에 하나의 메시지를 읽고 처리한다고 가정하지만이 작업은 쉽게 일반화 될 수 있습니다). 소비자 추락. 따라서 해당 주제에 등록 된 그룹의 다른 모든 소비자는 해당 파티션을 인수 한 후에 메시지를 다시 읽습니다. 그래서 그것은 다른 소비자들도 추락시킬 가능성이 있습니다. 메시지 처리 전에 오프셋이 커밋되면 첫 번째 소비자가 충돌했을 때 오프셋이 이미 커밋되어 있기 때문에 다음 소비자는 메시지를 볼 수 없습니다.
  • 하나의 소비자가 느린 메시지를 차단하는 경우 : 해당 사용자가 살아있는 것으로 간주되는 한 해당 그룹의 다른 소비자는 인계받지 않습니다. 둔화가 소비자의 session.timeout.ms을 넘어 서면 소비자는 죽은 것으로 간주되어 그룹에서 제거됩니다. 따라서 그룹의 다른 소비자가 오프셋을 적용하는 방법 /시기에 따라 메시지를 읽을 지 여부를 결정합니다.
  • 느리고 치명적인 메시지로 인해 소비자 충돌이 발생합니다.이 시나리오는 카프카가 처리하는 방식에서 이전 시나리오와 유사해야합니다. 느린 속도가 먼저 감지되거나 충돌이 먼저 발생합니다. 다시 중요한 것은 오프셋이 언제/어떻게 커밋되었는지입니다.

귀하의 질문에 도움이되기를 바랍니다.

+0

감사합니다. 가능한 한 빨리 오프셋을 적용해야한다는 의미입니까? –

+0

치명적인 메시지를 다시 처리하지 않으려면 메시지 처리를 시작하기 전에 오프셋을 적용 할 수 있습니다. 그러나 이것은 메시지 전달 의미를 "최대 한 번"으로 변경합니다. – vahid