我对新闻提要的处理方式有多少错误


What are the number of ways in which my approach to a news-feed is wrong?

这个问题已经被问了一千次了。。。所以,如果你决定跳过阅读/回答它,这并不不公平,但我仍然认为人们希望看到并评论我的方法。。。

我正在创建一个需要活动提要的网站,比如FourSquare。

但我的网站有这个功能是为了养眼,不需要永远保存这些东西。

因此,我将event_typeuser_id写入MySQL表。在向表中写入新事件之前,我删除了所有较旧的、不必要的行(通过计算行总数,使event_id小于所有冗余的值,并删除这些行(。我修剪这个表,每次事件发生时都写一个新行。如果没有用户生成的文本,则另一个user_text列为NULL。。。

在前端,我有一个jQuery,它通过GET每隔x秒检查一次PHP文件,用户打开网站。jQuery发送一个请求,其中包含它接收到的最后一个更新"id"。<div>我的后端生成的标签将"id"属性设置为MySQL行id。这样,我就不必将last_received_id保存在内存中,尽管我想在内存中存储一个int值很小的变量绝对不会对性能产生影响。。。

我有一个函数,根据我从jQuery传递的event_type和user_id,以及user_text列是否为空,生成一个"更新文本"。更新文本被传递回jQuery,jQuery将新接收的事件<div>对具有某些效果的提要,同时消除"尾端"事件<div>具有效果。

如果我(更重要的是,客户端(愿意,我可以在数据库中有一个"事件存档"表(或另一个(,在删除之前保存所有多余的行。这样,事件信息将永远保存,同时不会影响现场的性能。。。

我使用的是CodeIgniter,所以在任何地方都不存在重复代码的问题。所有相关函数分别进入库和模型中的LiveUpdates类。

我对我的做法很满意,因为它在坚持KISS意识形态的同时解决了手头的问题。。。但是,有人能给我指一些资源吗?这些资源显示了更好的方法?在谷歌上搜索这个主题会发现太多的文章/SO问题,我想从任何其他已经搜索过它们并找到最佳方法的开发人员的经验中受益。。。

如果使用正确的索引,就没有理由不能在不影响性能的情况下将所有事件保存在一个表中。

如果您正确地进行轮询,在没有新内容时不返回任何内容,则可以最大限度地减少每个客户端在服务器上的负载。如果你也研究推送通知(混合延迟连接关闭方法(,这将进一步帮助你成功地扩大规模。

最后,完全没有必要担心客户端中的变量存储。这是过早的优化。性能问题将出现在许多用户与web服务器的雪崩式连接中,以及在数据库中,没有适当索引的表中。

关于索引:当针对表的最常见查询可以通过查找和最少的读取次数(如1-5(来执行时,索引是"合适的"。在您的情况下,这可能是一个递增的id或日期(如果它有足够的精度(。如果设计正确,那么查找最新update_id的操作应该是一次读取。然后,当您的客户端提交ajax请求以查看是否有更新的内容时,首先进行查询,查看提交的值(id或时间(是否小于当前值。如果是,请立即通过第二个查询使用新内容进行响应。保持"ping"操作尽可能轻量级是您的目标,即使这会在有新内容时带来稍大的成本。

不过,使用推送会更好,所以请探索彗星。

如果你不知道你的查询进行了多少次读取,那么我鼓励你探索数据库的这一方面,这样你就可以找到它并对其进行适当的评估。

更新:提供客户端得到"是的,有新内容"答案,然后实际请求内容的想法可能不是最好的。请看为什么胖萍赢了一些非常有趣的相关材料。