This sample implements a fictional store that can be deployed to Azure. It is different from most samples in that it shows many features of NServiceBus working together.
- Start the Azure Storage Emulator. Ensure latest version is installed.
- Run the solution. 4 console windows start and one web-site opens.
- Order products from the website. Once orders are submitted, there is a window of time allocated for handling cancellations due to buyer's remorse. Once the order has been accepted, they are provisioned and made available for download. If the order is cancelled before the buyer's remorse timeout, nothing is provisioned for download.
Walk-through
Users can order products from the website. Once orders are submitted, there is a window of time allocated for handling cancellations due to buyer's remorse. Once the order has been accepted, it is provisioned and made available for download.
Sales
The web application hosts the ECommerce endpoint. When a user presses Place Order on the website, the ECommerce endpoint sends a SubmitOrder
command to the Sales endpoint. Upon receiving a SubmitOrder
command the Sales endpoint will immediately publish an OrderPlaced
event with a request to be called back in 20 seconds (BuyersRemorseIsOver
). If the user does not cancel the order before the end of the buyer's remorse period, the Sales endpoint will publish an OrderAccepted
event.
The ECommerce endpoint subscribes to the OrderPlaced
and OrderAccepted
events in order to update the web page. It does this by forwarding events to the client using SignalR.
If the user presses Cancel before the buyer's remorse period ends, the ECommerce endpoint sends a CancelOrder
command to the Sales endpoint which publishes an OrderCancelled
event instead of an OrderAccepted
event. The ECommerce endpoint subscribes to OrderCancelled
and updates the UI via SignalR to mark the order as cancelled.
Provisioning
Once an order is accepted, it can be provisioned. The ContentManagement endpoint subscribes to the OrderAccepted
event and sends a ProvisionDownloadRequest
message to the Operations endpoint. When Operations handles ProvisionDownloadRequest
it responds with a ProvisionDownloadResponse
message. When the response is received by ContentManagement it publishes a DownloadIsReady
event. The ECommerce endpoint subscribes to DownloadIsReady
to update the UI via SignalR.
CustomerRelations
The CustomerRelations endpoint subscribes to OrderAccepted
events. When a customer order is accepted, the CustomerRelations endpoint publishes a ClientBecamePreferred
event. This event has only one subscriber, CustomerRelations itself, which will send the customer a welcome pack and a limited time offer when a customer becomes preferred.
Feature usage
In implementing the above workflow various aspects are highlighted:
Azure Storage Queues transport
All endpoints in the solution communicate using the Azure Storage Queues transport. The sample has been configured to use the Azure Storage Emulator.
Azure Table persistence
The endpoints in the solution persist data using the Azure Table persistence. This persistence is used to store subscription, timeout, and saga data.
ProcessOrderSaga
avoids this issue by combining a collection of ProductIds
into a single string for persistence.Azure Web Sites and Web Jobs
The Ecommerce
project is configured to deploy as an Azure Web Site. The ContentManagement
, CustomerRelations
, Operations
, and Sales
endpoints are all configured to run as Azure Web Jobs. The sample has been configured to run on the Azure Storage Emulator.
Sagas
Illustrates the use of the saga pattern to handle the buyer's remorse scenario.
Request / response
The request/response pattern is illustrated for the product provisioning between the ContentManagement endpoint and the Operations endpoint.
ASP MVC and SignalR
The e-commerce endpoint is implemented as an ASP.NET application which uses SignalR to show feedback to the user.
Message mutator
The use of message headers and message mutator is illustrated when the user clicks on the checkbox on the e-commerce web page, which stops at the predefined breakpoints in the message handler code on the endpoints.
Encryption
The use of encryption is illustrated by passing in the credit card number and the expiration date from the web site. The UnobtrusiveConventions defined in the ECommerce endpoint show how to treat certain properties as encrypted. Both the ECommerce and the Sales endpoint use Rijndael encryption and the encryption key is provided in the config file. If the messages are inspected in the queue, both the credit card number and the expiration date will show the encrypted values.
Deployment notes
This sample has been designed to run in a development environment under the Azure Storage Emulator. In order to deploy the sample to the cloud the following should be considered:
- Application settings to be created:
- Application setting with the key
AzureWebJobsEnv
; must be set to a value other thanDevelopment
. - Application setting with the key
AzureWebJobsDashboard
; must be set to a value other thanDevelopment
. - Application setting with the key
AzureWebJobsStorage
; must be set to a value other thanDevelopment
.
- Application setting with the key
- An Azure Storage account must be created.
- By default, each endpoint is using the development storage. Application setting with the key
NServiceBus.
must be defined and its value set to the Storage Account connection string configured in step 1.ConnectionString
- In order to support the elastic scale capabilities of the Azure platform, a SignalR backplane must be added to the
ECommerce
endpoint.