Saya merancang sistem untuk klien di mana persyaratannya adalah:
- mereka mengunggah file JSON (satu objek / baris)
- melakukan panggilan ke API dengan objek JSON sebagai payload
- merekam keadaan (berhasil / gagal) dari setiap panggilan API dalam database
- buat satu coba lagi jika ada kegagalan.
Saya memutuskan untuk membuatnya menggunakan seledri dan database sqlite sebagai backend. Jumlah garis JSON tidak besar - mungkin paling banyak beberapa juta - yang sesuai dengan memori. Saya memiliki semua komponen yang berfungsi dengan baik (dapat mengunggah file, dapat membaca file, dapat memanggil API, dapat menulis ke db, dll.), Tetapi saya tidak yakin tentang keseluruhan arsitektur tugas pengiriman menggunakan seledri.
Dengan asumsi ada garis N dalam file, haruskah saya:
Opsi A:
- Buat objek N dalam database dengan
result
kolom (awalnya nol). - Buat tugas seledri N dan lulus id objek sebagai parameter dan payload
- Buat subtugas memanggil API dan perbarui bidang hasil objek untuk berhasil / gagal.
- Biarkan fitur coba lagi seledri mencoba memanggil API lagi jika terjadi kegagalan.
Opsi B:
- Buat objek N dalam database dengan
result
kolom (awalnya nol). - Buat 1 tugas seledri dan lewati seluruh daftar id objek N dan muatan N
- Ulangi semua objek N dan perbarui database dengan hasil pada setiap langkah.
- Ketika tugas sebelumnya selesai, ia menembakkan tugas seledri satu kali yang membaca database untuk semua objek dengan hasil kegagalan dan mencoba lagi.
Saya mendukung opsi A karena kesederhanaannya tetapi saya tidak tahu apa batasnya pada jumlah tugas seledri yang dapat dijadwalkan dan apakah broker (RabbitMQ) akan menanganinya. Dengan opsi B, risiko besar adalah bahwa jika tugas seledri dihentikan karena alasan apa pun di garis M, maka semua objek berikut tidak akan pernah bisa dicoba.
Adakah pemikiran tentang keduanya atau jika ada alternatif ketiga yang lebih baik?