Обработка дублированных уведомлений от 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 Вы можете видеть, что они были повторными попытками. (Подробности смотрите в документации)

Другие вопросы по тегам