我想实现一个投票系统,所有数据存储在 Amazon SimpleDB 中。前端也在 Amazon EC2 上运行。我主要关心的是服务成本。
投票系统需要防欺诈。也就是说,每个访问者每次选举只允许一票,并且没有用户帐户。我已经考虑过为每个投票存储一个 SimpleDB 项目以及它来自的 IP 地址。然后,如果该 ip/选举对没有条目,我只会插入新投票。
但是,就存储和处理而言,这听起来非常昂贵。我必须检索所有选票以统计它们以显示最新结果。
我考虑过的另一个选择是存储选票,只是偶尔总结它们并缓存结果。但这仍然需要我存储所有选票。
您的建议是什么?
让我们先解决您的主要问题,成本。假设您的系统中有 1 000 000 张选票。每个投票由一个 simpledb 项目表示,每个项目包含三个属性、时间戳、实际投票和标识用户的唯一值(稍后我将介绍该部分)。
现在,simpledb 概述页面为我们提供了一种计算项目实际存储大小的简单方法。
Amazon SimpleDB 测量的大小通过添加原始数据来计费数据您上传的数据的字节大小 + 45每个项目的开销字节数,属性名称和属性值双。
让我们用一点余量来计算,以防您决定包含更多数据,假设每个项目/投票将花费您 300 字节的存储空间。然后,数据的总存储大小将为~286mb。完全在免费套餐限制范围内。然后是插入物品的成本,但这可能可以忽略不计。有一个与计票相关的成本,但正如您已经建议缓存可以帮助显着缓解这种情况一样。
我把这些数字扔进了优秀的亚马逊简单月度计算器服务中,以获得一个近似的数字,并获得了~4美元/月的1GB存储,1M看跌,250k获取和100k选择。现在,根据我的经验,很难事先估算使用情况,因此您必须在进行过程中密切关注我们的使用情况。Amazon 提供的使用情况报告包含有关请求的详细信息,您可以使用这些信息来查看模拟应用程序真实使用情况的效果。
防欺诈
现在,至于防欺诈部分。对我来说,评估您正在寻找的欺诈预防水平有点困难,但无论如何,如果没有用户帐户,您根本不会拥有一个防欺诈的投票系统。即使你有帐户,你也必须非常小心地避免XSS和CSRF,这样恶意用户就不会利用其他用户和他们的投票。
限制每个IP的投票存在许多问题。
- 一些ISP积极为其客户重复使用IP地址
- 使用洪流时代蓬勃发展的大量匿名工具(代理,vpn:s)中的任何一种来伪造您的IP都太容易了。也可以使用免费的"合法"工具,例如 TOR。
- 许多大型组织/政府/学校将通过代理或使用NAT发送所有用户的流量,这意味着每个组织只有一个用户能够投票。
甚至有可能用户在每个请求上都有不同的IP地址(!
说到粘性会话,我们是惊讶地发现有那些极少数用户的 IP 地址会从请求从根本上更改为请求。
https://blog.stackoverflow.com/2009/07/
如果您真的认真对待创建一个万无一失的在线投票系统,则必须查看具有某种真实世界身份验证的用户帐户(即通过邮寄方式向用户注册地址发送验证码)。
最后,但并非最不重要的一点是。无论您的防欺诈机制多么复杂,您都必须对数据执行常规审计,以便及早发现意外的欺诈情况。