我已经构建了一个后端系统,以支持手机应用的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
正在运行一个事务。