通知系统(电子邮件,社交媒体)

时间:2012-12-21 11:53:07

标签: php mysql email notifications social-networking

我正在为我正在合作的公司写一个小型的内部社交媒体平台,没什么大不了的。 40,000多名用户。它基本上类似于Facebook或Google+,但功能较少。

此平台还有一个电子邮件通知系统(除了针对在线用户的Ajax通知)。

现在这是我的问题 - 它根本就没有缩放。

我有一个mySQL表,其中包含要发送的所有电子邮件通知。因此,只要有人在一个组中编写故事,系统就会自动在该表中插入一行,而email_send函数(cronjob)会将这些邮件发送给用户(用户可以在即时,每日或每周通知邮件之间进行选择)< / p>

到目前为止,如此好 - 如果这些团体的成员数量很少。

但是现在想象一个拥有5k +成员的小组 - 一旦用户将故事发布到该组中,它就会触发5,000个SQL插入到通知表中。

你会如何解决这个问题?我想到了服务器上的后台工作人员扫描新故事/评论/东西并在后台触发email_send功能。这会扩大规模吗?或者只是一种标准的方式,我只是在想错误的方向?

正确方向的任何一点都会非常感激, 谢谢你,圣诞快乐:)

// Markus。

2 个答案:

答案 0 :(得分:3)

您不应该通过发送电子邮件来减慢正常的Web请求/响应流 - 只需将数据转储到队列中并让后台工作接收到这项工作 - 听起来您已经在使用cron这样做了吗?

插入是导致缓慢的原因吗? 然后只需标准化您的数据,只需在您的电子邮件队列表中插入一个groupID即可。该groupID与包含X用户及其电子邮件地址的组相关联。那么你将插入1条记录而不是5000条记录。 很快也许这样的事情......

notificationTable
rowID | emailID | groupID | status

groupTable
groupID | groupName 

userTable
userID | userName | emailAddress | groupID

如果你想更进一步,那么你可以引入一个消息传递系统,这样你就可以发出简单(和快速)消息,并让一个或多个监听器(在一个或多个单独的服务器上)等待一个或多个消息更多渠道。

答案 1 :(得分:0)

好的,我想出了以下(可能)解决我问题的方法:

  • 我已经有一个表“活动”:

rowID (event_id)| story_id | initiator | group_id

  • 创建一个新表“ not_notified ”:

rowID | event_id

只要有人发布新的故事/评论,系统现在会在表格中插入一行“not_notified”。

每隔几分钟就会运行一个cron作业(如果速度在这里出现问题,可以从另一个专用服务器运行)并选择“not_notified”表。它只是遍历所有记录集并查找每个event_id,提取故事,检查要通知的用户的通知设置并将电子邮件通知发送给用户。 最后,脚本删除了“not_notified”中的行。

我甚至可能不需要“not_notified”表 - 它也可以通过事件表中的一个简单的“新”字段来完成,但是该表中的数百万条目的图像......

思想?