处理来自 superfeedr 的重复通知

Handling duplicate notifications from superfeedr

我通过 SuperFeedr 订阅了一个 RSS 提要,最近发现有很多重复的通知。我已经通过 Web 应用程序仔细检查了我的订阅,但我只看到 1。我还研究了确保我返回了正确的响应代码。文档说应该发送 200 作为响应,重试结构是在 5、10 和 15 秒之后,但在我的日志中,我看到重复的发送间隔几毫秒,这让我相信这些不是重试。

我的 doPost() 方法的第一行是:

    response.setStatus(HttpServletResponse.SC_OK);
    response.flushBuffer();

试图让 superfeedr 知道我收到了消息,本质上是一个确认。

作为短期补救措施,我决定在代表 'most recent message' 的数据存储中保留一条记录。

我知道通常在 servlet 的上下文中,您不会在 servlet 实例本身上进行同步,因为这会导致请求排队,但在这种情况下,Superfeedr 是唯一使用此 servlet 的服务,它不被普通用户使用,所以这正是我想要的,只是想确保这种方法不会有任何不良副作用。

我想给来自 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;
        }
    }

因此,假设我希望一次访问一个特定的代码块,这看起来合适吗?

我认为您遇到了一个问题,即您的 GAE 应用程序在两次通知之间关闭,因为它太少 activity。结果是我们的通知通常在您的 GAE 应用程序 "boot" 期间超时,您看到的重复是重试。

您可以通过检查 HTTP headers 轻松检查这一点。如果它们包含 X-Superfeedr-Retried,您可以看到它们是重试。 (参见 docs for details