pertentangan data ndb semakin buruk

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.


person Sheena    schedule 16.02.2016    source sumber
comment
Apakah Anda benar-benar sudah mencoba/kecuali?   -  person Tim Hoffman    schedule 16.02.2016
comment
Apa struktur kunci yang digunakan, kesalahan pertentangan seperti apa yang Anda dapatkan?   -  person Tim Hoffman    schedule 16.02.2016
comment
@TimHoffman: Tidak. Kode ini adalah versi singkat dari aslinya   -  person Sheena    schedule 01.03.2016
comment
@TimHoffman: jenis perselisihan, saya tidak mendapatkan banyak informasi selain pengecualian yang saya tempelkan di pertanyaan saya di atas. Saya akan mengedit untuk berbicara tentang struktur utama.   -  person Sheena    schedule 01.03.2016
comment
@BrentWashburne: Saya tidak percaya ini duplikat. masalahnya adalah pertikaian menjadi semakin buruk dari waktu ke waktu meskipun jumlah proses yang menangani data memiliki batas atas yang ketat.   -  person Sheena    schedule 01.03.2016
comment
Apakah Anda melihat jumlah contoh aplikasi meningkat selama ini?   -  person Dan Cornilescu    schedule 01.03.2016
comment
@DanCornilescu: Saya akan menjalankan hal ini lagi dan mendapatkan nomor-nomor itu   -  person Sheena    schedule 01.03.2016
comment
Ribuan Instances hingga beberapa Types =› grup entitas besar, setiap grup mendukung maksimal ~ 1 penulisan per detik. Berapa kecepatan pembaruan tugas Instances untuk Type induk yang sama (yaitu grup yang sama)? Apakah Anda memiliki threadsafe: true di konfigurasi .yaml Anda?   -  person Dan Cornilescu    schedule 01.03.2016


Jawaban (1)


Pertentangan akan menjadi lebih buruk dari waktu ke waktu jika Anda terus-menerus melebihi 1 penulisan/transaksi per grup entitas per detik. Jawabannya ada pada cara kerja Megastore/Paxo dan cara Cloud Datastore menangani perselisihan di backend.

Ketika 2 penulisan dilakukan secara bersamaan pada node berbeda di Megastore, satu transaksi akan menang dan transaksi lainnya gagal. Cloud Datastore mendeteksi pertentangan ini dan akan mencoba kembali transaksi yang gagal beberapa kali. Biasanya hal ini mengakibatkan transaksi berhasil tanpa ada kesalahan yang disampaikan kepada klien.

Jika penulisan berkelanjutan di atas batas yang disarankan sedang dicoba, kemungkinan transaksi perlu dicoba ulang beberapa kali akan meningkat. Jumlah transaksi dalam keadaan percobaan ulang internal juga meningkat. Pada akhirnya, transaksi akan mulai mencapai batas percobaan ulang internal kami dan akan mengembalikan kesalahan pertentangan kepada klien.

Metode tidur acak adalah cara yang salah untuk menangani situasi respons kesalahan. Anda sebaiknya melihat kemunduran eksponensial dengan jitter (contoh).

Demikian pula, inti masalah Anda adalah kecepatan penulisan yang tinggi ke dalam satu grup entitas. Anda harus melihat apakah pengasuhan eksplisit diperlukan (menghapusnya jika tidak), atau apakah Anda harus membagi grup entitas dengan cara yang masuk akal sesuai dengan pertanyaan dan persyaratan konsistensi Anda.

person Dan McGrath    schedule 28.12.2016