2009-11-28 29 views
7

Tôi đang làm việc trên thư viện lớp học để truy xuất thông tin từ trang web của bên thứ ba. Trang web đang truy cập sẽ ngừng phản hồi nếu có quá nhiều yêu cầu được thực hiện trong khoảng thời gian đã đặt (~ 0,5 giây).Trách nhiệm của ai là điều chỉnh yêu cầu web?

Các phương pháp công cộng của thư viện của tôi liên quan trực tiếp đến tài nguyên một tệp trên máy chủ web. Nói cách khác, mỗi khi một phương thức được gọi, một HttpWebRequest được tạo và gửi đến máy chủ. Nếu mọi thứ suôn sẻ, một tập tin XML sẽ được trả lại cho người gọi. Tuy nhiên, nếu đây là yêu cầu web thứ hai dưới 0,5 giây, yêu cầu sẽ hết thời gian chờ.

Tình trạng khó xử của tôi nằm ở cách tôi nên xử lý yêu cầu điều chỉnh (nếu có). Rõ ràng, tôi không muốn người gọi ngồi chờ đợi một phản ứng - đặc biệt là nếu tôi hoàn toàn chắc chắn rằng yêu cầu của họ sẽ hết thời gian chờ.

Thư viện của tôi có ý nghĩa hơn trong việc xếp hàng và điều chỉnh các yêu cầu web mà tôi tạo hay thư viện của tôi chỉ cần ném ngoại lệ nếu khách hàng không chờ đủ lâu giữa các cuộc gọi API?

+0

Justin. Là trang web bạn đang truy cập của bạn hoặc một bên thứ 3. Ý kiến ​​"Công dân tốt" của tôi dựa trên đó là một bên thứ 3, nhưng những người khác dường như đã giả định trang web của bạn. – Andiih

+0

Trang web thực sự là trang web của bên thứ ba. Cảm ơn bạn đã chỉ ra rằng tôi đã không chỉ định điều đó. Tôi đã cập nhật câu hỏi của mình để làm rõ. –

Trả lời

6

Khái niệm về thư viện là cung cấp cho mã khách hàng của mình càng ít lo lắng càng tốt. Do đó tôi sẽ làm cho nó trở thành công việc của thư viện để xếp hàng các yêu cầu và trả về kết quả một cách kịp thời. Trong một thế giới lý tưởng, bạn sẽ sử dụng một mô hình gọi lại hoặc đại biểu để mã máy khách có thể hoạt động không đồng bộ, không chặn giao diện người dùng. Bạn cũng có thể cung cấp tùy chọn bỏ qua hàng đợi, (và thất bại nếu nó hoạt động quá sớm) và thậm chí có thể đưa ra các ưu tiên trong mô hình hàng đợi.

Tôi cũng tin rằng tác giả thư viện có trách nhiệm mặc định là công dân tốt và hoạt động mặc định của thư viện tuân thủ các điều kiện của nhà cung cấp dữ liệu.

+0

+1 cho phần "công dân tốt". Tôi gần như quên xem vấn đề này từ quan điểm của nhà cung cấp dữ liệu. Nhưng sau đó làm cách nào để đảm bảo rằng kết quả sẽ được cung cấp kịp thời, mà không đặt giới hạn số lượng yêu cầu có thể xếp hàng đợi? –

+1

Tôi không nghĩ rằng bạn cần phải đảm bảo, miễn là bạn cung cấp các phương pháp để truy vấn kích thước hàng đợi, và có lẽ cũng có một thời gian chờ thực hiện bởi thư viện. – Andiih

+0

Nhưng đồng thời, nó sẽ không được tinh khiết hơn để chỉ đơn giản là để cho nó xảy ra, để cho yêu cầu bị từ chối, nhưng chỉ cần cho họ biết rằng họ đang làm nó quá nhanh? Bên cạnh đó, một ngày thực hiện trang web thực tế có thể nâng giới hạn cao hơn, cũng có thể chỉ cho phép thư viện trở thành sứ giả thay vì một nhà độc tài. – BigOmega

2

Đó là trách nhiệm của máy chủ web, imo. Bởi vì tải trọng quan trọng phụ thuộc vào phần cứng, băng thông mạng, v.v ... rất nhiều thứ nằm ngoài tầm kiểm soát của ứng dụng của bạn, nên không cần phải quan tâm đến việc thử giao dịch với nó. IIS có thể điều tiết lưu lượng dựa trên các tùy chọn cấu hình khác nhau.

+1

Chắc chắn nếu thư viện của bạn truy cập một dịch vụ web chỉ chấp nhận một câu trả lời mỗi 0,5 giây và đó là điều kiện sử dụng, thì đó là điều bạn nên quan tâm? – Andiih

+0

Nếu có một số lý do kinh doanh tại sao bạn chỉ cho phép 2 yêu cầu mỗi giây (có thể vì dữ liệu không được cập nhật thường xuyên hơn và khách hàng sẽ không thấy gì mới?), Thì tôi sẽ không gọi điều đó theo ý bạn muốn để hạn chế tải, và đó là hoàn toàn một cái gì đó mà ứng dụng có thể thực thi. – cdonner

+0

Trang web được truy cập là trang web của bên thứ ba, vì vậy rất tiếc cài đặt IIS nằm ngoài tầm kiểm soát của tôi. –

3

Tôi muốn nói cả hai - bạn đang giao dịch với hai hệ thống độc lập và cả hai nên thực hiện các biện pháp để tự bảo vệ mình khỏi tải quá mức. Máy chủ web nên từ chối các kết nối đến và thư viện khách hàng nên thực hiện các bước để giảm các yêu cầu mà nó thực hiện đối với dịch vụ bên ngoài chậm hoặc không hồi đáp. Một mô hình chung để xử lý điều này trên máy khách là 'bộ ngắt mạch' kết thúc cuộc gọi đến một dịch vụ bên ngoài, và không nhanh trong một khoảng thời gian nhất định sau khi thất bại.

+0

Sẽ tốt hơn nếu yêu cầu bị từ chối, thay vì bỏ qua. Cảm ơn bạn đã chỉ cho tôi đến mẫu bộ ngắt mạch. Tôi chắc chắn có thể thấy thời gian khi nó có ích. –

1

Loại máy khách nào? Đây có phải là ứng dụng khách tương tác, ví dụ: ứng dụng dựa trên GUI không?

Trong trường hợp đó, bạn có thể đánh giá điều đó với kịch bản webbrowser và để bề mặt thời gian chờ cho người gọi. Ngoài ra, nếu bạn biết chắc chắn rằng máy chủ web này đang điều chỉnh các yêu cầu, bạn có thể nói với khách hàng rằng anh ta phải chờ một khoảng thời gian nhất định trước khi thử lại. Theo cách đó, khách hàng sẽ không tiếp tục yêu cầu cấp lại và sẽ biết khi nào hết thời gian chờ đầu tiên xảy ra là vô ích khi đưa ra yêu cầu quá nhanh.

+0

Máy khách là một thư viện lớp, có thể được ứng dụng GUI sử dụng. Sử dụng các ngoại lệ để thông báo cho người gọi rằng phương pháp của tôi đang được gọi đến thường xuyên là một giải pháp mà tôi đang xem xét. Nhưng tôi biết rằng các cuộc gọi thường xuyên sẽ gây ra một thời gian chờ, vì vậy nó thực sự là một hoàn cảnh đặc biệt? –

+0

Bạn đã đề cập rằng máy chủ điều chỉnh các yêu cầu nếu "quá nhiều yêu cầu" được gửi cùng với một thời gian nhất định (0,5 giây). "Yêu cầu quá nhiều" là bao nhiêu? Nếu bạn nghĩ về điều đó, nếu 0.5 là giới hạn, thì có thể thực sự khó khăn cho GUI dựa trên ứng dụng khách vượt quá mức này. Cách khác, bạn có thể kiến ​​trúc thư viện GUI của bạn để không có nhiều hơn 'N' yêu cầu không đồng bộ xuất sắc, do đó bạn không bao giờ búa máy chủ. Tôi sẽ giới hạn N = 2 (và làm cho nó có thể cấu hình cho người dùng của bạn). Và có một cơ chế sử dụng một đại biểu để cung cấp thông báo tiến độ của khách hàng. – feroze

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