Jeśli publikuję kilka wiadomości z rzędu do klastra Kafka (przy użyciu new Producer API), otrzymuję od producenta Future
dla każdej wiadomości.Gwarantowana dostawa wielu wiadomości do klastra Kafka
Teraz, zakładając mam skonfigurowany mój producent mieć max.in.flight.requests.per.connection = 1
i retries > 0
mogę tylko czekać na ostatni przyszłości i mieć pewność, że wszystkie poprzednie zostały również dostarczone (w kolejności)? Czy muszę czekać na wszystkie kontrakty futures? W kodzie mogę zrobić:
Producer<String, String> producer = new KafkaProducer<>(myConfig);
Future<?> f = null;
for(MessageType message : messages){
f = producer.send(new ProducerRecord<String,String>("myTopic", message.getKey(), message.getValue());
}
try {
f.get();
} catch(ExecutionException e) {
//handle exception
}
zamiast tego:
Producer<String, String> producer = new KafkaProducer<>(myConfig);
List<Future<?>> futureList = new ArrayList<>();
for(MessageType message : messages){
futureList.add(producer.send(new ProducerRecord<String,String>("myTopic", message.getKey(), message.getValue()));
}
try {
for(Future<?> f : futureList) {
f.get();
}
} catch(ExecutionException e) {
//handle exception
}
i mieć pewność, że jeśli nic nie zostanie złapany tutaj (od pierwszego fragmentu):
try {
f.get();
} catch(ExecutionException e) {
następnie wszystkie moje wiadomości zostały zapisane w klastrze w zamów (bez względu na to, czy producent wykonał jakiekolwiek próby pod maską), a jeśli coś pójdzie nie tak, to dostanę tam wyjątek, nawet jeśli nie była to ostatnia przyszłość (na którą czekam), która pierwsza napotkała problem?
Czy są jeszcze jakieś dziwne przypadki narożne?
Jeśli przejrzysz tylko ostatnią przyszłość, nic nie powiesz o poprzednich żądaniach. Włączenie ponownych prób może spowodować zmianę kolejności komunikatów w przypadku awarii. – Sebastian
Jeśli mam max.in.flight.requests.per.connection = 1 to nie powinno zapobiegać zmianie kolejności wiadomości? Jeśli poprzednia partia zakończyła się niepowodzeniem, należy ją powtórzyć przed kontynuowaniem następnego, przynajmniej zgodnie z moją interpretacją. – Manjabes
Spowoduje to ponowienie, ale jeśli nadal nie powiedzie się 'n' razy (' n = numberOfRetries'), przechodzi do następnej wiadomości i potencjalnie pomyślnie ją wstawia. Aby poradzić sobie z tą sytuacją, musisz sprawdzić wynik każdej indywidualnej przyszłości. – Sebastian