2010-01-26 12 views
5

REST ủng hộ các ứng dụng web mà không cần trạng thái máy khách trên máy chủ. Ví dụ về giỏ hàng nổi tiếng được dịch sang tài nguyên thường nằm trong cơ sở dữ liệu.Duy trì trạng thái trong máy chủ ứng dụng hoặc trong cơ sở dữ liệu?

Tôi tự hỏi nếu thực hành tốt là sử dụng cơ sở dữ liệu cho loại dữ liệu đó, vì cơ sở dữ liệu đã là nút cổ chai trong nhiều ứng dụng. Nó sẽ không tốt hơn nếu sử dụng một bean java doanh nghiệp nhà nước thay thế? Máy chủ ứng dụng được thiết kế với sự chú ý.

Ưu điểm và nhược điểm của hai cách tiếp cận là gì?

Trả lời

3

phiên lưu trữ trên máy chủ ứng dụng sẽ chỉ làm việc nếu:

  • Khách hàng của bạn luôn luôn kết nối với cùng một máy chủ ứng dụng (hay còn gọi là "phiên ái lực")
  • cụm Ứng dụng của bạn các nút đều sử dụng một chung điểm gắn kết (nfs, v.v.) cho các phiên có chức năng phân tách

Lưu trữ phiên trong cơ sở dữ liệu trung tâm và/hoặc EJB sẽ hoạt động nếu khách hàng của bạn không được kết nối với cùng một nút ứng dụng trong cụm của bạn.

Một cách tiếp cận khác để xem xét là sử dụng dịch vụ như memcached. Điều này sẽ làm việc trong cả hai trường hợp.

+0

+1 để đề cập đến memcached –

2

Nói chung:

Cơ sở dữ liệu

  • đáng tin cậy hơn và sẽ tồn tại một khởi động lại ứng dụng/máy chủ
  • có thể được chia sẻ trên máy chủ cân bằng tải mà không cần phải đối phó với các phiên "dính"
  • chậm hơn để truy cập

Trong bộ nhớ (không phân phối đậu trạng thái)

  • lưu trữ nhanh và hồi
  • Ít mã
  • sẽ bị mất nếu ứng dụng/máy chủ khởi động lại

sự lựa chọn của bạn sẽ hoàn toàn phụ thuộc vào yêu cầu của ứng dụng của bạn và môi trường. Tất cả mọi thứ đều bình đẳng, tôi ủng hộ giải pháp cơ sở dữ liệu vì lợi ích cân bằng tải và độ tin cậy, nhưng điều này có thể dễ dàng bị quá tải trong nhiều tình huống.

1

Điều gì sẽ xảy ra khi máy chủ ứng dụng của bạn qua đời. Trạng thái phiên có còn quan trọng không? Đi cho một cơ sở dữ liệu.

Bạn có trạng thái phiên nhiều hơn không, khi đó máy chủ của bạn có thể xử lý cho tất cả người dùng đồng thời? Di chuyển dữ liệu vào cơ sở dữ liệu và chỉ kéo ra chỉ những gì bạn thực sự cần vào lúc này, có thể là một giải pháp.

Ứng dụng của bạn có được nhóm không? Nếu vậy, cơ sở dữ liệu trung tâm đảm bảo rằng sessiondata luôn có sẵn.

Nếu không: Chỉ cần lưu trữ trong phiên.

Bạn có yêu cầu mở rộng quy mô lớn (như luồng lưu lượng truy cập hoặc trang web có lưu lượng truy cập cao hơn) không? Tìm cách không sử dụng cơ sở dữ liệu.

Đúng là cơ sở dữ liệu thường là nút cổ chai. Nhưng một cơ sở dữ liệu thiết lập đúng cách sẽ xử lý một vài byte dữ liệu phiên chỉ tốt. Dữ liệu và truy vấn phức tạp hơn là chi phí hiệu suất.

0

Tất cả các mục khác là đề xuất tốt. Một điều nữa là: Không sử dụng trạng thái phiên nếu bạn không hoàn toàn cần nó.

Lưu phiên làm việc trong một cơ sở dữ liệu (nói chung) một ý tưởng tồi cho một vài lý do đơn giản:

  1. sử dụng điển hình của phiên là để tránh phải tải dữ liệu thông thường từ máy chủ cơ sở dữ liệu nhiều lần. Nếu phiên được lưu trữ trong máy chủ db thì, tốt, bạn thực sự chưa hoàn thành nhiều.

  2. Phiên phải được tuần tự hóa và được deserialized cho mỗi lần thực thi một trang. Điều này có nghĩa rằng dữ liệu phiên sẽ phải được lấy ra từ máy chủ và được ghi lại cho máy chủ mỗi lần tải trang bất kể bạn có sử dụng hay không.

Theo kinh nghiệm của tôi, bạn sẽ dễ dàng hơn khi kéo dữ liệu từ máy chủ cơ sở dữ liệu khi thực sự cần. Trong hầu hết các trường hợp, mọi người đưa tất cả các loại dữ liệu sống ngắn trong phiên chỉ đơn giản bởi vì họ nghĩ rằng họ đang giải quyết một vấn đề hiệu suất, trong thực tế họ đang làm cho nó tồi tệ hơn.

Hơn nữa, nếu bạn giới hạn số lượng dữ liệu (nói đến id người dùng, tên hoặc thứ gì đó tương tự), thì bạn có thể lưu trữ nó ở phía máy khách cookie được mã hóa và không phải lo lắng gì cả.

MemCache là một tùy chọn; nhưng một lần nữa tôi nghiêm túc xem xét việc sử dụng cơ sở dữ liệu của bạn và xem liệu bạn có thể điều chỉnh hiệu suất các truy vấn và lược đồ trước không.

+0

Tôi phải lưu trữ giỏ hàng ở đâu đó, cho dù tôi gọi nó là "phiên" hay không. Nếu tôi giúp bạn đúng, bạn sẽ lưu trữ giỏ hàng trong cơ sở dữ liệu? Để sử dụng cookie được mã hóa được coi là một ý tưởng tồi: http://stackoverflow.com/questions/2131522/client-side-sessions – deamon

+0

Thực ra, vâng tôi sẽ đặt nó trong cơ sở dữ liệu. Bằng cách đó, bạn có tùy chọn giữ chi tiết giỏ hàng trong trường hợp họ quyết định rời đi và quay lại vào ngày mai .. Sau khi phiên hết hạn. Ngẫu nhiên, gần như tất cả các xe thương mại đều làm theo cách này. – NotMe