2017-07-31 26 views
-2

我在AWS內部的EC2實例上有一箇中央C#窗口服務。它的任務是創建任務(JSON內部的指令),然後將這些任務發送到運行在AWS以外的服務器上的各個Windows服務(例如,在每個商店中有一個服務器的灰漿零售店)。這種情況下使用的最佳體系結構是什麼? SQS? SNS?兩者結合?

這些單獨的服務器根據JSON任務執行一些處理,然後將消息發送回AWS內的中央窗口服務。此設計目前正在使用AWS SQS。

我最初的設計是使用1個SQS隊列消息到外部服務器,1個SQS隊列消息返回。總共兩個隊列。

然而,這種設計看起來有缺陷,因爲某些消息僅用於某些服務器,但爲了確定哪個消息是針對哪個服務器的,消息必須從隊列中'讀'出來並檢查JSON,然後隱藏他們從其他服務器輪詢消息。這可能會導致服務器無法看到他們的消息,因爲他們不斷被其他服務器隱藏。

那麼我對這種設計有什麼選擇? AWS之外有400臺服務器。我可以有400個SQS隊列(每個服務器一個),然後一個隊列返回到中央服務?它看起來像很多隊列。

我想過使用SNS嗎?但是,我仍然有400個SNS主題?每個商店一個?

+0

並不是說這是理想的,但400個服務器可以輪詢每10分鐘,還是你需要它是或多或少的即時通知?如果輪詢正常,您可以簡單地將S3中的JSON文檔放在s3:// bucketname/serverN(或某種數據庫)中,並讓客戶端定期輪詢新的JSON文檔。 – jarmod

回答

0

您絕對應該而不是將檢索不會被處理的Amazon SQS消息。這可能會導致消息從不檢索所需的服務器。

您的選擇是:

  • 創建每臺服務器一個隊列。他們檢查自己的隊列。或
  • 使用API​​網關創建您自己的API。服務器呼入,標​​識自己。消息從數據庫(不是SQS)中檢索並返回。 缺點:你必須把它寫自己,做錯誤處理,隱蔽型功能性等

第一個選項是最簡單的,並要求幾乎沒有編碼的變化。 SQS中的隊列數似乎沒有限制。可以用幾行代碼以編程方式創建400個隊列。

根據您的應用程序的運行方式,您可能還需要一個通用隊列,任何服務器都可以抓取,甚至可能爲特定服務器類別(例如通過地理位置或功能)排隊。每個服務器會首先檢查自己的隊列,然後檢查其類的隊列,然後檢查通用隊列。

警告一句話:亞馬遜SQS charges by API call(例如試圖檢索消息)。使用long polling來減少請求的數量。

+0

嗨,John,謝謝你的評論。我想我會用每個服務器的一個隊列。我們不可能有超過500個這樣的隊列要求,並且 - 正如您指出的那樣 - 我可以設置中央應用程序,以便如果消息的目的地是不存在隊列的服務器,隊列可以以編程方式創建,其中包含作爲隊列名稱一部分的服務器名稱(以便消費者可以根據自己的服務器名稱動態調出隊列名稱,例如C#Environment.Machinename。謝謝John! – JamesMatson

0

這是SQS的解決方案。通過http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html

可以由任何商店使用的消息將不具有任何消息屬性;而特定商店的消息將具有屬性store = store1。

現在,所有商店將有兩個偵聽器,一個具有消息屬性;而一個聽衆沒有過濾器。

ping我如果你有任何疑問。

+0

不幸的是,這並沒有幫助。 ReadMessages()函數不能使用消息屬性作爲過濾器,所以不可能僅檢索例如store1的消息。 –

+0

你好迪帕克,正如約翰所建議的,我的印象是消息屬性不能用作過濾的手段。我在這方面做了一些研究,因爲它一眼就可以解決我的問題,但是我所做的每一項閱讀都表明它不能解決我的問題。你有這種方式使用消息屬性的證據嗎? – JamesMatson

+0

您好Deepak,你提到ping你,如果你有任何疑問。雖然這個問題已經得到解答,但我仍在亞馬遜網絡服務的另一個領域掙扎,主要是使用.NET的Lambda功能。似乎只有極少數使用.NET的示例,示例或教程(我的理解程度是因爲Node.js的功能長得多)。我在SO上發佈了另一個關於Lambda的問題。如果你認爲你可以提供幫助,如果你能看一看,我會很感激。 – JamesMatson

0

正如約翰建議我的上述答案可能無法正常工作; 一個解決方案可以使用任何JMS解決方案供應商,例如我已經使用的ActiveMQ,並且肯定會提供此功能;您可以在其中基於過濾器訂閱隊列。

bitnami爲activemq提供AMI,您可以將其安裝在微EC2實例上。它非常直接。

相關問題