处理来自 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)
我通过 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)