我们可以通过使用纯粹的get_or_insert和get_by_id来实现强一致性,而无需父实体和事务

时间:2015-07-25 06:09:14

标签: python google-app-engine

我已经构建了一个后端系统,以支持移动应用程序的7天免费试用功能。它由2个API组成

  • register - 如果这是一个新用户,我们会将他添加到系统并返回他的注册时间戳。如果这是现有用户,我们将返回其先前的注册时间戳。
  • query - 我们将返回此用户的注册时间戳。

在我的用例中,强一致性非常重要。

我主要担心的是,以下代码是否能够实现强一致性?

作为

  • 我不使用父实体
  • 我没有使用任何交易。
class User(ndb.Model):
    email = ndb.StringProperty(required = True)
    timestamp = ndb.DateTimeProperty(required = True)


class RegisterHandler(webapp2.RequestHandler):
    def get(self):
        result = {
            'email' : email,
            'user_timestamp' : 0,
        }

        email = self.request.get('email')
        user_timestamp = int(time.time())
        user = User.get_or_insert(email, email=email, timestamp=datetime.datetime.fromtimestamp(user_timestamp))

        result['user_timestamp'] = int(time.mktime(user.timestamp.timetuple()))
        self.response.headers['Content-Type'] = 'application/json'
        json_result = json.encode(result)
        self.response.out.write(json_result)


class QueryHandler(webapp2.RequestHandler):
    def get(self):
        result = {
            'email' : email,
            'user_timestamp' : 0,
        }

        email = self.request.get('email')
        user = User.get_by_id(email)

        if user is not None:
            result['user_timestamp'] = int(time.mktime(user.timestamp.timetuple()))

        self.response.headers['Content-Type'] = 'application/json'
        json_result = json.encode(result)
        self.response.out.write(json_result)

1 个答案:

答案 0 :(得分:1)

是的,按键获取(即通过id)总是非常一致。最终的一致性只是查询的一个问题。

但是,

get_or_insert正在运行一项交易。