Usiamo Storm con il becco Kafka. Quando falliamo i messaggi, vorremmo rieseguirli, ma in alcuni casi dati errati o errori di codice faranno sì che i messaggi falliscano sempre in un Bolt, quindi entreremo in un ciclo di riproduzione infinito. Ovviamente stiamo correggendo gli errori quando li troviamo, ma vorremmo che la nostra topologia fosse generalmente tollerante ai guasti. Come possiamo ack() una tupla dopo che è stata riprodotta più di N volte?Numero massimo di ripetizioni della tupla su Storm Kafka Spout
Guardando attraverso il codice per il Kafka becco, vedo che è stato progettato per riprovare con un esponenziale backoff timer e la comments on the PR Stato:
"Il becco non termina il ciclo di tentativi (è mia convinzione che non dovrebbe farlo, perché non può riportare il contesto sull'errore che è accaduto per abortire il reqeust), gestisce solo il ritardo dei tentativi. Un bullone nella topologia dovrebbe ancora chiamare ack() invece di fail() per fermarsi il ciclo."
Ho visto risposte StackOverflow che raccomandano di scrivere un beccuccio personalizzato, ma preferirei non rimanere bloccato mantenendo una patch personalizzata degli interni del becco Kafka se c'è un modo consigliato di farlo in un bullone.
Qual è il modo giusto per farlo in un bullone? Non vedo nessuno stato nella tupla che espone quante volte è stato riprodotto.
Se si verifica un errore nel bullone in cui è possibile concludere che la particolare tupla è "cattiva" secondo la logica aziendale, è possibile "ack" invece di non riuscire .... quindi non verrà riprodotto .. ... –