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 小时前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
十一10241 小时前
FX10/20 (CYUSB401X)开发笔记5 固件架构
笔记
FakeOccupational2 小时前
【电路笔记 通信】AXI4-Lite协议 FPGA实现 & Valid-Ready Handshake 握手协议
笔记·fpga开发
奶黄小甜包2 小时前
C语言零基础第18讲:自定义类型—结构体
c语言·数据结构·笔记·学习
rannn_1115 小时前
【MySQL学习|黑马笔记|Day7】触发器和锁(全局锁、表级锁、行级锁、)
笔记·后端·学习·mysql
喜欢吃燃面5 小时前
C++算法竞赛:位运算
开发语言·c++·学习·算法
传奇开心果编程5 小时前
【传奇开心果系列】Flet框架实现的家庭记账本示例自定义模板
python·学习·ui·前端框架·自动化
草莓熊Lotso5 小时前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
开发语言·c++·经验分享·笔记·其他
_Kayo_12 小时前
node.js 学习笔记3 HTTP
笔记·学习
CCCC131016315 小时前
嵌入式学习(day 28)线程
jvm·学习