Event-based architecture using AWS (SNS and SQS) and C#
Introduction
The following code is an example of an event based architecture using an SNS topic per event. It consists of:
Producer
- A system which produces events to an SNS topic.Consumer
- A system which consumes messages placed onto an SQS queue by an SNS topic.
The two events we are interested in are:
INCIDENT_CREATED
INCIDENT_UPDATED
We will create consumers which do the following:
- Consumer 1 - Send an email on
INCIDENT_CREATED
- Consumer 2 - Send an SMS on
INCICENT_CREATED
- Consumer 3 - Update a cache on
INCIDENT_CREATED
andINCIDENT_UPDATED
Instead of wrapping these into a single application, we will put these consumers in their own application (single responsibility principle).
Consumers 1 and 2 are simple, and comprise of 1 topic, 1 queue and one consumer.
Consumer 3 is a little more complex in that it comprises of 2 topics, 1 queue and one consumer.
The source code for our examples can be found on my github account:
https://github.com/darbio/aws-event-based-architecture
Producer
SNS Topics
- Create a topic in the AWS console called
INCIDENT_CREATED
. - Create a topic in the AWS console called
INCIDENT_UPDATED
.
Producer application
- Create a new visual studio console application project called
EventProducer
. - Add a reference to the
AWSSDK.SimpleNotificationService
nuget package. - We will create a simple producer which will publish messages to the SNS topics we created:
Consumers
Consumer 1 - Send an email on INCIDENT_CREATED
SQS Queues
This will create a consumer which sends an email on incident created.
- In the SQS console, create a queue for our consumer called
EMAIL_ON_INCIDENT_CREATED
. - Using the
Queue actions
drop down, create an SQS subscription to ourINCIDENT_CREATED
SNS topic for this SQS Queue. - Take note of the Queue URL. We will need this later.
Our SQS queue will now receive any messages which are published to the SNS topic INCIDENT_CREATED
.
N.B. I will leave it up to you to set up your queue for long polling, batching etc.
Consumer application
- Create a new visual studio console application project called
EMAIL_ON_INCIDENT_CREATED
. - Add a reference to the
AWSSDK.SQS
nuget package. - We will create a simple consumer which will consume messages from the SQS queue we created:
If you run this, you will be able to use the Publish to topic
button in the SNS console, or the producer application to send a message to the consumer.
Consumer 2 - Send an SMS on INCIDENT_CREATED
SQS Queues
We will repeat the above process, except this time we will create a queue called SMS_ON_INCIDENT_CREATED
.
- In the SQS console, create a queue for our consumer called
SMS_ON_INCIDENT_CREATED
. - Using the
Queue actions
drop down, create an SQS subscription to ourINCIDENT_CREATED
SNS topic for this SQS Queue. - Take note of the Queue URL. We will need this later.
Our SQS queue will now receive any messages which are published to the SNS topic INCIDENT_CREATED
.
N.B. I will leave it up to you to set up your queue for long polling, batching etc.
Consumer application
- Create a new visual studio console application project called
SMS_ON_INCIDENT_CREATED
. - Add a reference to the
AWSSDK.SQS
nuget package. - We will create a simple consumer which will consume messages from the SQS queue we created:
If you run this, you will be able to use the Publish to topic
button in the SNS console, or the producer application to send a message to the consumer.
Consumer 3 - Update a cache on INCIDENT_CREATED
and INCIDENT_UPDATED
SQS Queues
This will create a consumer which updates a cache on incident created or updated.
- In the SQS console, create a queue for our consumer called
CACHE_ON_INCIDENT_ALL
. - Using the
Queue actions
drop down, create an SQS subscription to ourINCIDENT_CREATED
SNS topic for this SQS Queue. - Using the
Queue actions
drop down, create an SQS subscription to ourINCIDENT_UPDATED
SNS topic for this SQS Queue. - Take note of the Queue URL. We will need this later.
Our SQS queue will now receive any messages which are published to the SNS topic INCIDENT_CREATED
.
N.B. I will leave it up to you to set up your queue for long polling, batching etc.
Consumer application
- Create a new visual studio console application project called
CACHE_ON_INCIDENT_ALL
. - Add a reference to the
AWSSDK.SQS
nuget package. - We will create a simple consumer which will consume messages from the SQS queue we created:
If you run this, you will be able to use the Publish to topic
button in the SNS console, or the producer application to send a message to the consumers. When you publish to INCIDENT_CREATED
all consumers should receive the event. When you publish to INCIDENT_UPDATED
only consumer 3 should receive the event.
Wrap up
In this example we have created an event based solution which allows the production of events to an SNS topic, and for multiple consumers to consume events from a producer.