<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zihadul Islam</title>
    <description>The latest articles on DEV Community by Zihadul Islam (@zuizihad).</description>
    <link>https://dev.to/zuizihad</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F291478%2Fd410fe2b-66f6-4d9e-918c-5dd5a686d3a6.jpeg</url>
      <title>DEV Community: Zihadul Islam</title>
      <link>https://dev.to/zuizihad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zuizihad"/>
    <language>en</language>
    <item>
      <title>Introduction to Message Brokers</title>
      <dc:creator>Zihadul Islam</dc:creator>
      <pubDate>Sat, 19 Aug 2023 08:30:45 +0000</pubDate>
      <link>https://dev.to/zuizihad/introduction-to-message-brokers-mma</link>
      <guid>https://dev.to/zuizihad/introduction-to-message-brokers-mma</guid>
      <description>&lt;p&gt;মেসেজ ব্রোকার কি?&lt;br&gt;
মেসেজ ব্রোকার হল একটি ইন্টারমিডিয়ারি কম্পিউটার প্রোগ্রাম মডিউল যা সেন্ডারের ফরমাল মেসেজিং প্রোটোকল থেকে রিসিভারের ফরমাল মেসেজিং প্রোটোকলে একটি মেসেজ ট্রান্সলেটে করে।&lt;/p&gt;

&lt;p&gt;মেসেজ ব্রোকার হল একটি ইন্টারমিডিয়ারি প্রোগ্রাম যা অ্যাপ্লিকেশন এবং সার্ভিসগুলি একে অপরের সাথে তথ্য বিনিময় করতে ব্যবহার করে। মেসেজ ব্রোকাররা রিকয়ারড ডেস্টিনেশানে মেসেজ যাচাই, স্টোর, রুট এবং ডেলিভার করতে ব্যবহার করা হয় । বিভিন্ন প্রোগ্রামিং ভাষায় প্রয়োগ করা হলেও শুধুমাত্র অ্যাপ্লিকেশনগুলিই তথ্য যোগাযোগ করতে পারে না। যেহেতু মেসেজ ব্রোকাররা একটি মধ্যস্থতাকারী/ইন্টারমিডিয়ারি প্রোগ্রাম হিসাবে কাজ করে, সেহেতু প্রেরকের/সেন্ডারের কোন ধারণা নেই যে রিসিভার অনলাইনে থাকলেও  কতজন আছে।&lt;/p&gt;

&lt;p&gt;সবচেয়ে গুরুত্বপূর্ণ হচ্ছে ব্রোকাররা নিশ্চিত করে যে রিসিভাররা অনলাইনে বা সক্রিয় না থাকলেও মেসেজ পেয়েছেন। (এটি ইমেলের মতো। আপনাকে অনলাইনে থাকতে হবে না কিন্তু আপনি মেসেজটি পাবেন)। &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z_3D5BYy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/frgkyzg06186f8jn03ew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z_3D5BYy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/frgkyzg06186f8jn03ew.png" alt="Image description" width="337" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;মেসেজ ব্রোকাররা এটির জন্য একটি মেসেজ কিউ ব্যবহার করে এবং এটি মেমরি বা একটি হার্ড ডিস্কে সংরক্ষণ করা হয়। এটা মেসেজ সংরক্ষণ এবং মেসেজ ডেলিভার করতে ব্যবহার করা হয়. (আমি আশা করি আপনি ডাটা স্ট্রাকচার “কিউ” এর সাথে পরিচিত। এটিও একই, ফার্স্ট ইন ফার্স্ট আউট)।&lt;/p&gt;

&lt;p&gt;মেসেজ কিউ মেসেজগুলিকে সেগুলি যে অর্ডারে রীসিভ হয় সেই অর্ডারে স্টোর করে এবং একই অর্ডারে রিসিভারকে পাঠায়৷ যদি কোনোভাবে একটি মেসেজ ডেলিভার করা সম্ভব না হয় (নেটওয়ার্কের সমস্যা) তাহলে মেসেজটি পরে কিউতে থাকার জন্য পুনরায় নির্ধারণ করা হবে। এছাড়াও একটি মেসেজ কিউতে, মেসেজগুলি সঠিক অর্ডারে রাখা হয় যেখানে সেগুলি প্রেরণ/সেন্ড করা হয়েছিল এবং প্রাপ্তি নিশ্চিত না হওয়া পর্যন্ত কিউতে থাকে৷&lt;/p&gt;

&lt;p&gt;মেসেজ কিউ দিয়ে অ্যাপ্লিকেশনগুলি অ্যাসিঙ্ক্রোনাসভাবে কাজ করতে পারে এটি ডেটা লস প্রতিরোধ করে এবং প্রচেস বা কানেকশন ফেল হলে সিস্টেমগুলিকে কাজ চালিয়ে যেতে সক্ষম করে। এটি ডেভেলপারদের প্রচেসস এবং অ্যাপ্লিকেশনগুলিকে আলাদা রাখতে দেয়,&lt;br&gt;
মেসেজ কিউ একটি ডেটা স্ট্রাকচার এবং এটি মেসেজ ব্রোকারের একটি অংশ।&lt;/p&gt;

&lt;p&gt;Components of a message broker&lt;/p&gt;

&lt;p&gt;এখন আসি মেসেজ ব্রোকারের মৌলিক উপাদানগুলি কি:&lt;/p&gt;

&lt;p&gt;Producer - এই কম্পনেন্টস মেসেজ পাঠানোর জন্য রিস্পন্সিবল। এটি মেসেজ ব্রোকারের সাথে সংযুক্ত। পাবলিশ/সাবস্ক্রাইব প্যাটারনে (আমরা নীচের বিভাগে আলোচনা করেছি) তাদের পাবলিসার বলা হয়।&lt;/p&gt;

&lt;p&gt;Consumer - এই কম্পনেন্টস মেসেজ ব্রোকারে মেসেজ গ্রহণ করে। পাবলিশ/সাবস্ক্রাইব প্যাটার্নে তাদের সাবস্ক্রাইবারস বলা হয়।&lt;/p&gt;

&lt;p&gt;Queue/topic — মেসেজ ব্রোকার এখানে মেসেজ স্টোর করে।&lt;/p&gt;

&lt;p&gt;Real-world use cases of message brokers&lt;/p&gt;

&lt;p&gt;Integrating microservices&lt;br&gt;
যখন একটি সিস্টেম তৈরি করতে মাইক্রোসার্ভিস আর্কিটেকচার ব্যবহার করা হয়, তখন ডেভেলপমেন্ট শেষে একাধিক মাইক্রোসার্ভিস থাকতে পারে। সমস্যা হল একে অপরের সাথে কমিউনিকেশন।&lt;/p&gt;

&lt;p&gt;একটি মেসেজ ব্রোকার একটি সেন্ট্রাল ব্রোকার হিসাবে ব্যবহার করা যেতে পারে এবং মাইক্রোসার্ভিস একে অপরের সাথে যোগাযোগ করতে পারে। এছাড়াও, যদি আপনি এটিতে অন্য সার্ভিস যোগ করতে চান তবে আপনাকে এটি শুধুমাত্র মেসেজ ব্রোকারের সাথে সংযুক্ত করতে হবে। &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3jPlbXTa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z3e1ejlkyimcyioydqc5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3jPlbXTa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z3e1ejlkyimcyioydqc5.png" alt="Image description" width="400" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rest API’s&lt;br&gt;
বর্তমানে প্রায়শই আমরা একটি REST API ব্যাকএন্ড সহ ওয়েব ফ্রন্টএন্ড বা মোবাইল অ্যাপ্লিকেশন ডেভেলপমেন্ট করি। ক্লায়েন্ট এবং সার্ভার আর্কিটেকচার যোগাযোগের জন্য HTTP প্রোটোকল ব্যবহার করে।&lt;/p&gt;

&lt;p&gt;কিন্তু যদি রিকোয়েস্ট থেকে ডেটা দীর্ঘ সময়ের জন্য প্রসেসের প্রয়োজন হয় তাহলে কী হবে। 10 মিনিটের মত হলে। যদি একটি সময় সাপেক্ষ হিসাব করতে হয়?&lt;/p&gt;

&lt;p&gt;এছাড়াও, সেই সময়ে ইউজারের যদি সংযোগের সমস্যা হয় তবে কী হবে। রিস্পপন্সটি ইউজার কখনই নাও পেতে পারে। একটি মেসেজ ব্রোকার এখানে ব্যবহার করা যেতে পারে যাতে মেসেজ সরবরাহ নিশ্চিত করা যায়।&lt;/p&gt;

&lt;p&gt;Mobile Applications&lt;br&gt;
মনে করুন আপনি একটি মোবাইল অ্যাপে বিজ্ঞপ্তি পাঠাতে চান। কিন্তু কিছু ইউজার অনলাইন না হলে কি হবে। একটি মেসেজ ব্রোকার ব্যবহার করে, আপনি নিশ্চিত করতে পারেন যে তারা অনলাইনে এলে মেসেজটি পাবে। &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PLoV-rFv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vactephls00f4nheowl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PLoV-rFv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vactephls00f4nheowl0.png" alt="Image description" width="624" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Different messaging models/distribution patterns&lt;br&gt;
যদিও বেশ কিছু মেসেজ ব্রোকার মডেল আছে আমরা এখানে প্রধান 02 মেসেজিং প্যাটার্ন নিয়ে আলোচনা করব।&lt;br&gt;
Point-to-Point. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RLGZMcBl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/psehz4bb9pm6ny5elpz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RLGZMcBl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/psehz4bb9pm6ny5elpz9.png" alt="Image description" width="624" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;মেসেজের কিউতে মেসেজের সেন্ডার (প্রডিউসার) এবং রিসিভার (কঞ্জুমার) এর সাথে ওয়ান টু ওয়ান সম্পর্ক রয়েছে।&lt;/li&gt;
&lt;li&gt;কিউতে থাকা প্রতিটি মেসেজ শুধুমাত্র একজন রিসিভারের কাছে পাঠানো হয় এবং শুধুমাত্র একবার রীসিভ হয়।&lt;/li&gt;
&lt;li&gt;ফাইনান্সিয়াল ট্রাঞ্জেকশানের জন্য এফিশিএন্ট যেহেতু পেমেন্ট  শুধুমাত্র একবার করা প্রয়োজন৷&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Publish-Subscribe. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zf-PFt_J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/86rcoabekam9en0bg2y6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zf-PFt_J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/86rcoabekam9en0bg2y6.png" alt="Image description" width="624" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;এই মেসেজ মডেলটি "পাব/সাব" নামেও পরিচিত৷&lt;/li&gt;
&lt;li&gt;এই মডেলে, মেসেজের কিউগুলির মেসেজ সেন্ডার এবং রিসিভারের সাথে এক থেকে একাধিক সম্পর্ক রয়েছে৷ এছাড়াও, সেন্ডার পাবলিসার হিসাবে পরিচিত এবং রিসিভার সাবস্ক্রাইবার হিসাবে পরিচিত।&lt;/li&gt;
&lt;li&gt;এই মডেল অনুসারে, একজন সেন্ডার একটি টপিকে মেসেজ পাবলিশ করে। এই মেসেজগুলি সমস্ত কঞ্জুমারের মধ্যে ডিস্ট্রিবিউট করা হয় যারা টপিকটিতে সাবস্ক্রাইব করেসে৷&lt;/li&gt;
&lt;li&gt;এই মডেলটি এমন একটি সিস্টেমের জন্য ব্যবহার করা যেতে পারে যেখানে ডেটা ক্রমাগত বিভিন্ন পক্ষের মধ্যে ভাগ করা উচিত।
যেমন: একটি এয়ারলাইন সিস্টেম তার অবতরণ সময় এবং অবস্থান সম্পর্কে ক্রমাগত আপডেট শেয়ার করা উচিত। এই আপডেটগুলি বিভিন্ন পক্ষের মধ্যে শেয়ার করা উচিত যেমন গ্রাউন্ড ক্রু (ল্যান্ডিংয়ের জন্য প্রস্তুত করা), নিয়ন্ত্রণ কেন্দ্র (ফ্লাইট পরিচালনা করার জন্য), জনসাধারণ ইত্যাদি।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;মেসেজ ব্রোকার ব্যবহার করার সুবিধা কি কি?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;মেসেজ ডেলিভারি গ্যারান্টি — কঞ্জুমার অফলাইনে থাকলেও অনলাইনে আসলে মেসেজটি ডেলিভার করা হবে।&lt;/li&gt;
&lt;li&gt;অ্যাসিঙ্ক্রোনাস প্রচেসসিং এর সাথে সিস্টেমের পারফরমেন্স বৃদ্ধি পায় — দীর্ঘ সময় নেয় এমন প্রচেসগুলি আলাদাভাবে প্রচেস করা যেতে পারে এবং তাহলে অ্যাপ্লিকেশনের মূল থ্রেড প্রভাবিত হবে না।&lt;/li&gt;
&lt;li&gt;একে অপরের সাথে যোগাযোগের জন্য অ্যাপ্লিকেশন, এমনকি যদি সেগুলি বিভিন্ন প্রোগ্রামিং ভাষায় প্রয়োগ করা হয় — (যেমন: SOAP, REST API, IoT ডিভাইস ইত্যাদি)।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;মেসেজ ব্রোকার ব্যবহার করার কিছু অসুবিধা কি কি?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;লার্নিং কার্ভ — এখানে বেশ কিছু মেসেজিং ব্রোকার এবং ডিজাইন প্যাটার্ন রয়েছে যা আপনি ব্যবহার করতে পারেন। আপনার পার্থক্য জানতে হবে এবং কোনটি ব্যবহার করতে হবে।&lt;/li&gt;
&lt;li&gt;ডিবাগিং — সিস্টেমের জটিলতার সাথে, ডিবাগিং কঠিন হতে পারে।&lt;/li&gt;
&lt;li&gt;কমপ্লেক্সিটি — একটি মেসেজ ব্রোকার থাকা অবশ্যই সিস্টেম আর্কিটেকচারে সম্পূর্ণ নতুন উপাদান যোগ করে।&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;সর্বাধিক জনপ্রিয় মেসেজ ব্রোকার:&lt;br&gt;
কিছু বিখ্যাত মেসেজ ব্রোকার হল Apache Kafka, RabbitMQ এবং Amazon SNS। &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Node js api rate limit</title>
      <dc:creator>Zihadul Islam</dc:creator>
      <pubDate>Sat, 19 Aug 2023 06:05:03 +0000</pubDate>
      <link>https://dev.to/zuizihad/node-js-api-rate-limit-cem</link>
      <guid>https://dev.to/zuizihad/node-js-api-rate-limit-cem</guid>
      <description>&lt;p&gt;Here we learn &lt;strong&gt;How node js api rate limiting&lt;/strong&gt;&lt;br&gt;
First you need to install &lt;code&gt;npm i ioredis&lt;/code&gt; this package&lt;/p&gt;

&lt;p&gt;COnfigure redis client&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Redis = require('ioredis');
const redis = new Redis(); // You might need to configure this properly

async function incr(key) {
  return await redis.incr(key);
}

async function expire(key, seconds) {
  return await redis.expire(key, seconds);
}

async function ttl(key) {
  return await redis.ttl(key);
}

module.exports = {
  incr,
  expire,
  ttl
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make a generic rate limiter function&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const redis = require('./redis-client');
function rateLimiter = ({secondWindow, allowdHits}) {
    return  async function (req, res, next) {
        // we use client ip as redis key here

        const ip = req.headers['x-forworded-for'] || 
         req.connection.remoteAddress || req.ip
        // if you use express use `req.ip` to get client ip

        const requests = await redis.incr(ip);
        let ttl;
        if(requests === 1) {
           await redis.expire(ip, secondWindow);
           ttl = secondWindow;
        }else {
              ttl = await redis.ttl(ip);
        }
        if(requests &amp;gt; allowdHits) {
           return res.status(503).json({
                response: 'error',
                callsInMinute: requests,
                ttl
           })
        } else {
               req.requests = requests;
               req.ttl = ttl;
               next();
         }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How to use it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.post('/api/login', rateLimiter({secondWindow: 5, 
    allowdHits: 3}), async(req, res) =&amp;gt; {
    return res.json({
        response: 'ok',
        callsInMinute: req.requests,
        ttl: req.ttl
    })
})

app.post('/api/checkout', rateLimiter({secondWindow: 12, 
    allowdHits: 7}), async(req, res) =&amp;gt; {
    return res.json({
        response: 'ok',
        callsInMinute: req.requests,
        ttl: req.ttl
    })
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>node</category>
      <category>api</category>
    </item>
  </channel>
</rss>
