Saya punya sedikit masalah aneh. Saya memiliki modul yang berjalan di gae yang menempatkan banyak tugas kecil di antrian tugas default. Tugas mengakses modul ndb yang sama. Setiap tugas mengakses sekumpulan data dari beberapa tabel berbeda lalu memanggil put
.
Beberapa tugas pertama berfungsi dengan baik tetapi seiring berjalannya waktu saya mulai menyelesaikannya di put
terakhir:
suspended generator _put_tasklet(context.py:358) raised TransactionFailedError(too much contention on these datastore entities. please try again.)
Jadi saya membungkusnya dengan percobaan dan memasukkan batas waktu acak sehingga mencoba ulang beberapa kali. Hal ini sedikit meringankan masalah, hal ini terjadi di kemudian hari.
Berikut ini beberapa kodesemu untuk tugas saya:
def my_task(request):
stuff = get_ndb_instances() #this accessed a few things from different tables
better_stuff = process(ndb_instances) #pretty much just a summation
try_put(better_stuff)
return {'status':'Groovy'}
def try_put(oInstance,iCountdown=10):
if iCountdown<1:
return oInstance.put()
try:
return oInstance.put()
except:
import time
import random
logger.info("sleeping")
time.sleep(random.random()*20)
return oInstance.try_put(iCountdown-1)
Tanpa menggunakan try_put
antrian akan melewati sekitar 30% hingga berhenti bekerja. Dengan try_put itu menjadi lebih jauh, seperti 60%.
Mungkinkah suatu tugas menahan koneksi ndb setelah selesai? Saya tidak menggunakan transaksi secara eksplisit.
Sunting:
sepertinya ada kebingungan tentang apa yang saya tanyakan. Pertanyaannya adalah: Mengapa perselisihan ndb semakin memburuk seiring berjalannya waktu. Saya memiliki banyak tugas yang berjalan secara bersamaan dan mereka mengakses ndb dengan cara yang dapat menimbulkan perselisihan. Jika pertikaian terdeteksi maka percobaan ulang dengan waktu acak akan dilakukan dan ini menghilangkan pertikaian dengan baik. Sebentar. Tugas terus berjalan dan terselesaikan dan semakin banyak yang berhasil kembali maka semakin banyak pertikaian yang terjadi. Padahal proses yang menggunakan data yang dipermasalahkan harusnya sudah selesai. Apakah ada sesuatu yang terjadi yang menahan pegangan penyimpanan data yang tidak semestinya? Apa yang sedang terjadi?
EDIT2:
Berikut ini sedikit tentang struktur utama yang berperan:
Model ndb saya berada dalam hierarki di mana kita memiliki sesuatu seperti ini (arah panah menentukan hubungan induk anak, yaitu: Tipe memiliki banyak Instance anak, dll)
Type->Instance->Position
Id Posisi dibatasi pada beberapa nama berbeda, terdapat ribuan contoh dan tidak banyak jenis.
Saya menghitung banyak Posisi dan kemudian melakukan try_put_multi (mirip dengan try_put dengan cara yang jelas) dan mendapatkan perselisihan. Saya akan segera menjalankan kodenya lagi dan mendapatkan penelusuran balik lengkap untuk disertakan di sini.
Instance
s hingga beberapaType
s =› grup entitas besar, setiap grup mendukung maksimal ~ 1 penulisan per detik. Berapa kecepatan pembaruan tugasInstance
s untukType
induk yang sama (yaitu grup yang sama)? Apakah Anda memilikithreadsafe: true
di konfigurasi.yaml
Anda? - person Dan Cornilescu   schedule 01.03.2016