Firestore - 如果大于零则减少数字
Firestore - Decrease number if greater than zero
假设 1 个用户可以按下按钮将计数器重置为 0。
另一方面,假设多个用户(例如 100k)可以 increase/decrease 同时或在他们需要的时候使用同一个计数器。
计数器永远不能小于 0。
我想做的是 运行 一个交易(读取值然后在必要时更新),但这似乎是,如果在交易完成之前多次更新计数器,它将是一次又一次重复,如果计数器在短时间内更新100k次并且交易失败(因为多次重复,可能我错了),可能会忽略一些增加。
是通过交易处理这个问题的唯一方法吗?
您所描述的称为争用瓶颈,是多用户系统中的常见限制。
如果对同一数据进行 10 万次并发更新在您的案例中是一个现实场景,您将需要寻找不同的方法来解决它。
第一个想到的,通常也是一个常见的解决方案,是让用户将他们的 increase/decrease 写入一个单独的“队列”。这可以是 Firestore 中的一个集合,但最重要的是这些都是仅附加操作:多个用户同时写入之间没有争用。
然后您将拥有一个 Cloud 运行 实例或 Cloud Functions,处理来自用户的 increase/decrease 操作。您可以将其限制为最多一个并发或几个并发,从而导致在更新最终计数器时没有争用或争用很少。
假设 1 个用户可以按下按钮将计数器重置为 0。
另一方面,假设多个用户(例如 100k)可以 increase/decrease 同时或在他们需要的时候使用同一个计数器。
计数器永远不能小于 0。
我想做的是 运行 一个交易(读取值然后在必要时更新),但这似乎是,如果在交易完成之前多次更新计数器,它将是一次又一次重复,如果计数器在短时间内更新100k次并且交易失败(因为多次重复,可能我错了),可能会忽略一些增加。
是通过交易处理这个问题的唯一方法吗?
您所描述的称为争用瓶颈,是多用户系统中的常见限制。
如果对同一数据进行 10 万次并发更新在您的案例中是一个现实场景,您将需要寻找不同的方法来解决它。
第一个想到的,通常也是一个常见的解决方案,是让用户将他们的 increase/decrease 写入一个单独的“队列”。这可以是 Firestore 中的一个集合,但最重要的是这些都是仅附加操作:多个用户同时写入之间没有争用。
然后您将拥有一个 Cloud 运行 实例或 Cloud Functions,处理来自用户的 increase/decrease 操作。您可以将其限制为最多一个并发或几个并发,从而导致在更新最终计数器时没有争用或争用很少。