Я столкнулся с проблемой возможного исключения idempotencyBreachException в службе, используемой прослушивателем Kafka.
Я не совсем уверен, как правильно справиться с этой ситуацией. У меня есть lockExecutor, который блокирует заданный идентификатор клиента и кеш, используемый в качестве идемпотентного репозитория. В 99,99% случаев все будет работать так, как ожидалось, но меня беспокоит сценарий, когда в конечном итоге возникает исключение IdempotencyBreachException и в базе данных сохраняются 2xdata. Должен ли я просто зарегистрировать ошибку и обработать ее вручную, когда она произойдет, или есть какой-то лучший способ справиться с ней?
Я рассматривал возможность использования @Retryable в методе обработки, но это создает проблему: ключ кэша уже использован, и я знаю, что не следует его удалять. Кроме того, меня беспокоит, как в этом контексте повторные попытки будут взаимодействовать с откатами, поскольку это будет параллельная обработка. На данный момент единственное решение, которое приходит на ум, — это зарегистрировать исключение и при необходимости обработать его вручную в будущем.
@Service
@RequiredArgsConstructor
public class ProcessingEventsServiceImpl {
private final IdempotencyRepository idempotencyRepository;
private final TransactionalService transactionalService;
private final LockExecutor lockExecutor;
public void process(InboundData inbound) {
final String key = inbound.getTransactionId();
final String customerId = inbound.getCustomerId();
final Provenance provenance = inbound.getDataProvenance();
lockExecutor.run(customerId, () -> {
if (idempotencyRepository.isKeyUsed(provenance, key)) {
return;
}
transactionalService.executeTransactionProcess(inbound);
try {
idempotencyRepository.markKeyAsUsed(provenance, key);
} catch (IdempotencyBreachException e) {
log.error(...);
}
});
}
}
@Component
@RequiredArgsConstructor
public class KafkaListener {
private final ProcessingService processingService;
private final DataMapper mapper;
private static final Logger LOGGER =
LoggerFactory.getLogger(KafkaListener.class);
@KafkaListener(topics = "topic")
public void onEvent(Event event) {
var data = mapper.mapEventToModel(event);
processingService.process(data);
}
}
@Service
@RequiredArgsConstructor
public class TransactionalService {
private final InboundRepository repository;
private final InboundMapper mapper;
@Transactional
public void executeTransactionalProcess(TransferData inbound) {
var entity = repository.saveOrUpdate(inbound);
repository.save(entity);
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... a-listener
IdempotencyBreachExceptionHandling в службе, используемой в прослушивателе Kafka ⇐ JAVA
Программисты JAVA общаются здесь
1763747375
Anonymous
Я столкнулся с проблемой возможного исключения idempotencyBreachException в службе, используемой прослушивателем Kafka.
Я не совсем уверен, как правильно справиться с этой ситуацией. У меня есть lockExecutor, который блокирует заданный идентификатор клиента и кеш, используемый в качестве идемпотентного репозитория. В 99,99% случаев все будет работать так, как ожидалось, но меня беспокоит сценарий, когда в конечном итоге возникает исключение IdempotencyBreachException и в базе данных сохраняются 2xdata. Должен ли я просто зарегистрировать ошибку и обработать ее вручную, когда она произойдет, или есть какой-то лучший способ справиться с ней?
Я рассматривал возможность использования @Retryable в методе обработки, но это создает проблему: ключ кэша уже использован, и я знаю, что не следует его удалять. Кроме того, меня беспокоит, как в этом контексте повторные попытки будут взаимодействовать с откатами, поскольку это будет параллельная обработка. На данный момент единственное решение, которое приходит на ум, — это зарегистрировать исключение и при необходимости обработать его вручную в будущем.
@Service
@RequiredArgsConstructor
public class ProcessingEventsServiceImpl {
private final IdempotencyRepository idempotencyRepository;
private final TransactionalService transactionalService;
private final LockExecutor lockExecutor;
public void process(InboundData inbound) {
final String key = inbound.getTransactionId();
final String customerId = inbound.getCustomerId();
final Provenance provenance = inbound.getDataProvenance();
lockExecutor.run(customerId, () -> {
if (idempotencyRepository.isKeyUsed(provenance, key)) {
return;
}
transactionalService.executeTransactionProcess(inbound);
try {
idempotencyRepository.markKeyAsUsed(provenance, key);
} catch (IdempotencyBreachException e) {
log.error(...);
}
});
}
}
@Component
@RequiredArgsConstructor
public class KafkaListener {
private final ProcessingService processingService;
private final DataMapper mapper;
private static final Logger LOGGER =
LoggerFactory.getLogger(KafkaListener.class);
@KafkaListener(topics = "topic")
public void onEvent(Event event) {
var data = mapper.mapEventToModel(event);
processingService.process(data);
}
}
@Service
@RequiredArgsConstructor
public class TransactionalService {
private final InboundRepository repository;
private final InboundMapper mapper;
@Transactional
public void executeTransactionalProcess(TransferData inbound) {
var entity = repository.saveOrUpdate(inbound);
repository.save(entity);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79826821/idempotencybreachexceptionhandling-in-service-used-in-kafka-listener[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия