Mẫu cho các yêu cầu với thời gian đáp ứng dài?


7

Chúng tôi hiện đang duy trì một "máy chủ web" trăn nhà, nơi tạo ra phản hồi cho một số yêu cầu có thể mất nhiều thời gian chủ yếu do tính toán nặng nề - những yêu cầu này về cơ bản là các bài đăng với thời gian chờ rất dài (nghĩ vài phút đến hàng chục phút).

Một vấn đề của kiến ​​trúc này là đôi khi cần phải hủy một yêu cầu như vậy - ví dụ: người dùng nhận thấy một lỗi trong khi định cấu hình yêu cầu. Hiện tại, việc hủy bỏ là một yêu cầu khác, hủy bỏ yêu cầu chạy dài - nhưng có rất nhiều khoảng trống, ví dụ như điều gì xảy ra nếu khách hàng chỉ cần đóng trang web?

Hiện tại, chúng tôi đang có kế hoạch loại bỏ sự ghê tởm của một máy chủ web và chuyển sang một thứ gì đó hợp lý - ví dụ Flask chạy bên trong IIS bằng wfastcgi. Vì lý do chính trị, IIS được thiết lập, do đó, việc chuyển sang một thứ như gunicorn nằm ngoài cửa sổ.

Tất cả sự phát triển đã bị đình trệ bởi vì không ai có ý tưởng, làm thế nào để tiêu diệt các quy trình được điều hành bởi (w) fastcgi - mối quan tâm đó đơn giản không phải là một phần của thông số fastcgi.

Cảm giác của tôi là, một nỗ lực để xây dựng một cái gì đó kết hợp đó là một sai lầm - tôi thích một giải pháp trong đó máy chủ chỉ đơn giản là giảm tải các tác vụ chuyên sâu tính toán như vậy cho một số máy chủ nền (bình + cần tây?) Và các cuộc thăm dò phía trước cho điều đó.

Thật không may, giải pháp cũ đã tồn tại quá lâu đến nỗi một số nhà phát triển muốn giữ lại hành vi bằng mọi giá.

Không phải là một anh chàng máy chủ web, tôi muốn có một số lời khuyên / mô hình giải pháp hợp lý cho vấn đề như vậy có thể trông như thế nào.

Câu trả lời:


8

Những gì bạn đang đề nghị là hoàn toàn đúng.

Nó không đồng bộ.

Bạn có thể gửi yêu cầu và yêu cầu cung cấp cho bạn một Id duy nhất. Nó đăng một Xong trên ID duy nhất này trong một số cửa hàng nơi bạn có thể thăm dò ý kiến.

Nếu bạn cần hủy yêu cầu, yêu cầu hủy sử dụng cùng Id sẽ được đăng.

Ngoài ra ở mặt sau nơi tính toán này đang chạy, ví dụ: trong giao diện chạy của Chủ đề (kiểu java), bạn có thể kiểm tra sau mỗi vài giây nếu quá trình bị hủy bằng cách kiểm tra nếu bài đăng bị hủy được yêu cầu. Nếu có, thì luồng phải thoát. Đây là một lối thoát sạch sẽ. Bạn cũng có thể sử dụng một ngắt cho chủ đề.


IMHO giải pháp này là giải pháp phù hợp nhất với phương pháp 'không trạng thái' rất phù hợp với http - bạn tách biệt hành động thực hiện phép tính khỏi giao tiếp yêu cầu / phản hồi. Trong mô hình này, giao tiếp yêu cầu / phản hồi trở thành một cuộc trò chuyện như thế này: 'vui lòng bắt đầu .. được rồi tôi sẽ làm thế nào? .. vẫn hoạt động .. vui lòng hủy .. được rồi tôi đang hủy .. làm thế nào bạn nhận được? .. tính toán đã bị hủy .. vui lòng bắt đầu ... (chờ đợi) .. bạn tiếp tục như thế nào? .. tính toán hoàn thành ở đây là kết quả. '.
Robert

2

Tôi đề nghị bạn xem xét wsgi và sử dụng đa luồng . Bạn có thể quản lý từng yêu cầu trong một luồng và thực hiện thời gian chờ trong luồng. Bạn cũng có thể quản lý các chủ đề và hủy yêu cầu dễ dàng hơn.


1

Vấn đề bạn hiện đang gặp phải với một bài viết HTTP đơn giản không thể giải quyết được trong giao thức đó. HTTP hoạt động không đồng bộ trong máy khách / máy chủ nghiêm ngặt do đó không có thông báo phía máy chủ và không hủy bỏ riêng. Ngoài ra, bạn sẽ phải đối mặt với vấn đề mất câu trả lời vì hết thời gian mạng internet. Tôi sẽ đề xuất một cách tiếp cận khác nhau và hiện đại. Tuyên bố miễn trừ trách nhiệm: hỗ trợ trình duyệt ít hơn 90%

Tôi khuyên bạn nên đảo ngược luồng thông tin và sử dụng websockets. Những gì bạn cần làm một khi nhiệm vụ được thực hiện là thông báo cho người dùng của bạn và đẩy thông báo từ máy chủ đến máy khách.

Khi một tác vụ được đăng, hoặc chính xác hơn là thay thế cho bài đăng, hãy mở một websocket (sử dụng công nghệ máy chủ mà bạn thích, tornado, gevent, python-websocket, v.v.). Liên kết chuỗi nhiệm vụ trên sự kiện mở websocket máy chủ. Nếu khách hàng thoát ra, khách hàng sẽ gửi một sự kiện gần đến trình xử lý websocket của bạn, để bạn có thể chấm dứt chuỗi liên kết với nó. Khác, nếu nhiệm vụ của bạn kết thúc bình thường, máy chủ có thể gửi dữ liệu đến máy khách và đóng websocket. Ngoài ra, bạn phải tạo ping máy chủ cứ sau 30 giây một lần vì các websockets sẽ đóng nếu không hoạt động trong hơn một phút.

Nếu bạn áp dụng điều này, điều này sẽ nhanh hơn và sạch hơn so với bỏ phiếu phía khách hàng, đồng thời giải quyết các vấn đề về khoảng cách vì bạn có một kênh hai chiều thực sự. Lưu ý rằng bạn có thể triển khai các dịch vụ bổ sung qua lược đồ tác vụ như phiên, ping tiến trình, v.v.


0

Nếu nhiệm vụ của bạn cần nhiều thời gian để hoàn thành, đừng làm điều đó theo yêu cầu đó. Xếp hàng lên và thực hiện một số quy trình khác sẽ thực hiện công việc.

Sau khi hoàn thành công việc, chỉ cần gửi thông báo cho người dùng rằng "thao tác x" đã được thực hiện, trong khi đó, thông báo hiển thị "công việc của bạn sẽ được thực hiện trong khoảng x phút".

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.