设计模式:通知系统

时间:2009-08-22 13:31:22

标签: design-patterns database-design

我正在开发一个将使用社交网络功能的网站(例如facebook)。

我想实现一个通知系统,显示诸如“X将你添加为朋友”,“Y邀请你参加聚会”,“Z已经采取最新的挑战”之类的东西......我不知道怎么办。

我想知道什么是最好的解决方案:

  • 解决方案1,又名“伐木”。

专用表格“通知”。每次发生通知时都会在此表中添加行(朋友添加,quizz应答等)。根据向表中添加的通知类型,表“通知”包含包含不同信息的字段。

良好:易于编码,通知功能与“普通”功能分离,在需要阅读表格时不会耗费太多资源。

错误:通知表可能会增长很大(我想我会在表中添加10k行/天),“重复”信息:通知表中的信息可以在所有其他信息中找到表使用日期/列表/无论比较。

  • 解决方案2,又名“无处不在”。

每当我需要显示通知列表或显示有多少新通知时,我会查看所有相关表格,比较日期/等以了解自上次用户检查通知后是否发生了新的事件。< / p>

良好:与解决方案1相比,不是一个太大的表,没有信息的“冗​​余”。

错误:我因为用户数量(~1k +)而感到害怕,它会使服务器爆炸,因为它耗费资源/时间,代码/维护难度更小。

你能告诉我你认为哪个更好,为什么,或者你有一个我没想到的解决方案?

谢谢=)


修改: 假设我使用了一个非常基本的数据库设计:用户有朋友,可以进行测验。

1个用户列表,quizz列表,

1表quizz&lt; - &gt;用户关系,

1个表用户&lt; - &gt;友情用户。

每当用户访问他自己的个人资料时,他都可以看到发生了什么:新的quizz&lt; - &gt;用户关系,新用户&lt; - &gt;用户关系等。 你会如何设计这样的通知?

5 个答案:

答案 0 :(得分:21)

创建系统队列,添加到此队列的每条消息都有一个“使用者”列表和内容。主消息泵处理每条消息并将消息发送给所有消费者。

让我们说2个人互相交朋友。您向主系统队列添加一条消息,A是B的朋友,消费者是A和B.当您的消息“pump”(处理器)看到此消息时,它会将其添加到A队列和B队列中。现在,用户A和用户B有一条新消息,表明他们是朋友。反过来每个用户都有一个消息处理器,所以当它看到一条名为“我是[某人]的朋友”的消息时,它会将此处理为向A的朋友看到​​的“墙”添加新条目“A是B的朋友“等等。

这过于简单,但希望显示消息队列如何用于此(非常类似的系统用作Windows UI框架),因此已有一个现有示例,并且您可以使用大量同步消息队列模式。

休息取决于你的设计。

答案 1 :(得分:15)

真的,这属于我如何设计汽车?类型问题类别......

实现取决于设计,未来将在哪里以及您将实施的环境。您可以选择推特式的实现,SAN支持的XML系统,关系数据库,Hadoop以及其他许多。

熟悉网络技术,经验,试验和错误是唯一可以设计任何功能的唯一方法,确保您正在使用它是正确的(ish)方式。

您的表现需求是什么?流量水平?用户要求?你想稍后发布(例如通过webhooks发布吗?)。

您的问题需要更具体。

我个人会有一个“通知类型”表,就像枚举一样...然后是一个处理通知和用户之间关系的用户&lt;&gt;通知表。

通过一些良好的编码,您可以跨多个服务器拼接用户&lt;&gt;通知表,并键入用户ID或类似的...并在每个节点上复制类型表以进行本地缓存/引用。这样的事情。

答案 2 :(得分:1)

现在像亚马逊托管这样的日子服务器正在提供通知框架。因此,如果您使用亚马逊通知,则可能无需担心表格结构。

希望这有助于其他人寻找类似的解决方案。

答案 3 :(得分:0)

我建议使用普通通知。没有通知类型或其他。

通知
-id
-message
-href(当用户点击通知时链接去)
-receiverUser
-date

用法示例: 约翰(34)喜欢玛丽(47)的照片。 (我们正在向玛丽发送通知)

INSERT INTO Notifications(message,href,receiverUser, date) VALUES ('John liked your photo', 'link of the photo', 47, 01.11.2014) 

答案 4 :(得分:0)

我所做的是提供了专用服务来存储以下数据:

  • recipent_id
  • actor_id
  • html_msg
  • 元数据
  • if_seen
  • 时间戳

如果用户在线,则通过套接字推送到UI