Я пишу базу данных ошибок с помощью Google App Engine, и у меня возникают проблемы с получением уникальных номеров ошибок. Каждому жучку нужен уникальный номер, чтобы пользователи могли легко ссылаться на него, а числа должны быть простыми и как можно меньше. «Эй, я исправил ошибку 27» или «Я снова открыл ошибку 1867». Номера ошибок также должны увеличиваться, чтобы пользователи имели четкое представление о том, какие ошибки возникли после какой ошибки.
В App Engine нет настоящих счетчиков, таких как SQL, поэтому я реализовал следующую функцию, которая в основном представляет собой код, который рекомендует Google, но не работает постоянно.
Я иногда вижу повторяющиеся номера ошибок. В настоящее время я единственный человек, использующий базу данных ошибок (что значимо, эта ошибка находится в моей базе данных ошибок), и я не буду вводить ошибки быстрее, чем один раз в 5 или 10 секунд (если я печатаю быстро). Несмотря на то, что со временем появятся несколько пользователей, которые могут одновременно вводить ошибки.
class SimpleCounterShard(db.Model):
count = db.IntegerProperty(required=True, default=0)
def getNewID():
def txn():
index = random.randint(0, NUM_SHARDS - 1)
shard_name = "shard" + str(index)
counter = SimpleCounterShard.get_by_key_name(shard_name)
if counter is None:
counter = SimpleCounterShard(key_name=shard_name)
counter.count += 1
counter.put()
db.run_in_transaction(txn)
total = 0
for counter in SimpleCounterShard.all():
total += counter.count
return total
Что я делаю не так (или не понимаю)? Или лучше, если в некоторых случаях на производственных серверах появляются уникальные номера, которые не являются случайными, как, например, ключи или идентификаторы.