2012-01-30 16 views
5

Tôi sẽ không bao giờ tạo đủ thực thể để hết dung lượng địa chỉ 63 bit, nhưng nói rằng tôi đã sử dụng allocateIdRange để cấp id 9223372036854775807 (gần như là 2^63). Liệu loại thực thể đó có bị hỏng cho các thực thể mới được nhập tự động không?Tôi có thể mong đợi điều gì khi tôi hết id trên AppEngine?

Tôi đã dùng thử trong ứng dụng thử nghiệm. Dường như một số phân đoạn của ID tự động có thể tiếp tục tạo id hợp lệ, nhưng các phân đoạn khác chỉ cung cấp một số DatastoreFailureException. Tỷ lệ thành công là khoảng 30%. Nó sẽ đi lên?

Đây thực sự là một câu hỏi nghiêm trọng bởi vì, trong sự ngây thơ của tôi, tôi đã tạo ra một số id khá lớn. Tôi vẫn có vài nghìn tỷ thực thể đi trước khi tôi đạt đến giới hạn này, nhưng tôi nhận thấy rằng các id có thể nhảy qua hàng triệu giữa các thực thể và tôi nhập các thực thể mới với tốc độ khoảng một triệu mỗi năm. Vì vậy ... Tôi sợ phải đạt đến giới hạn này.

+0

Bạn có thể sử dụng id gia tăng và nó không phải là vấn đề –

+0

Cảm ơn bạn đã trả lời. Làm thế nào tôi có thể sử dụng id gia tăng? Trong các thử nghiệm của tôi, phân bổ mặc định mà appengine không hoạt động. –

+3

Miễn là bạn không tạo ra bất kỳ id lớn hơn tôi nghĩ bạn sẽ không sao. Tôi tin rằng khoảng cách giữa các id đến từ reset trong các quầy địa phương được sử dụng để phân bổ id. Bạn có thể hình dung nó hoạt động như thế nào: Các mảnh khác nhau của kho dữ liệu sử dụng tương đương nội bộ của allocate_ids để yêu cầu ví dụ: 100 id và sau đó trao chúng cho các thực thể mới; nếu một mảnh vỡ bị giết bất kỳ ids nó đã không đưa ra được nêu ra là mãi mãi dành riêng. Tôi đang tạo ra các id mới với tốc độ một triệu mỗi năm tôi nghĩ rằng hầu hết các mảnh vỡ sẽ phát ra nhiều id trước khi chúng chết. Bạn có thể lấy mẫu id trong một tháng và dự đoán tỷ lệ. –

Trả lời

2

Với ứng dụng thử nghiệm, tôi đã đặt trước một loạt các id rất cao với allocateIdRange. Lúc đầu, khoảng một nửa nỗ lực của tôi để đưa các thực thể mới thành công. Bây giờ, no thực thể mới có thể được đặt bằng id trống - một số DatastoreFailureException được nâng lên mỗi lần. Tôi đoán điều này là bởi vì việc thực hiện phân bổ khóa không theo dõi các khoảng trống trong các khóa, nhưng chỉ theo dõi các id cao nhất được đưa ra cho đến nay.

Tôi không thấy bất kỳ cách nào để đặt lại bộ đếm cho Loại này, vì vậy tôi nghĩ giải pháp duy nhất là chọn tên Kind mới.

Bài học: không sử dụng id ở bất kỳ đâu gần 2^63!

Các vấn đề liên quan