web-dev-qa-db-ja.com

Kafka producer TimeoutException:Expiring 1 record(s)

私はKafkaをSpring-boot:で使用しています

Kafka Producerクラス

_@Service
public class MyKafkaProducer {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    private static Logger LOGGER = LoggerFactory.getLogger(NotificationDispatcherSender.class);

    // Send Message
    public void sendMessage(String topicName, String message) throws Exception {
        LOGGER.debug("========topic Name===== " + topicName + "=========message=======" + message);
        ListenableFuture<SendResult<String, String>> result = kafkaTemplate.send(topicName, message);
        result.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
            @Override
            public void onSuccess(SendResult<String, String> result) {
                LOGGER.debug("sent message='{}' with offset={}", message, result.getRecordMetadata().offset());
            }

            @Override
            public void onFailure(Throwable ex) {
                LOGGER.error(Constants.PRODUCER_MESSAGE_EXCEPTION.getValue() + " : " + ex.getMessage());
            }
        });
    }
}
_

Kafka-configuration:

_spring.kafka.producer.retries=0
spring.kafka.producer.batch-size=100000
spring.kafka.producer.request.timeout.ms=30000
spring.kafka.producer.linger.ms=10
spring.kafka.producer.acks=0
spring.kafka.producer.buffer-memory=33554432
spring.kafka.producer.max.block.ms=5000
spring.kafka.bootstrap-servers=192.168.1.161:9092,192.168.1.162:9093
_

トピック_my-test-topic_で1000回のメッセージを10回送信したとしましょう。

10回中8回は、コンシューマーですべてのメッセージを正常に取得していますが、時々これを取得していますerror

_2017-10-05 07:24:11, [ERROR] [my-service - LoggingProducerListener - onError:76] Exception thrown when sending a message with key='null' and payload='{"deviceType":"X","deviceKeys":[{"apiKey":"X-X-o"}],"devices...' to topic my-test-topic_

およびorg.Apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for my-test-topic-4 due to 30024 ms has passed since batch creation plus linger time

14
Prakash Pandey

3つの可能性があります。

  1. 増加する request.timeout.ms-これは、Kafkaがバッチ全体がバッファで準備できるのを待つ時間です。したがって、バッファ内のメッセージが100 000未満の場合、タイムアウトが発生します。詳細情報ここ: https://stackoverflow.com/a/34794261/2707179
  2. 減少batch-size-前のポイントに関連して、バッチをより頻繁に送信しますが、含まれるメッセージは少なくなります。
  3. メッセージサイズによっては、ネットワークが高負荷に追いつかない可能性がありますか?スループットがボトルネックになっていないか確認してください。
9
michalbrz

acks_config="1"そしてそれは動作します

1
user10254546