2010-09-07 37 views
5

Tôi muốn xây dựng dịch vụ cửa sổ sẽ sử dụng dịch vụ mã hóa từ xa (như encoding.com, zencoder, v.v.) để tải lên các tệp video để mã hóa, tải chúng xuống sau quá trình mã hóa hoàn thành và xử lý chúng. Để làm được điều đó, tôi đã suy nghĩ về việc có hàng đợi khác nhau, một để xử lý các tệp đang chờ, một cho tệp đang được tải lên, một tệp cho tệp đang chờ mã hóa hoàn thành và một tệp khác để tải chúng xuống. Mỗi hàng đợi có một giới hạn, ví dụ chỉ có 5 tệp có thể được tải lên để mã hóa tại một thời điểm nhất định. Hàng đợi phải được hiển thị và có thể hồi sinh từ một sự cố - hiện tại chúng tôi làm điều đó bằng cách viết hàng đợi vào một bảng SQL và quản lý số lượng các mục trong một bảng riêng biệt.Thiết kế: Câu hỏi quản lý hàng đợi (C#)

Tôi cũng muốn hàng đợi chạy trong nền, độc lập với nhau, nhưng có thể chuyển tệp từ hàng đợi này sang hàng đợi khác khi quá trình tiếp tục.

Dấu hỏi lớn nhất của tôi là về cách xây dựng hàng đợi và quản lý chúng, và ít hơn về việc giới hạn số lượng mục trong mỗi hàng đợi.

Tôi không chắc cách tiếp cận phù hợp cho điều này và thực sự đánh giá cao sự trợ giúp nào.
Cảm ơn!

Trả lời

1

Bạn có thể không cần phải tách công việc thành hàng đợi riêng biệt, miễn là chúng được phân tách một cách hợp lý theo một cách nào đó (được gắn thẻ với "loại công việc" khác nhau hoặc như vậy).

Như tôi thấy, thách thức là không nhận và xử lý nhiều hơn một số lượng công việc hạn chế nhất định từ hàng đợi, dựa trên loại công việc. Tôi đã có một vấn đề hơi tương tự một thời gian trước đó dẫn đến một question here on SO, và sau blog post with my solution, cả hai đều có thể cung cấp cho bạn một số ý tưởng.

Tóm lại, giải pháp của tôi là tôi giữ một danh sách "mã thông báo". Khi bao giờ tôi muốn thực hiện một công việc có một số hạn chế, trước tiên tôi lấy một mã thông báo. Nếu không có mã thông báo, tôi sẽ cần phải chờ một thẻ để có sẵn. Sau đó, bạn có thể sử dụng bất cứ cơ chế xếp hàng nào phù hợp để xử lý hàng đợi như vậy.

+0

Cảm ơn, nó rất hữu ích nhưng câu hỏi của tôi đã cố gắng nhắm đến việc quản lý hàng đợi riêng biệt hơn. Bài đăng trên blog của bạn hữu ích. cảm ơn! – Nir

+0

Tôi đồng ý với Fredrik. Nếu bạn tạo 4 hàng đợi và gán một luồng cho mỗi (hoặc số luồng tương tự), có thể một hàng đợi chậm (một hàng đợi chịu trách nhiệm cho một quy trình chạy dài) sẽ làm chậm toàn bộ quá trình của bạn vì hàng đợi đó bận nhưng các chủ đề trong hàng đợi khác đang ngồi và không làm gì cả.Trong mọi trường hợp, việc tinh chỉnh các số luồng này có thể khó khăn. – Aliostad

+0

Khi nó quay ra, bài đăng trên blog cực kỳ hữu ích. Cảm ơn rất nhiều! – Nir

1

Có nhiều cách khác nhau để tiếp cận điều này và tùy thuộc vào trường hợp nào phù hợp với trường hợp của bạn về độ tin cậy và chi phí bảo trì/chi phí phát triển/bảo trì. Bạn cần phải trả lời các câu hỏi trên thích rằng nếu máy chủ bị treo, điều quan trọng là phải mang theo những gì bạn đang làm?

Hàng đợi có thể được triển khai trong MSMQ, SQL Server hoặc đơn giản là trong mã và tất cả các hàng đợi trong bộ nhớ. Đối với quy trình làm việc, bạn có thể sử dụng Windows Workflow Foundation hoặc tự thực hiện nó, điều này có thể dễ dàng hơn nhưng thay đổi sẽ khó khăn hơn.

Vì vậy, nếu bạn đưa ra một vài gợi ý khác, tôi sẽ có thể giúp bạn tốt hơn.

+0

Cảm ơn. Có, nó rất quan trọng để nhận từ cùng một vị trí tôi còn lại nếu máy chủ bị treo. Tôi rất sẵn lòng cung cấp thêm thông tin, chỉ cần cho tôi biết điều gì có thể hữu ích. – Nir

+0

Nếu bạn cần nó không an toàn, tôi sẽ lưu trữ nó trong một SQL Server nếu tôi có thể đủ khả năng để có được kể từ khi nó được dễ dàng hơn để làm việc với và có thể được sao lưu. Nếu không, tôi sẽ sử dụng MSMQ đi kèm với Windows. Đối với công việc, tôi sẽ chỉ sử dụng máy trạng thái đơn giản trong mã. – Aliostad

+0

Cảm ơn @Aliostad. – Nir