我在一次采访中被问到这个问题。问题陈述是这样的
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/