4

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

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

现在这是我的问题 - 它根本不是缩放。

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

到目前为止,一切都很好——如果团体的成员数量很少的话。

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

你会如何解决这个问题?我想到了服务器上的后台工作人员,它会扫描新的故事/评论/内容并在后台触发 email_send 功能。这个规模会更好吗?或者是否有一个标准的方法,我只是在思考错误的方向?

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

// 马库斯

4

2 回答 2

3

您不应该通过发送电子邮件来减慢正常的 Web 请求/响应流程 - 只需将数据转储到队列中并让后台作业接手该工作 - 听起来您已经在使用 cron 执行此操作,对吗?

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

notificationTable
rowID | emailID | groupID | status

groupTable
groupID | groupName 

userTable
userID | userName | emailAddress | groupID

如果您想更进一步,那么您可以引入一个消息传递系统,以便您可以触发简单(快速)的消息,并让一个或多个侦听器(在一个或多个单独的服务器上)在一个或多个通道上等待消息。

于 2012-12-21T11:58:44.200 回答
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”表——它也可以通过事件表中的一个简单的“新”字段来完成,但是在该表中成像数百万个条目......

想法?

于 2012-12-21T12:58:46.997 回答