2012-03-04 159 views
12

我有一個Azure託管的Web應用程序,它與一些輔助角色的實例一起工作。目前,Web應用程序通過將消息放置在Azure隊列中供工作人員接受,從而將工作傳遞給這些工作人員。工作人員通過將消息放置到「反饋」隊列中來傳遞狀態和進度消息。目前,爲了讓瀏覽器客戶端知道進展情況,我在瀏覽器中將基於Ajax的定期輪詢調用到MVC控制器方法,該方法讀取Azure的「反饋」隊列,並將這些消息作爲json返回給瀏覽器。很顯然,SignalR看起來像是這種笨拙的輪詢/排隊方法的一個非常有吸引力的替代方案,但是當我們談論多個工作者角色(而不是web角色)時,我幾乎找不到指導如何去做)需要向個人或所有客戶發送狀態。在Azure Worker角色中使用SignalR

SignalR.WindowsAzureServiceBus by Clemens vasters看起來非常棒,但在最後會留下一點高和幹,即缺乏一個很好的示例解決方案。

添加評論:從我讀到目前爲止似乎從工人角色沒有直接通信通過SignalR方法(而不是網絡角色)瀏覽器客戶端是可能的。似乎工作人員必須使用隊列與Web角色進行通信。這反過來又強制實施輪詢方法,即必須輪詢隊列中的工作角色的消息 - 該輪詢必須從它出現的瀏覽器發起(驅動)(如何在Web角色中設置輪詢循環?)

總之,SignalR,即使有 Clemens Vasters的SignalR.WindowsAzureServiceBus擴展方法,也無法處理從工作角色到瀏覽器的直接通信。

任何意見的專家將不勝感激。

+0

什麼是最輕量級的方式,你能夠中繼工人角色=> webrole =>客戶端瀏覽器? – DeepSpace101 2013-01-17 00:37:30

+0

由於bacr已經回答。我也有多個工作角色作爲客戶端運行,並且webrole控制它們。 – 2013-04-13 22:13:20

回答

1

我們使用Azure服務總線隊列將數據發送到我們的SignalR Web角色,然後轉發給客戶端。 CAT pages有非常好的如何設置異步循環和發送的例子。

+3

感謝@el_tone似乎Web角色必須使用SignalR發送到瀏覽器客戶端。我的問題是,必須發送的消息**來自_worker_角色**。如何從工作角色獲取這些消息。如果他們將這些消息放入服務總線隊列中,那麼服務總線似乎需要通過Web角色進行輪詢。這種輪詢是人們試圖通過首先使用SignalR來避免的! – t0rus 2012-03-20 12:49:55

+0

@ t0rus:服務總線隊列可以在阻塞模式下運行,即不進行輪詢。隊列讀取在設定的超時(例如24小時)或收到消息時返回。在此阻塞一個IIS線程是一個禁忌,但是對於任務來說,開銷*可能會很低。想知道如果開銷可以是甚至更低... – DeepSpace101 2013-01-17 00:39:29

+0

看起來像鏈接關閉。 – 2014-12-01 13:08:09

6

您可以將您的工作角色用作SignalR客戶端,以便他們將消息發送給Web角色(即SignalR服務器),並且Web角色反過來將消息轉發給客戶端。

+2

你有一個如何做到這一點的例子? – 2014-12-01 13:07:31

+1

向下投了這個答案,因爲它目前的立場並沒有增加任何價值。 – 2017-05-05 20:18:07

1

請記住,我對這兩種技術的知識是非常基本的,我剛開始。我可能誤解了你的問題,但對我來說這似乎很明顯:

Web角色能夠訂閱隊列服務器,工作者角色存放消息?如果沒有客戶端「拉」,隊列服務將爲Web服務器端代碼提供一條新消息,並且通過SignalR您可以將更改推送到客戶端,而不涉及客戶端請求。網絡和工作人員之間的溝通將保持不變(在我看來,這是正確的做法)。

0

替代消息總線產品,如NServiceBus可能值得研究。 NServiceBus能夠跨進程邊界異步傳遞消息,而不需要輪詢。

相關問題