2011-04-07 96 views
2

我正在調查Azure存儲對於我所考慮的應用程序的使用。其中一部分涉及投票和收藏夾等類似SO的功能。與SO一樣,我希望能夠允許用戶投票/添加收藏夾一次,然後將其用於評分/加權目的。Azure存儲投票模式

爲此,如何使用Azure存儲或AWS SimpleDB進行此操作?這種情況是否有模式出現?

回答

2

您使用的是表格存儲嗎?要記住Azure存儲的棘手問題是缺少Count等功能。

爲防止某人投票或贊成某事兩次,您需要使主鍵包含內容的ID和用戶的ID。比方說,用戶可以對評論投票。我們將創建一個名爲CommentVotes的表,其中包含「UserID」的PartitionKey和「CommentID」的RowKey。現在任何重複都會拋出異常並阻止它發生。問題是計算事物的計數而不抓取所有行。您需要創建另一個存儲彙總結果的表格,這些彙總結果在插入成功時遞增。該表可能看起來像PK「評論」,RK「CommentID」,TotalVotes「5」。

0

當你計劃一個分佈式系統時,一個挑戰就是說服你自己應該在不同的地方複製信息,那就是數據非規範化。我們大多數人都習慣於數據庫中的數據規範化和所有這些,試圖將每種信息類型保存在一個地方。但要知道,我們必須爲了表演和分配而做相反的事情。

正如@Vyrotek已經指出的那樣,您應該將「計數」信息保存在其他地方,並在每次元素投票時自行更新。

1

您可以選擇一些方法來利用存儲:BLOB(二進制大對象)或表。 Blob只是存儲文本或二進制數據。表格提供了更多的結構。此外,他們還提供REST服務來管理它們。

如果您需要「持久且耐用」的存儲選項,Microsoft表示Azure存儲對此非常完美。但是,如果您的應用程序可能會受到大多數應用程序的更改,那麼我建議您使用SQL Azure。 SQL在存儲應用程序數據方面更爲常見。 Azure存儲對於利用診斷日誌等更加有用,無需設置SQL數據庫(或者自行編寫連接到數據庫的問題)。

存儲的另一種用途是劃分出您的信息,以便不同的人可以訪問它們。例如,您將所有診斷和錯誤信息放入Ops團隊的一個位置,然後爲需要簡單文件的經理創建另一個存儲位置,該文​​件包含應用程序生成的報告。每個存儲位置都可以擁有自己的標識符和連接哈希字符串(對不起,我不知道他們正式稱爲什麼)。

此外,您可以使用存儲進行部署和構建。我相信Visual Studio使用存儲來配置部署時通過IDE進行部署。我的觀點是,越來越多的人發現SQL對應用程序數據和操作數據存儲非常有用。

我喜歡但尚未實現的一種模式是使用Azure隊列。當您想要使用幾種不同類型的角色擴展您的應用程序時,它的用處就顯而易見了。例如,Web角色可以使用隊列來添加事務,並且有兩個或更多個工作角色從隊列中選擇事務進行處理和存儲。通常,許多Azure應用程序的瓶頸在於數據庫,因此,如果需要考慮可伸縮性,將數據處理從Web角色轉移到輔助角色非常有用。

1

最簡單的解決方案包括使用每個計數器1個blob(又名Blob存儲)。 blob實際上不僅包含最終計數,還包含投票用戶的標識符以及。這將確保沒有雙重投票。開源庫如Lokad.Cloud可以幫助你做到這一點(免責聲明:我在Lokad工作)。

這種方法的一個缺點是,你的計數器不會超過〜10票/秒 - 這對於大多數網絡應用來說已經是很多。那麼,如果你真的想到超重型計數器,你應該考慮分片計數器,它可以使用表存儲和Blob存儲來實現。

另一個看待這個問題的角度是想想CQRS,並讓投票發出異步處理的命令消息,而Javascript負責向用戶提供即時反饋。這裏最顯着的好處是,可以有一個單個斑點代表頁面的全部狀態,投票計數器以及其他東西到加速讀取。請檢查Lokad.CQRS來執行此操作。