Tôi đang thiết kế một hệ thống cho khách hàng với các yêu cầu là:
- họ tải lên một tệp JSON (một đối tượng / dòng)
- thực hiện cuộc gọi đến API với đối tượng JSON làm trọng tải
- ghi lại trạng thái (thành công / thất bại) của mỗi lệnh gọi API trong cơ sở dữ liệu
- làm một lần thử lại nếu có một thất bại.
Tôi quyết định xây dựng nó bằng cách sử dụng cần tây và cơ sở dữ liệu sqlite làm phụ trợ. Số lượng dòng JSON không lớn - có thể nhiều nhất là vài triệu - sẽ phù hợp với bộ nhớ. Tôi có tất cả các thành phần riêng lẻ hoạt động tốt (có thể tải lên tệp, có thể đọc tệp, có thể gọi API, có thể ghi vào db, v.v.), nhưng tôi không chắc về kiến trúc tổng thể của việc gửi các tác vụ bằng cách sử dụng cần tây.
Giả sử có N dòng trong tệp, tôi nên:
Tùy chọn A:
- Tạo N đối tượng trong cơ sở dữ liệu với một
result
cột (ban đầu là null). - Tạo N nhiệm vụ cần thiết và truyền id đối tượng làm tham số và tải trọng
- Tạo các nhiệm vụ con gọi API và cập nhật trường kết quả của đối tượng thành thành công / thất bại.
- Hãy để tính năng thử lại của celery cố gắng gọi lại API trong trường hợp thất bại.
Tùy chọn B:
- Tạo N đối tượng trong cơ sở dữ liệu với một
result
cột (ban đầu là null). - Tạo 1 tác vụ cần tây và vượt qua toàn bộ danh sách N đối tượng id và N tải trọng
- Lặp qua tất cả N đối tượng và cập nhật cơ sở dữ liệu với kết quả ở mỗi bước.
- Khi tác vụ trước kết thúc, nó sẽ thực hiện một tác vụ cần tây một lần khác để đọc cơ sở dữ liệu cho tất cả các đối tượng có kết quả thất bại và thử lại chúng.
Tôi thích lựa chọn A vì tính đơn giản của nó nhưng tôi không biết giới hạn nào về số lượng tác vụ cần tây có thể được lên lịch và nếu người môi giới (RabbitMQ) sẽ xử lý nó. Với tùy chọn B, rủi ro lớn là nếu nhiệm vụ cần tây bị chấm dứt vì bất kỳ lý do nào tại một số dòng M, thì tất cả các đối tượng sau sẽ không bao giờ được thử.
Bất kỳ suy nghĩ về hai hoặc nếu có một sự thay thế tốt thứ ba?