Обработка дублированных уведомлений от superfeedr
У меня есть подписка на RSS-канал через SuperFeedr, и я заметил много дублирующих уведомлений в последнее время. Я дважды проверил свои подписки через веб-приложение, но вижу только 1. Я также посмотрел, чтобы убедиться, что я возвращаю правильный код ответа. В документации сказано, что 200 должен быть отправлен в качестве ответа, а структура повторных попыток - через 5, 10 и 15 секунд, но в моих журналах я вижу, что дубликаты отправляются с интервалом в миллисекунды, что наводит меня на мысль, что это не повторы.
Самые первые строки моего метода doPost():
response.setStatus(HttpServletResponse.SC_OK);
response.flushBuffer();
Есть попытка сообщить superfeedr, что я получил сообщение, по сути, подтверждение.
В качестве краткосрочного решения я решил сохранить в хранилище данных запись, которая представляет собой "самое последнее сообщение".
Я знаю, что обычно в контексте сервлета вы не будете синхронизироваться на самом экземпляре сервлета, потому что это вызовет очередь запросов, но в этом случае Superfeedr является единственным сервисом, использующим этот сервлет, он не используется обычные пользователи, так что это именно то, что я хочу, просто хотел убедиться, что не будет никаких побочных эффектов этого подхода.
Я хочу выделить время для поступления запроса от Superfeedr, проанализировать сообщение, убедиться, что оно не является дубликатом, а если нет, обновить значение в хранилище данных, которое представляет самое последнее сообщение, по одному за раз. Вот что у меня есть:
synchronized(this) {
//check datastore entry to see if the message coming in is a duplicate
if(messageIsADuplicate(title)){
logger.log(Level.SEVERE, "DUPLICATE MESSAGE RECEIVED");
return;
}
//delete the entry in the datastore that represents the most recent message
if(!mostRecentMessageDeletedFromDatastore()){
logger.log(Level.SEVERE, "UNABLE TO DELETE MOST RECENT MSG");
return;
}
//add an entry to the datastore that represents the most recent message from superfeedr
if(!mostRecentMessageUpdatedInDatastore(title)){
logger.log(Level.SEVERE, "UNABLE TO UPDATE MOST RECENT MSG");
return;
}
}
Итак, если предположить, что я хочу поочередно получить доступ к этому конкретному блоку кода, кажется ли это целесообразным?
1 ответ
Я думаю, что вы сталкиваетесь с проблемой, когда ваше приложение GAE отключается между уведомлениями, потому что оно слишком малоактивно. Как следствие, наши уведомления обычно задерживаются во время "загрузки" вашего приложения GAE, и дубликаты, которые вы видите, являются повторными попытками.
Вы можете легко проверить это, проверив заголовки HTTP. Если они содержат X-Superfeedr-Retried
Вы можете видеть, что они были повторными попытками. (Подробности смотрите в документации)