از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
صف پیغام در Node.js با AWS SQS با افزایش پیچیدگی سیستمهای نرمافزاری مدرن، نیاز به تجزیه سیستمهایی که اندازه اولیهشان بیشتر شده بود، به وجود آمد. این افزایش پیچیدگی سیستم ها، نگهداری، به روز رسانی و ارتقاء آنها را دشوارتر می کرد. این امر راه را برای ریزسرویسهایی هموار کرد که به سیستمهای یکپارچه عظیم اجازه میداد…
سرفصلهای مطلب
معرفی
با افزایش پیچیدگی سیستمهای نرمافزاری مدرن، نیاز به تجزیه سیستمهایی که از اندازه اولیه خود بیشتر شده بودند، پدید آمد. این افزایش پیچیدگی سیستم ها، نگهداری، به روز رسانی و ارتقاء آنها را دشوارتر می کرد.
این امر راه را برای ریزسرویسها هموار کرد که به سیستمهای یکپارچه عظیم به سرویسهای کوچکتر تقسیم میشوند که بهطور سست جفت شدهاند اما برای ارائه عملکرد کلی راهحل یکپارچه اولیه با هم تعامل دارند. کوپلینگ شل چابکی را فراهم می کند و باعث سهولت آن می شود process تعمیر و نگهداری و افزودن ویژگی های جدید بدون نیاز به تغییر کل سیستم ها.
در این معماری های میکروسرویس است که سیستم های نوبت دهی برای تسهیل ارتباط بین سرویس های جداگانه ای که کل راه اندازی را تشکیل می دهند مفید است.
در این پست، ما به سیستم های صف، به ویژه آمازون می پردازیم سرویس صف ساده و نشان می دهد که چگونه می توانیم از ویژگی های آن در یک محیط میکروسرویس استفاده کنیم.
صف پیام چیست؟
قبل از اینکه اینترنت و ایمیل وارد تصویر شوند، مردم در فواصل طولانی بیشتر از طریق تبادل نامه با یکدیگر ارتباط برقرار می کردند. نامه ها حاوی پیام هایی بود که باید به اشتراک گذاشته می شد و در ایستگاه پست محلی پست می شد و از آنجا به آدرس گیرنده منتقل می شد.
این ممکن است از منطقه ای به منطقه دیگر متفاوت باشد، اما ایده یکسان بود. مردم به واسطهها اعتماد میکردند تا پیامهایشان را در حالی که به زندگیشان ادامه میدادند، برسانند.
هنگامی که یک سیستم به اجزای کوچکتر یا خدماتی تقسیم می شود که انتظار می رود با هم کار کنند، بسته به اینکه باید اطلاعات را از یک سرویس به سرویس دیگر منتقل کنند. روی عملکرد خدمات فردی
صف پیام این امر را تسهیل می کند process با عمل به عنوان “خدمات اداره پست” برای خدمات میکرو. پیامها در یک صف قرار میگیرند و سرویسهای هدف دریافت میشوند و عمل میکنند روی کسانی که خطاب به آنها هستند. پیام ها می توانند حاوی هر چیزی باشند – مانند دستورالعمل ها روی چه مراحلی باید برداشته شود، داده هایی که باید بر اساس آنها عمل کرد یا ذخیره کرد، یا کارهای ناهمزمانی که باید انجام شوند.
صف پیام مکانیزمی است که به اجزای یک سیستم امکان ارتباط و تبادل اطلاعات به صورت ناهمزمان را می دهد. این به این معنی است که سیستمهای با اتصال آزاد مجبور نیستند منتظر بازخورد فوری باشند روی پیام هایی که ارسال می کنند و می توان آنها را برای ادامه رسیدگی به سایر درخواست ها آزاد کرد. هنگامی که زمان فرا رسید و پاسخ مورد نیاز است، سرویس می تواند پاسخ را در صف پیام جستجو کند.
در اینجا چند نمونه از صف های پیام محبوب یا واسطه ها آورده شده است:
- سرویس صف ساده آمازون – که محور این مقاله است
- RabbitMQ – که منبع باز است و قابلیت پیام رسانی ناهمزمان را فراهم می کند
- آپاچی کافکا – که یک پلت فرم پخش توزیع شده است که از حالت pub/sub تعامل پشتیبانی می کند
- دیگران شامل آپاچی RocketMQ، NSQ، و هورنت کیو
موارد استفاده از صف پیام
صف های پیام برای هر سیستمی مورد نیاز نیست، اما سناریوهای خاصی وجود دارد که در آنها ارزش تلاش و منابع مورد نیاز برای راه اندازی و نگهداری آنها را دارد. هنگامی که به طور مناسب مورد استفاده قرار گیرد، صف های پیام از چندین جهت سودمند هستند.
اول، صفهای پیام از جداسازی سیستمهای بزرگ با ارائه مکانیسم ارتباطی در یک سیستم با اتصال آزاد پشتیبانی میکنند.
افزونگی از طریق استفاده از صف های پیام با حفظ وضعیت در صورت خرابی یک سرویس تقویت می شود. هنگامی که یک سرویس ناموفق یا معیوب فعالیت خود را از سر می گیرد، تمام عملیاتی که قرار بود انجام دهد همچنان در صف خواهند بود و می تواند آنها را انتخاب کند و به تراکنش هایی ادامه دهد که در غیر این صورت ممکن بود از بین رفته باشند.
صف پیام، دسته بندی عملیاتی مانند ارسال ایمیل یا درج سوابق در پایگاه داده را تسهیل می کند. دستورالعملهای دستهای را میتوان در یک صف ذخیره کرد و بهجای پردازش یکی یکی، همه را بهطور همزمان پردازش کرد، که میتواند ناکارآمد باشد.
سیستمهای صف همچنین میتوانند با اطمینان از اجرای آنها به ترتیبی که دریافت شدهاند، در تضمین سازگاری عملیات مفید باشند. این امر به ویژه زمانی مهم است که اجزا یا خدمات خاصی از یک سیستم به منظور مدیریت بار افزایش یافته تکرار شده باشد. به این ترتیب، سیستم به خوبی مقیاس میشود تا بار را مدیریت کند و همچنین اطمینان حاصل کند که تراکنشهای پردازش شده سازگار و منظم هستند، زیرا همه سرویسهای تکراری دستورالعملهای خود را از صف پیام دریافت میکنند که به عنوان منبع واحد حقیقت عمل میکند.
سرویس صف ساده آمازون – SQS
مانند بسیاری از پیشنهادات دیگر از خدمات وب آمازون، سرویس صف ساده (SQS) یک راه حل صف پیام است که توسط آمازون توزیع و مدیریت می شود، بسیار شبیه به محاسبات بدون سرور از طریق جام گل.
SQS به ما اجازه میدهد پیامها یا دستورالعملها را بین اجزای نرمافزار ارسال و دریافت کنیم که ما را قادر میسازد تا میکروسرویسها را در سیستمهای خود بدون دردسر راهاندازی و نگهداری یک سیستم صف اجرا و مقیاسبندی کنیم.
مانند سایر خدمات AWS، SQS به صورت پویا مقیاس می شود روی تقاضا در عین حصول اطمینان از امنیت داده های ارسال شده از طریق رمزگذاری (اختیاری) پیام ها.
پروژه نمایشی
برای کشف سرویس صف ساده آمازون، یک سیستم جداشده در Node.js ایجاد خواهیم کرد که هر مؤلفه با ارسال و بازیابی پیام از SQS با سایر مؤلفه ها تعامل خواهد داشت.
از آنجایی که ما یک سازمان کوچک هستیم که پهنای باند لازم برای رسیدگی به سفارشها را نداریم، یک سرویس برای دریافت سفارشهای کاربران و سرویس دیگری خواهیم داشت که تمام سفارشهای ارسال شده در آن روز را در زمان مشخصی به صندوق ورودی ایمیل ما تحویل میدهد. روز برای پردازش دسته ای تمام سفارشات تا زمانی که توسط سرویس دوم ما جمع آوری و به صندوق پست الکترونیکی ما تحویل داده شوند در صف ذخیره می شوند.
میکروسرویسهای ما از APIهای Node.js ساده تشکیل شدهاند، یکی که اطلاعات سفارش را از کاربران دریافت میکند و دیگری ایمیلهای تأیید را برای کاربران ارسال میکند.
ارسال تأییدیههای ایمیل بهصورت ناهمزمان از طریق صف پیامرسانی به سرویس سفارشهای ما اجازه میدهد تا علیرغم بارگیری، به دریافت سفارشها ادامه دهد زیرا نیازی به نگرانی در مورد ارسال ایمیلها نیست.
همچنین، در صورتی که سرویس پستی از کار بیفتد، پس از بالا آمدن مجدد، به ارسال ایمیلها از صف ادامه میدهد، بنابراین، دیگر نگران سفارشهای از دست رفته نخواهیم بود.
خدمات وب آمازون
برای این پروژه، به یک حساب AWS فعال و معتبر نیاز داریم که بتوانیم در آن ثبت نام کنیم AWS homepage. AWS مستلزم آن است که ما نه تنها برخی از جزئیات شخصی، بلکه جزئیات صورتحساب خود را نیز ارائه دهیم. برای جلوگیری از دریافت صورتحساب برای این پروژه آزمایشی، ما از آن استفاده خواهیم کرد AWS Free Tier برای اهداف آزمایش و توسعه
ما همچنین باید ابزار AWS CLI را نصب کنیم تا بتوانیم با منابع AWS خود از دستگاههایمان تعامل داشته باشیم. دستورالعمل نصب ابزار AWS CLI روی پلتفرم های متعددی را می توان یافت اینجا.
با استفاده از ابزار AWS CLI، میتوانیم به سمت آن برویم کنسول AWS و در زیر کشویی نمایه ما بخشی به نام “مدارک امنیتی مندر اینجا ما می توانیم اعتبارنامه هایی ایجاد کنیم که هنگام تعامل با AWS مورد استفاده قرار گیرند console.
این اعتبارنامه ها توسط ابزار CLI آمازون نیز استفاده می شود که با اجرای آن پیکربندی می کنیم:
$ aws configure
ما یک درخواست برای پر کردن ما دریافت خواهیم کرد Access Key ID
، Secret Access Key
، و مناطق پیش فرض و فرمت های خروجی. دو مورد آخر اختیاری هستند اما ما به کلید دسترسی و رمزی که از AWS به دست آورده ایم نیاز داریم console داشبورد.
با راهاندازی حساب AWS و پیکربندی AWS CLI، میتوانیم سرویس صف ساده AWS خود را با پیمایش به خانه SQS page.
همانطور که در اسکرین شات زیر می بینیم، پس از تعیین نام صف خود به عنوان nodeshop.fifo
ما با دو گزینه صف روبرو هستیم:
ما این امکان را داریم که بین a یکی را انتخاب کنیم صف استاندارد یا الف صف FIFO. یک صف استاندارد ترتیب پیامهایی را که دریافت میکند حفظ نمیکند و برای پروژههایی که توان عملیاتی را بر ترتیب رویدادها اولویت میدهند، مناسبتر است.
یک صف FIFO، روی از طرف دیگر، ترتیب پیام ها را به صورت دریافتی حفظ می کند و آنها نیز در همان بازیابی می شوند اولین ورودی اولین خروجی سفارش.
با توجه به اینکه ما در حال ساخت یک پلت فرم خرید کوچک خواهیم بود، حفظ ترتیب درخواست ها مهم است زیرا امیدواریم اقلام را به ترتیب خرید به مردم بفروشیم. هنگامی که نوع صف مورد نیاز خود را انتخاب کردیم، میتوانیم برخی از تنظیمات اضافی صف خود را تغییر دهیم:
ما می توانیم زمان قبل از حذف خودکار یک پیام از صف و اندازه یک پیام را در میان گزینه های دیگر پیکربندی کنیم. در حال حاضر، صف FIFO خود را با استفاده از مقادیر پیش فرض پیکربندی می کنیم. با آماده شدن صف، اکنون میتوانیم APIهای Node.js خود را ایجاد کنیم که از صف FIFO آمازون SQS ما بخوانند و بنویسند.
راه اندازی Node.js و NPM
دستورالعمل راه اندازی Node.js روی پلتفرم های متعدد را می توان در اینجا یافت روی را وب سایت رسمی Node.js. Node Package Manager (NPM) با Node.js ارسال می شود و ما می توانیم نصب خود را به صورت زیر تأیید کنیم:
# Node.js version
$ node -v
v12.12.0
# NPM version
$ npm -v
6.11.3
مرحله بعدی این است که پوشه های خود را به صورت زیر تنظیم کنیم:
# create folder and move into it
$ mkdir nodeshop_apis && cd $_
# create the orders and emails services folders
$ mkdir orderssvc emailssvc
راه اندازی Node API
را خواهیم ساخت orders
ابتدا خدمات را انجام دهید زیرا این کسی است که سفارشات را از کاربران دریافت می کند و اطلاعات را در صف ما ارسال می کند. ما emails
سپس سرویس از صف خوانده می شود و ایمیل ها را ارسال می کند.
ما یک پروژه Node.js را مقداردهی اولیه می کنیم و آن را نصب می کنیم چارچوب Express.js، که ما از آن برای ساختن API مینیمالیستی خود استفاده خواهیم کرد. ما همچنین نصب خواهیم کرد تجزیه کننده بدن میان افزار برای رسیدگی به داده های درخواستی ما و همچنین اعتبارسنجی آن.
برای رسیدن به این در ما root پوشه:
# initialize node project
$ npm init
# install express and body-parser
$ npm install express body-parser --save
یک بار اکسپرس و body-parser
نصب شده اند، به طور خودکار به بخش وابستگی های ما اضافه می شوند package.json
فایل با تشکر از --save
گزینه.
از آنجایی که چندین سرویس خواهیم داشت که همزمان اجرا خواهند شد، ما نیز آن را نصب خواهیم کرد npm-run-all بسته ای که به ما کمک می کند همه سرویس های خود را همزمان راه اندازی کنیم و مجبور نباشیم دستورات را به صورت چندگانه اجرا کنیم terminal پنجره ها:
$ npm install npm-run-all --save
با npm-run-all
نصب شده است، اجازه دهید اکنون آن را نیشگون گرفتن و کشیدن scripts
ورود در ما package.json
فایل شامل دستورات برای شروع خدمات ما و یک فرمان برای اجرای همه آنها:
{
// Truncated for brevity...
"scripts": {
"start-orders-svc": "node ./orderssvc/index.js 8081",
"start-emails-svc": "node ./emailssvc/index.js",
"start": "npm-run-all -p -r start-orders-svc"
},
// ...
}
ما دستورات را اضافه می کنیم start-orders-svc
و start-emails-svc
برای اجرای ما orders
و emails
خدمات به ترتیب. سپس ما را پیکربندی می کنیم start
دستور برای اجرای هر دو با استفاده از npm-run-all
.
با این تنظیمات، اجرای تمام سرویس های ما به آسانی اجرای دستور زیر خواهد بود:
$ npm start
ما می توانیم خود را ایجاد کنیم orders
API در index.js
به شرح زیر فایل کنید:
const express = require('express');
const bodyParser = require('body-parser');
const port = process.argv.slice(2)(0);
const app = express();
app.use(bodyParser.json());
app.get('/index', (req, res) => {
res.send("Welcome to NodeShop Orders.")
});
console.log(`Orders service listening روی port ${port}`);
app.listen(port);
پس از افزودن کتابخانه های مورد نیاز به Express ما app
، نقطه پایانی “/index” به سادگی با ارسال یک پیام خوش آمد پاسخ می دهد. در نهایت، API گوش خواهد داد روی پورتی که هنگام راه اندازی آن را مشخص خواهیم کرد.
ما برنامه را با اجرای برنامه شروع می کنیم npm start
دستور دهید و با API های ما با استفاده از برنامه پستچی:
را اجرا خواهیم کرد emails
سرویس بعدا روی. در حال حاضر، ما orders
سرویس راه اندازی شده است و اکنون می توانیم منطق تجاری خود را پیاده سازی کنیم.
اجرا: خدمات سفارشات
برای پیاده سازی منطق کسب و کار خود ما با این شروع می کنیم orders
سرویسی که سفارشات ما را دریافت می کند و آنها را در صف آمازون SQS ما می نویسد.
ما با معرفی یک مسیر و کنترلکننده جدید برای مدیریت ورودی سفارش از کاربر نهایی و ارسال دادههای سفارش به صف آمازون SQS به این هدف دست خواهیم یافت.
قبل از اجرای کنترلر، باید Amazon SDK را برای Node.js نصب کنیم:
$ npm install aws-sdk --save
نقطه پایانی جدید “/order” ما یک بار دریافت می کند که حاوی داده های سفارش است و آن را با استفاده از AWS SDK به صف SQS ما ارسال می کند:
// ./orderssvc/index.js
//
// Code removed for brevity...
//
// Import the AWS SDK
const AWS = require('aws-sdk');
// Configure the region
AWS.config.update({region: 'us-east-1'});
// Create an SQS service object
const sqs = new AWS.SQS({apiVersion: '2012-11-05'});
const queueUrl = "SQS_QUEUE_URL";
// the new endpoint
app.post('/order', (req, res) => {
let orderData = {
'userEmail': req.body('userEmail'),
'itemName': req.body('itemName'),
'itemPrice': req.body('itemPrice'),
'itemsQuantity': req.body('itemsQuantity')
}
let sqsOrderData = {
MessageAttributes: {
"userEmail": {
DataType: "String",
StringValue: orderData.userEmail
},
"itemName": {
DataType: "String",
StringValue: orderData.itemName
},
"itemPrice": {
DataType: "Number",
StringValue: orderData.itemPrice
},
"itemsQuantity": {
DataType: "Number",
StringValue: orderData.itemsQuantity
}
},
MessageBody: JSON.stringify(orderData),
MessageDeduplicationId: req.body('userEmail'),
MessageGroupId: "UserOrders",
QueueUrl: queueUrl
};
// Send the order data to the SQS queue
let sendSqsMessage = sqs.sendMessage(sqsOrderData).promise();
sendSqsMessage.then((data) => {
console.log(`OrdersSvc | SUCCESS: ${data.MessageId}`);
res.send("Thank you for your order. Check you inbox for the confirmation email.");
}).catch((err) => {
console.log(`OrdersSvc | ERROR: ${err}`);
// Send email to emails API
res.send("We ran into an error. Please try again.");
});
});
AWS SDK از ما میخواهد که یک آبجکت بارگذاری بسازیم که دادههایی را که به صف ارسال میکنیم مشخص میکند، در مورد ما آن را به صورت تعریف میکنیم. sqsOrderData
.
سپس این شی را به sendMessage()
تابعی که پیام ما را با استفاده از اعتبارنامه هایی که برای پیکربندی AWS CLI استفاده کردیم به صف ارسال می کند. در نهایت منتظر پاسخ می مانیم و به کاربر اطلاع می دهیم که سفارشش با موفقیت دریافت شده و باید تایید ایمیل را بررسی کند.
برای تست کردن orders
سرویس، دستور را اجرا می کنیم npm start
و محموله زیر را به localhost:8081/order
:
{
"itemName": "Phone case",
"itemPrice": "10",
"userEmail": "(email protected)",
"itemsQuantity": "2"
}
این سفارش ما را به orders
سرویس، که از آنجا پیام به صف SQS ما ارسال می شود. ما می توانیم سفارش را در صف SQS از طریق AWS مشاهده کنیم console، همانطور که نشان داده شده است:
ما orders
سرویس توانسته است سفارش یک کاربر را دریافت کند و داده ها را با موفقیت به صف ما ارسال کند روی را سرویس صف ساده.
پیاده سازی: سرویس ایمیل
ما orders
سرویس آماده است و در حال حاضر سفارشات را از کاربران دریافت می کند. این emails
مسئولیت خواندن پیامهای ذخیرهشده در صف و ارسال ایمیلهای تاییدیه برای کاربران بر عهده سرویس خواهد بود. این سرویس هنگام ثبت سفارش ها اطلاع رسانی نمی شود و بنابراین باید به بررسی صف برای هر گونه سفارش جدید ادامه دهد.
برای اطمینان از اینکه ما emails
سرویس به طور مستمر در حال بررسی سفارشات جدیدی است که ما از آن استفاده خواهیم کرد sqs-consumer
کتابخانه ای که به طور مستمر و دوره ای سفارش های جدید را بررسی می کند و ایمیل ها را برای کاربران ارسال می کند. sqs-consumer
همچنین پس از خواندن موفقیت آمیز پیام ها از صف، پیام ها را از صف حذف می کند.
ما با نصب شروع خواهیم کرد sqs-consumer
کتابخانه با اجرای دستور زیر:
$ npm install sqs-consumer --save
اکنون می توانیم آن را پیاده سازی کنیم emails
خدمات به شرح زیر:
const AWS = require('aws-sdk');
const { Consumer } = require('sqs-consumer');
// Configure the region
AWS.config.update({region: 'us-east-1'});
const queueUrl = "SQS_QUEUE_URL";
// Configure Nodemailer to user Gmail
let transport = nodemailer.createTransport({
host: 'smtp.googlemail.com',
port: 587,
auth: {
user: 'Email address',
pass: 'Password'
}
});
function sendMail(message) {
let sqsMessage = JSON.parse(message.Body);
const emailMessage = {
from: 'sender_email_adress', // Sender address
to: sqsMessage.userEmail, // Recipient address
subject: 'Order Received | NodeShop', // Subject line
html: `<p>Hi ${sqsMessage.userEmail}.</p. <p>Your order of ${sqsMessage.itemsQuantity} ${sqsMessage.itemName} has been received and is being processed.</p> <p> Thank you for shopping with us! </p>` // Plain text body
};
transport.sendMail(emailMessage, (err, info) => {
if (err) {
console.log(`EmailsSvc | ERROR: ${err}`)
} else {
console.log(`EmailsSvc | INFO: ${info}`);
}
});
}
// Create our consumer
const app = Consumer.create({
queueUrl: queueUrl,
handleMessage: async (message) => {
sendMail(message);
},
sqs: new AWS.SQS()
});
app.روی('error', (err) => {
console.error(err.message);
});
app.روی('processing_error', (err) => {
console.error(err.message);
});
console.log('Emails service is running');
app.start();
جدید ایجاد خواهیم کرد sqs-consumer
برنامه با استفاده از Consumer.create()
تابع و ارائه URL پرس و جو و تابع برای رسیدگی به پیام های واکشی شده از صف SQS.
در مورد ما، تابع sendMail()
پیام واکشی شده را از صف دریافت می کند، جزئیات سفارش کاربر را استخراج می کند و سپس با استفاده از آن برای کاربر ایمیل ارسال می کند. Nodemailer
. اگر مایلید بیشتر بدانید، مقاله ما را در مورد ارسال ایمیل در Node.js بررسی کنید.
ما emails
سرویس اکنون آماده است برای ادغام آن با اسکریپت اجرایی خود، به سادگی آن را تغییر می دهیم scripts
گزینه در ما package.json
:
{
// Truncated for brevity...
"scripts": {
"start-orders-svc": "node ./orderssvc/index.js 8081",
"start-emails-svc": "node ./emailssvc/index.js",
// Update this line
"start": "npm-run-all -p -r start-orders-svc start-emails-svc"
},
// ...
}
هنگامی که سفارش جدیدی را از طریق orders
خدمات، ایمیل زیر را در صندوق ورودی خود دریافت می کنیم:
نتیجه
در این پست، ما از Node.js و Express برای ایجاد یک API استفاده کردیم که به منظور دریافت سفارشات کاربران و ارسال جزئیات سفارش در صف SQS ما بود. روی AWS. سپس ما یک سرویس دیگر ساختیم تا پیامها را همانطور که پست شده است واکشی کنیم روی صف و ارسال ایمیل های تایید برای کاربرانی که سفارشات را ارسال کرده اند.
ما منطق سفارش را از منطق مدیریت ایمیل جدا کردیم و با استفاده از سیستم صف پیام، این دو سرویس را کنار هم آوردیم. این راه ما orders
خدمات می تواند قرار دادن سفارش را اداره کند در حالی که emails
سرویس ایمیل ها را برای کاربران ارسال می کند.
کد منبع این پروژه موجود است اینجا روی GitHub./
(برچسبها برای ترجمه)# aws
منتشر شده در 1403-01-23 19:53:07