aws(学习笔记第十七课) SQS Amazon Simple Queue Service服务

aws(学习笔记第十七课)

  • SQS Amazon Simple Queue Service服务

学习内容:

  • 使用SQS Amazon Simple Queue Service服务
  • 整体代码(nodejs的通常工程)
  • 代码动作

1. 使用SQS Amazon Simple Queue Service服务

  1. 利用应用程序来学习SQS
    • 创建S3

      shell 复制代码
      $ aws s3 mb s3://urs2png-20241211-finlay
      $ aws s3 website s3://urs2png-20241211-finlay --index-document index.html --error-document error.html
    • 创建SQS

      shell 复制代码
      aws sqs create-queue --queue-name url2png
  2. 整体代码(nodejs的通常工程)
    • config.json
      QueueUrl替换成上面创建的SQS
      Bucket替换成上面创建的S3 bucket的名字

      json 复制代码
      {
      	"QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/081353481087/url2png",
      	"Bucket": "urs2png-20241211-finlay"
      }
    • package.json 定义依赖关系

      json 复制代码
      {
              "dependencies": {
                      "aws-sdk": "2.1.18",
                      "node-uuid": "1.4.3",
                      "node-webshot": "1.0.4",
                      "phantomjs-prebuilt": "2.1.16"
              },
              "private": true
      }
    • index.js (生产者 producer)
      it send url of png to sqs on aws.

      json 复制代码
      var AWS = require('aws-sdk');
      var uuid = require('node-uuid');
      var config = require('./config.json');
      var sqs = new AWS.SQS({
              "region": "ap-northeast-1"
      });
      
      if (process.argv.length !== 3) {
              console.log('URL missing');
              process.exit(1);
      }
      
      var id = uuid.v4();
      var body = {
              "id": id,
              "url": process.argv[2]
      };
      
      sqs.sendMessage({
              "MessageBody": JSON.stringify(body),
              "QueueUrl": config.QueueUrl
      }, function(err) {
              if (err) {
                      console.log('error', err);
              } else {
                      console.log('PNG will be soon available at http://' + config.Bucket + '.s3-website-us-east-1.amazonaws.com/' + id + '.png');
              }
      });
    • worker.js 消费者(consumer
      receive message of sqs on aws every 1 second.

      javascript 复制代码
      var fs = require('fs');
      var AWS = require('aws-sdk');
      var webshot = require('node-webshot');
      var config = require('./config.json');
      var sqs = new AWS.SQS({
      	"region": "us-east-1"
      });
      var s3 = new AWS.S3({
      	"region": "us-east-1"
      });
      
      function acknowledge(message, cb) {
      	var params = {
      		"QueueUrl": config.QueueUrl,
      		"ReceiptHandle": message.ReceiptHandle
      	};
      	sqs.deleteMessage(params, cb);
      }
      
      function process(message, cb) {
      	var body = JSON.parse(message.Body);
      	var file = body.id + '.png';
      	webshot(body.url, file, function(err) {
      		if (err) {
      			cb(err);
      		} else {
      			fs.readFile(file, function(err, buf) {
      				if (err) {
      					cb(err);
      				} else {
      					var params = {
      						"Bucket": config.Bucket,
      						"Key": file,
      						"ACL": "public-read",
      						"ContentType": "image/png",
      						"Body": buf
      					};
      					s3.putObject(params, function(err) {
      						if (err) {
      							cb(err);
      						} else {
      							fs.unlink(file, cb);
      						}
      					});
      				}
      			});
      		}
      	});
      }
      
      function receive(cb) {
      	var params = {
      		"QueueUrl": config.QueueUrl,
      		"MaxNumberOfMessages": 1,
      		"VisibilityTimeout": 120,
      		"WaitTimeSeconds": 10
      	};
      	sqs.receiveMessage(params, function(err, data) {
      		if (err) {
      			cb(err);
      		} else {
      			if (data.Messages === undefined) {
      				cb(null, null);
      			} else {
      				cb(null, data.Messages[0]);
      			}
      		}
      	});
      }
      
      function run() {
      	receive(function(err, message) {
      		if (err) {
      			throw err;
      		} else {
      			if (message === null) {
      				console.log('nothing to do');
      				setTimeout(run, 1000);
      			} else {
      				console.log('process');
      				process(message, function(err) {
      					if (err) {
      						throw err;
      					} else {
      						acknowledge(message, function(err) {
      							if (err) {
      								throw err;
      							} else {
      								console.log('done');
      								setTimeout(run, 1000);
      							}
      						});
      					}
      				});
      			}
      		}
      	});
      }
      
      run();

3. 代码动作

  1. 安装nodejs
    由于一些包的原因,这个nodejs程序只能运行在nodejs@v11.15.0,因此事先下载。
    nodejsv11.15.0

  2. 执行npm install

    shell 复制代码
    npm install
  3. 准备图片
    示例图片URL

  4. 运行程序

    • 首先运行work.js监视aws sqs

      shell 复制代码
      node work.js
    • 之后运行index.js

      shell 复制代码
      node index.js "https://pics1.baidu.com/feed/f9dcd100baa1cd11d2771efce7c9a6f8c1ce2d0c.jpeg@f_auto?token=e630acf36ce316be5abcb2652d6971b3&s=110AA3F04A32B6C842AFE716030040DF"


      可以看到work.js这边显示done,表明已经接收到urlmessage,处理成文件之后传送到了S3 bucket

    • 最后检查S3 bucket

相关推荐
知识分享小能手1 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
汇能感知3 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun3 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao4 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾4 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT4 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa5 小时前
HTML和CSS学习
前端·css·学习·html
ST.J5 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
Suckerbin5 小时前
LAMPSecurity: CTF5靶场渗透
笔记·安全·web安全·网络安全
看海天一色听风起雨落6 小时前
Python学习之装饰器
开发语言·python·学习