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



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

  • register—如果这是一个新用户,我们将把他添加到系统中并返回他的注册时间戳。如果这是一个现有的用户,我们将返回他以前的注册时间戳。
  • 查询-我们将返回该用户的注册时间戳。

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

我主要关心的是,下面的代码能够实现强一致性吗?

  • 我不使用父实体
  • 我不使用任何交易。

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)

是的,按键(即按id)获取总是强一致的。最终一致性只与查询有关。

get_or_insert正在运行一个事务。

最新更新