2010-10-22 50 views
7

Đây là câu hỏi của anh chị em với số this programmers question.Có bất kỳ mối nguy hiểm không rõ ràng trong việc sử dụng các chủ đề trong ASP.NET không?

Tóm lại, chúng tôi đang xem xét thúc đẩy một số tác phẩm được yêu cầu của người dùng vào nền "đúng cách". Câu hỏi được liên kết đã cho tôi rất nhiều ý tưởng chúng ta nên đi theo con đường dịch vụ, nhưng không thực sự đưa ra bất kỳ lý lẽ thuyết phục nào về lý do tại sao, chính xác, chúng ta nên làm vậy.

tôi sẽ thừa nhận rằng, với tôi, khả năng làm việc tương đương với đạo đức của

WorkQueue.Push(delegate(object context) { ... }); 

thực sự hấp dẫn, vì vậy nếu nó chỉ là một chút khó khăn (chứ không phải vốn không khả thi) Tôi có khuynh hướng đi với phương pháp tiếp cận chuỗi nền.

Vì vậy, những vấn đề với chủ đề nền Tôi nhận thức được (trong bối cảnh của một AppPool):

  • Họ có thể chết bất cứ lúc nào do sự AppPool được tái chế
    • Giải pháp: theo dõi khi một nhiệm vụ đang được thực hiện, vì vậy nó có thể được chạy lại * a thread mới nên cần
  • Các ThreadPool được sử dụng để đáp ứng các truy vấn HTTP đến, vì vậy sử dụng nó có thể chết đói IIS
    • Giải pháp: xây dựng hồ bơi chủ đề của riêng chúng tôi, giới hạn số lượng chủ đề.

Câu hỏi của tôi là, những gì tôi thiếu, nếu bất cứ điều gì? Điều gì khác có thể đi sai với chủ đề nền trong ASP.NET?

* Tác vụ trong câu hỏi đã an toàn để chạy lại, vì vậy đây không phải là vấn đề.
ǂ Giả sử chúng tôi không làm bất cứ điều gì thực sự câm, như ném ngoại lệ trong chủ đề nền.

+0

không phải là đa số luồng 'nguy hiểm' không hiển nhiên ?? –

+0

@Mitch - Tôi đang tìm kiếm những điểm khác biệt với ASP.NET. Những nguy hiểm cho người đi bộ có thể được bỏ qua cho bây giờ, :) –

Trả lời

2

Một mối nguy hiểm mà tôi gặp phải là CallContext. Chúng tôi đã sử dụng CallContext để đặt dữ liệu nhận dạng người dùng, vì cùng một mã được chia sẻ trên ứng dụng web của chúng tôi và dịch vụ ứng dụng dựa trên .NET Remoting của chúng tôi (được thiết kế để sử dụng CallContext để lưu trữ dữ liệu cụ thể của cuộc gọi) - vì vậy chúng tôi không sử dụng HttpContext.

Chúng tôi nhận thấy rằng, đôi khi, một yêu cầu mới sẽ kết thúc với một danh tính không rỗng trong CallContext. Nói cách khác, ASP .NET không loại bỏ dữ liệu được lưu trữ trong CallContext giữa các yêu cầu ... và do đó người dùng chưa được xác thực có thể vào ứng dụng nếu họ chọn một chuỗi vẫn có CallContext chứa thông tin nhận dạng người dùng đã được xác thực.

1

Hãy để tôi cho bạn biết về một nguy cơ không rõ ràng :)

Tôi đã từng đề để thu thập Cập nhật một số cơ sở dữ liệu RSS vào của tôi cho một trang web tôi đã lưu trữ với GoDaddy. Các chủ đề làm việc tốt (nếu chúng được chấm dứt, chúng sẽ được tự động khởi động lại do một số kiểm tra mà tôi đã xây dựng trong một số trang web).

Nó đã làm việc xuất sắc và tôi đã rất hạnh phúc, cho đến khi GoDaddy (máy chủ của tôi sau đó) đầu tiên bắt đầu giết chết các chủ đề, và sau đó chặn chúng hoàn toàn. Ứng dụng của tôi đã chết!

Nếu điều đó không rõ ràng, thì sao?

0

Có thể bạn đang quá phức tạp với kiến ​​trúc của mình mà không nhận được bất kỳ lợi ích nào.

Chương trình của bạn sẽ tốn kém hơn để viết, tốn kém hơn để duy trì và có nhiều rủi ro bị lỗi hơn.

+0

Meh, tôi sẵn sàng cho rằng chúng tôi có thể làm cho nó đúng, nếu nó có thể được nhận ngay tại nơi đầu tiên. Nó không giống như tôi đã không bao giờ viết một hồ bơi thread trước, heck Sam thậm chí có một OSS'd hơn tại [mediabrowser] (http://code.google.com/p/videobrowser/) (mặc dù nó không IIS đã sẵn sàng, và không được cấp phép tương thích). Thêm vào đó, có những lợi ích: sự đơn giản (không cần phải so sánh giữa các quy trình xử lý) là một trong số chúng. –

+1

Có, tôi chắc chắn rằng bạn có thể làm cho nó hoạt động, nhưng chức năng phụ có biện minh cho công việc và phức tạp thêm –

3

Tôi sẽ tránh xa việc khởi chạy chủ đề từ với trong AppDomain IIS của bạn cho StackOverflow. Tôi không có bất kỳ bằng chứng khó để hỗ trợ những gì tôi sẽ nói, nhưng làm việc với IIS trong 10 năm, tôi biết rằng nó hoạt động tốt nhất khi nó là trò chơi duy nhất trong thị trấn.

Ngoài ra còn có một giải pháp thay thế, tôi biết điều này sẽ là loại take off on my answer đối với chuỗi lập trình viên. Nhưng như tôi đã hiểu, bạn đã có một giải pháp hoạt động bằng cách sao chép công việc theo yêu cầu của người dùng. Tại sao không sử dụng mã đó, nhưng chỉ khởi chạy nó khi một API nội bộ đặc biệt được gọi. Sau đó, sử dụng Task Scheduler để gọi một lệnh CURL gọi API đó sau mỗi 30 giây để khởi chạy tác vụ. Bằng cách này, bạn cho phép IIS xử lý luồng và mã của bạn đang xử lý một cái gì đó mà nó đã thực hiện dễ dàng.

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