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

相关推荐
('-')7 小时前
《从根上理解MySQL是怎样运行的》第十章学习笔记
笔记·学习·mysql
hd51cc7 小时前
MFC学习笔记 对话框
笔记·学习·mfc
卡提西亚7 小时前
数据库笔记-4-SQL语言之DCL
数据库·笔记·sql
Radan小哥7 小时前
Docker学习笔记—day0010
笔记·学习·docker
im_AMBER7 小时前
Canvas架构手记 05 鼠标事件监听 | 原生事件封装 | ctx 结构化对象
前端·笔记·学习·架构
老神在在0017 小时前
Mybatis01
后端·学习·spring·java-ee·mybatis
Y***89087 小时前
Neo4j图数据库学习(二)——SpringBoot整合Neo4j
数据库·学习·neo4j
理人综艺好会8 小时前
MySQL学习之go-mysql
学习·mysql·golang
想要成为计算机高手8 小时前
π*0.6: 从实践中学习 -- 2025.11.17 -- Physical Intelligence (π) -- 未开源
人工智能·学习·机器人·多模态·具身智能·vla
黑客思维者8 小时前
LLM底层原理学习笔记:模型评估的基准测试体系与方法论
人工智能·笔记·神经网络·学习·模型评估·基准测试