【问题标题】:How exactly do i go about implementing a facebook-esque news feed我究竟该如何实现一个 facebook 式的新闻提要
【发布时间】:2013-12-16 08:22:07
【问题描述】:

背景

在没有任何正式培训和/或学校教育的情况下,我对编程比较陌生,我正在努力学习。我目前正在尝试编写一个简单的 facebook 式新闻提要,其中用户分为 2 个一般组,被关注的组 (A) 和关注的组 (B)。

我计划将提要设为一个方向[即 B 跟随 A(并从 A 获取更新/通知)但 A 不跟随 B 返回] 以保持简单。此外,每当 A 做某事时,即状态更新,我计划用 A 的活动更新 B 的提要。

我已经在这里阅读了一些关于 SO 和一些我自己的谷歌搜索但遇到了 2 个问题,第一个是我所看到的大部分内容都在我的脑海中(使用 redis 等工具),第二个是我读过的大多数文章和答案都解决了做什么的问题(消息队列,推/拉),但没有解决如何实际去做的问题。

我计划有一个表(follow-info)来存储有关如何关注谁的信息:

---------------
| id | A  | B |
---------------
| 1  |  3 | 5 |
----------------
| 2  |  3 | 11|   WHERE A= id of people being followed AND B=id of people following.
----------------
| 3  |  7 | 2 |
---------------- 
| 4  |  3 | 1 |
---------------

以及其他跟踪他活动的表格

-----------------------------------------
| id | activities | last-update         |
-----------------------------------------
| 1  |   details  |  2013-12-8 00:00:00 | WHERE last-update = ON UPDATE CURRENT
-----------------------------------------   TIMESTAMP

因此,每当上次更新时间发生变化(即发生活动)时,我想将活动的详细信息发布到 B(下一个)。

问题

我将如何在别人的“墙上”发布更新?我知道我必须在数据库中查询用户之间的 r/s(即谁在关注谁)但是我如何将活动详细信息推送到用户的墙上?我读过的大部分内容似乎都建议设置各种各样的计时器,它将查询服务器以获取任何更新(我将如何去做从未被确切提及。)但在我有限的知识中,这不是很浪费资源吗?(为什么继续不必要地查询服务器何时可能没有更新,而您可以在它们发生时简单地推出它们?)

P.S 我知道基本的 html、php 和 jquery,目前正在使用 PHP 5.3 和 Apache(统一服务器)运行。

我们将不胜感激任何建议/帮助和/或意见。

【问题讨论】:

  • 这是作业还是家庭作业?
  • @TobyAllen 既不是哈哈。我正在尝试学习网络编程,并认为最好尝试编写一些代码

标签: php html mysql database feed


【解决方案1】:

您想要实现的目标起初可能看起来很简单,但纵观全局,如果您试图简单地模拟问题,那么您的业务会遇到很多事情,那么这应该不是什么大问题,但如果您正在为生产目的而努力,并且您即将瞄准数百万次使用,那么您需要团队合作和大量的团队合作。

建议的解决方案仅用于模拟目的

数据库设计

您的数据库应该很简单,有 3 个表 1 Users(关注或关注两者),表 2 Relations(谁在关注谁)。表 3 Updates(谁在分享什么)。这是极简设计。

动态非实时动态消息

这里讨论的提要被认为是动态的,但不是实时的。首先通过登录他/她并为他/她激活会话来识别您的用户。使用 css/css3、HTML/HTML5 和 jQuery/Javascript 渲染您的布局,现在使用服务器脚本(PHP/JSP/ASP.Net 等) 查询您的数据库到 1。从关系表中选择所有被登录用户关注的用户。接下来从更新表中为每个存在关系的用户选择所有更新(A. 拥有更新的用户 B. 由会话标识的登录用户)。现在,您的更新已将动态内容显示给 Actively Logged User

使其成为实时供稿

您问题的重要部分是如何向用户推送更新。好吧,网络不是中断驱动的,而是客户端每次都必须请求新数据,这就是 AJAX 请求首先存在的原因。考虑一下服务器是否必须在准备好时向每个客户端推送更新,服务器如何知道客户端仍然在线,或者客户端有足够的带宽来接收数据,或者客户端不忙以及许多其他问题。这个想法是在一定程度上分担负载,同时让服务器可以管理事物,加上 HTTP 协议是无状态的,无法实现这样的功能。

解决方案是轮询您使用 JavaScript SetTimeOut() 方法向服务器发送 AJAX 请求并带回更新(如果有),然后相应地更新用户界面。

减少对服务器的 AJAX 调用次数的一种策略是对setTimeOut() 方法使用不同的时间间隔。例如,您向服务器发出 AJAX 请求,服务器响应没有更新,然后在 1 秒后您发出另一个 AJAX 请求,现在再次没有更新,这是有理由在 2 秒后发出下一个 AJAX 请求,下次 4 秒......直到你得到更新,在这种情况下,您可能想要重置您的计时器或根据您的需要和策略使用当前计时器的一半间隔。

即使您在 chrome 浏览器或 firefox 中监控您的网络活动,您也会看到 Facebook 主动发送 AJAX 请求并带回您的朋友/聊天消息/feed 条目等的在线/离线状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多