Thực hiện cuộc gọi API với cần tây


8

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:

  1. Tạo N đối tượng trong cơ sở dữ liệu với một resultcột (ban đầu là null).
  2. 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
  3. 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.
  4. 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:

  1. Tạo N đối tượng trong cơ sở dữ liệu với một resultcột (ban đầu là null).
  2. 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
  3. 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.
  4. 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?

Câu trả lời:


1

Tùy chọn Một âm thanh giống như cách bạn có thể thiết lập API một cách độc lập thay vì một nhiệm vụ lớn mà chỉ một công nhân có thể quản lý.

Tôi có một kịch bản rất giống nhau khi sử dụng kombu và Celery:

  • Chúng tôi nhận được một tin nhắn được đăng lên RMQ bằng cách tích hợp vào hàng đợi RMQ
  • Chúng tôi có một sự kiện thoát nước tiêu dùng kombu
  • Khi sự kiện được nhận, chúng tôi thực hiện gọi lại (gửi đến hàng đợi python cục bộ)
  • cần tây nhận được tin nhắn được gửi qua hàng đợi python và xử lý nó
  • Sau khi hoàn thành, nó trả về kết quả và chúng tôi chuyển tiếp thông báo đến nhà sản xuất kombu
  • Nhà sản xuất gửi lại cho RMQ

Như bạn có thể thấy, về cơ bản chúng tôi sử dụng phương pháp tương tự như bạn. Chúng tôi có điều này trong việc xử lý sản xuất khoảng 2000 tin nhắn mỗi giờ mà không có vấn đề gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.