Saya sedang menulis layanan logging sederhana di DynamoDB.
Saya memiliki tabel log yang dikunci oleh hash user_id dan rentang timestamp (Unix epoch int).
Saat pengguna layanan menghentikan akunnya, saya perlu menghapus semua item dalam tabel, terlepas dari nilai kisarannya.
Apa cara yang disarankan untuk melakukan operasi semacam ini (Ingatlah bahwa mungkin ada jutaan item yang akan dihapus)?
Pilihan saya, sejauh yang saya bisa lihat adalah:
J: Lakukan operasi Pindai, panggil hapus pada setiap item yang dikembalikan, sampai tidak ada item yang tersisa
B: Lakukan operasi BatchGet, sekali lagi panggil delete pada setiap item hingga tidak ada yang tersisa
Keduanya tampak mengerikan bagi saya karena akan memakan waktu lama.
Idealnya apa yang ingin saya lakukan adalah memanggil LogTable.DeleteItem (user_id) - Tanpa memberikan jangkauan, dan membuatnya menghapus semuanya untuk saya.
BatchWriteItem
item harus ditentukan melaluiTableWriteItems
batch_writer()
sebagai bagian dariboto3.resource.Table
API yang akan "secara otomatis menangani buffering dan mengirim item dalam batch. Selain itu, penulis batch akan juga secara otomatis menangani item yang belum diproses dan mengirimnya kembali sesuai kebutuhan "yaitu pembungkus di sekitar BatchWriteItem yang mengatur bagian-bagian yang mengganggu. boto3.amazonaws.com/v1/documentation/api/latest/reference/…Menurut dokumentasi DynamoDB Anda cukup menghapus tabel lengkap.
Lihat di bawah:
"Menghapus seluruh tabel secara signifikan lebih efisien daripada menghapus item satu per satu, yang pada dasarnya menggandakan throughput tulis seperti yang Anda lakukan sebanyak operasi penghapusan seperti operasi put"
Jika Anda ingin menghapus hanya sebagian dari data Anda, maka Anda dapat membuat tabel terpisah untuk setiap bulan, tahun atau yang serupa. Dengan cara ini Anda dapat menghapus "bulan lalu" dan menyimpan data Anda yang lain tetap utuh.
Beginilah cara Anda menghapus tabel di Java menggunakan AWS SDK:
sumber
Jika Anda ingin menghapus item setelah beberapa waktu, misalnya setelah sebulan, gunakan saja opsi Time To Live. Ini tidak akan menghitung unit tulis.
Dalam kasus Anda, saya akan menambahkan ttl saat log kedaluwarsa dan meninggalkannya setelah pengguna dihapus. TTL akan memastikan log pada akhirnya dihapus.
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html
sumber
Jawaban dari pertanyaan ini bergantung pada jumlah item dan ukurannya serta anggaran Anda. Tergantung pada 3 kasus berikut:
1- Jumlah item dan ukuran item dalam tabel tidak terlalu banyak. kemudian seperti yang dikatakan Steffen Opel Anda dapat Menggunakan Query daripada Scan untuk mengambil semua item untuk user_id dan kemudian mengulang semua item yang dikembalikan dan memfasilitasi
DeleteItem
atauBatchWriteItem
. Namun perlu diingat Anda mungkin menghabiskan banyak kapasitas throughput di sini. Misalnya, pertimbangkan situasi di mana Anda perlu menghapus 1000 item dari tabel DynamoDB. Asumsikan bahwa setiap item berukuran 1 KB, menghasilkan data sekitar 1MB. Tugas penghapusan massal ini akan membutuhkan total 2000 unit kapasitas tulis untuk melakukan kueri dan penghapusan. Untuk melakukan pemuatan data ini dalam 10 detik (yang bahkan tidak dianggap secepat di beberapa aplikasi), Anda perlu menyetel throughput tulis yang disediakan tabel ke 200 unit kapasitas tulis. Seperti yang Anda lihat, ini bisa dilakukan untuk menggunakan cara ini jika itu untuk jumlah barang yang lebih sedikit atau barang berukuran kecil.2- Kami memiliki banyak item atau item yang sangat besar di meja dan kami dapat menyimpannya sesuai waktu ke dalam tabel yang berbeda. Kemudian sebagai jonathan Said Anda cukup menghapus tabel. ini jauh lebih baik tetapi saya rasa tidak cocok dengan kasus Anda. Karena Anda ingin menghapus semua data pengguna tidak peduli kapan waktu pembuatan log, jadi dalam hal ini Anda tidak dapat menghapus tabel tertentu. jika Anda ingin memiliki tabel terpisah untuk setiap pengguna maka saya kira jika jumlah pengguna tinggi maka itu sangat mahal dan tidak praktis untuk kasus Anda.
3- Jika Anda memiliki banyak data dan Anda tidak dapat membagi data panas dan dingin Anda ke dalam tabel yang berbeda dan Anda perlu melakukan penghapusan skala besar secara rutin, sayangnya DynamoDB bukanlah pilihan yang baik untuk Anda sama sekali. Mungkin menjadi lebih mahal atau sangat lambat (tergantung pada anggaran Anda). Dalam kasus ini saya merekomendasikan untuk mencari database lain untuk data Anda.
sumber
Pendekatan saya untuk menghapus semua baris dari tabel i DynamoDb hanya menarik semua baris keluar dari tabel, menggunakan DynamoDbs ScanAsync dan kemudian memasukkan daftar hasil ke DynamoDbs AddDeleteItems. Kode di bawah ini di C # berfungsi dengan baik untuk saya.
Catatan: Menghapus tabel dan membuatnya kembali dari konsol web dapat menyebabkan masalah jika menggunakan YAML / CloudFront untuk membuat tabel.
sumber
Kami tidak memiliki opsi untuk memotong tabel dinamo. kita harus menjatuhkan tabel dan membuat lagi. Biaya DynamoDB didasarkan pada ReadCapacityUnits & WriteCapacityUnits. Jika kita menghapus semua item menggunakan fungsi BatchWriteItem, itu akan menggunakan WriteCapacityUnits. Jadi lebih baik untuk menghapus record tertentu atau hapus tabel dan mulai lagi.
sumber