中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

利用 Amazon Web Services 集成企業(yè)應(yīng)用程序

2019-02-26    來源:多智時代

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

探索如何利用 XML 和 Amazon Web Services 集成企業(yè)應(yīng)用程序,以及使用Microsoft .NET (C#) 和 Java 平臺構(gòu)建跨平臺應(yīng)用程序集成功能。

隊(duì)列 是用于存儲等待處理的消息的臨時數(shù)據(jù)結(jié)構(gòu)。Amazon Simple Queue Services (Amazon SQS) 是一個支持 Web 服務(wù)的高可用性可伸縮消息隊(duì)列。Amazon SQS 的主要益處包括:

  • 由 Amazon 管理,不需使用私有基礎(chǔ)設(shè)施,也不需要專業(yè)支持知識。
  • 任何連接到 Internet 的客戶端都可以通過 Web 服務(wù)訪問該服務(wù),因此支持業(yè)務(wù)到業(yè)務(wù)(B2B)集成。
  • 該服務(wù)在多個服務(wù)器上存儲所有消息,以提供高可用性和容錯。
  • Amazon SQS 支持多個進(jìn)程同時讀寫一個隊(duì)列,以及在處理窗口時鎖定消息,以避免兩個客戶端同時處理一條消息。
  • 通過使用 Amazon SQS 服務(wù),您可以根據(jù)存儲在隊(duì)列中的消息的處理需求設(shè)計和鎖定窗口。鎖定窗口能夠阻止兩個隊(duì)列讀取器同時處理同一個隊(duì)列項(xiàng)。對于處理時間更長的隊(duì)列項(xiàng),則需要更長時間地鎖定窗口。鎖定窗口由可見性超時參數(shù)控制,您可以給每個隊(duì)列配置該參數(shù)。
  • 它為常見的語言(包括 Java 和 Microsoft .NET 平臺)提供 API 包裝器,以支持快速開發(fā)并無縫地集成到現(xiàn)有應(yīng)用程序中。
  • 公司僅需為它們的 HTTP 請求使用的帶寬付費(fèi);Amazon SQS 不收取其他額外的費(fèi)用。

在開始 Amazon SQS 開發(fā)之前,了解它的一些特征是非常有幫助的。如果不了解這些特征,您剛開始使用 Amazon SQS 時可能會碰到挫折,或感到困惑。

首先,Amazon 不能保證隊(duì)列項(xiàng)的處理順序。這意味著先進(jìn)先出(first-in-first-out,F(xiàn)IFO)處理不得到保證,這在很多消息隊(duì)列實(shí)現(xiàn)中都很常見。Amazon 僅保證所有消息都分發(fā)出去。

Amazon SQS 的第二大特征是最終一致性。大型數(shù)據(jù)庫系統(tǒng)的主要特征是一致性、高可用性和可伸縮性。Amazon 不是所有 3 個特征,而是主要高可用性和可伸縮性,然后再以此為基礎(chǔ)提供最終的一致性。這意味著 Amazon 通過將所有消息發(fā)送到多個服務(wù)器來實(shí)現(xiàn)高可用性和可伸縮性。Amazon 保證最終會將所有消息分發(fā)出去,但不保證什么時候分發(fā)它們。從實(shí)用的角度看,這意味著假如您向一個隊(duì)列發(fā)送 3 條消息,當(dāng)下次嘗試接收這些消息時,不一定能收到所有 3 條消息。您可能在一個Read中收到所有 3 條消息,或在第一個Read中收到前兩條消息,在第二個Read中收到第三條消息。如果您持續(xù)地輪詢該隊(duì)列,最終肯定能收到所有 3 條消息。

為了開始使用 Amazon SQS,您必須根據(jù)自己使用的語言獲取 Amazon SQS 的 API 庫。Amazon 為所有常見的語言都提供了一個庫,比如 Perl、Microsoft Visual Basic.NET、C#、Java 和 PHP。這些庫是開源的,并且易于使用。參考資料小節(jié)提供這些庫的下載鏈接。

現(xiàn)在您首先學(xué)習(xí)如何使用 Java 語言創(chuàng)建隊(duì)列、發(fā)送消息和接收消息。第一步是創(chuàng)建一個 Amazon SQS 隊(duì)列。清單 1 中的代碼顯示了如何為 Amazon SQS 創(chuàng)建 HTTP 客戶端、實(shí)例化CreateQueueRequest對象和調(diào)用隊(duì)列創(chuàng)建請求。Access Key ID(由 20 個字母和數(shù)字組成)是請求身份驗(yàn)證或讀取隊(duì)列項(xiàng)所需的密匙。為了創(chuàng)建或操作隊(duì)列項(xiàng),您需要使用 Secret Access Key(由 40 個字母和數(shù)字組成)。注冊 Amazon 時就會收到這些密匙

String queueName = "TestQueue"; // create http client AmazonSQS service = new AmazonSQSClient(accessKeyId, secretAccessKey); // instantiate create queue request CreateQueueRequest request = new CreateQueueRequest(); request.setQueueName(queueName); request.setDefaultVisibilityTimeout(30); // execute create queue operation and get the server response System.out.print("Creating Queue: " + queueName); CreateQueueResponse response = service.createQueue(request); if (response.isSetCreateQueueResult()) { System.out.print("Create Queue Result:"); CreateQueueResult createQueueResult = response.getCreateQueueResult(); if (createQueueResult.isSetQueueUrl()) { System.out.print("Queue Url: " + createQueueResult.getQueueUrl()); } }

下一步是向最新創(chuàng)建的隊(duì)列發(fā)送一條消息。清單 2 中的代碼顯示了如何為 Amazon SQS 創(chuàng)建 HTTP 客戶端,以及如何向隊(duì)列發(fā)送一個簡單的消息。

String queueName = "TestQueue"; // create http client AmazonSQS service = new AmazonSQSClient(accessKeyId, secretAccessKey); // instantiate send message request SendMessageRequest request = new SendMessageRequest(); request.setQueueName(queueName); request.setMessageBody("Test SQS Message"); // execute the send message operation and get the server response SendMessageResponse response = service.sendMessage(request); if (response.isSetSendMessageResult()) { System.out.print("Send Message Result: "); SendMessageResult sendMessageResult = response.getSendMessageResult(); if (sendMessageResult.isSetMessageId()) { System.out.print(" MessageId: " + sendMessageResult.getMessageId()); } }

現(xiàn)在,我們嘗試從隊(duì)列接收消息。清單 3 顯示了如何為 Amazon SQS 創(chuàng)建 HTTP 客戶端,以及如何從隊(duì)列接收消息。Message包含來自隊(duì)列的消息并公開幾個關(guān)鍵方法:

  • 返回消息的唯一標(biāo)識符。您可以使用isSetMessageId確定消息 ID 是否已設(shè)置。
  • 將句柄返回給消息。句柄用于刪除消息。您可以使用isSetReceiptHandle確定消息句柄是否已設(shè)置。
  • 以字符串的形式返回消息體。消息可以是純文本或 XML,您可以使用isSetBody確定消息體是否已設(shè)置。

String queueName = "TestQueue"; // create http client AmazonSQS service = new AmazonSQSClient(accessKeyId, secretAccessKey); // instantiate the receive message request ReceiveMessageRequest request = new ReceiveMessageRequest(); request.setQueueName(queueName); // the following two parameters are optional request.setMaxNumberOfMessages(10); // set maximum number of messages to receive request.setVisibilityTimeout(30); // set visibility window // execute the receive messages operation and get server response ReceiveMessageResponse response = service.receiveMessage(request); System.out.print("Receive Message Response:"); if (response.isSetReceiveMessageResult()) { ReceiveMessageResult receiveMessageResult = response.getReceiveMessageResult(); java.util.List messageList = receiveMessageResult.getMessage(); for (Message message : messageList) { if (message.isSetMessageId()) { System.out.print("MessageId: " + message.getMessageId()); } if (message.isSetReceiptHandle()) { System.out.print("ReceiptHandle: " + message.getReceiptHandle()); } if (message.isSetBody()) { System.out.print("Body: " + message.getBody()); } }

現(xiàn)在,您將使用C# 將一個對象系列化到 XML,并將其作為 Amazon SQS 消息發(fā)送。

第一步是創(chuàng)建一個將被系列化的業(yè)務(wù)對象;清單 4 顯示了一個 Product 對象。公共屬性被控制 XML 系列化的屬性修飾。C# 屬性類似于 Java 注釋,定義屬性如何映射到 XML 元素或 XML 屬性。此外,這個類包含將對象實(shí)例系列化到 XML 的ToXml()方法。

namespace Stewart.Test { ///

/// Product /// [XmlRoot(ElementName="Product")] public class Product { /// /// Product Name /// [XmlElement("ProductName")] public string ProductName; /// /// Product Price /// [XmlElement("ProductPrice")] public decimal ProductPrice; /// /// Quantity in stock /// [XmlElement("InStock")] public bool InStock; /// /// Product Id /// [XmlAttributeAttribute(AttributeName = "Id", DataType = "integer")] public string Id; /// /// Initializes a new instance of the class. /// public Product() { } /// /// Initializes a new instance of the class. /// ///

Name of the product. ///

The product price. public Product(string productName, decimal productPrice) { this.ProductName = productName; this.ProductPrice = productPrice; } ///

/// Converts to XML. /// /// public String ToXml() { StringBuilder output = new StringBuilder(); // no name space XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); // settings to omit xml declaration XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; // finally serialize to string XmlWriter writer = XmlTextWriter.Create(output, settings); XmlSerializer serializer = new XmlSerializer(typeof(Product)); serializer.Serialize(writer, this, ns); // return string containing XML document return output.ToString(); } }

接下來,發(fā)送 XML 消息。用于 Amazon SQS 的 Amazon C# API 在功能上類似于 Java API。清單 5 中的代碼顯示了如何使用C# 發(fā)送消息。

Product prod = new Product("Widget", 1.5M); string accessKeyId = ConfigurationSettings.AppSettings["AmazonAccessKeyID"]; string secretAccessKey = ConfigurationSettings.AppSettings["AmazonSecretAccessKey"]; AmazonSQS service = new AmazonSQSClient(accessKeyId, secretAccessKey); SendMessageRequest request = new SendMessageRequest(); request.MessageBody = prod.ToXml(); request.QueueName = "TestQueue"; SendMessageResponse response = service.SendMessage(request); if (response.IsSetSendMessageResult()) { Console.WriteLine("Send Message Response: "); SendMessageResult sendMessageResult = response.SendMessageResult; if (sendMessageResult.IsSetMessageId()) { Console.WriteLine(String.Format("MessageId {0}", sendMessageResult.MessageId)); } if (sendMessageResult.IsSetMD5OfMessageBody()) { Console.WriteLine(String.Format("MD5OfMessageBody: {0}", sendMessageResult.MD5OfMessageBody)); } }

圖 1 顯示了 清單 5 的輸出結(jié)果。

最后一步是從隊(duì)列接收 XML 消息,并反系列化實(shí)例。清單 6 顯示了將 XML 消息反系列化到Product實(shí)例的代碼。

Product prod = null; string accessKeyId = ConfigurationSettings.AppSettings["AmazonAccessKeyID"]; string secretAccessKey = ConfigurationSettings.AppSettings["AmazonSecretAccessKey"]; AmazonSQS service = new AmazonSQSClient(accessKeyId, secretAccessKey); ReceiveMessageRequest request = new ReceiveMessageRequest(); request.QueueName = "TestQueue"; ReceiveMessageResponse response = service.ReceiveMessage(request); if (response.IsSetReceiveMessageResult()) { Console.WriteLine("Receive Message Result:"); ReceiveMessageResult receiveMessageResult = response.ReceiveMessageResult; List messageList = receiveMessageResult.Message; foreach (Message message in messageList) { if (message.IsSetMessageId()) { Console.WriteLine(String.Format("MessageId: {0}", message.MessageId)); } if (message.IsSetBody()) { Console.WriteLine(string.Format("Body: {0}", message.Body)); String xml = message.Body; StringReader sr = new StringReader(xml); XmlSerializer serializer = new XmlSerializer(typeof(Product)); prod = (Product) serializer.Deserialize(sr); Console.WriteLine(string.Format("Id: {0}", prod.Id)); Console.WriteLine(string.Format("Name: {0}", prod.ProductName)); Console.WriteLine(string.Format("Price: {0}", prod.ProductPrice)); } } }

圖 2 顯示了 清單 6 的輸出結(jié)果。

盡管以上的例子非常簡單,但是它們是非常強(qiáng)大的,因?yàn)槟梢韵盗谢粋對象,并向另一個不局限于本地物理網(wǎng)絡(luò)的應(yīng)用程序發(fā)送消息。這里沒有復(fù)雜的防火墻限制或安全性考慮事項(xiàng)。此外,不需要用相同的語言編寫消息的發(fā)送器和接收器,甚至不需要使用相同的平臺。

這個示例解決方案包含需要集成業(yè)務(wù)流程的分銷商和制造商。分銷商制造商處購買商品并出售給客戶。

當(dāng)客戶需要商品時,分銷商使用C# WinForm 客戶端提交一個客戶訂單。訂單提交程序?qū)⒂唵渭?xì)節(jié)存儲在一個本地 MySQL 數(shù)據(jù)庫中。該客戶端還允許用戶瀏覽庫存、查看訂單和 Amazon SQS 隊(duì)列。

一般而言,分銷商的庫存能夠滿足客戶的訂購需求。如果庫存不足的話,分銷商會及時向制造商發(fā)送一個購買訂單。然后,當(dāng)物品已經(jīng)發(fā)出時,制造商發(fā)送回一個訂單匯總。所有這些通信都使用 Amazon SQS 來完成。

分銷商的 Order Fulfillment 和 Inventory Management 服務(wù)也是使用C# 構(gòu)建的,它輪詢進(jìn)入的商品和待處理的客戶訂單。當(dāng)處理客戶訂單時發(fā)現(xiàn)商品庫存少于訂購數(shù)量,那么將使用 Amazon SQS 向制造商發(fā)送一個購買訂單。隊(duì)列項(xiàng)的消息體是一個包含購買訂單的 XML 文檔。

制造商的 Order Processing Service 是基于 Java 平臺構(gòu)建的,它處理購買訂單隊(duì)列。當(dāng)物品已經(jīng)發(fā)出時,它將使用 Amazon SQS 向分銷商回復(fù)一條消息。該消息的消息體是包含訂單匯總的 XML 文檔。

圖 3顯示了涉及到的系統(tǒng)。

第一步是為在分銷商和制造商之間發(fā)送的消息定義 XML 模式。您需要兩個模式:一個購買訂單和一個訂單匯總。

清單 7 顯示了購買訂單的模式。

<?xml version="1.0" encoding="utf-8"??>

Purchase Order XML 模式包含下列關(guān)鍵元素:

表1.購買訂單模式中的關(guān)鍵元素

關(guān)鍵元素

描述

Id

包含Purchase Order的唯一標(biāo)識符的字符串

OrderDate

包含Purchase Order日期的字符串

Company

包含分銷商的關(guān)鍵地址信息,包括公司名稱、街道地址、城市、州和郵政編碼

Vendor

包含制造商的關(guān)鍵地址信息,包括公司名稱、街道地址、城市、州和郵政編碼

Items

包含訂購商品的所有信息,包括商品ID、商品名稱和數(shù)量

清單 8 顯示了訂單匯總的模式。

<?xml version="1.0" encoding="utf-8"??>

Order Summary XML 模式包含下列關(guān)鍵元素:

表2.訂單匯總模式中的關(guān)鍵元素

Id

包含Order Summary的唯一標(biāo)識符的字符串

ReferenceId

包含初始Purchase Order的ID的字符串

OrderDate

包含Order Summary日期的字符串

CustomerAddress

包含分銷商的關(guān)鍵地址信息,包括公司名稱、街道地址、城市、州和郵政編碼

VendorAddress

包含制造商的關(guān)鍵地址信息,包括公司名稱、街道地址、城市、州和郵政編碼

Items

包含訂購商品的所有信息,包括商品ID、商品名稱和數(shù)量

接下來,我們定義數(shù)據(jù)庫模式。圖 4 顯示了數(shù)據(jù)庫實(shí)體模型。

Reseller 數(shù)據(jù)實(shí)體包括以下內(nèi)容:

  • Customer包含訂單的客戶聯(lián)系信息。
  • CustomerOrder包含客戶訂單的訂單信息。
  • CustomerOrderDetail包含客戶訂單的商品細(xì)節(jié)。
  • Inventory包含分銷商的庫存。

Manufacturer 數(shù)據(jù)實(shí)體為:

  • VendorOrder跟蹤由制造商的 Order Processing Service 處理的購買訂單。

最后需要定義的組建是消息隊(duì)列。表 3 顯示了這個解決方案的消息隊(duì)列。

表3. Amazon SMS消息隊(duì)列

隊(duì)列名

可見性超時

描述

POQueue

30秒

從分銷商發(fā)送給制造商的購買訂單消息

OSQueue

30秒

從制造商發(fā)送給分銷商的訂單匯總消息

在不久的將來,云計算一定會徹底走入我們的生活,有興趣入行未來前沿產(chǎn)業(yè)的朋友,可以收藏云計算,及時獲取人工智能、大數(shù)據(jù)、云計算和物聯(lián)網(wǎng)的前沿資訊和基礎(chǔ)知識,讓我們一起攜手,引領(lǐng)人工智能的未來!

標(biāo)簽: b2b Mysql 安全 大數(shù)據(jù) 代碼 防火墻 服務(wù)器 數(shù)據(jù)庫 通信 網(wǎng)絡(luò) 云計算

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:百度云OS宣布暫停更新和維護(hù) 壽命不到3年

下一篇:唐威:云安全在信息安全中的應(yīng)用與展望