处理来自 superfeedr 的重复通知

Posted

技术标签:

【中文标题】处理来自 superfeedr 的重复通知【英文标题】:Handling duplicate notifications from superfeedr 【发布时间】:2015-02-27 03:12:39 【问题描述】:

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

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

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

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

作为一种短期补救措施,我决定在数据存储中保留代表“最新消息”的记录。

我知道通常在 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;
        
    

那么,假设我想要一次访问这个特定的代码块,这是否合适?

【问题讨论】:

他们运行分布式服务,所以我猜它可能会发生。 IIRC 他们会发送一个 ID,您可以检查您是否已经收到? 【参考方案1】:

我认为您遇到了一个问题,即您的 GAE 应用程序在通知之间因活动太少而关闭。结果是我们的通知通常在您的 GAE 应用程序“启动”期间超时,而您看到的重复项是重试。

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

【讨论】:

以上是关于处理来自 superfeedr 的重复通知的主要内容,如果未能解决你的问题,请参考以下文章

如何停止来自应用程序的通知[重复]

重复的本地通知

当重复设置为“是”时,UNUserNotification 不会从待处理通知中删除 - Swift

使用firebase云功能在特定时间发送FCM通知[重复]

带有 FCM 推送通知的 Safari [重复]

JVM如何通知长时间运行的线程“停止”[重复]