Melakukan panggilan API dengan seledri

8

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:

  1. Buat objek N dalam database dengan resultkolom (awalnya nol).
  2. Buat tugas seledri N dan lulus id objek sebagai parameter dan payload
  3. Buat subtugas memanggil API dan perbarui bidang hasil objek untuk berhasil / gagal.
  4. Biarkan fitur coba lagi seledri mencoba memanggil API lagi jika terjadi kegagalan.

Opsi B:

  1. Buat objek N dalam database dengan resultkolom (awalnya nol).
  2. Buat 1 tugas seledri dan lewati seluruh daftar id objek N dan muatan N
  3. Ulangi semua objek N dan perbarui database dengan hasil pada setiap langkah.
  4. 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?

pengguna154706
sumber

Jawaban:

1

Opsi A terdengar seperti cara untuk pergi karena Anda dapat menetapkan pekerja itu API secara mandiri, bukan tugas besar yang hanya bisa dikelola oleh satu pekerja.

Saya memiliki skenario yang sangat mirip menggunakan kombu dan Seledri:

  • Kami mendapatkan pesan yang diposting ke RMQ oleh beberapa integrasi ke antrian RMQ
  • Kami memiliki acara pengeringan konsumen kombu
  • Ketika acara diterima, kami mengeksekusi callback (posting ke antrian python lokal)
  • seledri menerima pesan yang dikirim melalui antrian python dan memprosesnya
  • Setelah selesai, hasilnya dikembalikan dan kami menyampaikan pesan ke produsen kombu
  • Produser memposting kembali ke RMQ

Seperti yang Anda lihat, pada dasarnya kami menggunakan pendekatan yang sama seperti Anda. Kami memiliki ini dalam penanganan produksi sekitar 2000 pesan per jam tanpa masalah.

ZeroSoul13
sumber