2010-04-26 78 views
17

Trước khi tôi bắt đầu sử dụng máy chủ Phiên trạng thái vì lợi ích của việc tạo trạng thái phiên mạnh mẽ hơn trong các ứng dụng của tôi so với trạng thái InProc, tôi muốn tìm danh sách Ưu và khuyết điểm để đánh giá.Ưu điểm và nhược điểm của việc sử dụng ASP.NET Session State Server (thay vì InProc)?

Cập nhật 1: Còn về việc tái sử dụng hồ bơi còn lại?

Cập nhật 2: Tuổi thọ của phiên và kết thúc của chúng là gì?

+1

Có lẽ điều này nên được đánh dấu là một wiki cộng đồng. –

+8

@Tom: có chuyện gì với mọi người yêu cầu wiki cộng đồng? Đây không phải là "phim hoạt hình yêu thích của bạn?", Đó là một câu hỏi hợp lệ. – CMircea

+3

Mọi người thường bị lẫn lộn giữa một câu hỏi có nhiều câu trả lời đúng (không cần wiki) và một câu hỏi mang tính chủ quan (dành cho wiki). Câu hỏi của tôi ở đây là loại cũ. –

Trả lời

26

Dưới đây là phân tích kinh điển của những ưu và nhược điểm của ba lựa chọn của bạn, từ bài viết Rob Howard ASP.NET Session State:

  • Trong quá trình. Trong quá trình sẽ thực hiện tốt nhất vì bộ nhớ trạng thái phiên được giữ trong quá trình ASP.NET. Đối với các ứng dụng Web được lưu trữ trên một máy chủ duy nhất, các ứng dụng mà người dùng được đảm bảo sẽ được chuyển hướng đến máy chủ chính xác hoặc khi dữ liệu trạng thái phiên không quan trọng (theo nghĩa là nó có thể được xây dựng lại hoặc điền lại) , đây là chế độ để chọn.

  • Quá trình. Chế độ này được sử dụng tốt nhất khi hiệu suất là quan trọng nhưng bạn không thể đảm bảo máy chủ nào người dùng sẽ yêu cầu ứng dụng. Với chế độ ngoài quy trình, bạn nhận được hiệu suất đọc từ bộ nhớ và độ tin cậy của một quy trình riêng biệt quản lý trạng thái cho tất cả các máy chủ.

  • Máy chủ SQL. Chế độ này được sử dụng tốt nhất khi độ tin cậy của dữ liệu là nền tảng cho sự ổn định của ứng dụng, vì cơ sở dữ liệu có thể được nhóm lại cho các tình huống thất bại. Hiệu suất không nhanh như quá trình, nhưng sự cân bằng là mức độ tin cậy cao hơn.

Các tùy chọn out-of-process (hay còn gọi là "StateServer") và SQL-Server cả hai sống sót khởi động lại ứng dụng web (bao gồm hồ bơi ứng dụng đi xe đạp) và cả hai làm cho dữ liệu phiên có sẵn cho nhiều máy chủ trong một cluster/nông trại.

Cuối cùng, có thể không cần nói, nhưng thiết lập trong quá trình cơ bản là dễ cấu hình nhất, có nghĩa là "chuyên nghiệp" trong nhiều môi trường.

ASP.NET Session State: Architectural and Performance Considerations Tim Sneath thêm một số thông tin bổ sung và MSDN topic on Session State Modes là nguồn đáng tin cậy, cập nhật.

4

Ưu điểm:
1. Bạn có thể truy cập cùng trạng thái phiên trên các máy.
2. Trạng thái phiên tương tự có sẵn sau khi tải lại app_pool.

Nhược điểm:
1. Chậm hơn trong chế độ xử lý.
2. Tất cả các đối tượng trong trạng thái phiên phải được tuần tự hóa.

+1

Làm thế nào chậm hơn? Chậm hơn vì độ trễ mạng hoặc cái gì khác? – Babak

+1

Khá nhiều. Với trong quá trình, nó sử dụng bộ nhớ được sử dụng bởi IIS. Nó không phải serialize, đẩy dữ liệu đến một ứng dụng khác vv. Miễn là máy chủ trạng thái của bạn và máy chủ ứng dụng của bạn không ở trạng thái khác nhau, sự chậm lại sẽ không thực sự đáng chú ý. – kemiller2002

0

1 bất lợi khác là bạn có thể sẽ có một điểm lỗi nếu bạn thực hiện 1 máy chủ trạng thái từ xa trên một trang trại. Ngay cả khi không phải là một trang trại, nó vẫn có giá trị chạy tại địa phương chỉ để tồn tại app_pool IMO. Chúng tôi đã bị cuốn vào phần có thể tuần tự hóa, do đó, hãy theo dõi điều đó.

Ngoài ra, hãy chú ý đến Windows Server AppFabric để phát hành, vì nó sẽ có bản sao thay thế máy chủ trạng thái được sao chép/phân tán. Được cho là RTM trong 1H2010.

+0

AppFabric chưa được cập nhật từ năm 2012. – Babak

3

Tôi muốn nói một trong những nhược điểm lớn khi sử dụng In_Proc là trạng thái phiên có thể bị mất nếu nhóm ứng dụng hoặc miền được tái chế. Điều này có thể xảy ra bất cứ lúc nào, ví dụ nếu máy chủ có bộ nhớ thấp, vv Cá nhân tôi không bao giờ dựa vào In_Proc phiên cho bất kỳ thứ gì bạn không muốn mất. Tôi đã dành hàng giờ gỡ lỗi các trang web với các vấn đề lẻ tẻ chỉ để tìm ra nó là vì trạng thái phiên bị mất do máy chủ bị tái chế tài nguyên thấp (và dĩ nhiên, bạn càng lưu trữ trong phiên càng thấp thì tài nguyên máy chủ càng thấp Hãy nhớ rằng, nếu nó có thể sai thì có thể nó sẽ bị sai tại một số điểm!

Đó là lý do tại sao bây giờ tôi thường sử dụng Máy chủ của Nhà nước cho bất cứ điều gì trừ dữ liệu phiên không đáng kể. để đánh dấu các lớp học như serializable, nhưng điều này thường là tầm thường. Nó cũng chậm hơn một chút nữa, nhưng điều đó là không đáng kể trong hầu hết các trường hợp.

a good article about this trên blog IIS MSDN.

6

Máy chủ trạng thái là tuyệt vời (!) lựa chọn để bắt đầu. Tại sao? Bởi vì nó có nghĩa là ứng dụng của bạn bây giờ tương thích với bất kỳ chế độ lưu trữ ngoài quy trình nào.

Nếu hiện tại bạn đang phát triển trang web của mình với InProc và muốn di chuyển vào StateServer hoặc SqlServer sau đó, bạn có thể gặp sự cố với việc tuần tự hóa. Không phải luôn luôn, nhưng nó là không xảy ra.

Một số ví dụ bao gồm (một số đã được đề cập):

  • Ops bắt đầu lên kế hoạch hồ bơi ứng dụng IIS thường xuyên tái chế mà bạn không biết
  • Memory đang ở mức thấp một cách thường xuyên
  • Bạn sẽ được làm việc với một cân bằng tải trên sản xuất và không thể đảm bảo cùng một trang web sẽ nhận được yêu cầu tương tự.

Do đó, tốt nhất là sắp xếp việc này sớm hơn là sau này. Chỉ thay đổi cấu hình và khởi động dịch vụ; Boom! Điều này cũng có nghĩa là, nếu bạn quyết định đi xuống một tuyến lưu trữ phiên hoàn toàn khác, chẳng hạn như sử dụng Redis (Distributed Key/Value Store) hoặc RavenDB (Document Database), bạn đã được sắp xếp.

Thực sự là đầu tư tốt cho công việc của 1 phút. Bây giờ bạn đã sẵn sàng cho các trang trại, cân bằng tải và bất kỳ hệ thống quản lý phiên nào khác mà bạn quyết định dùng thử.

2

Nhược Phiên trong ASP.NET

  • Mỗi biến được lưu giữ như Object. Điều đó có nghĩa là bạn cần phải chuyển đổi Object thành kiểu nhất định khi đọc biến session.

  • Ngoài ra, nếu phiên trống, Object sẽ không có giá trị. Trước khi đọc biến phiên, bạn cần phải kiểm tra nó cho null.Ngay cả khi biến được khởi tạo trước đó, nó có thể là null vì phiên đã hết hạn. Một nỗ lực để sử dụng giá trị phiên null có thể trả về một ngoại lệ. Nếu giá trị của biến phiên là null, thực tế phổ biến là sử dụng một số giá trị mặc định thay vì null vô nghĩa. Nếu giá trị không phải là null, bạn phải chuyển đổi nó thành kiểu thích hợp bởi vì tất cả các biến phiên là loại đối tượng. Khi làm tất cả những điều này, bạn nên chú ý để tránh mã hóa cứng. Tìm hiểu thêm về đọc và viết các biến phiên theo cách có thể mở rộng và có thể bảo trì mà bạn có thể đọc trong hướng dẫn Cách viết, đọc và xóa phiên trạng thái phiên.

  • Tên biến là loại chuỗi. Nếu bạn tên mã cứng của biến, có một tùy chọn để làm cho loại sai lầm ở đâu đó. Vấn đề là, nếu bạn cố gắng đọc biến phiên không tồn tại, ASP.NET sẽ không trả về bất kỳ ngoại lệ hoặc cảnh báo nào. Nó sẽ đơn giản tạo biến mới với tên sai có giá trị null. Các loại lỗi này có thể khó tìm.

  • Dữ liệu phiên không nên được sử dụng để lưu trữ dữ liệu nhạy cảm. Có khả năng người dùng độc hại có được id phiên của khách truy cập thường xuyên. Nếu trạng thái phiên được sử dụng để lưu trữ thông tin như: "cho phép truy cập vào khu vực quản trị hay không" hoặc như vậy, kẻ tấn công có thể xem dữ liệu nhạy cảm của trang web, dữ liệu cá nhân khác, chỉnh sửa cơ sở dữ liệu, xóa nội dung, v.v.

  • Nếu InProc chế độ được sử dụng, phiên dễ dàng xả tất cả tài nguyên máy chủ và do đó làm giảm hiệu suất trang web.

StateServer

SQL Server là đáng tin cậy nhất của tất cả các chế độ. Dữ liệu phiên là nguyên vẹn nếu ASP.NET khởi động lại, nhưng cũng nếu SQL Server khởi động lại.

SQL Server cũng là tùy chọn khả thi nhất.

SQL Server thường có sẵn trong kịch bản lưu trữ chia sẻ

chế độ Custom

Bạn có toàn quyền điều khiển phiên. Có thể tạo id phiên tùy chỉnh ngay cả.

Bạn có thể hỗ trợ các nguồn dữ liệu khác nhau. Điều đó có thể hữu ích khi lưu trữ dữ liệu phiên trên cơ sở dữ liệu khác, như Oracle, MySQL, MS Access, v.v.

cho bất kỳ chi tiết nào khác mà bạn có thể click here to view ASP.NET Session state advantages. hy vọng câu trả lời của tôi đã giúp bạn.! :)

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