𝗛𝗼𝘄 𝗜 𝗕𝘂𝗶𝗹𝘁 𝗮 𝗦𝗲𝘁 𝗜𝘁 𝗮𝗻𝗱 𝗙𝗼𝗿𝗴𝗲𝘁 𝗜𝘁 𝗦𝘆𝗻𝗰 𝗦𝘆𝘀𝘁𝗲𝗺
Bagaimana Saya Membina Sistem Sinkronisasi "Set It and Forget It"
Harga produk berubah di banyak tempat. Ia berubah di panel admin, melalui import pukal, atau melalui webhook API.
Jika anda ingin menyinkronkan perubahan ini ke pasaran luaran, anda akan menghadapi masalah. Menambah panggilan sinkronisasi ke setiap laluan kod adalah satu kesilapan. Anda akan terlupa satu. Anda akan merosakkan satu. Penyelenggaraan akan menjadi satu mimpi ngeri.
Django signals menyelesaikan masalah ini. Anda menyambung (hook) ke acara simpanan model (model save event). Ini menangkap setiap perubahan di satu tempat.
Tetapi signals mempunyai kelemahan. Jika anda mengemas kini 100 harga sekaligus, signal akan dicetuskan sebanyak 100 kali. Ini mencetuskan 100 panggilan API. Anda akan terkena had kadar (rate limits) atau membazir sumber.
Saya menggunakan corak tiga bahagian untuk memperbaikinya:
• Pengendali signal yang mengumpul ID dan bukannya bertindak serta-merta.
• Set bagi setiap thread untuk membuang pendua.
• Callback flush menggunakan transaction.on_commit untuk memproses semuanya sekaligus.
Begini cara ia berfungsi.
Gunakan
threading.local()Jangan gunakan pemboleh ubah global. Pemboleh ubah global berkongsi keadaan (state) merentasi permintaan (requests). Ini membawa kepada kebocoran data.threading.local()memastikan data terasing kepada satu thread sahaja.Rekod, jangan bertindak Pengendali signal hanya menambah ID produk ke dalam satu set. Ia kemudian memberitahu Django untuk menjalankan fungsi flush hanya selepas transaksi pangkalan data berjaya. Ini menghalang penyinkronan data yang gagal disimpan.
Lakukan secara berkelompok (Batch) Apabila transaksi selesai (commits), fungsi flush akan dijalankan. Ia menyalin set tersebut dan mengosongkannya. Kemudian, ia menghantar keseluruhan senarai ID ke lapisan perkhidmatan (service layer).
Lapisan perkhidmatan melakukan satu pertanyaan pukal (bulk query) untuk mengambil semua produk. Ia mengelompokkannya mengikut kedai. Akhir sekali, ia menghantar satu tugasan tunggal ke Celery bagi setiap kedai.
Manfaatnya adalah jelas:
- Penyingkiran pendua (Deduplication) adalah automatik. Set menguruskannya untuk anda.
- Keselamatan transaksi sudah terbina. Anda tidak akan menyinkronkan data yang telah dibatalkan (rolled-back).
- Kecekapan adalah tinggi. Anda mengelakkan masalah pertanyaan N+1.
- Kebolehpercayaan adalah tinggi. Celery mengendalikan cubaan semula (retries) jika API gagal.
Anda membina sistem ini sekali sahaja. Setiap ciri baharu yang anda tambah kemudiannya akan berfungsi dengan sistem sinkronisasi secara automatik.
Bagaimana anda mengendalikan sinkronisasi API luaran dalam Django? Adakah anda menggunakan signals atau corak yang berbeza?
Sumber: https://dev.to/acel/how-i-built-a-set-it-and-forget-it-sync-system-with-django-signals-2ld7