2010-03-23 31 views
5

Một phần của ứng dụng tôi đang thực hiện là một swf cho thấy một thử nghiệm với khoảng 80 câu hỏi. Mỗi câu hỏi được lưu trong SQL Server thông qua WebORB và ASP.NET.Xếp hàng bằng Cơ sở dữ liệu hoặc MSMQ?

Nếu một ứng cử viên kết thúc bài kiểm tra, phiên cần phải được xác thực. Vấn đề là đôi khi 350 ứng cử viên kết thúc thử nghiệm của họ tại cùng một thời điểm, và CPU trên máy chủ web và SQL Server phát nổ (350 xác nhận đồng thời).

Bây giờ, tôi nên triển khai xếp hàng tại đây bằng cách nào? Trong cơ sở dữ liệu, có một bảng có bản ghi cho mỗi phiên. Một cột giữ trạng thái. 1 được hoàn thành, 2 được xác nhận.

tôi có thể thực hiện xếp hàng theo hai cách (như tôi nhìn thấy nó, có thể bạn có mệnh đề khác):

  • Một quy trình để kiểm tra bảng cho hồ sơ với tư cách 1. Nếu nó tìm thấy một, nó xác nhận các phiên. Vì vậy, các phiên được xác thực sau một.
  • Nếu một ứng cử viên kết thúc phiên của nó, một tin nhắn được gửi đến một hàng đợi MSMQ. Một quá trình khác lắng nghe hàng đợi và xác nhận phiên sau một.

Bây giờ là:

  • Điều gì sẽ là phương pháp tốt nhất?
  • Bạn bắt đầu quá trình sẽ xác thực phiên ở đâu? Trong global.asax (application_start) của bạn? Là một dịch vụ cửa sổ? Như một exe trên thư mục gốc của trang web được bắt đầu trong application_start?

Với tôi, việc sử dụng bảng và tìm kiếm hồ sơ có trạng thái 1 có vẻ là cách dễ nhất.

Trả lời

4

Cách tiếp cận MSMQ decouples ứng dụng quay mặt web của bạn từ dịch vụ logic xác thực và cơ sở dữ liệu.

này mang lại nhiều lợi thế, một vài trong số đó:

  • Nó sẽ được dễ dàng hơn để xử lý các tình huống mà các logic xác nhận có thể xử lý 5 phiên mỗi giây, và nó nhận được 300 cùng một lúc. Nếu không, bạn sẽ phải xử lý hết thời gian chờ, thử lại, v.v.

  • Sẽ dễ dàng hơn để thực hiện bảo trì trên dịch vụ xác thực mà không phải gián đoạn phần còn lại của ứng dụng. Khi dịch vụ xác thực được đưa xuống, các thư sẽ xếp hàng trong MSMQ và sẽ được xử lý lại ngay khi nó được đưa lên.

  • Tương tự như trên áp dụng cho bảo trì cơ sở dữ liệu.

1

validating là gì? Trước khi làm việc với chiến lược xếp hàng của bạn, tôi sẽ cố gắng làm cho validating càng nhanh càng tốt, bao gồm cả việc đặt chiến lược dựa trên nếu nó chưa được như vậy.

+0

Tôi đã thiết lập dựa trên googled, nhưng tôi không hoàn toàn chắc chắn ý của bạn là gì. Tôi đã xác thực nhanh nhất có thể (hiện tại ở mức 500ms mỗi phiên) nhưng vẫn còn, nếu 350 ứng viên xác thực cùng một lúc, nó sẽ tạo 175 giây. Mặc dù, nó được loadbalanced, vì vậy trên thực tế nó là 350/4 giây. Nó hoạt động nhưng cpu của máy chủ web đi gần 100% trong một vài phút. –

+1

sử dụng các hoạt động "thiết lập dựa trên" liên quan đến lập trình cơ sở dữ liệu là khi bạn phát hành một lệnh cơ sở dữ liệu duy nhất, như UPDATE và nó ảnh hưởng đến tất cả các hàng của bạn, trái với vòng lặp trên mỗi hàng và thực hiện một UPDATE riêng biệt trên mỗi hàng. Tôi đã làm một google trên "cơ sở dữ liệu thiết lập dựa trên chế biến" và đây là hai bài viết từ gần đầu: http://www.codeproject.com/KB/database/SetAndProceduralSQL.aspx và http://weblogs.sqlteam.com/jeffs /archive/2007/04/30/60192.aspx –

3

Nếu bạn không có kinh nghiệm sử dụng MSMQ và không có cơ sở hạ tầng nào được thiết lập, tôi sẽ khuyên bạn nên dùng nó. Chắc chắn, nó có thể là "đúng" cách xếp hàng trên nền tảng Microsoft, nhưng nó không phải là rất thẳng về phía trước và có một đường cong học tập khá.

Cũng vậy với việc tạo Dịch vụ Windows; không làm điều đó trừ khi bạn đã quen thuộc với nó. Đối với những trường hợp đơn giản như thế này, tôi cho rằng nỗi đau lớn hơn phần thưởng.

Giải pháp đơn giản nhất có thể là sử dụng bảng và chạy quy trình trên chuỗi nền mà bạn khởi động trong global.asax. Bạn cũng có thể muốn tạo một trang quản trị có thể báo cáo một số thông tin trạng thái về quy trình (số công việc đang chờ xử lý, v.v.) và có thể là một nút để khởi động lại quá trình nếu nó không thành công.

0

Gần đây tôi đã tự điều tra về điều này nên tôi muốn đề cập đến những phát hiện của mình. Vị trí của Cơ sở dữ liệu so với ứng dụng của bạn là một yếu tố lớn trong việc quyết định tùy chọn nào nhanh hơn.

Tôi đã thử nghiệm chèn thời gian cần thiết để chèn 100 mục nhập cơ sở dữ liệu so với ghi dữ liệu giống hệt chính xác vào thư MSMQ cục bộ. Sau đó tôi lấy trung bình kết quả thực hiện phép thử này vài lần.

Điều tôi thấy là khi cơ sở dữ liệu nằm trên mạng cục bộ, việc chèn một hàng nhanh hơn 4 lần so với ghi vào MSMQ.

Khi cơ sở dữ liệu được truy cập qua kết nối internet tốt, việc chèn một hàng vào cơ sở dữ liệu chậm hơn 6 lần so với đăng nhập vào MSMQ.

Vì vậy:

Cơ sở dữ liệu cục bộ - DB nhanh hơn, nếu không MSMQ là.

+0

Tôi xác nhận ý kiến ​​này, tôi cảm thấy như vậy. Tôi đã cố gắng chèn 100 bản ghi vào cơ sở dữ liệu nằm trong mạng của mình trong tòa nhà của riêng mình và sau đó tôi đã tạo MSMQ riêng trong máy tính xách tay của mình và làm như vậy. MSMQ mất hơn 1,5 lần thời gian so với cơ sở dữ liệu. Tôi đoán MSMQ là tốt khi bạn có số lượng dịch vụ muốn ghi dữ liệu ở cùng một nơi. –

+0

i vấp khi báo giá này: "SSB sẽ nhanh hơn đáng kể so với MSMQ trong chế độ giao dịch. MSMQ sẽ nhanh hơn nếu để hoạt động ở chế độ không được giao dịch (nỗ lực tốt nhất, không sắp xếp, phân phối)". Vậy ... có thể xác định xem các thử nghiệm của bạn đã được thực thi với một hàng đợi được giao dịch hay một hàng đợi chưa được chuyển giao không? – Mario

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