database - 设计数据库/后端来解决这种高负载需求场景?

标签 database load-balancing scalability

我在一次采访中被问到这个问题。问题陈述是这样的

You have a website which handles load of millions of users. You have got a shared database across various load balancing web servers which has got details of coupons in a table. Every person who logs in will get a random coupon id from the table.

问题是您将如何设计系统来满足这么多用户的需求?

In my opinion every time a user logs in, we will have to run a select query to fetch a coupon id and delete it from the table using a delete query to ensure that it does not get assigned to other user.

但是我不知道它将如何扩展到数百万用户?在我的设计中,直到第一个用户的删除尚未完成,我无法招待任何其他用户。这就是为什么很多从属数据库服务器和主数据库服务器没有帮助的原因。因为master中的删除操作必须同步到slave服务器上才不会出现重复。

如何解决这个问题来扩展我的后端?另外,如果这里应该使用缓存,我的方法应该是什么?

最佳答案

问题陈述没有说明向每个用户发放哪张优惠券。。我认为任何都可以。

您当前的设计无法扩展,因为它有一个争用点:获取第一个优惠券。

相反,只需从 table 上拿走任何优惠券即可。将随机数列添加到存储优惠券的表中。其取值范围应为[0, 1000000)。

当必须领取优惠券时,请领取与您刚刚抽取的数字相比随机数最小的优惠券:

SELECT TOP 1 *
FROM Coupons
WHERE RandomNumber >= RAND(0, 1000000)
ORDER BY RandomNumber

这消除了所有争用,因为写入发生在表中的随机点。以下是将查询表述为写入:

DELETE x FROM
(
 SELECT TOP 1 *
 FROM Coupons
 WHERE RandomNumber >= RAND(0, 1000000)
 ORDER BY RandomNumber
) x

这具有确保原子性的正确锁定语义。

关于database - 设计数据库/后端来解决这种高负载需求场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23580360/

相关文章:

algorithm - 在 O(n) 时间内执行连接?

apache - 504网关超时

ajax - 如何重构 Django 站点以使其可以扩展

c- Loadbalancer.拼接时修改http header?

mysql - 数据库设计 : Multiple tables vs a single table

iphone - Parse 的可扩展性如何?

mongodb - 访问 Meteor 生产数据库

database - 学习数据库编程的好的起点、教程或项目是什么?

mysql - 如何将包含双引号的字符串添加到sql数据库?

load-balancing - 如何在 envoy 代理中设置 Hash Key 值以实现 RING_HASH 负载平衡