Vài nghìn yêu cầu mỗi phút là một lớn tải, và cách duy nhất để làm điều đó đúng, là kiểm soát và giới hạn số luồng tối đa có thể chạy bất kỳ lúc nào.
Vì không có nhiều thông tin được đăng về cách bạn triển khai điều này. Tôi sẽ đề cập đến một số trường hợp có thể xảy ra.
Đã đến lúc thử nghiệm ...
Hằng số:
- Các mục cần xử lý:
- 50 mỗi giây hay nói cách khác ...
- 3.000 mỗi phút và một cách khác để xem xét nó ...
- 180.000 mỗi giờ
Các biến:
-
Tốc độ truyền dữ liệu:
-
Lượng dữ liệu bạn có thể truyền mỗi giây sẽ đóng vai trò như thế nào cho dù chúng ta làm gì và điều này sẽ thay đổi trong ngày tùy thuộc vào thời gian trong ngày.
Điều duy nhất chúng tôi có thể làm là loại bỏ nhiều yêu cầu hơn từ các cpu khác nhau để phân phối khối lượng lưu lượng truy cập mà chúng tôi đang gửi lại.
-
-
Khả năng xử lý:
-
Tôi giả sử bạn có cái này trong
WebJob
Trái ngược với việc mã hóa này bên trong trang MVC, nó là chính nó. Nó rất kém hiệu quả và không phù hợp với mục đích mà bạn đang cố gắng đạt được. Bằng cách sử dụng WebJob, chúng tôi có thể xếp hàng các hạng mục công việc sẽ được xử lý bởiWebJobs
khác . Hàng đợi được đề cập là Hàng đợi Azure Bộ nhớ .
-
Vấn đề:
- Chúng tôi đang cố gắng hoàn thành 50 giao dịch mỗi giây, vì vậy mỗi giao dịch sẽ được thực hiện dưới 1 giây nếu chúng tôi đang sử dụng 50 chuỗi. Thời gian nghỉ 45 giây của chúng tôi không có mục đích gì vào thời điểm này.
- Chúng tôi mong đợi 50 luồng chạy đồng thời và tất cả đều hoàn thành trong vòng chưa đầy một giây, mỗi giây, trên một cpu duy nhất. (Tôi đang phóng đại một điểm ở đây, chỉ để nói rõ ... nhưng hãy tưởng tượng tải xuống 50 tệp văn bản mỗi giây. Xử lý nó, sau đó cố gắng gửi lại cho đồng nghiệp với hy vọng họ sẽ sẵn sàng nắm bắt nó)
- Chúng tôi cần có logic thử lại, nếu sau 3 lần thử, mặt hàng không được xử lý, chúng cần được đưa trở lại hàng đợi. Lý tưởng nhất là chúng ta nên cung cấp nhiều thời gian hơn để máy chủ phản hồi thay vì chỉ một giây với mỗi lần thất bại, giả sử chúng ta đã cho nó nghỉ 2 giây đối với lần thất bại đầu tiên, sau đó 4 giây, rồi 10, điều này sẽ làm tăng khả năng chúng ta kiên trì / truy xuất dữ liệu mà chúng tôi cần.
- Chúng tôi giả định rằng MongoDb của chúng tôi có thể xử lý số lượng yêu cầu này mỗi giây. Nếu bạn chưa làm như vậy, hãy bắt đầu tìm cách mở rộng quy mô, vấn đề không nằm ở thực tế đó là MongoDb, lớp dữ liệu có thể là bất cứ thứ gì, thực tế là chúng tôi đang thực hiện số lượng yêu cầu này từ một nguồn duy nhất có khả năng là nguyên nhân gây ra sự cố của bạn.
Giải pháp:
- Thiết lập
WebJob
và đặt tên cho nó làEnqueueJob
.WebJob
này sẽ có một mục đích duy nhất, xếp hàng đợi các hạng mục công việc được xử lý trongQueue Storage
. - Tạo
Queue Storage Container
được đặt tên làWorkItemQueue
, hàng đợi này sẽ đóng vai trò kích hoạt bước tiếp theo và bắt đầu các hoạt động mở rộng quy mô của chúng tôi. - Tạo một
WebJob
khác được đặt tên làDequeueJob
.WebJob
này cũng sẽ có một mục đích duy nhất, để xếp thứ tự các mục công việc từWorkItemQueue
và đưa ra các yêu cầu tới kho dữ liệu của bạn. - Định cấu hình
DequeueJob
để quay lên sau khi một mục đã được đặt bên trongWorkItemQueue
, bắt đầu 5 luồng riêng biệt trên mỗi luồng và trong khi hàng đợi không trống, hãy xếp hàng lại các mục công việc cho mỗi luồng và cố gắng thực hiện công việc đã định sẵn.- Lần thử 1, nếu không thành công, hãy đợi và thử lại.
- Lần thử 2, nếu không thành công, hãy đợi và thử lại.
- Nỗ lực 3, nếu không thành công, hãy xếp hàng trở lại
WorkItemQueue
- Định cấu hình trang web của bạn để tự động chia tỷ lệ ra x số lượng cpu (lưu ý rằng trang web và công việc web của bạn chia sẻ cùng một tài nguyên)
Đây là một video ngắn 10 phút cung cấp tổng quan về cách sử dụng kho hàng đợi và công việc web.
Chỉnh sửa:
Một lý do khác khiến bạn gặp phải những lỗi đó cũng có thể là do hai yếu tố khác, một lần nữa gây ra bởi nó nằm trong ứng dụng MVC ...
Nếu bạn đang biên dịch ứng dụng bằng DEBUG
đã áp dụng thuộc tính nhưng đẩy RELEASE
thay vào đó, bạn có thể gặp sự cố do cài đặt trong web.config
của mình , không có DEBUG
thuộc tính, một ứng dụng web ASP.NET sẽ chạy một yêu cầu trong tối đa 90 giây, nếu yêu cầu kéo dài hơn thời gian này, nó sẽ loại bỏ yêu cầu.
Để tăng thời gian chờ lên lâu hơn 90 giây bạn sẽ cần thay đổi [httpRuntime][3]
thuộc tính trong web.config
của bạn ...
<!-- Increase timeout to five minutes -->
<httpRuntime executionTimeout="300" />
Một điều khác mà bạn cần lưu ý là yêu cầu cài đặt thời gian chờ của trình duyệt> ứng dụng web của bạn, tôi muốn nói rằng nếu bạn khăng khăng giữ mã trong MVC thay vì giải nén và đưa nó vào WebJob, thì bạn có thể sử dụng mã sau để kích hoạt một yêu cầu tới ứng dụng web của bạn và bù lại thời gian chờ của yêu cầu.
string html = string.Empty;
string uri = "http://google.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Timeout = TimeSpan.FromMinutes(5);
using (HttpWebResponse response = (HttpWebResonse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
html = reader.ReadToEnd();
}