一 引言
亞馬遜Amazon作為雲計算的領跑者推出了很多雲服務,最近因為項目的原因,需要用到SQS服務,因此簡要地寫下這篇隨筆,一來方便以后查閱,二來方便共享一些簡單的操作。
SQS即可以理解為一個放在雲上的消息隊列,它不是FIFO(First in First out)的,但是由於人工測試是有一定的延遲性,而消息到雲端隊列的時間到微秒級別,因此人工是看不出來它不是FIFO【雲端隊列和我們常規的隊列稍有不同,不能保證順序是嚴格的FIFO】,事實上這也不是重點。
保存在隊列中的消息由一定時間的存活期。通過SQS,我們可以實現位於不同地方的不同程序在不同時間內進行通信,比如我可以從位於北京的一個普通桌面應用程序發送消息到亞馬遜簡單隊列服務(SQS),發送完成后即可退出,其后位於北美的一些應用程序可以通過讀取存儲在SQS上的消息來完成北京發出的指令。
二 准備過程
要使用Amazon SQS服務,你首先需要注冊一個亞馬遜雲服務賬號,現在亞馬遜提供了為期一年的免費服務。你可以參考峻祁連的另一片文章《免費的雲技術平台--亞馬遜WEB服務AWS提供免費方式》。亞馬遜提供了幾種SDK,包括Java,Python,.net。因為項目使用的是.NET框架,因此我簡單地用.NET來演示。.NET的SDK請訪問https://docs.aws.amazon.com/sdkfornet/v3/apidocs/Index.html 當然你可以通過NuGet管理平台來下載Amazon SQS相關包。在此就不贅述。
三 模擬過程
1) 創建一個對象來連接到Amazon SQS.
AmazonSQSClient objClient = new AmazonSQSClient("AssaaIAxxxxx", "lssssX1axxxxxxx");
使用通過key來new 一個 AmzonSQSClient對象。這個key是你創建亞馬遜雲服務賬號,再創建SQS隊列,系統生成的。我這邊是雲服務發郵件過來的。具體key就不公布出去。
2) 展示雲端隊列。
展示雲端隊列,一個是調用objClient的某個方法獲取隊列列表。二是需要一個對象來存儲這個列表。這二者都可以在SDK中找到。
ListQueuesResponse objqueuesResponseList = new ListQueuesResponse();
objqueuesResponseList = objClient.ListQueues(new ListQueuesRequest());
ListQueuesResult Result = objqueuesResponseList.ListQueuesResult;
主要是基於Request 和 Response的。 因此需要 ListQueuesRequest對象,和ListQueuesResponse對象。
3) 發送消息。
調用objClient.SendMessage方法。
從SDK中可以看到。SendMessage中需要一個MessageRequest對象。因此我們將我們需要發送的消息。封裝成一個MessageRequest對象即可。以下是一個MessageRequest對象的實例。
new SendMessageRequest() {MessageBody = xxxxx , QueueUrl = xxxx } ;
其中QueueUrl可以從2)中的result中獲取,在此就不贅述。
4) 接受消息
a) new一個 ReceiveMessageResponse 對象。
b) 調用objClient 的 ReceiveMessage方法
ReceiveMessageResponse queueReceiveMessageResponse = new ReceiveMessageResponse();
queueReceiveMessageResponse = objClient.ReceiveMessage(new ReceiveMessageRequest() { QueueUrl = xxx, MaxNumberOfMessages = 10 });
c) new一個 ReceiveMessageResult對象存儲 Response的結果
d) 使用一個List<Message>列表存儲Message列表。 ReceiveMessageResult.Message
以下是部分源代碼:
private void DisplayQueues()
{
ListQueuesResponse objqueuesResponseList = new ListQueuesResponse();
objqueuesResponseList = objClient.ListQueues(new ListQueuesRequest());
ListQueuesResult Result = objqueuesResponseList.ListQueuesResult;
this.QueuesList.Visible = true;
this.QueuesList.DataSource = Result.QueueUrl;
this.QueuesList.DataBind();
}
protected void btnSendMessage_Click(object sender, EventArgs e)
{
if (QueuesList.SelectedIndex > -1)
{
if (!string.IsNullOrEmpty(txtMessage.Text))
{
string selectedQueue = this.QueuesList.SelectedItem.Value.ToString();
objClient.SendMessage(new SendMessageRequest() { MessageBody = this.txtMessage.Text, QueueUrl = selectedQueue });
Response.Write("<script>alert('Message sent successfully to Queue.');</script>");
}
else
{
Response.Write("<script>alert('Please enter Message Text.');</script>");
}
}
else
{
Response.Write("<script>alert('Please select Queue from list.');</script>");
}
}
2018/7/23 地大工程研究中心