PARSE - 处理并发请求?

时间:2016-05-09 08:31:42

标签: javascript parse-platform scaling cloud-code parse-server

我使用解析创建了一个基于转弯的绘图游戏,您可以在其中与任何人玩游戏。一次只能有一个用户可以玩。有三个回合。它在玩家的朋友列表中工作正常 - >您要么开始新游戏,要么接收通知以继续游戏。

我试图实现多人游戏模式 - >为此,我在数据库中有一个单独的列表,包含所有可用的公共游戏。如果游戏是公开的,我会在该列表中创建一个带有指向游戏的指针的新对象。每次用户搜索可用游戏时,他都会查询该列表,如果找到记录,我会删除此特定列表中的公共游戏对象,使其对其他用户不可用,游戏继续进行..

我想知道以下内容 - > Parse如何处理并发请求? 是否有可能同时搜索的多个用户会尝试删除同一个对象(请参阅下面的代码)?我已经在我的查询中跳过了一个随机索引来避免这种行为,但这看似微不足道。

以下是处理请求的云代码示例:

Parse.Cloud.define('findPublicGame', function(req, res) {
    var query = new Parse.Query("public");
    query.count({
        success: function(number) {
            if (number == 0) {
                // no public games - reject
                res.success(number);
            } else {
                // public game found - handle
                query.limit(1)
                var randomIndex = parseInt(Math.random() * number);
                query.skip(randomIndex);
                query.find({
                    success: function(object) {
                        // delete public
                        object[0].destroy({
                            success: function(_data) {
                                res.success(_data);
                            },
                            error: function(error) {
                                res.error();
                            }
                        });
                    },
                    error: function(error, object) {
                        res.error(error);
                    }
                });
            }
        },
        error: function(error) {
            res.error(error);
        }
    });
});

假设试图销毁已经被破坏的对象会导致错误,这是正确的吗?

我有一个想法是在公共游戏对象上添加一个beforeDelete函数,以检查它是否仍然可用,但我现在试图保持我的请求数量较低..

如果有人能够启发我,请称赞!

1 个答案:

答案 0 :(得分:0)

  

假设试图销毁已经被破坏的对象会导致错误,这是正确的吗?

根据我的经验,不,这不正确。我总是直接使用Android和iOS API中可用的删除方法,而不是调用解析云中的方法,但对于Android和iOS API中的删除方法,在已删除的对象上调用delete不会引发错误。它就像删除成功一样。

  

我有一个想法是在公共游戏对象上添加一个beforeDelete函数,以检查它是否仍然可用,但我现在正试图保持我的请求数量很少..

这是您的最佳选择。通常,您正在处理“对象修改”,因此您可以检查类似“已修改时间”的时间戳,但由于您要删除对象,因此您只需检查它是否仍然存在。