কম্পিউটার টিউটোরিয়াল

Node.js এবং Redis-এর সাহায্যে বার্তা সারি আয়ত্ত করা:ওয়েব অ্যাপ পারফরম্যান্স বুস্ট করুন

Node.js এবং Redis-এর সাহায্যে বার্তা সারি আয়ত্ত করা:ওয়েব অ্যাপ পারফরম্যান্স বুস্ট করুন

আপনি যখন বড় আকারের ওয়েব অ্যাপ্লিকেশন তৈরি করছেন, তখন গতি একটি প্রধান অগ্রাধিকার। ব্যবহারকারীরা আর প্রতিক্রিয়ার জন্য বেশিক্ষণ অপেক্ষা করতে চান না, এবং তাদের করা উচিত নয়। কিন্তু কিছু প্রক্রিয়া সময় নেয়, এবং সেগুলিকে দ্রুত করা বা দূর করা যায় না।

বার্তা সারি স্বাভাবিক অনুরোধ-প্রতিক্রিয়া যাত্রায় একটি অতিরিক্ত শাখা প্রদান করে এই সমস্যার সমাধান করতে সাহায্য করে। এই অতিরিক্ত শাখাটি নিশ্চিত করতে সাহায্য করে যে ব্যবহারকারীরা তাৎক্ষণিক প্রতিক্রিয়া পেতে পারেন এবং সময়সাপেক্ষ প্রক্রিয়াগুলি পাশে করা যেতে পারে। সবাই খুশি হয়ে বাড়ি যায়।

এই নিবন্ধটি বার্তা সারিগুলি কী এবং কীভাবে একটি খুব সাধারণ অ্যাপ্লিকেশন তৈরি করে সেগুলি দিয়ে শুরু করা যায় তা ব্যাখ্যা করার উপর ফোকাস করবে৷ আপনার Node.js এর মূল বিষয়গুলির সাথে পরিচিত হওয়া উচিত এবং আপনার Redis স্থানীয়ভাবে বা একটি ক্লাউড উদাহরণে ইনস্টল করা উচিত। এখানে কিভাবে Redis ইনস্টল করতে হয় তা জানুন।

একটি সারি কি?

একটি সারি হল একটি ডেটা স্ট্রাকচার যা আপনাকে একটি ক্রমে সত্তা সংরক্ষণ করতে দেয়। সারিগুলি একটি ফার্স্ট-ইন-ফার্স্ট-আউট (FIFO) নীতি ব্যবহার করে।

কম্পিউটার বিজ্ঞানে সারিগুলির ধারণাটি দৈনন্দিন জীবনে সারিগুলির ধারণার মতো যেখানে লোকেরা জিনিসগুলি পেতে লাইনে দাঁড়ায়। আপনি পেছন থেকে একটি সারিতে যোগ দিন, আপনার পালা না হওয়া পর্যন্ত অপেক্ষা করুন, তারপরে উপস্থিত হওয়ার পরে সামনে থেকে সারি ছেড়ে যান।

কম্পিউটার বিজ্ঞানে, যখন একটি API অনুরোধের মতো একটি প্রক্রিয়া চলছে, এবং আপনাকে বর্তমান প্রবাহ থেকে একটি নির্দিষ্ট কাজ (যেমন একটি ইমেল পাঠানো) সরাতে হবে, আপনি এটিকে একটি সারিতে নিয়ে যান এবং প্রক্রিয়াটি চালিয়ে যান৷

নীচের চিত্রটি একটি সারির জীবনচক্র চিত্রিত করে:

Node.js এবং Redis-এর সাহায্যে বার্তা সারি আয়ত্ত করা:ওয়েব অ্যাপ পারফরম্যান্স বুস্ট করুন সারির জীবনচক্র | https://optimalbits.github.io/bull/

চাকরি কি?

একটি কাজ হল ডেটার একটি অংশ যা একটি সারিতে ব্যবহার করা হয়, সাধারণত একটি JSON-এর মতো বস্তু৷

এই প্রবন্ধের কভার ইমেজে প্রদর্শিত হিসাবে, আপনি বিমানবন্দরে একটি সারিতে থাকা প্রতিটি ব্যক্তি হিসাবে একটি চাকরির কথা ভাবতে পারেন। প্রতিটি ব্যক্তির কাছে একটি ব্রিফকেস থাকে যাতে নির্দিষ্ট ডেটা এবং অন্যান্য নির্দেশাবলী থাকে (পাসপোর্ট এবং সম্ভবত চিকিৎসা সংক্রান্ত কাগজপত্র যেখানে প্রয়োজন হয়) যা তাদের উপস্থিতির পালা হলে সাহায্য করবে৷

এই সারিতে যোগদানকারী নতুন লোকেরা পেছন থেকে (শেষ ব্যক্তি হিসাবে) প্রবেশ করবে এবং সামনে থেকে লোকেদের উপস্থিত করা হবে। এইভাবে কাজগুলিও প্রক্রিয়া করা হয়, প্রতিটি কাজের ডেটা থাকে যা তার প্রক্রিয়াকরণের জন্য ব্যবহার করা হবে। নতুন চাকরি পেছন থেকে যোগ করা হয় যখন সামনে থেকে চাকরি নেওয়া হয়।

একজন কাজের প্রযোজক কি?

একটি কাজের প্রযোজক হল কোডের যে কোন অংশ যা একটি সারিতে একটি কাজ যোগ করে। বাস্তব জীবনে, এটি হবে বিমানবন্দরের নিরাপত্তা প্রহরী যে মানুষকে নির্দেশনা দেয়, বিভিন্ন উদ্দেশ্যে কোন সারিতে যোগ দিতে হবে তা বলে।

একজন চাকরি প্রযোজক একজন চাকরির ভোক্তা থেকে স্বাধীনভাবে থাকতে পারেন। এর মানে হল যে একটি মাইক্রোসার্ভিস সেটআপে, একটি নির্দিষ্ট পরিষেবা কেবল একটি সারিতে কাজ যোগ করার সাথে সম্পর্কিত হতে পারে, তবে সেগুলি কীভাবে প্রক্রিয়া করা হবে তা নয়৷

একজন কর্মী (চাকরির ভোক্তা) কি?

একজন কর্মী, বা কাজের ভোক্তা, একটি প্রক্রিয়া, বা ফাংশন, যা একটি কাজ সম্পাদন করতে পারে। একজন কর্মীকে ব্যাঙ্কের ক্যাশিয়ার হিসাবে ভাবুন যিনি ব্যাঙ্কে সারিতে থাকা লোকেদের সাথে যোগ দিচ্ছেন। যখন প্রথম ব্যক্তি আসে, তারা সারিতে একমাত্র একজন হিসাবে সারিতে যোগ দেয়। ক্যাশিয়ার তারপর তাদের জন্য ডাকে এবং সারি খালি করা হয়।

ক্যাশিয়ার ব্যক্তির কাছ থেকে লেনদেন প্রক্রিয়া করার জন্য ব্যবহার করার জন্য নির্দিষ্ট বিবরণের জন্য অনুরোধ করে। যখন ক্যাশিয়ার সেই গ্রাহকের সাথে দেখা করে, তখন আরও চারজন গ্রাহক লাইনে দাঁড়াতে পারত। পরেরটির জন্য কল করার আগে প্রথম গ্রাহকের সাথে ক্যাশিয়ার করা না হওয়া পর্যন্ত তারা সারিতে থাকবে। সারিবদ্ধ কর্মীদের ক্ষেত্রেও এটি একই প্রক্রিয়া - তারা সারিতে থাকা প্রথম কাজটি বেছে নেয় এবং এটি প্রক্রিয়া করে।

ব্যর্থ চাকরি কি?

প্রায়শই, কিছু কাজ প্রক্রিয়াকরণের সময় ব্যর্থ হতে পারে।

এখানে কিছু কারণ রয়েছে কেন একটি চাকরি ব্যর্থ হতে পারে:

  • অবৈধ বা অনুপস্থিত ইনপুট ডেটা:যখন একটি কাজের প্রক্রিয়াকরণের জন্য প্রয়োজনীয় ডেটা অনুপস্থিত থাকে, তখন কাজটি ব্যর্থ হবে৷ উদাহরণস্বরূপ, একটি ইমেল পাঠানোর কাজ প্রাপকের ইমেল ঠিকানা ছাড়াই ব্যর্থ হবে।
  • টাইম আউট:একটি কাজ সারিবদ্ধ প্রক্রিয়া দ্বারা ব্যর্থ হতে পারে যদি এটি স্বাভাবিকের চেয়ে বেশি সময় নেয়। এটি চাকরির নির্ভরতা বা অন্য কিছুর কারণে হতে পারে, তবে সাধারণত আপনি একটি চাকরি চিরতরে চলতে চান না৷
  • নেটওয়ার্ক বা অবকাঠামোগত সমস্যা:এই সমস্যাগুলি প্রায় আপনার নিয়ন্ত্রণের বাইরে, কিন্তু এটি ঘটে। উদাহরণস্বরূপ একটি ডাটাবেস সংযোগ ত্রুটি একটি কাজ ব্যর্থ হবে.
  • নির্ভরতার সমস্যা:কখনও কখনও একটি কাজ ভালভাবে কাজ করার জন্য কিছু বাহ্যিক সংস্থানের উপর নির্ভর করে। যখনই এই অন্যান্য সংস্থানগুলি অনুপলব্ধ বা ব্যর্থ হয়, তখন কাজটি ব্যর্থ হবে৷

যখন কাজ ব্যর্থ হয়, আপনি তাদের পুনরায় চেষ্টা করার জন্য আপনার সারি প্রক্রিয়া কনফিগার করতে পারেন। আপনি হয় অবিলম্বে কাজটি পুনরায় চেষ্টা করতে পারেন, অথবা একটি গণনা করা সময়ের পরে। আপনি সর্বোচ্চ সংখ্যক প্রচেষ্টা সেট করতে পারেন, যা সুপারিশ করা হয়। যদি তা না হয়, তাহলে আপনি এমন একটি চাকরি শেষ করবেন যা সর্বদা অসীমভাবে ব্যর্থ হবে।

মাইক্রোসার্ভিসের মধ্যে শক্তিশালী যোগাযোগের চ্যানেল তৈরি করার জন্য সারিগুলি কার্যকর। একাধিক পরিষেবা একই সারি ব্যবহার করতে পারে। বিভিন্ন পরিষেবা বিভিন্ন সমস্যার সাথে কাজ করা যেতে পারে। যখন একটি পরিষেবা তার কাজ শেষ করে, তখন এটি একটি চাকরিকে অন্য পরিষেবাতে ঠেলে দিতে পারে যেখানে কর্মীরা সেই কাজের জন্য অপেক্ষা করছে। সেই পরিষেবাটি এটিকে তুলে নেবে এবং ডেটার সাথে যা যা প্রয়োজন তা করবে৷

সারিগুলি একটি প্রক্রিয়া থেকে ভারী কাজগুলি অফলোড করার জন্যও কার্যকর। আপনি এই নিবন্ধে দেখতে পাবেন, একটি ইমেল পাঠানোর মতো একটি সময়সাপেক্ষ কাজকে একটি সারিতে রাখা যেতে পারে যাতে প্রতিক্রিয়া সময় ধীর না হয়।

সারি ব্যর্থতার একক পয়েন্ট এড়াতে সাহায্য করে। একটি প্রক্রিয়া যা ব্যর্থ হওয়ার ক্ষমতা রাখে এবং পুনরায় চেষ্টা করা যেতে পারে একটি সারি ব্যবহার করে সর্বোত্তম প্রক্রিয়া করা হয় যেখানে এটি কিছুক্ষণ পরে পুনরায় চেষ্টা করা যেতে পারে।

কীভাবে সারি ব্যবহার করে এমন একটি সহজ অ্যাপ্লিকেশন তৈরি করবেন

এই নিবন্ধে, আমরা Node.js এবং Redis ব্যবহার করে একটি সাধারণ প্রকল্প তৈরি করব। আমরা বুল লাইব্রেরি ব্যবহার করব কারণ এটি একটি কিউ সিস্টেম তৈরিতে জড়িত অনেক জটিলতাকে সরল করে। ইমেল পাঠানোর জন্য প্রকল্পটির একটি একক শেষ পয়েন্ট থাকবে৷

একটি নতুন Node.js প্রকল্প তৈরি করুন

mkdir nodejs-queue-project
cd nodejs-queue-project
npm init -y

উপরের কমান্ডগুলি nodejs-queue-project নামে একটি নতুন ফোল্ডার তৈরি করবে এবং একটি package.json এটিতে ফাইল করুন। package.json ফাইলটি এইরকম হওয়া উচিত:

{
 "name": "nodejs-queue-project",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
 "test": "echo \"Error: no test specified\" && exit 1"
 },
 "keywords": [],
 "author": "",
 "license": "ISC"
}

প্রয়োজনীয় নির্ভরতা ইনস্টল করুন

npm i express @types/express @types/node body-parser ts-node ts-lint typescript nodemon nodemailer @types/nodemailer

উপরের কমান্ডগুলি প্রকল্পের জন্য প্রয়োজনীয় বিভিন্ন প্যাকেজ এবং নির্ভরতা ইনস্টল করবে।

ইনস্টলেশনের পরে, আপনি scripts আপডেট করতে পারেন আপনার package.json এর বিভাগ একটি dev থাকতে আদেশ আপনার সম্পূর্ণ package.json ফাইল এখন এই মত হওয়া উচিত:

{
 "name": "nodejs-queue-project",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
 "dev": "nodemon src/app.ts"
 },
 "keywords": [],
 "author": "",
 "license": "ISC",
 "dependencies": {
 "@types/express": "^4.17.17",
 "@types/node": "^20.3.3",
 "@types/nodemailer": "^6.4.8",
 "body-parser": "^1.20.2",
 "express": "^4.18.2",
 "nodemailer": "^6.9.3",
 "nodemon": "^2.0.22",
 "ts-lint": "^4.5.1",
 "ts-node": "^10.9.1",
 "typescript": "^5.1.6"
 }
}

উপরের ফাইলটি আপনার সমস্ত ইনস্টল করা নির্ভরতা দেখায়। npm run dev আপনি যখন dev ব্যবহার করবেন তখন কমান্ড চলবে স্ক্রিপ্ট।

এন্ডপয়েন্ট কিভাবে তৈরি করবেন

প্রথম কাজটি হল src নামে একটি নতুন ফোল্ডার তৈরি করা . এই ফোল্ডারে আপনার সমস্ত কোড ফাইল থাকবে। এটিতে প্রথম যে ফাইলটি থাকবে সেটি হল অ্যাপ্লিকেশনটির রুট ফাইল — app.ts package.json এ সংজ্ঞায়িত ফাইল ফাইল।

আমরা app.ts ব্যবহার করব প্রয়োজনীয় প্যাকেজগুলি আমদানি করতে ফাইল করুন এবং নীচের মত একটি ইমেল পাঠাতে একটি একক শেষ পয়েন্ট সহ একটি সাধারণ সার্ভার তৈরি করুন:

import express from "express";
import bodyParser from "body-parser";
import nodemailer from "nodemailer";
const app = express();
app.use(bodyParser.json());
app.post("/send-email", async (req, res) => {
 const { from, to, subject, text } = req.body;
 // Use a test account as this is a tutorial
 const testAccount = await nodemailer.createTestAccount();
 const transporter = nodemailer.createTransport({
 host: "smtp.ethereal.email",
 port: 587,
 secure: false,
 auth: {
 user: testAccount.user,
 pass: testAccount.pass,
 },
 tls: {
 rejectUnauthorized: false,
 },
 });
 console.log("Sending mail to %s", to);
 let info = await transporter.sendMail({
 from,
 to,
 subject,
 text,
 html: `<strong>${text}</strong>`,
 });
 console.log("Message sent: %s", info.messageId);
 console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
 res.json({
 message: "Email Sent",
 });
});
app.listen(4300, () => {
 console.log("Server started at http://localhost:4300");
});

এখন, আপনি npm run dev চালিয়ে আপনার সার্ভার শুরু করতে পারেন আপনার টার্মিনালে। আপনি Server started at [http://localhost:4300](http://localhost:4300) বলে একটি বার্তা দেখতে পাবেন আপনার টার্মিনালে।

Node.js এবং Redis-এর সাহায্যে বার্তা সারি আয়ত্ত করা:ওয়েব অ্যাপ পারফরম্যান্স বুস্ট করুন npm রান ডেভ মেসেজ

আপনি এখন পোস্টম্যানের মত একটি টুল ব্যবহার করে শেষ পয়েন্ট পরীক্ষা করতে পারেন:

Node.js এবং Redis-এর সাহায্যে বার্তা সারি আয়ত্ত করা:ওয়েব অ্যাপ পারফরম্যান্স বুস্ট করুন পোস্টম্যানের এন্ডপয়েন্ট টেস্টিং

স্ক্রিনশটে দেখানো হিসাবে অনুরোধটি প্রায় 4 সেকেন্ড সময় নিয়েছে। এটি একটি শেষ পয়েন্টের জন্য খুব ধীর। আপনি যদি আপনার টার্মিনালটি দেখেন তবে আপনাকে একটি URLও দেখতে হবে যেখানে আপনি পাঠানো ইমেলটির পূর্বরূপ দেখতে পারেন৷

Node.js এবং Redis-এর সাহায্যে বার্তা সারি আয়ত্ত করা:ওয়েব অ্যাপ পারফরম্যান্স বুস্ট করুন

লিঙ্কটি খুললে আপনি দেখতে পারবেন ইমেলটি কেমন দেখাচ্ছে৷

Node.js এবং Redis-এর সাহায্যে বার্তা সারি আয়ত্ত করা:ওয়েব অ্যাপ পারফরম্যান্স বুস্ট করুন ইমেল সামগ্রী

কিভাবে সারি তৈরি করবেন

প্রক্রিয়াটিকে আরও দ্রুত করার জন্য, ইমেলটি পরে পাঠানোর জন্য সারিবদ্ধ করা যেতে পারে এবং অবিলম্বে ব্যবহারকারীকে একটি প্রতিক্রিয়া পাঠানো যেতে পারে৷

এটি করতে, bull ইনস্টল করুন লাইব্রেরি এবং এর @types লাইব্রেরি যেমন আমরা একটি সারি তৈরি করতে এটি ব্যবহার করব। সেটি হল:

npm i bull @types/bull

bull ব্যবহার করে একটি নতুন সারি তৈরি করা হচ্ছে একটি নতুন Bull তাৎক্ষণিক করার মতোই সহজ৷ সারির জন্য একটি নাম সহ বস্তু:

// This goes at the top of your file
import Bull from 'bull';
const emailQueue = new Bull("email");

যখন সারিটি শুধুমাত্র সারির নাম দিয়ে তৈরি করা হয়, তখন এটি ডিফল্ট Redis সংযোগ URL ব্যবহার করার চেষ্টা করে:localhost:6379 . আপনি যদি একটি ভিন্ন URL ব্যবহার করতে পছন্দ করেন, তাহলে কেবল একটি দ্বিতীয় অবজেক্টে Bull পাস করুন একটি বিকল্প অবজেক্ট হিসাবে ক্লাস:

const emailQueue = new Bull("email", {
 redis: "localhost:6379",
});

এই মুহুর্তে, আপনি একজন কাজের প্রযোজক হিসাবে কাজ করার জন্য একটি সাধারণ ফাংশন তৈরি করতে পারেন এবং প্রতিবার অনুরোধ আসার পরে সারিতে একটি কাজ যোগ করতে পারেন৷

type EmailType = {
 from: string;
 to: string;
 subject: string;
 text: string;
};
const sendNewEmail = async (email: EmailType) => {
 emailQueue.add({ ...email });
};

এই নতুন তৈরি ফাংশন, sendNewEmail , EmailType ধরনের পাঠানো নতুন ইমেলের বিশদ বিবরণ সহ একটি বস্তু গ্রহণ করে . প্রেরকের ইমেল ঠিকানা আছে (from ), প্রাপকের ইমেল ঠিকানা (to ), subject ইমেলের, এবং ইমেলের বিষয়বস্তু (text ) তারপরে এটি একটি নতুন কাজকে সারিতে ঠেলে দেয়।

এখন অনুরোধের সময় ইমেল পাঠানোর পরিবর্তে আপনি এই ফাংশনটি ব্যবহার করতে পারেন। এটি করতে শেষবিন্দু পরিবর্তন করুন:

app.post("/send-email", async (req, res) => {
 const { from, to, subject, text } = req.body;
 await sendNewEmail({ from, to, subject, text });
 console.log("Added to queue");
 res.json({
 message: "Email Sent",
 });
});

এই মুহুর্তে, কোডটি সহজ এবং প্রক্রিয়াটি দ্রুততর। অনুরোধটি মাত্র 40m সময় নেয় — আগের তুলনায় প্রায় 100x দ্রুত৷

Node.js এবং Redis-এর সাহায্যে বার্তা সারি আয়ত্ত করা:ওয়েব অ্যাপ পারফরম্যান্স বুস্ট করুন পোস্টম্যানের সাথে এন্ডপয়েন্ট টেস্টিং

এই মুহুর্তে, ইমেলটি একটি সারিতে যোগ করা হয়। প্রক্রিয়া না হওয়া পর্যন্ত এটি সারিতে থাকবে। কাজটি একই অ্যাপ্লিকেশন বা অন্য একটি পরিষেবা (যদি একটি মাইক্রোসার্ভিস সেটআপে থাকে) দ্বারা প্রক্রিয়া করা যেতে পারে।

কিভাবে কাজগুলি প্রক্রিয়া করতে হয়

চক্রটি অসম্পূর্ণ এবং অকেজো যদি মেলগুলি কখনই সারি ছেড়ে না যায়। আমরা কাজগুলি প্রক্রিয়া করার জন্য এবং সারি সাফ করার জন্য একটি কাজের ভোক্তা তৈরি করব৷

একটি Job গ্রহণ করে এমন একটি ফাংশনের জন্য যুক্তি তৈরি করে আমরা এটি করতে পারি অবজেক্ট এবং ইমেল পাঠায়:

const processEmailQueue = async (job: Job) => {
 // Use a test account as this is a tutorial
 const testAccount = await nodemailer.createTestAccount();
 const transporter = nodemailer.createTransport({
 host: "smtp.ethereal.email",
 port: 587,
 secure: false,
 auth: {
 user: testAccount.user,
 pass: testAccount.pass,
 },
 tls: {
 rejectUnauthorized: false,
 },
 });
 const { from, to, subject, text } = job.data;
 console.log("Sending mail to %s", to);
 let info = await transporter.sendMail({
 from,
 to,
 subject,
 text,
 html: `<strong>${text}</strong>`,
 });
 console.log("Message sent: %s", info.messageId);
 console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
 return nodemailer.getTestMessageUrl(info);
};

উপরের ফাংশনটি একটি Job গ্রহণ করে বস্তু বস্তুটির দরকারী বৈশিষ্ট্য রয়েছে যা একটি কাজের স্থিতি এবং ডেটা দেখায়। এখানে, আমরা data ব্যবহার করি সম্পত্তি

এই সময়ে, আমরা সব একটি ফাংশন আছে. এটি স্বয়ংক্রিয়ভাবে কাজ বাছাই করে না কারণ এটি কোন সারিতে কাজ করবে তা জানে না৷

এটিকে সারিতে সংযুক্ত করার আগে, আপনি কিছু অনুরোধ পাঠিয়ে সারিতে কয়েকটি কাজ যোগ করতে পারেন। আপনি আপনার redis-cli-এ এই কমান্ডটি চালিয়ে বর্তমানে সারিবদ্ধ ইমেল কাজগুলি পরীক্ষা করতে পারেন :

LRANGE bull:email:wait 0 -1

এটি ইমেল অপেক্ষা তালিকা পরীক্ষা করে এবং ids ফেরত দেয় অপেক্ষমাণ কাজের।

Node.js এবং Redis-এর সাহায্যে বার্তা সারি আয়ত্ত করা:ওয়েব অ্যাপ পারফরম্যান্স বুস্ট করুন Redis CLI

শ্রমিকরা আসলে কীভাবে কাজ করে তা দেখানোর জন্য আমি কয়েকটি কাজ তৈরি করেছি।

এখন, এই লাইনের কোড যোগ করে কর্মীকে সারিতে সংযুক্ত করুন:

emailQueue.process(processEmailQueue);

এটি আপনার app.ts ফাইলটি এখন তার দেখাশোনা করা উচিত:

import express from "express";
import bodyParser from "body-parser";
import nodemailer from "nodemailer";
import Bull, { Job } from "bull";
const app = express();
app.use(bodyParser.json());
const emailQueue = new Bull("email", {
 redis: "localhost:6379",
});
type EmailType = {
 from: string;
 to: string;
 subject: string;
 text: string;
};
const sendNewEmail = async (email: EmailType) => {
 emailQueue.add({ ...email });
};
const processEmailQueue = async (job: Job) => {
 // Use a test account as this is a tutorial
 const testAccount = await nodemailer.createTestAccount();
 const transporter = nodemailer.createTransport({
 host: "smtp.ethereal.email",
 port: 587,
 secure: false,
 auth: {
 user: testAccount.user,
 pass: testAccount.pass,
 },
 tls: {
 rejectUnauthorized: false,
 },
 });
 const { from, to, subject, text } = job.data;
 console.log("Sending mail to %s", to);
 let info = await transporter.sendMail({
 from,
 to,
 subject,
 text,
 html: `<strong>${text}</strong>`,
 });
 console.log("Message sent: %s", info.messageId);
 console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
};
emailQueue.process(processEmailQueue);
app.post("/send-email", async (req, res) => {
 const { from, to, subject, text } = req.body;
 await sendNewEmail({ from, to, subject, text });
 console.log("Added to queue");
 res.json({
 message: "Email Sent",
 });
});
app.listen(4300, () => {
 console.log("Server started at http://localhost:4300");
});

একবার আপনি সংরক্ষণ করলে, আপনি লক্ষ্য করবেন যে সার্ভারটি পুনরায় চালু হবে এবং অবিলম্বে মেলগুলি পাঠানো শুরু করবে। এর কারণ হল কর্মী সারি দেখে এবং অবিলম্বে প্রক্রিয়া শুরু করে৷

Node.js এবং Redis-এর সাহায্যে বার্তা সারি আয়ত্ত করা:ওয়েব অ্যাপ পারফরম্যান্স বুস্ট করুন সারিবদ্ধ ইমেল পাঠাচ্ছে সার্ভার

এখন প্রযোজক ও কর্মী উভয়েই সক্রিয়। প্রতিটি নতুন API অনুরোধ সারিতে ঠেলে দেওয়া হবে, এবং কর্মী অবিলম্বে এটি প্রক্রিয়া করবে যদি না ইতিমধ্যে কিছু মুলতুবি কাজ থাকে৷

সারাংশ

আমি আশা করি এই নিবন্ধটি আপনাকে একটি বার্তা সারি কী, কীভাবে চাকরি যোগ করতে হয় এবং সেগুলি চালানোর জন্য প্রক্রিয়া তৈরি করতে এবং কীভাবে আপনি আরও ভাল ওয়েব অ্যাপ্লিকেশন তৈরি করতে সেগুলি ব্যবহার করতে পারেন তা বুঝতে সাহায্য করেছে। আপনি GitHub এ এই নিবন্ধে ব্যবহৃত কোড ফাইলগুলি খুঁজে পেতে পারেন৷

যদি আপনার কোন প্রশ্ন বা প্রাসঙ্গিক পরামর্শ থাকে, তাহলে অনুগ্রহ করে সেগুলি শেয়ার করতে আমার সাথে যোগাযোগ করুন।

আমার আরো নিবন্ধ পড়তে বা আমার কাজ অনুসরণ করতে, আপনি LinkedIn, Twitter, এবং Github এ আমার সাথে সংযোগ করতে পারেন। এটি দ্রুত, এটি সহজ, এবং এটি বিনামূল্যে!

বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন


  1. ক্যাশে সামঞ্জস্য বজায় রাখার তিনটি উপায়

  2. কীভাবে আইফোন/আইওএস-এ একটি UIView-এ একটি বর্ডার, বর্ডার ব্যাসার্ধ এবং ছায়া তৈরি করবেন?

  3. বিদ্যমান AlwaysOn ডাটাবেসে Microsoft SQL সার্ভার লগ শিপিং

  4. মেটাপ্রোগ্রামিং এর লুকানো খরচ