2011-08-30 130 views
2

形勢發公告,從Azure的工人角色Azure的Web角色 - 最佳實踐

用戶可以上傳文件,隊列消息將被放置在隊列中的文件ID。工作人員角色會選擇並獲取文檔。用Lucene完全解析它。解析完成後,應該更新Webrole上的Lucene IndexSearcher。

在我保持靜態Lucene的IndexSearcher的,否則你必須做出一個新的IndexSearch每個搜索請求的Web角色,這給了很多的開銷等

我想要做什麼是發出通知從工作者角色到Web角色,他需要更新他的IndexSearcher。

可能的解決方案

  • 使某種通知隊列。 Web角色開始了一個持續檢查通知隊列的無盡任務。如果他發現一條消息,那麼他應該更新IndexSearch。
  • 在工作者角色上啓動WCF服務並與Web角色連接。從工作者角色進行回調,並通過服務告知Web角色他需要更新他的IndexSearcher。
  • 定期間隔

什麼是最好的解決辦法還是對此有任何其他的解決辦法只是更新呢?

非常感謝!

回答

2

如果您的工作人員角色使用類似(DateTime.MaxValue - DateTime.UtcNow).Ticks.ToString("d19")之類的PK將每個完成的工作詳細信息寫入表格,您將擁有已處理的最新作業的排序列表。設置你的Web角色輪詢表所示:

var q = ctx.CreateQuery<LatestJobs>("jobstable") 
    .Where(j => j.PartitionKey.CompareTo(LastIndexTime.GetReverseTicks()) < 0) 
    .Take(1) 
    .AsTableServiceQuery() 

if (q.Count() > 0) 
{ 
    //new jobs exist since last check... re-index. 
} 

對於工人角色做索引工作,這是偉大的,因爲他們可以胡亂寫表中沒有衝突的擔心。對你而言,你也有一份他們正在處理的工作的審計日誌(假設你在那裏提供了一些細節)。

但是,您還有一個問題:聽起來您有1個Web角色更新索引。這個網絡角色當然可以根據您選擇的頻率輪詢該表格(只需跟蹤LastIndexTime以供後續搜索)。你的問題是如果你有多個Web角色併發控制的話。每個網絡角色是否維護它自己的索引,或者你有一個存儲在某個地方?對不起,但我不是Lucene的專家,如果這應該是顯而易見的。

無論如何,如果您的WebRole中有多個實例以及所有人都可以看到的單個索引,則需要防止多個角色反覆更新索引。您可以通過租用索引來執行此操作(如果存儲在Blob存儲中)。

更新基於評論:

如果每個WebRole實例都有自己的指數,那麼你不必擔心租賃。只有當他們共同分享blob資源時纔是如此。所以,這項技術應該可以正常工作,唯一的潛在障礙是Web角色的輪詢時間間隔可能會略有不同步,從而導致稍微不同的結果,直到所有更新(取決於您打的哪個實例)。在桌面上每30秒輪詢一次,這將是您的最大不同步。每個Web角色實例只需跟蹤上次更新的時間並從該點進行增量搜索。

+0

每個實例都有自己的IndexSearcher。 indexsearcher的更新意味着它從Blob Storage下載所有新的Lucene索引文件並將其保存在本地。然後他可以很容易地查詢這個。租賃該指數意味着什麼?將IndexSearch存儲在BlobStorage中? –

+0

查看我的更新以獲取更多說明。租賃僅適用於Blob存儲中的共享資源。當時情況並非如此。 – dunnry

+0

我不認爲滴答是主鍵的好選擇,也許只是使用標識列? –

1

根據上傳頻率的不同,您可能會發現隊列消息導致不必要的更新。例如,如果您獲得了一打上傳並在近距離處理它們,您現在將擁有一打隊列消息,每個都會告訴您的Web角色進行更新。保留單個信號(可能是錶行或SQL Azure行)會更有意義。您可以簡單地將行值設置爲1,表示需要更新。當您的Web角色檢測到此更改時,請重置爲0並開始更新。注意:如果使用Azure Table行,您需要輪詢更新(並且根據流量,您可以開始累積大量事務)。您也可以使用AppFabric Cache來處理此信號。

您可以在Web角色的內部端點上使用WCF服務。然而,你仍然有爆發的問題(如果你在webrole更新時得到了十幾個上傳,那麼你不想再做十次更新)。

+0

工作者角色一次不佔用1個隊列消息。他接收最大的消息(32)並解析這些消息。在他解析完所有內容之後,他會發送更新。因此,如果在同一時間上傳1,10或32個文檔,他仍然只會更新一次。單一信號的想法是偉大的,但這意味着我需要不斷查詢表格行嗎? –