0

我正在使用 Windows Azure 为移动社交网络构建服务器后端。

我有这 3 个实体:

  1. 用户 - 存储在 SQL Azure 中
  2. 线程( 2 个用户之间的某种关系,然后能够相互发送消息) - 存储在 SQL Azure 中
  3. 消息 - 存储在 Azure 表中

当我将消息存储在按线程 ID 分区的 Azure 表中时,我希望在聊天时有良好的性能(向/从线程发送/读取消息)。

但我还需要能够为用户提供最新线程列表(recent = 包含最新消息)。换句话说,我需要在显示时按最后一条消息日期订购线程。

扫描许多不同的表分区并查找消息显然会成为性能杀手,因此我需要以某种方式将数据非规范化到其他表分区,以便能够有效地获取最新的线程。

根据您的经验,最佳策略是什么?

4

2 回答 2

0

选择批处理解决方案始终是一种解决方法,这让我想起了大型机等旧计算。没有什么可以替代在线/实时系统。

如果您选择批处理解决方案,它将使您的系统在启动时过时,并将阻止未来的任何技术创新。

当您的 Azure 数据库开始变得太大而无法查询时,Microsoft 建议使用联合。基本上,这意味着将您的数据拆分到多个数据库中,并在代码中使用兼容的访问逻辑。

首先查看此演示应用程序:SQL Azure Federations Tutorial -- Entity Framework

于 2012-04-08T21:43:01.340 回答
0

编辑:经过进一步思考,这是一个更好的建议(我认为):

有一个消息 ATS 表。该表将容纳两种类型的消息:发送的消息和接收的消息。每次用户发送消息时,将其存储在表中作为“已发送”,然后作为“已接收”(或任何您想调用的类型)。

按以下方式对消息表中的所有消息进行分区:

(UserId) - PartitionKey, (long.Max - Timestamp.Ticks) - RowKey

作为额外的属性,您可以存储 ThreadId、Sent/Received 区分等。

如果您想保证您的消息被插入两次而不会出现问题,请使用 Queue 和 Worker 角色。

该方案按用户划分所有内容。您将能够在一个时间范围内显示该用户的所有消息,并且始终按降序显示。

于 2012-04-09T02:30:24.780 回答