0

我實現亞馬遜SQS進行圖像處理。我想知道如何在C#中創建一個邏輯,這將允許我僅處理X個圖像並閱讀更多消息以感受X容量(比方說20個圖像)。代碼邏輯用於圖像處理與Amazon SQS

從我的理解,我按照這個邏輯,圖像處理:

  1. 圖片上傳到服務器
  2. 我上傳圖片到S3的臨時存儲與唯一的字符串
  3. 我創建了一個SQS消息稍後會讀取圖像位置(加上需要存儲的更多數據)
  4. 我讀取服務器上的消息
  5. 如果有消息(最多爲X,比方說20),請運行處理該圖像
  6. 代碼代碼:下載從S3,處理的圖像的臨時圖像,將其重新上傳到S3處理

在一個web服務使用什麼碼邏輯的圖像是由用戶上載的後,以便連續檢查消息並且在給定時間僅處理X個圖像量。確保如果例如一個圖像已經完成該過程,我們可以繼續處理另一個圖像。

例如我正在處理20個圖像,一個處理完成,不能處理另一個圖像。

我認爲有關運行recieveMessageResponse每次單個圖像處理完成,並保持活動進程的存儲器中的計數器(靜態變量)。於是,我開始counter = 0,當我們說三個圖像上載,計數器等於3,當它達到20,我不會處理任何圖像,當一個人完成了counter = counter - 1。我有一個if語句來檢查計數器,如果是小於X(比方說20配額),我將處理X - counter

在我的應用程序:用戶上傳的圖像使用web服務的EC2服務器。我有一個WCF服務,它執行從webservice本身調用的處理。圖像處理完成後,我有一個回調函數。

它的最佳邏輯是什麼?

+0

您是否試圖問如何設計您的圖像處理器一次處理最多20個圖像? – tster

+0

是的,我:) - 任何想法? –

+0

當然! (查看答案) – tster

回答

1

想到3種不錯的選擇。我將按照我的優先順序(從最好到最差)列出它們。

1)使用初始計數爲20的信號量。從SQS讀取的線程可以在調用SQS之前從信號中獲取線程。處理完成時,執行圖像處理的線程將從信號量釋放(如果存在異常,請務必在finally子句中釋放)。這是理想的,因爲它允許任意數量的工作線程和任意數量的SQS輪詢線程。它也可以被實現爲允許從單個接收消息呼叫獲取多個消息。

2)具有20個SQSL輪詢線程其同步地做在同一線程上的圖像處理。這並沒有很大的關注點分離,但它是最少的線程數,而且它是迄今爲止最容易實現的。最大的不利之處在於,在單個接收消息呼叫期間無法接收多條消息。假設圖像處理比SQS輪詢的資源密集程度高出數量級,這不是問題。但是如果SQS輪詢代表了CPU利用率的很大一部分,這可能是一個問題。

3)從SQS中讀取1個線程並切換到20個工作線程。進行切換阻塞,以使讀者線程永遠不會拉下超過1條消息,超過可處理的數量。這對擴大閱讀器線程是有問題的,而且它並不理想,因爲您收到1條等待工作線程處理的消息。

注意:我越想它,#2似乎是你最好的選擇。設計的簡單性應該超過允許在#1中批量接收的好處。如果您以後需要它,您可以隨時更改設計。即使同一個線程正在執行處理,也應該確保設計代碼,以便圖像處理和SQS輪詢解耦。