0

每当我将媒体上传到我的网站时会发生什么;每个人都会收到通知。每个人都可以单击一个框来删除它,它将永远从他们的消息队列中消失。

如果我的网站上有 10,000 人,我将如何将其添加到每个人的消息队列中?我可以想象这需要很多时间,所以我会选择像文件系统日志这样的东西吗?标记我需要通知人们,数据然后是我当前的位置。然后每插入 100 次左右更新我的位置?我需要在我的观察者列表上进行 PK,所以如果有人在其中注册,我的订单不会被破坏,因为我将通过 PK 进行排序?

这是群发通知系统的最佳解决方案吗?

-编辑-

该站点是用户创建的内容站点。管理员可以发送全球消息,受欢迎的人可能有成千上万的订阅者。

4

5 回答 5

3

如果将 10000 插入到将收件人链接到消息的狭窄多对多表中的(recipientid, messageid, status)速度很慢,我预计您的设计会遇到更大的问题。

这是我通常不会担心批处理或人们在后期操作中间订阅的操作 - 基本上:

假设@publisherid已知,@msg已知在 SQL Server 上:

BEGIN TRANSACTION

INSERT INTO msgs (publisherid, msg)
VALUES(@publisherid, @msg)
SET @messageid = SCOPE_IDENTITY()

INSERT INTO msqqueue (recipientid, messageid, status)
SELECT subscriberid, @messageid, 0 -- unread
FROM subscribers
WHERE subscribers.publisherid = @publisherid

COMMIT TRANSACTION
于 2009-05-30T01:25:15.823 回答
1

我想说让数据库来处理它有能力和设计做的事情。插入和管理数据。不要尝试在代码中执行,只需编写 SQL 以一次性插入数据。10000 行对于所有真实数据库来说都是骗人的。

于 2009-05-30T06:40:00.833 回答
1

也许只是为每个用户记录他们看到了哪些通知——所以要显示给用户的通知集是在他们的“earliest_notification”范围之前创建的(当他们注册时,或者一周前......)减去他们已经确认的通知. 这样一来,您将延迟插入任何内容,直到它立即成为单个用户 - 另外,如果您只向用户显示不到一周的消息,您可以清除一周或更长时间的 read-this-notification 标志。

(我以前工作的 DBA 的性能优化提示:“业务流程是最容易改变的东西,先看看它们”)

于 2009-05-30T00:43:33.397 回答
0

恕我直言,插入记录可能不是解决此问题的最有效方法。您是否可以使用客户端 cookie 来存储用户是否删除了通知,或者即使他们清除了 cookie,您也必须跟踪这一点?如果您上传新视频,应用程序只需将 cookie 与新视频记录 ID 进行比较,并根据 cookie 中存储的内容决定显示或隐藏通知。这将为您节省大量的数据库插入,并将大部分繁重的工作交给客户端。

于 2009-05-30T00:45:15.517 回答
0

如果您使用的是 Postgres,则可以使用 COPY 命令,这是所有方法中最快的方法:

COPY tablename (col1, col2, col3) FROM '/path/to/tabfile';

其中tabfile是一个 TAB 分隔的文件,有很多条目。但是,如果有一些 UNIQUE 约束并且文件中有重复项,这将失败。

于 2009-05-30T01:23:47.887 回答