2013-02-28 41 views
6

Tôi đang cố triển khai một số điều chỉnh trên API REST của mình. A typical approach là sau một ngưỡng nhất định để chặn yêu cầu (với 403 hoặc 429 phản hồi). Tuy nhiên, tôi đã thấy one api thay vào đó, hãy thêm chậm trễ vào phản hồi.điều chỉnh các cuộc gọi http api với độ trễ

Khi bạn thực hiện cuộc gọi đến API, chúng tôi sẽ xem xét số cuộc gọi trung bình của bạn mỗi giây (c/s) trong khoảng thời gian năm phút trước đó. Đây là những gì sẽ xảy ra:

  • trên 3c/s và chúng tôi thêm một sự chậm trễ 2 giây

  • trên 5c/s và chúng tôi thêm một sự chậm trễ 4 thứ hai

  • trên 7c/s và chúng tôi thêm một sự chậm trễ 5 giây

Từ quan điểm của khách hàng, tôi thấy điều này là tốt hơn so với việc trở lại một lỗi. Điều tồi tệ nhất có thể xảy ra là bạn sẽ chậm lại.

Tôi tự hỏi làm thế nào điều này có thể đạt được mà không ảnh hưởng tiêu cực đến máy chủ ứng dụng. tức là để thêm những sự chậm trễ đó, máy chủ cần phải giữ yêu cầu mở, khiến cho yêu cầu xử lý ngày càng nhiều bận rộn, nghĩa là nó có ít dung lượng hơn cho các yêu cầu mới sắp tới.

Cách tốt nhất để thực hiện điều này là gì? (nghĩa là cái gì đó có thể được thực hiện trên máy chủ web/cân bằng tải để máy chủ ứng dụng không bị ảnh hưởng tiêu cực? Có một số loại lớp điều chỉnh có thể được thêm vào cho mục đích này không?)

Chúng tôi ' tái sử dụng Django/Tastypie, nhưng câu hỏi là nhiều hơn về kiến ​​trúc/mức độ khái niệm.

Trả lời

3

Nếu bạn đang sử dụng máy chủ ứng dụng đồng bộ là thiết lập phổ biến nhất cho các ứng dụng Django (ví dụ: gunicorn với mặc định --worker-class sync), thì việc thêm chậm trễ trong ứng dụng thực sự sẽ có tác động rất xấu đến hiệu suất. Công nhân xử lý yêu cầu bị trì hoãn sẽ bị chặn trong thời gian chậm trễ.

Nhưng bạn có thể sử dụng máy chủ ứng dụng không đồng bộ (ví dụ: gunicorn với '--worker-class gevent`) và sau đó chi phí trên không đáng kể. Một nhân viên xử lý các yêu cầu bị trì hoãn có thể xử lý các yêu cầu khác trong khi đang tiến hành trì hoãn.

Làm điều này trong máy chủ proxy ngược có thể là một lựa chọn tốt hơn, bởi vì nó cho phép điều chỉnh chính sách dễ dàng và linh hoạt. Có an external nginx module for exactly such thing.

+0

Cảm ơn! Có vẻ như chính xác thứ tôi đang tìm kiếm (không chắc chắn điều gì, nhưng có lẽ sẽ làm). – gingerlime

+0

Đó có phải là 'nginx-delay-module' có thể lấy chỉ dẫn từ Django theo bất kỳ cách nào không? Ví dụ: nếu lạm dụng được xác định thông qua chế độ xem Django, tôi có thể hướng dẫn plugin đó trì hoãn phản hồi ở phía bên nginx không? Lý tưởng nhất là tôi muốn viết một lớp Throttle tùy chỉnh cho DRF bằng cách sử dụng này. – dtgq

Các vấn đề liên quan