1

我正在尝试完成类似 facebook 新闻源墙之类的事情,从整个数据集中加载 N 个结果,从最近的日期降序开始。当您单击“更多”时,它会在下面显示下一个 N,依此类推,直到您完成数据集。

我正在努力想出最好的设计来实现这一点。我一直被告知无状态 Web 服务是构建可扩展企业应用程序的唯一方法,这意味着据我了解,在第一次调用页面时将整个结果对象缓存在服务器端,并从中获取 N 个结果每个后续的 Web 服务调用都是否?

如果是这样的话,那么像 GetResults(int pageindex, int pagesize) 这样的东西会起作用....这就是我打算这样做的方式,但后来我意识到如果有人在两次通话之间添加了新的数据库记录,它就行不通了。例如,您从数据库中的 23 个墙馈送项目开始,并希望一次显示 10 个。

  • 第一次调用,页面 1,页面大小 10 将返回结果 14-23(最近的在前)
  • 然后有人添加了 2 个新帖子,所以你现在有 25 个在数据库中
  • 第二次调用,第 2 页,页面大小 10 将返回结果 6-15,其中两个已在第一次调用中返回。

所以这种抵消方法不起作用,因为你不能保证底层数据集在调用之间保持不变。

我很困惑,我该如何做到这一点?

编辑:对不起,更多信息。为了避免查找大量数据表的问题,我考虑过在您第一次加载屏幕时使用该用户的最近几天数据预先填充“临时”表的选项,然后一次只读取一页的结果从该瞬态表中读取,使其读取速度更快,加载时间稍慢。然后,当您用完该数据时,将下一个周期(例如 2 周)带入瞬态表并继续阅读。

困难在于用户将“发布”项目,然后自动被匹配其搜索条件的用户拾取。例如,如果您的标准规定您想结识 25 到 32 岁且距离您 50 英里以内的人,那么当您加载新闻提要时,您希望它显示所有符合您标准的用户的帖子。有点像动态朋友列表。

我将如何实现这一点是在登录时,将运行一个存储的过程,它将通过选择所有用户并根据我在静态查找表中的年龄和位置标准(邮政编码距离)进行过滤来填充数据库中的瞬态表等),然后它将与您的条件匹配的用户列表保存到此临时表中,以便在您需要过滤帖子或搜索用户时使用。如果您更新首选项,它也会重新计算此值,但仅在您更新首选项或重新登录时。因此,在您下次登录之前,不会出现任何注册的新用户,我认为这很好。

然后,当需要显示您的新闻提要时,它所做的就是从数据库中检索符合您条件的用户 ID 列表,然后带回这些用户发布的所有 NewsFeedPosts。嘿 presto,动态新闻提要!

但显然这是动态生成的整个 NewsFeedPost 表的子集,因此每次用户单击“更多”时重新计算它是没有意义的,所以这就是我考虑实现它的方式。

表格 - NewsFeedCurrent、NewsFeedRecent、NewsFeedArchive 在当前表格中创建新帖子。每天晚上运行一个批处理作业,将所有数据从当前的 2 天前移动到最近的表,并将最近表中一周前的任何数据移动到存档表。

考虑到 90% 的时间,用户只会对最近 2 天的数据感兴趣。所以为了访问时间,保持桌子很小。另外 9% 的时间用户可能需要最近几周的数据。因此,将其单独保存在辅助表中。那么只有 1% 的时间用户需要超过一周的数据,所以将其保存在一个更大、更慢的存档表中,这会更慢,但通过保持当前和最近的表较小,可以提高性能。

因此,当您第一次点击新闻提要页面时,它将为您的帐户获取预先生成的用户列表,并拉出所有 NewsFeedCurrent 项目并将它们放在一个临时表中,例如您的用户 ID 下的 TempNewsFeed。然后,您只需为您的用户 id 拉回所有内容即可使用此结果集,您不感兴趣的项目不需要过滤,因为它们是预先过滤的。这将为页面加载增加一秒钟左右的时间,但会缩短获取结果时的响应时间。然后,当该数据用完时,它将再次使用符合您条件的用户列表从“最近”表中提取所有相关数据,将其添加到 TempNewsFeed 表中,从而允许您继续获取长达一周的数据。当那用尽时,它最终会转到存档表并使用用户 ID 列表,拉出与此匹配的所有数据并放入临时表中,允许您继续导航剩余数据。这将在填充存档数据时产生相当大的延迟,但如果您要返回一周,则在填充数据并显示“正在加载数据...”时,您将不得不等待 5-10 秒。但是,一旦完成,浏览历史数据将与最新数据一样快,因为它们都在瞬态表中。

如果您刷新屏幕或从另一个屏幕返回该屏幕,它会清除瞬态表并从当前表数据重新开始。

4

1 回答 1

0

希望我的回答有意义,做出正确的假设......

我会将新闻提要分为两个部分。第一个是传入的消息——它将由 AJAX 调用驱动。它一直在说“什么是新的?” 第二部分是旧新闻,用户可以通过向下滚动来懒惰地加载更多新闻。

最新消息

重要的一点是记下您页面上的最大新闻提要 ID。假设是 10000。当用户加载页面时,新闻提要 id 10000 是最新的新闻项目。

当使用 AJAX 更新新部分时,我们只需要问:“比 id 10000 更新什么?” 我们将这些项目加载到页面上。在我们加载它们之后,我们还会增加页面上的 id。例如,如果我们从 id 10000 开始并加载五个新的新闻项目,那么新的 id 将是 10005。下一个调用会问:“什么比 10005 更新?”

较早的新闻项目

较旧的部分将跟踪页面上最旧的新闻项目。让我们想象一下,他们回滚了一周的新闻。最小的新闻条目 ID 为 9000。当他们想要进一步向后滚动时,我们只需问:“什么比 9000 更早?”

然后的想法是在页面上维护最大新闻项 id 和最小新闻项 id,然后继续从该参考点加载。

于 2013-01-15T22:26:00.623 回答