Queues example
@queues
are very similar to @events
because they also allow for asynchronous message processing. @queues
will provision an AWS SQS queue and register a Lambda function to handle messages that are sent to the queue. There are notable differences between @queues
and @events
. While @events
push messages to all of its subscribers, @queues
will poll for messages. Queues work on the first message in the queue before moving onto the next. Queues will also keep retrying until it is delivered for up to 4 days.
Let's make an example message queue by starting with a fresh Architect project
npm init @architect ./arc-queues-app
cd arc-queues-app
npm install @architect/functions
Open up the app.arc
file and modify the manifest to include our @queues
function as follows:
# app.arc
@app
arc-queues-app
@http
get /
@queues
account-signup
After modifying the app.arc
file you can run arc init
from the project root to scaffold the function folders with Architect.
The queue function uses SQS as an event source. You can use this pattern to move data between Lambda functions and using the queue as a temporary data store. To write a queue function, make a new file in /src/queues
// src/queues/account-signup/index.js
exports.handler = async function queue (event) {
event.Records.forEach(record => {
const { body } = record;
console.log(body);
});
return {};
}
Now we can modify our get-index
function to publish a message as follows:
// src/http/get-index/index.js
let arc = require('@architect/functions')
exports.handler = async function http(req) {
let name = 'account-signup'
let payload = {body: req.body, text: 'yolo'}
await arc.queues.publish({name, payload})
return {statusCode: 201}
}
Run npm start
from the root of the project to start Sandbox. Navigate to http://localhost:3333 and take a look in the terminal for our output.
You should see the @queue
event object being logged in the console.
@queue {
"name": "account-signup",
"payload": {
"text": "yolo"
}
}
This event has name
and payload
keys which are reflected in the records when the queue is polled by the Lambda. You should also see the output from the account-signup
function handler:
{"text":"yolo"}
Let's follow how Architect implements @queues
by default with CloudFormation. Run arc deploy --dry-run
and open up sam.json
. You should see that AccountSignupQueueLambda
has an Events
source specified by type of "SQS":
"Events": {
"AccountSignupQueueEvent": {
"Type": "SQS",
"Properties": {
"Queue": {
"Fn::GetAtt": [
"AccountSignupQueue",
"Arn"
]
}
}
}
}
Architect also creates an SQS Queue with CloudFormation. Notice below that the queue is set to FIFO, instead of standard. This means this Lambda will try to ensure that it handles all messages in order as they come in batches.
"AccountSignupQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"VisibilityTimeout": 5,
"FifoQueue": true,
"ContentBasedDeduplication": true
}
},
The @architect/functions
library has publish()
and subscribe()
methods that wrap the JSON payload with a compatible Lambda function signature.
Top comments (0)