Kafka producteur TimeoutException: Expirant 1 dossier(s)
Je suis à l'aide de Kafka avec Printemps-boot:
Kafka Producteur de classe:
@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
Disons que j'ai envoyé 10 fois 1000 messages dans le sujet my-test-topic
.
8 fois sur 10 je suis avec succès, d'obtenir tous les messages dans ma consommation, mais parfois je suis en-dessous de erreur:
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
et 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
J'obtiens cette erreur sur le producteur
Donc, le lot est trop lent pour un "faible"
request.timeout.ms
. Essayez de faire batch-size
un peu plus basN'est pas de 30 secondes assez?( Je suis nouvelle de Kafka, s'il vous plaît garder avec moi)
Je ne sais pas, mais en fonction de votre erreur, vous êtes vraiment dépassant les 30 secondes:
due to 30024 ms has passed
OriginalL'auteur Prakash Pandey | 2017-10-09
Vous devez vous connecter pour publier un commentaire.
Il y a 3 possibilités:
request.timeout.ms
- c'est le temps que Kafka va attendre pour l'ensemble du lot pour être prêt dans le tampon. Donc, dans votre cas il y a moins de 100 000 messages dans la mémoire tampon, délai d'attente se produit. Plus d'infos ici: https://stackoverflow.com/a/34794261/2707179batch-size
liée au point précédent, il enverra les lots le plus souvent, mais ils comprennent de moins en moins de messages.linger.ms
. Selon la documentation, les lots sont envoyés après cette attarder le temps, même si le lot n'est pas complet, donc même avec une haute taille du lot, il ne devrait pas le temps.Après la lecture et la compréhension de ces deux articles: 1) stackoverflow.com/a/34794261/4038460 2) cloudera.com/documentation/kafka/latest/topics/... . J'ai senti que nous devrions augmenter lot de taille pour éviter de délai d'attente. Si l'on augmente batch-size -> Nombre de lots seront réduits -> Nombre de demandes de diminution -> le Temps pris pour envoyer des dossiers de baisse -> Délai d'attente ne se produisent pas fréquemment
OriginalL'auteur michalbrz
Donner
acks_config="1"
et il fonctionneraOriginalL'auteur user10254546