我正在考虑将Azure存储用于我想到的应用程序。其中一部分涉及一些类似SO的投票和收藏功能。与SO一样,我希望能够允许用户仅投票/添加一次收藏,并在以后使用这些收藏进行评分/加权。
如何使用Azure存储或AWS SimpleDB进行此操作?是否出现了这种情景的模式?
答案 0 :(得分:2)
您使用的是表存储吗?使用Azure存储时要记住的棘手问题是缺少Count等功能。
为防止某人投票或偏好两次,您需要让主键包含内容的ID和用户的ID。让我们说用户可以对评论进行投票。我们将创建一个名为CommentVotes的表,其中PartitionKey为“UserID”,RowKey为“CommentID”。现在任何重复项都会抛出异常并阻止它发生。问题是在没有抓住所有行的情况下计算Count。您需要创建另一个表来存储聚合结果,这些表在插入成功时会增加。该表可能看起来像PK“评论”,RK“CommentID”,TotalVotes“5”。
答案 1 :(得分:1)
您可以选择几种方式来利用存储:BLOB(二进制大对象)或表。 Blob只存储文本或二进制数据。表格提供了更多结构。此外,他们还提供REST服务来管理它们。
如果您需要“持久且持久”的存储选项,Microsoft表示Azure存储是完美的。但是,如果您的应用程序可能会受到大多数应用程序的更改,我建议您使用SQL Azure。 SQL在存储应用程序数据时更为常见。 Azure存储对于利用诊断日志更有用,而无需设置SQL数据库(或编写连接数据库本身的问题)。
存储的另一个用途是划分您的信息,以便不同的人可以访问它们。例如,您将所有诊断和错误信息放入Ops团队的一个位置,然后为需要包含应用程序生成的报告的简单文件的Managers创建另一个存储位置。每个存储位置都可以拥有自己的标识符和连接哈希字符串(抱歉,我不知道他们正式调用了什么)。
此外,您可以使用存储进行部署和构建。我相信Visual Studio在配置部署时使用存储来支持部署,以便通过IDE进行部署。我的观点是,越来越多的人认为SQL对应用程序数据和操作数据存储有用。
我喜欢但尚未实现的一种模式是使用Azure队列。当您想要使用几种不同类型的角色扩展应用程序时,实用性就变得很明显了。例如,Web角色可以使用队列添加事务,并具有两个或多个辅助角色,从队列中挑选事务以进行处理和存储。通常,许多Azure应用程序中的瓶颈是数据库,因此在考虑可伸缩性时,将数据处理从Web角色转移到工作者角色非常有用。
答案 2 :(得分:1)
最简单的解决方案包括每个计数器使用1个blob(又名Blob存储)。 blob实际上不仅包含最终计数,还包含投票用户的标识符 。这将确保不进行双重投票。开源库如Lokad.Cloud可以为您提供帮助(免责声明:我在Lokad工作)。
这种方法的一个缺点是你的计数器不会超过~10票/秒 - 这对于大多数网络应用来说已经很多。然后,如果您真的在考虑超重型计数器,您应该考虑分片计数器,这可以通过表存储和Blob存储实现。
要考虑这个问题的另一个角度是考虑CQRS,让投票发出异步处理的命令消息,而Javascript负责向用户提供即时反馈。这里最显着的好处是,有一个单个blob代表整个页面状态,投票计数器和其他内容可以加速读取。请检查Lokad.CQRS以执行此操作。
答案 3 :(得分:0)
规划分布式系统时遇到的挑战之一是说服自己应该在不同的地方复制信息,即数据非规范化。我们大多数人习惯于数据规范化,数据库以及所有这些,试图将每种信息类型仅保留在一个地方。但是要知道我们必须为表现和分配做相反的事情。
正如@Vyrotek已经指出的那样,你应该将“计数”信息保存在其他地方,并在每次投票时自己更新。