从其他RSS提要构建RSS,如何防止循环/递归/循环包含



这是一个RSS提要(A),其中用户可以添加多个图像,但他/她也可以添加来自不同用户的带有图像的RSS提要(B)。当请求提要(A)时,服务器然后获取提要(B),然后将提要中的图像添加到请求的提要(A)中。

有哪些机制或选项可以防止无限循环递归?
例如,当进料(B)也包括进料(A)
// Feed A setup
// - image1a
// - image2a
// - feed-B
// Feed B setup
// - image1b
// - feed-A
// fetching / assembling feed A
// - image1a
// - image2a
// - (A fetches feed-B)
// - image1b
// - (B fetches feed-A)
// - image1a
// - image2a
// - (fetched A fetches feed-B again)
// - image1b
// - (second B fetches feed-A again)
// .. recursion

有三种解决方案:

  • 存储每个条目的原始提要id,并且只转发最初为每个提要创建的条目,
  • 或转发每个提要的所有条目,并传递该条目所在的所有提要的列表(并检查该列表),
  • 或为每个RSS使用唯一的itemID,只存储一次,在itemID上放置唯一的约束或主键,因此永远不会为每个提要存储两次条目。

事实证明,解决方案分为几个阶段。

1锁定:在请求时返回缓存XML的副本。在构建提要XML期间,设置一个锁。这可以防止正在获取此提要的外部提要触发第二个新构建。外部提要将只接收缓存的XML。

2 identify items:锁会停止一个潜在的失控进程,但是提要XML确实会在每次请求时使用先前缓存的XML项增长。为了防止重复,为每个"guid"字段添加一个唯一的提要标识符。如果条目是提要自己的,则不包含它并记录消息(并在需要时通知)。

最新更新