自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在Azure上構(gòu)建一個(gè)基于Facebook的營(yíng)銷式應(yīng)用程序(下)

原創(chuàng)
云計(jì)算
當(dāng)你的Facebook應(yīng)用程序點(diǎn)擊率上升的時(shí)候,它如何進(jìn)行擴(kuò)展呢?如果你是在Windows Azure上構(gòu)建的這個(gè)應(yīng)用程序,并且是按橫向擴(kuò)展的思想設(shè)計(jì)的這個(gè)應(yīng)用程序,那么很高興地告訴,你可以“高枕無(wú)憂”了。

本文承接《在Azure上構(gòu)建一個(gè)基于Facebook的營(yíng)銷式應(yīng)用程序(上) 》 和《在Azure上構(gòu)建一個(gè)基于Facebook的營(yíng)銷式應(yīng)用程序(中)》

選擇一個(gè)商店

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

我使用的是公用的來(lái)自于1999年人口普查的美國(guó)郵政編碼列表(具體可以參考:http://www.census.gov/geo/www/tiger/zip1999.html)。這個(gè)列表包含每個(gè)郵政編碼的經(jīng)度和緯度坐標(biāo)。然后,因?yàn)槲覜](méi)有自己的商店,所以我從這個(gè)列表隨機(jī)地選擇了一些郵政編碼,然后用這些郵政編碼生成了一個(gè)包含1000個(gè)樣例商店的列表。然后,把這個(gè)商店列表通過(guò)CSV文件(這種文件格式對(duì)Azure Azure Storage Explorer比較友好)的形式,上傳到我的***個(gè)Azure表中,“Store”實(shí)體如下所示:

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; }

}

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

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”存儲(chǔ)了郵政編碼。“row keys”是每個(gè)商店的靠近等級(jí)。每個(gè)“partition”代表一個(gè)郵政編碼,“partition”中的每一行代表一個(gè)商店和這個(gè)郵政編碼所在地的靠近程度。

現(xiàn)在,我們可以看一看“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()”方法,控制器使用這個(gè)方法來(lái)加載可用的商店列表。***個(gè)查詢只指定了“partition key”(郵政編碼),然后返回三個(gè)或少于三個(gè)商店。因?yàn)?ldquo;row key”是距離等級(jí),所以這個(gè)查詢會(huì)按照距離的順序來(lái)返回各個(gè)商店。而對(duì)于每個(gè)商店來(lái)說(shuō),我們使用商店號(hào)作為“partition key”,從“store”表中獲取商店名,城市,國(guó)家和郵政編碼。

雖然對(duì)于這個(gè)視圖來(lái)說(shuō),必須要進(jìn)行四次查詢,但是它們都是通過(guò)“partition key”和“row key”來(lái)進(jìn)行的,速度非??臁6?,你還可以購(gòu)買(mǎi)存儲(chǔ)空間,通過(guò)把全部的“store”實(shí)體都直接存儲(chǔ)到“ZipStore”表中,盡量減少對(duì)單一查詢的檢查的方式,來(lái)獲得更好的性能。

#p#

存儲(chǔ)和隊(duì)列

這個(gè)叫作“SelectStore”的處理程序用用戶選擇的商店和注冊(cè)標(biāo)記來(lái)更新“contact”,然后保存這個(gè)“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角色進(jìn)行處理,這個(gè)控制器會(huì)把“contact”排成隊(duì)列。這是“QueueContact”的完整實(shí)現(xiàn):

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隊(duì)列。對(duì)于在多個(gè)角色(一個(gè)可擴(kuò)展的應(yīng)用程序是由這些角色組成的)之間進(jìn)行通信來(lái)說(shuō),隊(duì)列是必需的。“ContactQueue”繼承于一個(gè)Windows Azure Toolkit類型,“ContactQueueMessage”也是如此,它們可以讓隊(duì)列方法的實(shí)現(xiàn)變得更加簡(jiǎn)單。但是,當(dāng)這個(gè)工具包從Worker角色的隊(duì)列中獲取消息的時(shí)候,這個(gè)工具包會(huì)才會(huì)真正地大放異彩。接下來(lái)我們將會(huì)看到這一點(diǎn)。

在Worker角色中Dequeuing

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

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)建了一個(gè)“AzureStorageFactory”對(duì)象,然后使用它來(lái)查找“contact”隊(duì)列。然后,我們創(chuàng)建了一個(gè)處理程序,在這個(gè)例子中,它每5秒檢查一次隊(duì)列,如果有一個(gè)消息可用的話,它就用這個(gè)消息調(diào)用我們的消息處理器(“EmailAndStoreContact”)。因?yàn)樘幚黻?duì)列消息是Worker角色的工作,所以,我們需要做的所有事情只是把它寫(xiě)入到“EmailAndStoreContact”中而已。對(duì)于這個(gè)類來(lái)說(shuō),Main方法被叫作Run,它的實(shí)現(xiàn)如下所示:

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();

}

}

這個(gè)消息處理器從隊(duì)列消息中獲取“contact”的Facebook ID,然后使用它從這個(gè)容器中獲取“contact”。因?yàn)樵谶@個(gè)應(yīng)用程序中我們并沒(méi)有真正地email什么內(nèi)容,所以剩下的所有事情只是把“contact”發(fā)送到SQL Azure中而已。這里,我們使用了一個(gè)“SQLContact”對(duì)象,它是“LINQ to SQL”中的一個(gè)數(shù)據(jù)類。

究竟為什么從Azure Table Storage遷移到SQL Azure呢?因?yàn)殡m然Azure表很快,但是它們并不適合進(jìn)行某些特定的查詢。把聯(lián)系數(shù)據(jù)遷移到SQL Azure中可以生成表,其他應(yīng)用程序就可以查詢這個(gè)“contact”表來(lái)判斷我們的活動(dòng)進(jìn)行的怎么樣了。

#p#

起點(diǎn)

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

即使你從來(lái)沒(méi)有發(fā)起過(guò)你自己的活動(dòng),對(duì)于那些使用C#的Azure開(kāi)發(fā)者來(lái)說(shuō),也會(huì)有很多收獲的。首先,使用Windows Azure toolkit可以簡(jiǎn)化訪問(wèn)Azure存儲(chǔ)表和隊(duì)列的過(guò)程。其次,如果你正在編寫(xiě)一個(gè)Facebook應(yīng)用程序,那么你可以使用Facebook C# SDK。再次,使用Worker角色可以把后臺(tái)任務(wù)分離出來(lái)。***(但并非到此為止),可以讓你知道如何組織你的存儲(chǔ)結(jié)構(gòu)才能給你的應(yīng)用程序提供***的可擴(kuò)展性。

你需要的一些工具:

這些工具的***版本可以通過(guò)下面這些地址來(lái)下載:

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/

樣例代碼:

這些樣例代碼是本文寫(xiě)作的時(shí)候使用的一些代碼。

你可以通過(guò)如下地址來(lái)下載本文的樣例代碼:

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

本文承接《在Azure上構(gòu)建一個(gè)基于Facebook的營(yíng)銷式應(yīng)用程序(上) 》

《在Azure上構(gòu)建一個(gè)基于Facebook的營(yíng)銷式應(yīng)用程序(中)》

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

【本文乃51CTO精選譯文,轉(zhuǎn)載請(qǐng)標(biāo)明出處!】
 

【編輯推薦】 

  1. 在Azure上構(gòu)建一個(gè)基于Facebook的營(yíng)銷式應(yīng)用程序(中)
  2. 在Azure上構(gòu)建一個(gè)基于Facebook的營(yíng)銷式應(yīng)用程序(上)
  3. 無(wú)需頂禮膜拜 三步打造經(jīng)濟(jì)高效的云基礎(chǔ)架構(gòu)

 

 

 

責(zé)任編輯:王勇 來(lái)源: 來(lái)源:51CTO
相關(guān)推薦

2011-03-14 14:47:50

2011-03-14 15:10:10

AzureFacebook

2011-11-23 10:06:32

Azure微軟移動(dòng)應(yīng)用

2011-03-10 10:45:47

Azure“Hello Worl

2011-03-15 19:45:27

Windows Azu

2010-11-09 10:37:21

2021-07-14 17:39:46

ReactRails API前端組件

2023-09-21 08:00:00

ChatGPT編程工具

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

2010-01-08 12:14:44

ibmdwAndroid

2021-02-17 11:05:34

PythonPyQt代碼

2015-03-10 09:51:56

云開(kāi)發(fā)云應(yīng)用程構(gòu)建PaaS

2011-03-21 14:31:36

Azure應(yīng)用程序

2015-10-14 10:43:17

PaaSSaaS應(yīng)用構(gòu)建
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)