雲計算設計模式(四) 消費者的競爭模式

2021-09-11 08:31:18 字數 2389 閱讀 7238

允許多個併發使用者處理在同乙個通訊通道接收的訊息。這種模式使系統能夠同時處理多個郵件,以優化吞吐量,提高可擴充套件性和可用性,以及平衡工作負載。

在雲中執行的應用程式,可以預計,以處理大量的請求。而不是過程的每個請求同步地,乙個常用的方法是通過乙個訊息傳送系統到該非同步地處理它們的另一服務(消費者服務),以通過他們的應用程式。這種策略有助於確保在應用程式的業務邏輯沒有被阻塞,而正在處理的請求。

請求的數量可以隨著時間的原因有很多顯著變化。突然一陣在使用者活動或聚集的請求,來自多個租戶未來可能會導致不可**的工作負載。在高峰時間的系統可能需要處理許多每秒數百個請求,而在其他時間的數量可能是非常小的。此外,該工作的性質進行的處理這些請求可能是高度可變的。使用消費者服務的單個例項,可能會導致該例項成為充斥請求或訊息傳送系統可通過訊息從應用程式來的流入被過載。為了處理這種波動的負載,該系統可以執行消費者服務的多個例項。然而這些消費者必須協調,以確保每個訊息只傳送給乙個單個消費者。工作量也需要跨消費者被負載平衡,以防止乙個例項成為瓶頸。

使用訊息佇列來實現應用和消費者服務的例項之間的通訊通道。在訊息佇列中的形式應用帖請求,以及消費者的服務例項從佇列中接收訊息並對其進行處理。這種方法使消費者的服務例項的同一池中從應用程式的任何例項處理訊息。圖1示出了該架構。

圖1 - 使用訊息佇列分發工作提高到乙個服務的例項 

該解決方案具有以下優點: 

•它使固有的負載調平系統,可以處理由應用程式例項傳送請求量很大的變化。佇列充當應用程式例項和消費者服務例項,這有助於最大限度地減少對應用程式和服務例項(所描述的基於佇列的負載調平模式)的可用性和響應性的影響之間的緩衝區。處理的訊息,需要一些將被執行時,不會妨礙同時由消費者服務的其他例項所處理的其它訊息長期執行的處理。 

•它提高了可靠性。如果乙個生產者直接與消費者,而不是使用這種模式進行通訊,但不監視消費者,有乙個高概率的訊息可能丟失或失敗,如果消費者無法進行處理。在這種模式的訊息不被傳送給乙個特定的服務例項,乙個失敗服務例項不會阻塞乙個生產者和訊息可以通過任何加工服務例項進行處理。 

•它不需要複雜的協調的消費者之間,或在生產者和消費者的例項。訊息佇列確保每個訊息傳遞至少一次。 

•它是可擴充套件的。該系統能夠動態地增加或減少消費者服務的例項的數目的訊息量是波動的。 

•它可以提高彈性,如果訊息佇列提供事務讀取操作。如果消費者服務例項能夠讀取和處理該訊息作為乙個事務操作的一部分,並且如果這種消費服務例項隨後發生故障時,這種模式可以確保該訊息將被返回到佇列中被拾起並處理通過的另乙個例項消費者服務。

[csharp]view plain

copy

private string queuename = ...;  

private string connectionstring = ...;  

...  

public async task start()  

...  

// create the queue client. by default the peeklock method is used.  

this.client = queueclient.createfromconnectionstring(  

this.connectionstring, this.queuename);  

}  

下面的**片段顯示了乙個應用程式如何建立和傳送一批訊息佇列。

[csharp]view plain

copy

public async task sendmessagesasync()  

;  messages.add(message);  

}  await this.client.sendbatchasync(messages);  

}  下面的**顯示了如何消費服務例項可以從佇列中下乙個事件驅動的方式接收訊息。該processmessagetask引數的receivemessages法為代表,它引用在收到訊息時執行的**。此**是非同步執行。

[csharp]view plain

copy

private manualresetevent pauseprocessingevent;  

...  

public void receivemessages(func

processmessagetask)  

,  options);  

}  ...  

private void optionsonexceptionreceived(object sender,   

exceptionreceivedeventargs exceptionreceivedeventargs)  

雲計算設計模式(四) 消費者的競爭模式

允許多個併發使用者處理在同乙個通訊通道接收的訊息。這種模式使系統能夠同時處理多個郵件,以優化吞吐量,提高可擴充套件性和可用性,以及平衡工作負載。在雲中執行的應用程式,可以預計,以處理大量的請求。而不是過程的每個請求同步地,乙個常用的方法是通過乙個訊息傳送系統到該非同步地處理它們的另一服務 消費者服務...

設計模式 生產者消費者模式

常見場景 某個模組負責產生資料,這些資料由另乙個模組來負責處理。產生資料的模組,就形象地稱為生產者 而處理資料的模組,就稱為消費者。該模式還需要有乙個緩衝區處於生產者和消費者之間,作為乙個中介。生產者把資料放入緩衝區,而消費者從緩衝區取出資料 緩衝區作用 1.解耦,生產者和消費者只依賴緩衝區,而不互...

設計模式 生產者消費者模式

在併發程式設計中使用生產者和消費者模式能夠解決絕大多數併發問題。該模式通過平衡生產線程和消費執行緒的工作能力來提高程式的整體處理資料的速度。生產者消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費...