paint-brush
Node.js টিউটোরিয়াল: কাফকা দিয়ে কিভাবে একটি সহজ ইভেন্ট-চালিত অ্যাপ্লিকেশন তৈরি করবেনদ্বারা@alvinslee
545 পড়া
545 পড়া

Node.js টিউটোরিয়াল: কাফকা দিয়ে কিভাবে একটি সহজ ইভেন্ট-চালিত অ্যাপ্লিকেশন তৈরি করবেন

দ্বারা Alvin Lee14m2024/06/28
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

Heroku-এ Node.js এবং Apache Kafka ব্যবহার করে কীভাবে একটি সাধারণ ইভেন্ট-চালিত অ্যাপ্লিকেশন তৈরি করবেন তা শিখুন। এই নির্দেশিকাটি একটি কাফকা ক্লাস্টার সেট আপ করা, ইভেন্টগুলি তৈরি এবং ব্যবহার করার জন্য একটি Node.js অ্যাপ তৈরি করা এবং Heroku-এ অ্যাপ্লিকেশন স্থাপন করা কভার করে৷ শেষ পর্যন্ত, আপনার কাছে রিয়েল-টাইম ডেটা প্রসেসিং সহ একটি ইভেন্ট-চালিত আর্কিটেকচারের একটি কার্যকরী উদাহরণ থাকবে।
featured image - Node.js টিউটোরিয়াল: কাফকা দিয়ে কিভাবে একটি সহজ ইভেন্ট-চালিত অ্যাপ্লিকেশন তৈরি করবেন
Alvin Lee HackerNoon profile picture

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


এই ওয়াকথ্রুতে, আমরা Heroku-এ Apache Kafka ব্যবহার করে একটি সাধারণ ইভেন্ট-চালিত অ্যাপ্লিকেশন তৈরি করার মাধ্যমে আপনাকে গাইড করব। আমরা কভার করব:

  • হেরোকুতে একটি কাফকা ক্লাস্টার স্থাপন করা হচ্ছে


  • একটি Node.js অ্যাপ্লিকেশন তৈরি করা যা ইভেন্ট তৈরি করে এবং ব্যবহার করে


  • হেরোকুতে আপনার অ্যাপ্লিকেশন স্থাপন করা হচ্ছে


Apache Kafka EDA সিস্টেম তৈরির জন্য একটি শক্তিশালী হাতিয়ার। এটি একটি ওপেন সোর্স প্ল্যাটফর্ম যা রিয়েল-টাইম ডেটা ফিড পরিচালনা করার জন্য ডিজাইন করা হয়েছে। Apache Kafka on Heroku একটি Heroku অ্যাড-অন যা কাফকাকে একটি পরিষেবা হিসেবে প্রদান করে। Heroku অ্যাপ্লিকেশন স্থাপন এবং পরিচালনা করা বেশ সহজ করে তোলে এবং আমি সম্প্রতি আমার প্রকল্পগুলিতে এটি আরও ব্যবহার করছি। আপনি যখন একটি ইভেন্ট-চালিত অ্যাপ্লিকেশন চালাতে চান তখন Heroku এর সাথে কাফকাকে একত্রিত করা সেটআপ প্রক্রিয়াটিকে সহজ করে।


এই গাইডের শেষ নাগাদ, আপনার কাছে একটি চলমান অ্যাপ্লিকেশন থাকবে যা Heroku-এ Apache Kafka-এর সাথে EDA-এর ক্ষমতা প্রদর্শন করবে। চল শুরু করি!

শুরু হচ্ছে

আমরা কোডে ডুব দেওয়ার আগে, আসুন দ্রুত কিছু মূল ধারণা পর্যালোচনা করি। একবার আপনি এইগুলি বুঝতে পারলে, অনুসরণ করা সহজ হবে।


  • ইভেন্টগুলি ডেটার টুকরো যা সিস্টেমে কিছু ঘটনাকে নির্দেশ করে, যেমন একটি সেন্সর থেকে তাপমাত্রা রিডিং।


  • বিষয় হল বিভাগ বা চ্যানেল যেখানে ইভেন্ট প্রকাশিত হয়। আপনি একটি নিউজলেটার সাবস্ক্রাইব বিষয় হিসাবে তাদের মনে করুন.


  • প্রযোজক হল এমন সত্তা যারা বিষয়গুলিতে ইভেন্ট তৈরি করে এবং পাঠায়। আমাদের ডেমো EDA অ্যাপ্লিকেশনে, আমাদের প্রযোজকরা আবহাওয়া সেন্সরগুলির একটি সেট হবে।


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

আমাদের আবেদনের ভূমিকা

আমরা KafkaJS লাইব্রেরি ব্যবহার করে একটি Node.js অ্যাপ্লিকেশন তৈরি করব। এখানে আমাদের অ্যাপ্লিকেশন কিভাবে কাজ করবে তার একটি দ্রুত ওভারভিউ:


  1. আমাদের আবহাওয়া সেন্সর (উৎপাদক) পর্যায়ক্রমে ডেটা তৈরি করবে — যেমন তাপমাত্রা, আর্দ্রতা এবং ব্যারোমেট্রিক চাপ — এবং এই ঘটনাগুলি অ্যাপাচি কাফকাকে পাঠাবে। ডেমো উদ্দেশ্যে, ডেটা এলোমেলোভাবে তৈরি করা হবে।


  2. আমরা একটি ভোক্তা বিষয় শুনতে হবে. একটি নতুন ইভেন্ট প্রাপ্ত হলে, এটি একটি লগে ডেটা লিখবে।


  3. আমরা পুরো সেটআপটি Heroku-এ স্থাপন করব এবং Heroku লগ ব্যবহার করে ইভেন্টগুলি ঘটলে তা নিরীক্ষণ করব।

পূর্বশর্ত

আমরা শুরু করার আগে, নিশ্চিত করুন যে আপনার নিম্নলিখিত আছে:


  • একটি Heroku অ্যাকাউন্ট: আপনার যদি একটি না থাকে, Heroku এ সাইন আপ করুন
  • Heroku CLI: Heroku CLI ডাউনলোড এবং ইনস্টল করুন
  • উন্নয়নের জন্য আপনার স্থানীয় মেশিনে ইনস্টল করা Node.js। আমার মেশিনে, আমি নোড (v.20.9.0) এবং npm (10.4.0) ব্যবহার করছি।


এই সম্পূর্ণ প্রকল্পের কোডবেস এই GitHub সংগ্রহস্থলে উপলব্ধ। কোডটি নির্দ্বিধায় ক্লোন করুন এবং এই পোস্ট জুড়ে অনুসরণ করুন।


এখন যেহেতু আমরা বেসিকগুলি কভার করেছি, আসুন হেরোকুতে আমাদের কাফকা ক্লাস্টার সেট আপ করি এবং নির্মাণ শুরু করি।

হেরোকুতে একটি কাফকা ক্লাস্টার সেট আপ করা হচ্ছে

হেরোকুতে সবকিছু সেট আপ করা যাক। এটি একটি চমত্কার দ্রুত এবং সহজ প্রক্রিয়া.

ধাপ 1: Heroku CLI এর মাধ্যমে লগ ইন করুন

 ~/project$ heroku login

ধাপ 2: একটি Heroku অ্যাপ তৈরি করুন

 ~/project$ heroku create weather-eda


(আমি আমার Heroku অ্যাপের নাম দিয়েছি weather-eda , কিন্তু আপনি আপনার অ্যাপের জন্য একটি অনন্য নাম বেছে নিতে পারেন।)

ধাপ 3: Heroku অ্যাড-অনে Apache Kafka যোগ করুন

 ~/project$ heroku addons:create heroku-kafka:basic-0 Creating heroku-kafka:basic-0 on ⬢ weather-eda... ~$0.139/hour (max $100/month) The cluster should be available in a few minutes. Run `heroku kafka:wait` to wait until the cluster is ready. You can read more about managing Kafka at https://devcenter.heroku.com/articles/kafka-on-heroku#managing-kafka kafka-adjacent-07560 is being created in the background. The app will restart when complete... Use heroku addons:info kafka-adjacent-07560 to check creation progress Use heroku addons:docs heroku-kafka to view documentation


আপনি Heroku অ্যাড-অনে Apache Kafka সম্পর্কে আরও তথ্য এখানে পেতে পারেন। আমাদের ডেমোর জন্য, আমি অ্যাড-অনের বেসিক 0 টিয়ার যোগ করছি। অ্যাড-অনের খরচ হল $0.139/ঘন্টা৷ আমি যখন এই ডেমো অ্যাপ্লিকেশনটি তৈরি করেছিলাম, আমি এক ঘণ্টারও কম সময়ের জন্য অ্যাড-অন ব্যবহার করেছি এবং তারপরে আমি এটিকে কমিয়ে দিয়েছি।


হেরোকু কাফকাকে আপনার জন্য প্রস্তুত করতে কয়েক মিনিট সময় নেয়। খুব শীঘ্রই, আপনি এটি দেখতে পাবেন:


 ~/project$ heroku addons:info kafka-adjacent-07560 === kafka-adjacent-07560 Attachments: weather-eda::KAFKA Installed at: Mon May 27 2024 11:44:37 GMT-0700 (Mountain Standard Time) Max Price: $100/month Owning app: weather-eda Plan: heroku-kafka:basic-0 Price: ~$0.139/hour State: created

ধাপ 4: কাফকা শংসাপত্র এবং কনফিগারেশন পান

আমাদের কাফকা ক্লাস্টার চালু হওয়ার সাথে সাথে, আমাদের শংসাপত্র এবং অন্যান্য কনফিগারেশন পেতে হবে। Heroku আমাদের অ্যাপ্লিকেশনের জন্য বেশ কিছু কনফিগারেশন ভার্স তৈরি করে, কাফকা ক্লাস্টারের তথ্য দিয়ে সেগুলি তৈরি করে যা এইমাত্র তৈরি করা হয়েছে। আমরা নিম্নলিখিতগুলি চালিয়ে এই সমস্ত কনফিগার ভার্স দেখতে পারি:


 ~/project$ heroku config === weather-eda Config Vars KAFKA_CLIENT_CERT: -----BEGIN CERTIFICATE----- MIIDQzCCAiugAwIBAgIBADANBgkqhkiG9w0BAQsFADAyMTAwLgYDVQQDDCdjYS1h ... -----END CERTIFICATE----- KAFKA_CLIENT_CERT_KEY: -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAsgv1oBiF4Az/IQsepHSh5pceL0XLy0uEAokD7ety9J0PTjj3 ... -----END RSA PRIVATE KEY----- KAFKA_PREFIX: columbia-68051. KAFKA_TRUSTED_CERT: -----BEGIN CERTIFICATE----- MIIDfzCCAmegAwIBAgIBADANBgkqhkiG9w0BAQsFADAyMTAwLgYDVQQDDCdjYS1h ... F+f3juViDqm4eLCZBAdoK/DnI4fFrNH3YzhAPdhoHOa8wi4= -----END CERTIFICATE----- KAFKA_URL: kafka+ssl://ec2-18-233-140-74.compute-1.amazonaws.com:9096,kafka+ssl://ec2-18-208-61-56.compute-1.amazonaws.com:9096...kafka+ssl://ec2-34-203-24-91.compute-1.amazonaws.com:9096


আপনি দেখতে পাচ্ছেন, আমাদের বেশ কয়েকটি কনফিগার ভেরিয়েবল রয়েছে। আমরা আমাদের প্রোজেক্ট রুট ফোল্ডারে .env নামক একটি ফাইল চাই যা এই সমস্ত কনফিগার var মান সহ। এটি করার জন্য, আমরা কেবল নিম্নলিখিত কমান্ডটি চালাই:


 ~/project$ heroku config --shell > .env


আমাদের .env ফাইলটি এইরকম দেখাচ্ছে:


 KAFKA_CLIENT_CERT="-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----" KAFKA_CLIENT_CERT_KEY="-----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY-----" KAFKA_PREFIX="columbia-68051." KAFKA_TRUSTED_CERT="-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----" KAFKA_URL="kafka+ssl://ec2-18-233-140-74.compute-1.amazonaws.com:9096,kafka+ssl://ec2-18-208-61-56.compute-1.amazonaws.com:9096...kafka+ssl://ec2-34-203-24-91.compute-1.amazonaws.com:9096"


এছাড়াও, আমরা আমাদের .gitignore ফাইলে .env যোগ করার বিষয়টি নিশ্চিত করি। আমরা আমাদের সংগ্রহস্থলে এই সংবেদনশীল ডেটা কমিট করতে চাই না।

ধাপ 5: Heroku CLI-তে কাফকা প্লাগইন ইনস্টল করুন

Heroku CLI সরাসরি বাক্সের বাইরে কাফকা-সম্পর্কিত কমান্ডের সাথে আসে না। যেহেতু আমরা কাফকা ব্যবহার করছি, তাই আমাদের CLI প্লাগইন ইনস্টল করতে হবে।


 ~/project$ heroku plugins:install heroku-kafka Installing plugin heroku-kafka... installed v2.12.0


এখন, আমরা CLI থেকে আমাদের কাফকা ক্লাস্টার পরিচালনা করতে পারি।


 ~/project$ heroku kafka:info === KAFKA_URL Plan: heroku-kafka:basic-0 Status: available Version: 2.8.2 Created: 2024-05-27T18:44:38.023+00:00 Topics: [··········] 0 / 40 topics, see heroku kafka:topics Prefix: columbia-68051. Partitions: [··········] 0 / 240 partition replicas (partitions × replication factor) Messages: 0 messages/s Traffic: 0 bytes/s in / 0 bytes/s out Data Size: [··········] 0 bytes / 4.00 GB (0.00%) Add-on: kafka-adjacent-07560 ~/project$ heroku kafka:topics === Kafka Topics on KAFKA_URL No topics found on this Kafka cluster. Use heroku kafka:topics:create to create a topic (limit 40)

ধাপ 6: ক্লাস্টারের সাথে ইন্টারঅ্যাক্ট করে পরীক্ষা করুন

ঠিক একটি বিবেক চেক হিসাবে, আসুন আমাদের কাফকা ক্লাস্টারের সাথে খেলা করি। আমরা একটি বিষয় তৈরি করে শুরু করি।


 ~/project$ heroku kafka:topics:create test-topic-01 Creating topic test-topic-01 with compaction disabled and retention time 1 day on kafka-adjacent-07560... done Use `heroku kafka:topics:info test-topic-01` to monitor your topic. Your topic is using the prefix columbia-68051.. ~/project$ heroku kafka:topics:info test-topic-01 ▸ topic test-topic-01 is not available yet


এক মিনিটের মধ্যে আমাদের বিষয় উপলব্ধ হয়ে যায়।


 ~/project$ heroku kafka:topics:info test-topic-01 === kafka-adjacent-07560 :: test-topic-01 Topic Prefix: columbia-68051. Producers: 0 messages/second (0 bytes/second) total Consumers: 0 bytes/second total Partitions: 8 partitions Replication Factor: 3 Compaction: Compaction is disabled for test-topic-01 Retention: 24 hours


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


 ~/project$ heroku kafka:topics:tail test-topic-01


এখান থেকে, টার্মিনালটি বিষয়ের উপর প্রকাশিত যেকোনো ইভেন্টের জন্য অপেক্ষা করে।


একটি পৃথক টার্মিনাল উইন্ডোতে, আমরা একটি প্রযোজক হিসাবে কাজ করব, এবং আমরা এই বিষয়ে কিছু বার্তা প্রকাশ করব৷


 ~/project$ heroku kafka:topics:write test-topic-01 "hello world!"


আমাদের ভোক্তার টার্মিনাল উইন্ডোতে ফিরে, আমরা যা দেখতে পাই:


 ~/project$ heroku kafka:topics:tail test-topic-01 test-topic-01 0 0 12 hello world!


চমৎকার! আমরা সফলভাবে আমাদের কাফকা ক্লাস্টারে একটি বিষয়ের জন্য একটি ইভেন্ট তৈরি এবং ব্যবহার করেছি৷ আমরা আমাদের Node.js অ্যাপ্লিকেশনে যেতে প্রস্তুত। আমাদের খেলার মাঠ পরিপাটি রাখতে এই পরীক্ষার বিষয়কে ধ্বংস করি।


 ~/project$ heroku kafka:topics:destroy test-topic-01 ▸ This command will affect the cluster: kafka-adjacent-07560, which is on weather-eda ▸ To proceed, type weather-eda or re-run this command with --confirm weather-eda > weather-eda Deleting topic test-topic-01... done Your topic has been marked for deletion, and will be removed from the cluster shortly ~/project$ heroku kafka:topics === Kafka Topics on KAFKA_URL No topics found on this Kafka cluster. Use heroku kafka:topics:create to create a topic (limit 40).

ধাপ 7: আমাদের আবেদনের জন্য কাফকা প্রস্তুত করুন

কাফকা ব্যবহার করার জন্য আমাদের অ্যাপ্লিকেশনের জন্য প্রস্তুত করতে, আমাদের দুটি জিনিস তৈরি করতে হবে: একটি বিষয় এবং একটি ভোক্তা গোষ্ঠী৷


আমাদের অ্যাপ্লিকেশন ব্যবহার করবে যে বিষয় তৈরি করা যাক.


 ~/project$ heroku kafka:topics:create weather-data


এর পরে, আমরা একটি ভোক্তা গোষ্ঠী তৈরি করব যেটির একটি অংশ হবে আমাদের অ্যাপ্লিকেশনের গ্রাহক:


 ~/project$ heroku kafka:consumer-groups:create weather-consumers


আমরা আমাদের Node.js অ্যাপ্লিকেশন তৈরি করতে প্রস্তুত!

অ্যাপ্লিকেশন তৈরি করুন

আসুন একটি নতুন প্রকল্প শুরু করি এবং আমাদের নির্ভরতা ইনস্টল করি।


 ~/project$ npm init -y ~/project$ npm install kafkajs dotenv @faker-js/faker pino pino-pretty


আমাদের প্রকল্প দুটি প্রক্রিয়া চলমান থাকবে:


  1. consumer.js , যা এই বিষয়ে সদস্যতা নিয়েছে এবং প্রকাশিত যেকোনো ইভেন্ট লগ করে।


  2. producer.js , যা প্রতি কয়েক সেকেন্ডে বিষয়ের উপর কিছু এলোমেলো আবহাওয়ার তথ্য প্রকাশ করবে।


আমাদের কাফকা ক্লাস্টারের সাথে সংযোগ করতে এই উভয় প্রক্রিয়ারই KafkaJS ব্যবহার করতে হবে, তাই আমরা এটিকে পুনরায় ব্যবহারযোগ্য করতে আমাদের কোড মডুলারাইজ করব।

কাফকা ক্লায়েন্টের সাথে কাজ করা

প্রকল্প src ফোল্ডারে, আমরা kafka.js নামে একটি ফাইল তৈরি করি। এটি এই মত দেখায়:


 const { Kafka } = require('kafkajs'); const BROKER_URLS = process.env.KAFKA_URL.split(',').map(uri => uri.replace('kafka+ssl://','' )) const TOPIC = `${process.env.KAFKA_PREFIX}weather-data` const CONSUMER_GROUP = `${process.env.KAFKA_PREFIX}weather-consumers` const kafka = new Kafka({ clientId: 'weather-eda-app-nodejs-client', brokers: BROKER_URLS, ssl: { rejectUnauthorized: false, ca: process.env.KAFKA_TRUSTED_CERT, key: process.env.KAFKA_CLIENT_CERT_KEY, cert: process.env.KAFKA_CLIENT_CERT, }, }) const producer = async () => { const p = kafka.producer() await p.connect() return p; } const consumer = async () => { const c = kafka.consumer({ groupId: CONSUMER_GROUP, sessionTimeout: 30000 }) await c.connect() await c.subscribe({ topics: [TOPIC] }); return c; } module.exports = { producer, consumer, topic: TOPIC, groupId: CONSUMER_GROUP };


এই ফাইলে, আমরা একটি নতুন কাফকা ক্লায়েন্ট তৈরি করে শুরু করি। এর জন্য কাফকা ব্রোকারদের জন্য ইউআরএলের প্রয়োজন, যা আমরা আমাদের .env ফাইলের KAFKA_URL ভেরিয়েবল থেকে পার্স করতে সক্ষম (যা মূলত কলিং হেরোকু কনফিগ থেকে এসেছে)। সংযোগের প্রচেষ্টাকে প্রমাণীকরণ করতে, আমাদের KAFKA_TRUSTED_CERT , KAFKA_CLIENT_CERT_KEY , এবং KAFKA_CLIENT_CERT প্রদান করতে হবে।


তারপর, আমাদের কাফকা ক্লায়েন্ট থেকে, আমরা একজন producer এবং একজন consumer তৈরি করি, আমাদের গ্রাহকদের weather-data বিষয়ের সদস্যতা নিশ্চিত করে।

কাফকা উপসর্গের ব্যাখ্যা

kafka.js এ লক্ষ্য করুন যে আমরা আমাদের বিষয় এবং ভোক্তা গোষ্ঠীর নামের সাথে KAFKA_PREFIX প্রিপেন্ড করি। আমরা Heroku-এ Apache Kafka-এর জন্য বেসিক 0 প্ল্যান ব্যবহার করছি, যা একটি মাল্টি-টেন্যান্ট কাফকা প্ল্যান। এর মানে আমরা একটি KAFKA_PREFIX এর সাথে কাজ করি। যদিও আমরা আমাদের বিষয়ের weather-data এবং আমাদের ভোক্তা গোষ্ঠীর weather-consumers নাম দিয়েছি, আমাদের মাল্টি-টেন্যান্ট কাফকা ক্লাস্টারে তাদের প্রকৃত নাম অবশ্যই তাদের সামনে KAFKA_PREFIX লেখা থাকতে হবে (তারা অনন্য তা নিশ্চিত করতে)।


সুতরাং, প্রযুক্তিগতভাবে, আমাদের ডেমোর জন্য, আসল বিষয়ের নাম হল columbia-68051.weather-data , weather-data নয়। (অনুরূপভাবে ভোক্তা গোষ্ঠীর নামের জন্য।)

প্রযোজক প্রক্রিয়া

এখন, আমাদের পটভূমি প্রক্রিয়া তৈরি করা যাক যা আমাদের আবহাওয়া সেন্সর প্রযোজক হিসাবে কাজ করবে। আমাদের প্রোজেক্ট রুট ফোল্ডারে, আমাদের কাছে producer.js নামে একটি ফাইল আছে। এটি এই মত দেখায়:


 require('dotenv').config(); const kafka = require('./src/kafka.js'); const { faker } = require('@faker-js/faker'); const SENSORS = ['sensor01','sensor02','sensor03','sensor04','sensor05']; const MAX_DELAY_MS = 20000; const READINGS = ['temperature','humidity','barometric_pressure']; const MAX_TEMP = 130; const MIN_PRESSURE = 2910; const PRESSURE_RANGE = 160; const getRandom = (arr) => arr[faker.number.int(arr.length - 1)]; const getRandomReading = { temperature: () => faker.number.int(MAX_TEMP) + (faker.number.int(100) / 100), humidity: () => faker.number.int(100) / 100, barometric_pressure: () => (MIN_PRESSURE + faker.number.int(PRESSURE_RANGE)) / 100 }; const sleep = (ms) => { return new Promise((resolve) => { setTimeout(resolve, ms); }); }; (async () => { const producer = await kafka.producer() while(true) { const sensor = getRandom(SENSORS) const reading = getRandom(READINGS) const value = getRandomReading[reading]() const data = { reading, value } await producer.send({ topic: kafka.topic, messages: [{ key: sensor, value: JSON.stringify(data) }] }) await sleep(faker.number.int(MAX_DELAY_MS)) } })()


ফাইলের অনেক কোড এলোমেলো মান তৈরি করার সাথে সম্পর্কিত। আমি গুরুত্বপূর্ণ অংশগুলি হাইলাইট করব:


  • আমরা পাঁচটি ভিন্ন আবহাওয়া সেন্সর থাকার অনুকরণ করব। SENSORS -এ তাদের নাম পাওয়া যায়।


  • একটি সেন্সর তিনটি সম্ভাব্য রিডিংয়ের একটির জন্য একটি মান নির্গত (প্রকাশ) করবে: temperature , humidity বা barometric_pressuregetRandomReading অবজেক্টের এই প্রতিটি রিডিংয়ের জন্য একটি ফাংশন রয়েছে, একটি যুক্তিসঙ্গত সংশ্লিষ্ট মান তৈরি করতে।


  • সম্পূর্ণ প্রক্রিয়াটি অসীম while লুপ সহ একটি async ফাংশন হিসাবে চলে।


while লুপের মধ্যে, আমরা:


  • এলোমেলোভাবে একটি sensor চয়ন করুন।
  • এলোমেলোভাবে একটি reading চয়ন করুন.
  • সেই পড়ার জন্য একটি র্যান্ডম value তৈরি করুন।
  • producer.send কল করুন। এই তথ্যটি বিষয়ে প্রকাশ করতে পাঠান। sensor ইভেন্টের key হিসাবে কাজ করে, যখন reading এবং value ইভেন্ট বার্তা গঠন করবে।
  • তারপরে, আমরা লুপের পরবর্তী পুনরাবৃত্তির আগে 20 সেকেন্ড পর্যন্ত অপেক্ষা করি।

ভোক্তা প্রক্রিয়া

consumer.js এ ব্যাকগ্রাউন্ড প্রক্রিয়া যথেষ্ট সহজ।


 require('dotenv').config(); const logger = require('./src/logger.js'); const kafka = require('./src/kafka.js'); (async () => { const consumer = await kafka.consumer() await consumer.run({ eachMessage: async ({ topic, partition, message }) => { const sensorId = message.key.toString() const messageObj = JSON.parse(message.value.toString()) const logMessage = { sensorId } logMessage[messageObj.reading] = messageObj.value logger.info(logMessage) } }) })()


আমাদের consumer ইতিমধ্যে weather-data বিষয়ের সদস্যতা নিয়েছেন। আমরা consumer.run কল করি এবং তারপর আমরা eachMessage জন্য একটি হ্যান্ডলার সেট আপ করি। যখনই কাফকা কোন বার্তার consumer অবহিত করেন, তখনই এটি বার্তাটি লগ করে। এখানেই শেষ এটা পেতে ওখানে যাও।

প্রক্রিয়া এবং Procfile

package.json ফাইলে, আমাদের কিছু scripts যোগ করতে হবে যা আমাদের প্রযোজক এবং ভোক্তা ব্যাকগ্রাউন্ড প্রক্রিয়া শুরু করে। ফাইলটিতে এখন নিম্নলিখিতগুলি অন্তর্ভুক্ত করা উচিত:


 ... "scripts": { "start": "echo 'do nothing'", "start:consumer": "node consumer.js", "start:producer": "node producer.js" }, ...


গুরুত্বপূর্ণগুলি হল start:consumer এবং start:producer । কিন্তু আমরা আমাদের ফাইলে start রাখি (যদিও এটি অর্থপূর্ণ কিছু করে না) কারণ Heroku নির্মাতা আশা করে যে এটি সেখানে থাকবে।


এরপরে, আমরা একটি Procfile তৈরি করি যা Heroku কে বলবে কিভাবে আমাদের Heroku অ্যাপের জন্য আমাদের প্রয়োজনীয় বিভিন্ন কর্মীদের শুরু করতে হয়। আমাদের প্রকল্পের রুট ফোল্ডারে, Procfile এর মত দেখতে হবে:


 consumer_worker: npm run start:consumer producer_worker: npm run start:producer


বেশ সহজ, তাই না? আমাদের কাছে একজন ব্যাকগ্রাউন্ড প্রসেস ওয়ার্কার থাকবে যার নাম consumer_worker , আর আরেকজন নাম producer_worker । আপনি লক্ষ্য করবেন যে আমাদের কোনো web কর্মী নেই যা আপনি সাধারণত একটি ওয়েব অ্যাপ্লিকেশনের জন্য Procfile এ দেখতে পাবেন। আমাদের Heroku অ্যাপের জন্য, আমাদের শুধু দুটি ব্যাকগ্রাউন্ড কর্মী প্রয়োজন। আমাদের web দরকার নেই।

প্রয়োগ এবং অ্যাপ্লিকেশন পরীক্ষা

যে সঙ্গে, আমাদের কোড সব সেট করা হয়. আমরা আমাদের সমস্ত কোড রেপোতে প্রতিশ্রুতিবদ্ধ করেছি, এবং আমরা স্থাপন করতে প্রস্তুত।


 ~/project$ git push heroku main … remote: -----> Build succeeded! … remote: -----> Compressing... remote: Done: 48.6M remote: -----> Launching... … remote: Verifying deploy... done


আমরা স্থাপন করার পরে, আমরা নিশ্চিত করতে চাই যে আমরা আমাদের ডাইনোগুলিকে সঠিকভাবে স্কেল করি। ওয়েব প্রক্রিয়ার জন্য আমাদের একটি ডাইনোর প্রয়োজন নেই, তবে consumer_worker এবং producer_worker উভয়ের জন্যই আমাদের একটির প্রয়োজন হবে। আমরা আমাদের প্রয়োজনের উপর ভিত্তি করে এই প্রক্রিয়াগুলি সেট করতে নিম্নলিখিত কমান্ডটি চালাই।


 ~/project$ heroku ps:scale web=0 consumer_worker=1 producer_worker=1 Scaling dynos... done, now running producer_worker at 1:Eco, consumer_worker at 1:Eco, web at 0:Eco


এখন, সবকিছু আপ এবং চলমান করা উচিত. পর্দার আড়ালে, আমাদের producer_worker কাফকা ক্লাস্টারের সাথে সংযোগ স্থাপন করা উচিত এবং তারপর প্রতি কয়েক সেকেন্ডে আবহাওয়া সেন্সর ডেটা প্রকাশ করা শুরু করা উচিত। তারপরে, আমাদের consumer_worker কাফকা ক্লাস্টারের সাথে সংযোগ স্থাপন করা উচিত এবং এটি যে বিষয়ের সদস্যতা নিয়েছে সেখান থেকে প্রাপ্ত যেকোন বার্তাগুলিকে লগ করা উচিত৷


আমাদের consumer_worker কি করছে তা দেখতে, আমরা আমাদের Heroku লগগুলিতে দেখতে পারি।


 ~/project$ heroku logs --tail … heroku[producer_worker.1]: Starting process with command `npm run start:producer` heroku[producer_worker.1]: State changed from starting to up app[producer_worker.1]: app[producer_worker.1]: > [email protected] start:producer app[producer_worker.1]: > node producer.js app[producer_worker.1]: … heroku[consumer_worker.1]: Starting process with command `npm run start:consumer` heroku[consumer_worker.1]: State changed from starting to up app[consumer_worker.1]: app[consumer_worker.1]: > [email protected] start:consumer app[consumer_worker.1]: > node consumer.js app[consumer_worker.1]: app[consumer_worker.1]: {"level":"INFO","timestamp":"2024-05-28T02:31:20.660Z","logger":"kafkajs","message":"[Consumer] Starting","groupId":"columbia-68051.weather-consumers"} app[consumer_worker.1]: {"level":"INFO","timestamp":"2024-05-28T02:31:23.702Z","logger":"kafkajs","message":"[ConsumerGroup] Consumer has joined the group","groupId":"columbia-68051.weather-consumers","memberId":"weather-eda-app-nodejs-client-3ee5d1fa-eba9-4b59-826c-d3b924a6e4e4","leaderId":"weather-eda-app-nodejs-client-3ee5d1fa-eba9-4b59-826c-d3b924a6e4e4","isLeader":true,"memberAssignment":{"columbia-68051.test-topic-1":[0,1,2,3,4,5,6,7]},"groupProtocol":"RoundRobinAssigner","duration":3041} app[consumer_worker.1]: [2024-05-28 02:31:23.755 +0000] INFO (21): {"sensorId":"sensor01","temperature":87.84} app[consumer_worker.1]: [2024-05-28 02:31:23.764 +0000] INFO (21): {"sensorId":"sensor01","humidity":0.3} app[consumer_worker.1]: [2024-05-28 02:31:23.777 +0000] INFO (21): {"sensorId":"sensor03","temperature":22.11} app[consumer_worker.1]: [2024-05-28 02:31:37.773 +0000] INFO (21): {"sensorId":"sensor01","barometric_pressure":29.71} app[consumer_worker.1]: [2024-05-28 02:31:54.495 +0000] INFO (21): {"sensorId":"sensor05","barometric_pressure":29.55} app[consumer_worker.1]: [2024-05-28 02:32:02.629 +0000] INFO (21): {"sensorId":"sensor04","temperature":90.58} app[consumer_worker.1]: [2024-05-28 02:32:03.995 +0000] INFO (21): {"sensorId":"sensor02","barometric_pressure":29.25} app[consumer_worker.1]: [2024-05-28 02:32:12.688 +0000] INFO (21): {"sensorId":"sensor04","humidity":0.1} app[consumer_worker.1]: [2024-05-28 02:32:32.127 +0000] INFO (21): {"sensorId":"sensor01","humidity":0.34} app[consumer_worker.1]: [2024-05-28 02:32:32.851 +0000] INFO (21): {"sensorId":"sensor02","humidity":0.61} app[consumer_worker.1]: [2024-05-28 02:32:37.200 +0000] INFO (21): {"sensorId":"sensor01","barometric_pressure":30.36} app[consumer_worker.1]: [2024-05-28 02:32:50.388 +0000] INFO (21): {"sensorId":"sensor03","temperature":104.55}


এটা কাজ করে! আমরা জানি যে আমাদের প্রযোজক পর্যায়ক্রমে কাফকার কাছে বার্তা প্রকাশ করছেন কারণ আমাদের ভোক্তা সেগুলি গ্রহণ করছেন এবং তারপরে লগ করছেন৷


অবশ্যই, একটি বড় EDA অ্যাপে, প্রতিটি সেন্সর একটি প্রযোজক। তারা বিভিন্ন উদ্দেশ্যে একাধিক বিষয়ে প্রকাশ করতে পারে, অথবা তারা সবাই একই বিষয়ে প্রকাশ করতে পারে। এবং আপনার ভোক্তা একাধিক বিষয় সাবস্ক্রাইব করা যেতে পারে. এছাড়াও, আমাদের ডেমো অ্যাপে, আমাদের ভোক্তারা eachMessage প্রচুর পরিমাণে নির্গত করেছেন; কিন্তু একটি EDA অ্যাপ্লিকেশনে, একজন ভোক্তা তৃতীয় পক্ষের API কল করে, একটি এসএমএস বিজ্ঞপ্তি পাঠিয়ে বা একটি ডাটাবেস জিজ্ঞাসা করে প্রতিক্রিয়া জানাতে পারে।


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

উপসংহার

EDA বেশ শক্তিশালী — সহজ স্কেলেবিলিটি এবং রিয়েল-টাইম ডেটা প্রসেসিংয়ের মতো মূল বৈশিষ্ট্যগুলি উপভোগ করার সময় আপনি আপনার সিস্টেমগুলিকে ডিকপল করতে পারেন। EDA-এর জন্য, কাফকা হল একটি মূল টুল, যা আপনাকে সহজে উচ্চ-থ্রুপুট ডেটা স্ট্রীম পরিচালনা করতে সাহায্য করে। Heroku এ Apache Kafka ব্যবহার করা আপনাকে দ্রুত শুরু করতে সাহায্য করে। যেহেতু এটি একটি পরিচালিত পরিষেবা, তাই আপনাকে কাফকা ক্লাস্টার ব্যবস্থাপনার জটিল অংশগুলি নিয়ে চিন্তা করতে হবে না। আপনি শুধু আপনার অ্যাপস তৈরিতে ফোকাস করতে পারেন।


এখান থেকে, আপনার পরীক্ষা এবং প্রোটোটাইপ করার সময় এসেছে। EDA এর সাথে কোন ব্যবহারের ক্ষেত্রে উপযুক্ত তা চিহ্নিত করুন। ডুব দিন, Heroku-এ এটি পরীক্ষা করুন এবং আশ্চর্যজনক কিছু তৈরি করুন। শুভ কোডিং!