Était passé par plusieurs postes, mais la plupart d'entre eux sont liés à la manipulation des messages mauvais pas la gestion des exceptions tout en leur traitement.
Je veux savoir à la façon de traiter les messages qui été reçus par l'application de cours d'eau et il y a une exception lors du traitement du message? L'exception pourrait être à cause de plusieurs raisons, comme l'insuffisance du réseau, etc. RuntimeException,
- Quelqu'un pourrait -il suggérer quelle est la bonne façon de le faire? Dois - je utiliser
setUncaughtExceptionHandler
? ou est - il un moyen de mieux? - Comment gérer retries?
Merci d'avance!!
cela dépend de ce que vous voulez faire avec des exceptions sur le côté producteur. si exception sera levée sur le producteur (par exemple en raison de l' échec du réseau ou d'un courtier kafka est mort), le flux va mourir par défaut. et kafka-Streams la version 1.1.0 , vous pouvez remplacer le comportement par défaut en mettant en place ProductionExceptionHandler
comme suit:
public class CustomProductionExceptionHandler implements ProductionExceptionHandler {
@Override
public ProductionExceptionHandlerResponse handle(final ProducerRecord<byte[], byte[]> record,
final Exception exception) {
log.error("Kafka message marked as processed although it failed. Message: [{}], destination topic: [{}]", new String(record.value()), record.topic(), exception);
return ProductionExceptionHandlerResponse.CONTINUE;
}
@Override
public void configure(final Map<String, ?> configs) {
}
}
de la méthode de la poignée , vous pouvez revenir soit CONTINUE
si vous ne voulez pas mourir cours d' eau en cas d' exception, le retour FAIL
au cas où vous voulez arrêts flux (FAIL est une valeur par défaut). et vous avez besoin de spécifier cette classe dans config flux:
default.production.exception.handler=com.example.CustomProductionExceptionHandler
Aussi faire attention que les ProductionExceptionHandler
poignées seules exceptions sur le producteur, et il ne sera pas gérer les exceptions au cours du traitement du message avec des méthodes de flux mapValues(..)
, filter(..)
, branch(..)
etc, vous devez envelopper ces logiques de méthode avec try / blocs catch (mettre toute votre logique de la méthode dans le bloc d'essayer de garantir que vous allez gérer tous les cas exceptionnels):
.filter((key, value) -> { try {..} catch (Exception e) {..} })
que je sache, nous ne devons gérer les exceptions sur le côté des consommateurs explicitement, comme les flux de kafka va réessayer plus tard automatiquement la consommation (sous forme de décalage ne seront pas modifiées jusqu'à ce que les messages seront consommés et transformés); par exemple si kafka courtier ne sera pas accessible pendant un certain temps, vous eu des exceptions de flux kafka, et quand brisé sera en place, le flux kafka consommera tous les messages. dans ce cas, nous aurons tout retard et rien corrompu / perdu.
avec setUncaughtExceptionHandler
vous ne serez pas en mesure de changer le comportement par défaut comme avec ProductionExceptionHandler
, avec elle , vous ne pouvez vous connecter message d'erreur ou envoyer dans le sujet de l' échec.