订单服务很简单,接收一个下单请求,下单成功后快速返回给用户,同时将订单下单成功的消息发送到 SQS 中,供下游发票服务开具发票使用
'use strict'; const config = require('../conf/config.json') const AWS = require('aws-sdk'); const sqs = new AWS.SQS(); const { v4: uuidv4 } = require('uuid'); module.exports.checkout = async (event, context, callback) => { console.log(event) let statusCode = 200 let message if (!event.body) { return { statusCode: 400, body: JSON.stringify({ message: 'No order body was found', }), }; } const region = context.invokedFunctionArn.split(':')[3] const accountId = context.invokedFunctionArn.split(':')[4] const queueName = config['queueName'] // 组装 SQS 服务的 URL const queueUrl = `https://sqs.${region}.amazonaws.com/${accountId}/${queueName}` const orderId = uuidv4() try { // 调用 SQS 服务 await sqs.sendMessage({ QueueUrl: queueUrl, MessageBody: event.body, MessageAttributes: { orderId: { StringValue: orderId, DataType: 'String', }, }, }).promise(); message = 'Order message is placed in the Queue!'; } catch (error) { console.log(error); message = error; statusCode = 500; } // 快速返回订单 ID return { statusCode, body: JSON.stringify({ message, orderId, }), }; }; Invoice Lambda Function发票服务逻辑同样很简单,消费 SQS 指定队列中的消息,并将开具出的发票发送到客户订单信息的 email 中
module.exports.generate = (event, context, callback) => { console.log(event) try { for (const record of event.Records) { const messageAttributes = record.messageAttributes; console.log('OrderId is --> ', messageAttributes.orderId.stringValue); console.log('Message Body --> ', record.body); const reqBody = JSON.parse(record.body) // 睡眠 20 秒,模拟生成发票的耗时过程 setTimeout( () => { console.log("Receipt is generated and sent to :" + reqBody.email) }, 20000) } } catch (error) { console.log(error); } }到此 demo 的代码就全部实现了,从中你可以看到:
我们没有关注 lambda 的底层服务细节,没有关注 sqs 的服务,只是简单的代码逻辑实现以及服务之间的串联定义
最后我们看一下整体的目录结构吧:
. ├── app │ ├── invoice.js │ └── order.js ├── conf │ └── config.json ├── package.json └── serverless.yml 2 directories, 5 files 发布 Lambda 应用在发布之前,编译一下应用,安装必须的 package「uuid 和 aws-sdk」
npm install发布应用非常简单,只需要一条命令:
sls deploy -v运行上述命令后大概需要等带几十秒钟, 在构建的最后,会打印出我们的构建服务信息:
上图的 endpoints 就是我们一会要访问的 API gateway 触发 lambda 的入口,在调用之前,我们先到 AWS console 看一下我们定义的服务
lambda functions SQS-receverQueue API Gateway S3从上图的构建信息中你应该还看到一个 S3 bucket 的名称,我们并没有创建 S3, 这是 SF 自动帮我们创建,用来存储 lambda zip package 的
测试调用 API gateway 的 endpoint 来测试 lambda
打开 SQS 服务,你会发现,接收到一条消息:
接下来我们看看 Invoice Lambda function 的消费情况,打开 CloudWatch 查看 log: