精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在Azure上構建一個基于Facebook的營銷式應用程序(下)

原創(chuàng)
云計算
當你的Facebook應用程序點擊率上升的時候,它如何進行擴展呢?如果你是在Windows Azure上構建的這個應用程序,并且是按橫向擴展的思想設計的這個應用程序,那么很高興地告訴,你可以“高枕無憂”了。

本文承接《在Azure上構建一個基于Facebook的營銷式應用程序(上) 》 和《在Azure上構建一個基于Facebook的營銷式應用程序(中)》

選擇一個商店

如果我們在聯系信息窗體中通過了驗證,我們接下來就可以讓用戶選擇一個他自己喜歡的商店了。這個應用程序會給用戶展示一個包含三個商店的列表(這三個商店都在這個用戶的郵政編碼所在地方圓50英里之內,是按照從最近到最遠的順序來排序的)。要想讓這個窗體快速地顯示出來,盡量減少Web角色上的負載,提前計算距離,然后把據距離信息和商店數據整理到Azure Table Storage中是我們首先應該做的事情。要時刻謹記,我們的目標是可擴展性,而不是想當然的可升級性或未來的可預見性——營銷式應用程序存在的時間相對較短。

我使用的是公用的來自于1999年人口普查的美國郵政編碼列表(具體可以參考:http://www.census.gov/geo/www/tiger/zip1999.html)。這個列表包含每個郵政編碼的經度和緯度坐標。然后,因為我沒有自己的商店,所以我從這個列表隨機地選擇了一些郵政編碼,然后用這些郵政編碼生成了一個包含1000個樣例商店的列表。然后,把這個商店列表通過CSV文件(這種文件格式對Azure Azure Storage Explorer比較友好)的形式,上傳到我的***個Azure表中,“Store”實體如下所示:

Listing 7

public class Store: TableServiceEntity

{

// partition key is store number

// row key is empty

public Store()

{

this.RowKey = "";

}

public string Name { get; set; }

public string City { get; set; }

public string State { get; set; }

public string Zip { get; set; }

}

接下來,我構建了第二張表,叫作“ZipStore”,對于這個國家中的每個郵政編碼來說,它包含0到3行。每行是一個“郵政編碼-商店”對,對于每個郵政編碼來說,只考慮在這個郵政編碼所在地方圓50英里內的三個最近的商店。要構建這樣一張表,我必須要遍歷郵政編碼列表,然后使用一個基于經度和緯度的公式(具體可以參考:http://zips.sourceforge.net/),計算出各個郵政編碼所在地到每一個商店的距離,把范圍內最近的三個商店保存下來。如果方圓50英里之內根本就沒有商店,那么我會放棄這個郵政編碼。30分鐘的數值分析之后,我得到了一個包含“郵政編碼-商店”信息的CSV文件,然后我把這個文件上傳到了Azure Table Storage中。“ZipStore”實體是十分簡單的。

Listing 8

class ZipStore: TableServiceEntity

{

// partition key is zip code

// row key is distance rank (0 is nearest)

public string StoreNumber { get; set; }

}

“partition key”存儲了郵政編碼。“row keys”是每個商店的靠近等級。每個“partition”代表一個郵政編碼,“partition”中的每一行代表一個商店和這個郵政編碼所在地的靠近程度。

現在,我們可以看一看“Store”容器了:

Listing 9

public class StoreRepository : IStoreRepository

{

readonly AzureTable<ZipStore> _zipStore;

readonly AzureTable<Store> _store;

public StoreRepository()

{

var factory = new AzureStorageFactory ();

_zipStore = (AzureTable<ZipStore>)factory.GetTable><ZipStore>();

_store = (AzureTable<Store>)factory.GetTable><Store>();

}

public IEnumerable<Store> GetNearbyStores(string ZipCode)

{

var stores = new List<Store>();

Store store;

var query = _zipStore.Query.Where(zs => zs.PartitionKey == ZipCode);

foreach (ZipStore zs in query)

{

store = _store.Get(s => s.PartitionKey == zs.StoreNumber && s.RowKey == "");

if (store != null)

stores.Add(store);

}

Return stores;

}

}

這里值得一提的是“GetNearbyStores()”方法,控制器使用這個方法來加載可用的商店列表。***個查詢只指定了“partition key”(郵政編碼),然后返回三個或少于三個商店。因為“row key”是距離等級,所以這個查詢會按照距離的順序來返回各個商店。而對于每個商店來說,我們使用商店號作為“partition key”,從“store”表中獲取商店名,城市,國家和郵政編碼。

雖然對于這個視圖來說,必須要進行四次查詢,但是它們都是通過“partition key”和“row key”來進行的,速度非常快。而且,你還可以購買存儲空間,通過把全部的“store”實體都直接存儲到“ZipStore”表中,盡量減少對單一查詢的檢查的方式,來獲得更好的性能。

#p#

存儲和隊列

這個叫作“SelectStore”的處理程序用用戶選擇的商店和注冊標記來更新“contact”,然后保存這個“contact”。

Listing 10

[HttpPost]

[CanvasAuthorize]

public ActionResult SelectStore(SelectStoreViewModel model)

{

FacebookApp app = new FacebookApp ();

Contact contact = contactRepository.GetFromFacebookId(app.UserId);

if (ModelState.IsValid)

{

contact.StoreNumber = model.StoreNumber;

contact.Registered = true;

contactRepository.Save(contact);

QueueContact(contact);

return this.CanvasRedirectToAction("SignupComplete");

}

Return View(model);

此外,為了方便Worker角色進行處理,這個控制器會把“contact”排成隊列。這是“QueueContact”的完整實現:

Listing 11

private void QueueContact(Contact contact)

{

// queue the contact for the worker role.

ContactQueueMessage message = new ContactQueueMessage();

message.FacebookId = contact.PartitionKey;

contactQueue.AddMessage(message);

}

Windows Azure Toolkit可以讓你更方面地使用Azure隊列。對于在多個角色(一個可擴展的應用程序是由這些角色組成的)之間進行通信來說,隊列是必需的。“ContactQueue”繼承于一個Windows Azure Toolkit類型,“ContactQueueMessage”也是如此,它們可以讓隊列方法的實現變得更加簡單。但是,當這個工具包從Worker角色的隊列中獲取消息的時候,這個工具包會才會真正地大放異彩。接下來我們將會看到這一點。

在Worker角色中Dequeuing

Worker角色做了很多的工作,但是這一切都是在響應隊列消息的過程中完成的。使用Windows Azure Toolkit,我們可以在這個角色的“OnStart()”方法中創(chuàng)建一個隊列處理程序。我們只需把這段代碼添加到默認的實現中就可以了:

Listing 12

AzureStorageFactory factory = new AzureStorageFactory();

IAzureQueue<ContactQueueMessage> queue =

factory.GetQueue<ContactQueueMessage>(AzureConstants.ContactQueueName);

QueueHandler.For<ContactQueueMessage>(queue)

.Every(TimeSpan.FromSeconds(5))

.Do(new EmailAndStoreContact());

在“OnStart”中,我們創(chuàng)建了一個“AzureStorageFactory”對象,然后使用它來查找“contact”隊列。然后,我們創(chuàng)建了一個處理程序,在這個例子中,它每5秒檢查一次隊列,如果有一個消息可用的話,它就用這個消息調用我們的消息處理器(“EmailAndStoreContact”)。因為處理隊列消息是Worker角色的工作,所以,我們需要做的所有事情只是把它寫入到“EmailAndStoreContact”中而已。對于這個類來說,Main方法被叫作Run,它的實現如下所示:

Listing 13

public void Run(ContactQueueMessage message)

{
Contact contact = contactRepository.Get(message.FacebookId);

if (contact != null)

{

// TODO: contact another service to send off the email with

// the premium coupon here (outside the scope of this sample)!

// store the contact to sql Azure.

SQLContact sqlContact = new SQLContact();

MapContactToSqlContact(contact, sqlContact);

sqlContactRepository.Add(sqlContact);

sqlContactRepository.Save();

}

}

這個消息處理器從隊列消息中獲取“contact”的Facebook ID,然后使用它從這個容器中獲取“contact”。因為在這個應用程序中我們并沒有真正地email什么內容,所以剩下的所有事情只是把“contact”發(fā)送到SQL Azure中而已。這里,我們使用了一個“SQLContact”對象,它是“LINQ to SQL”中的一個數據類。

究竟為什么從Azure Table Storage遷移到SQL Azure呢?因為雖然Azure表很快,但是它們并不適合進行某些特定的查詢。把聯系數據遷移到SQL Azure中可以生成表,其他應用程序就可以查詢這個“contact”表來判斷我們的活動進行的怎么樣了。

#p#

起點

你可以把這個應用程序的源碼當成你自己在Facebook上的營銷活動的起點。就像上面討論的那樣,(除了50000個獎品)你還需要添加一些其他的東西。首先,在Worker角色中,要有email的處理程序。其次,要有一些輔助性的Facebook要素,例如:支持這個應用程序在公司頁面上作為一個標簽來運行,為“like”你的頁面的客戶提供額外的獎勵,通過邀請或Wall posts,進一步促進“病毒”的傳播。在大多數情況下,支持這些特性意味著直接和Facebook JavaScript API打交道。

即使你從來沒有發(fā)起過你自己的活動,對于那些使用C#的Azure開發(fā)者來說,也會有很多收獲的。首先,使用Windows Azure toolkit可以簡化訪問Azure存儲表和隊列的過程。其次,如果你正在編寫一個Facebook應用程序,那么你可以使用Facebook C# SDK。再次,使用Worker角色可以把后臺任務分離出來。***(但并非到此為止),可以讓你知道如何組織你的存儲結構才能給你的應用程序提供***的可擴展性。

你需要的一些工具:

這些工具的***版本可以通過下面這些地址來下載:

Windows Azure SDK的下載地址:http://msdn.microsoft.com/en-us/windowsazure/cc974146.aspx

Windows Azure Toolkit的下載地址:http://azuretoolkit.codeplex.com/

Facebook C# SDK的下載地址:http://facebooksdk.codeplex.com/

樣例代碼:

這些樣例代碼是本文寫作的時候使用的一些代碼。

你可以通過如下地址來下載本文的樣例代碼:

http://facebooksdk.codeplex.com/releases/view/60694

本文承接《在Azure上構建一個基于Facebook的營銷式應用程序(上) 》

《在Azure上構建一個基于Facebook的營銷式應用程序(中)》

原文名:Building a Facebook Marketing App on Azure 作者:Steve Apiki

【本文乃51CTO精選譯文,轉載請標明出處!】
 

【編輯推薦】 

  1. 在Azure上構建一個基于Facebook的營銷式應用程序(中)
  2. 在Azure上構建一個基于Facebook的營銷式應用程序(上)
  3. 無需頂禮膜拜 三步打造經濟高效的云基礎架構

 

 

 

責任編輯:王勇 來源: 來源:51CTO
相關推薦

2011-03-14 14:47:50

2011-03-14 15:10:10

AzureFacebook

2011-11-23 10:06:32

Azure微軟移動應用

2011-03-10 10:45:47

Azure“Hello Worl

2011-03-15 19:45:27

Windows Azu

2025-07-24 09:08:31

2010-11-09 10:37:21

2023-09-21 08:00:00

ChatGPT編程工具

2021-07-14 17:39:46

ReactRails API前端組件

2011-03-22 09:45:56

Windows AzuSilverlight

2010-07-12 10:11:27

ibmdwWeb

2023-08-22 20:55:04

AzureLLMTypeChat

2011-03-22 10:03:55

Windows AzuSilverlight

2018-12-13 11:10:21

OpenSnitchLinux防火墻

2018-11-14 19:00:24

PythonRedis共享單車

2011-05-11 10:58:39

iOS

2021-02-17 11:05:34

PythonPyQt代碼

2010-01-08 12:14:44

ibmdwAndroid

2015-10-14 10:43:17

PaaSSaaS應用構建

2015-03-10 09:51:56

云開發(fā)云應用程構建PaaS
點贊
收藏

51CTO技術棧公眾號

国产毛片久久久久久久| 亚洲欧洲久久| 精品一区免费观看| 九九精品在线| 欧美日韩一区中文字幕| a级黄色片网站| 天堂在线资源网| 青青草国产成人av片免费| 久久综合国产精品台湾中文娱乐网| 无码人妻一区二区三区在线视频| 国产精品25p| 欧美高清一级片在线观看| 亚洲已满18点击进入在线看片| 日韩xxx高潮hd| 欧美hentaied在线观看| 亚洲精品美女久久| 久久出品必属精品| 亚洲欧美一区二区三区| 亚洲人妖av一区二区| 明星裸体视频一区二区| 国产成人a人亚洲精品无码| 久久av一区| 国产黄色成人av| 日韩区在线观看| 三级视频中文字幕| 亚洲一级少妇| 亚洲一区二区欧美| 亚洲欧洲日本国产| 福利片在线观看| 成年人午夜久久久| 3d动漫啪啪精品一区二区免费| 午夜精品免费观看| 99在线观看免费视频精品观看| 久久精品国产电影| 国产精品久久久视频| 日本韩国欧美超级黄在线观看| 日韩一区二区三区高清免费看看| 国产又大又黄又粗的视频| 成年人黄色大片在线| 亚洲女性喷水在线观看一区| 亚洲国产综合自拍| 亚洲色图另类小说| 成人的网站免费观看| 亚洲一区二区三区乱码aⅴ| 在线播放成人av| 久久精品1区| 成人av综合在线| **欧美日韩vr在线| 久久综合久久鬼| 中文无码久久精品| 久久天天躁日日躁| 一级黄色录像视频| 欧美ab在线视频| 欧美成人国产va精品日本一级| 91动漫免费网站| 久久视频国产| 久久九九亚洲综合| 国产一区二区视频在线观看免费| 国产精品99一区二区三区| 日韩亚洲国产中文字幕| 免费在线观看a级片| 午夜影院欧美| 欧美精品午夜视频| 精品在线免费观看视频| 亚洲国产影院| 日本精品视频在线观看| 日韩av免费播放| 日本人妖一区二区| 国产中文日韩欧美| www国产一区| 成人在线综合网站| 久久国产精品高清| 邻家有女韩剧在线观看国语| 国产亚洲欧美日韩俺去了| 午夜视频久久久| 久热国产在线| 亚洲国产精品天堂| 欧美精品一区二区三区免费播放| 亚洲a∨精品一区二区三区导航| 欧美午夜精品久久久| xxx中文字幕| 日韩欧美影院| 中文字幕日韩精品在线观看| 内射一区二区三区| 亚洲精品美女91| 国产精品久久久久久久久久三级| 亚洲一区中文字幕永久在线| 国产乱人伦偷精品视频不卡| 韩国一区二区三区美女美女秀| 国产视频精选在线| 亚洲丝袜自拍清纯另类| 精品久久一二三| 福利一区在线| 日韩欧美精品在线视频| 黄色性生活一级片| 亚洲欧洲中文字幕| 欧美在线视频观看免费网站| 97成人在线观看| 99视频热这里只有精品免费| 亚洲人成77777| missav|免费高清av在线看| 色猫猫国产区一区二在线视频| 污污动漫在线观看| 欧美自拍一区| 欧美大奶子在线| 丁香社区五月天| 丁香啪啪综合成人亚洲小说 | 高h放荡受浪受bl| 久久一留热品黄| 国产精品视频一二三四区| 涩涩视频在线| 日韩欧美一区电影| 麻豆视频免费在线播放| 日韩视频精品在线观看| 成人黄色影片在线| 国产在线视频网址| 五月天亚洲精品| 91视频福利网| 日韩伦理一区| 国产成人一区三区| 亚洲色图 校园春色| 一区二区三区四区高清精品免费观看 | 国产精品久久久久久五月尺 | 亚洲天堂男人的天堂| 国产亚洲色婷婷久久99精品| 久久国产日韩欧美精品| 欧美日韩国产精品一区二区| 岛国片av在线| 日韩精品中文字幕在线一区| 国产极品视频在线观看| 久久久久99| 精品国产乱码久久久久久郑州公司 | 中文字幕视频免费观看| 久久午夜电影网| 国产精品无码av在线播放| 91亚洲无吗| 九九九久久国产免费| 国产美女自慰在线观看| 国产精品视频九色porn| 日韩中文字幕免费在线| 亚洲三级网页| 欧美综合在线第二页| 亚洲av毛片成人精品| 亚洲6080在线| 天堂www中文在线资源| 一区久久精品| 国产一区精品视频| 国内精彩免费自拍视频在线观看网址| 日韩一级在线观看| 久久久久久久中文字幕| 国产成人午夜99999| 亚洲国产一二三精品无码 | 国产精品蜜臀| 精品国产乱码久久久久久久| 久久av高潮av无码av喷吹| 国产一区二区美女诱惑| 国产一级片91| 99国产精品久久一区二区三区| 久久999免费视频| 亚洲精品久久久狠狠狠爱| 亚洲国产中文字幕| 日韩成人av一区二区| 久久精品日产第一区二区| 欧美在线视频二区| 成人性片免费| 欧美成人精品一区| 日本高清视频网站| 欧美视频二区36p| 丁香激情五月少妇| 精品亚洲aⅴ乱码一区二区三区| 老司机av福利| 黄色免费大全亚洲| 国产成人精品久久二区二区| av资源种子在线观看| 制服视频三区第一页精品| 九九热视频精品| 99精品桃花视频在线观看| 国产精品动漫网站| 香蕉综合视频| 国内精品久久久久久久果冻传媒| 成人性生活视频| 日韩小视频在线| 天堂在线资源网| 欧美日韩高清在线| 伊人365影院| 国产精品久久久久久久久图文区| 免费人成视频在线播放| 午夜宅男久久久| 樱花www成人免费视频| 视频在线观看免费影院欧美meiju 视频一区中文字幕精品 | 欧美 变态 另类 人妖| 麻豆一区二区三区| 18禁网站免费无遮挡无码中文| 精品国产乱码久久久久久蜜坠欲下 | 黄网在线观看视频| 国产精品二区一区二区aⅴ污介绍| 一级全黄裸体片| 秋霞午夜av一区二区三区| 日本五级黄色片| 啪啪亚洲精品| caoporen国产精品| 成人亚洲综合| 久久久久久18| 午夜视频在线观看免费视频| 亚洲第一区在线| 91久久久久久久久久久久| 午夜精品久久久久久久久久 | 综合久久综合| 日韩精品伦理第一区| 亚洲免费一区三区| 成人免费自拍视频| 成人激情综合| 久久久久免费视频| 黄页视频在线播放| 国产亚洲精品久久久久久牛牛| 亚洲AV无码乱码国产精品牛牛| 在线观看三级视频欧美| www.日本精品| 亚洲午夜激情av| 一区二区成人免费视频| 中文字幕在线不卡| 成人无码av片在线观看| 91免费观看视频| 天天躁日日躁狠狠躁av| 国产专区综合网| 美女网站视频黄色| 日韩在线观看一区二区| 久久婷婷国产精品| 亚洲主播在线| 日韩在线视频在线观看| 精品不卡视频| a级免费在线观看| 欧美1区视频| 糖心vlog在线免费观看| 99久久久久| 中文字幕一区二区三区最新 | 久久综合九色综合88i| 激情综合视频| av在线播放天堂| 激情婷婷亚洲| 国产黄页在线观看| 国产一区二区你懂的| 少妇人妻在线视频| 一区二区三区国产盗摄| 欧美黑人经典片免费观看| 亚洲久久视频| 精品中文字幕av| 性欧美videos另类喷潮| 精品99在线视频| 久久在线精品| 黄色成人免费看| 极品少妇一区二区| 污免费在线观看| 成人视屏免费看| 成人在线视频免费播放| 26uuu国产一区二区三区| 右手影院亚洲欧美| 国产日韩av一区二区| 色屁屁草草影院ccyy.com| 国产精品理论在线观看| 国产高清视频免费在线观看| 亚洲精品欧美二区三区中文字幕| 久久精品国产亚洲AV成人婷婷| 中文字幕亚洲精品在线观看| 99久久婷婷国产综合| 亚洲成a人片在线观看中文| 国产精品视频免费播放| 欧美亚洲高清一区| jlzzjlzzjlzz亚洲人| 精品国产自在久精品国产| 天堂视频中文在线| 中文字幕亚洲一区在线观看 | 色综合888| 尤物99国产成人精品视频| 国产黄色在线网站| 欧美不卡视频一区发布| 999av小视频在线| 国产精品福利无圣光在线一区| 91成人小视频| 精品乱码一区| 91亚洲一区| 青春草国产视频| 日韩 欧美一区二区三区| 黄色三级视频在线播放| 91免费版在线| 一区视频免费观看| 欧美性xxxx极品高清hd直播| 91亚洲国产成人久久精品麻豆| 欧美成va人片在线观看| 国产在线观看免费| 欧美噜噜久久久xxx| 欧美电影网址| 高清国产在线一区| av伊人久久| 久久国产午夜精品理论片最新版本| 老牛嫩草一区二区三区日本| 永久av免费在线观看| 久久青草国产手机看片福利盒子 | 午夜久久久久久久久| 中文字幕在线观看视频一区| 亚洲电影成人av99爱色| 男人天堂久久久| 日本午夜人人精品| 7m精品国产导航在线| 亚洲精品中字| 欧美专区一区二区三区| 国产综合内射日韩久| 国产精品萝li| 中文字幕免费观看| 欧美精品一区二区三区四区| 免费在线毛片网站| 国产xxx69麻豆国语对白| 亚洲开心激情| 在线观看18视频网站| 日本不卡的三区四区五区| 黄色片视频免费观看| 亚洲黄一区二区三区| 做爰视频毛片视频| 亚洲欧美一区二区三区久久| 黄色成人在线网| 99中文字幕| 综合激情婷婷| 三级性生活视频| 中日韩av电影| 懂色av中文字幕| 亚洲精品午夜精品| 欧美日韩国产观看视频| 97碰碰视频| 中文字幕乱码亚洲无线精品一区 | 97成人在线观看| 在线电影欧美日韩一区二区私密| 亚洲性受xxx喷奶水| 国产一区免费| 亚洲欧洲日本mm| 亚洲男女在线观看| 亚洲线精品一区二区三区八戒| 国产特级黄色片| 美女视频久久黄| 精品亚洲二区| 少妇一晚三次一区二区三区| 国产乱人伦偷精品视频免下载| 暗呦丨小u女国产精品| 91精品欧美综合在线观看最新 | 五月六月丁香婷婷| 国产精品福利影院| 91成品人影院| 久久综合网hezyo| 精品国产鲁一鲁****| 国产激情片在线观看| 国产不卡视频在线观看| 国产午夜免费视频| 亚洲加勒比久久88色综合| 国产美女精品写真福利视频| 久久久水蜜桃| 日韩电影在线一区| 亚洲激情图片网| 欧美一区国产二区| 黑人玩欧美人三根一起进| 国产综合 伊人色| 久久性天堂网| 亚洲不卡的av| 日韩无一区二区| 超碰91在线观看| 少妇免费毛片久久久久久久久 | yellow91字幕网在线| av免费精品一区二区三区| 99riav国产精品| 亚洲自拍偷拍图| 9191精品国产综合久久久久久| 在线免费观看污| 蜜桃999成人看片在线观看| 日本成人在线电影网| 午夜精品福利在线视频| 精品国内片67194| 国产综合色在线观看| 青青草原网站在线观看| 9l国产精品久久久久麻豆| 不卡av电影在线| 久久精品小视频| 卡通动漫国产精品| 一级片视频免费观看| 一二三四区精品视频| 精品影院一区| 51成人做爰www免费看网站| 亚洲裸体俱乐部裸体舞表演av| 成人性生交大片免费看无遮挡aⅴ| 欧美精品电影在线播放| 182在线播放| 正在播放一区二区三区| 不卡av在线免费观看| 中文字幕在线播放不卡| 国内外成人免费激情在线视频| 精品久久精品| 9.1在线观看免费| 欧美日韩一区二区三区四区| xxxx视频在线| 少妇熟女一区二区| 久久一区二区视频| 黄色av一区二区三区| 国产精品主播视频|