Tôi đang viết một ứng dụng web phức tạp hợp lý. Chương trình phụ trợ Python chạy một thuật toán có trạng thái phụ thuộc vào dữ liệu được lưu trữ trong một số bảng cơ sở dữ liệu có liên quan không thay đổi thường xuyên, cộng với dữ liệu cụ thể của người dùng thay đổi thường xuyên. Trạng thái của mỗi người dùng của thuật toán trải qua nhiều thay đổi nhỏ khi người dùng làm việc với ứng dụng. Thuật toán này được sử dụng thường xuyên trong quá trình làm việc của mỗi người dùng để đưa ra các quyết định quan trọng nhất định.Làm thế nào để một đối tượng Python tồn tại lâu dài trong một ứng dụng web?
Vì lý do hiệu suất, hãy khởi tạo lại trạng thái theo mọi yêu cầu từ dữ liệu cơ sở dữ liệu (bán chuẩn) nhanh chóng trở thành không khả thi. Nó sẽ là rất thích hợp hơn, ví dụ, để bộ nhớ cache đối tượng Python của nhà nước trong một số cách để nó có thể chỉ đơn giản được sử dụng và/hoặc cập nhật bất cứ khi nào cần thiết. Tuy nhiên, vì đây là một ứng dụng web, có một số quy trình phục vụ các yêu cầu, do đó, việc sử dụng một biến toàn cục không nằm trong câu hỏi.
Tôi đã thử tuần tự hóa đối tượng liên quan (qua pickle) và lưu dữ liệu đã tuần tự hóa vào DB, và giờ đây đang thử nghiệm với bộ nhớ đệm dữ liệu được tuần tự hóa thông qua memcached. Tuy nhiên, điều này vẫn có chi phí đáng kể của serializing và deserializing các đối tượng thường xuyên.
Tôi đã xem giải pháp bộ nhớ dùng chung nhưng điều duy nhất có liên quan tôi đã tìm thấy là POSH. Tuy nhiên POSH dường như không được sử dụng rộng rãi và tôi không cảm thấy dễ dàng tích hợp một thành phần thử nghiệm như vậy vào ứng dụng của tôi.
Tôi cần một số lời khuyên! Đây là lần đầu tiên tôi phát triển một ứng dụng web, vì vậy tôi hy vọng đây là một vấn đề đủ phổ biến mà có những giải pháp nổi tiếng cho các vấn đề như vậy. Tại đây các giải pháp điểm mà giả định Python back-end đang chạy trên một máy chủ duy nhất sẽ là đủ, nhưng điểm thêm cho những giải pháp mà quy mô đến nhiều máy chủ cũng :)
Ghi chú:
- Tôi có điều này ứng dụng đang hoạt động, hiện đang hoạt động và với người dùng đang hoạt động. Tôi bắt đầu mà không thực hiện bất kỳ tối ưu hóa sớm nào, và sau đó được tối ưu hóa khi cần. Tôi đã thực hiện đo lường và thử nghiệm để đảm bảo vấn đề được đề cập ở trên là nút cổ chai thực tế. Tôi chắc chắn khá chắc chắn tôi có thể ép hiệu suất nhiều hơn từ các thiết lập hiện tại, nhưng tôi muốn hỏi nếu có một cách tốt hơn.
- Bản thân thiết lập vẫn đang trong quá trình thực hiện; giả sử rằng kiến trúc của hệ thống có thể là bất kỳ bộ nào mà giải pháp của bạn đưa ra.
Khung làm việc nào? CherryPy? Django? –
Bạn đã thực hiện bất kỳ phép đo nào chứng minh rằng truy cập trạng thái là nút cổ chai? Làm thế nào lớn là dưa chua, mất bao nhiêu thời gian để giải tán, bao lâu là toàn bộ yêu cầu, vv? –
@Martin: Dưa chua là ~ 2MB lớn (giao thức 2), và quá trình tuần tự hóa và tuần tự hóa chiếm 90% thời gian xử lý yêu cầu. – taleinat