আপনি কি কখনও ভেবে দেখেছেন যে আপনার কিছু প্রিয় অ্যাপ রিয়েল-টাইম আপডেটগুলি কীভাবে পরিচালনা করে? লাইভ স্পোর্টস স্কোর, স্টক মার্কেট টিকার্স, বা এমনকি সোশ্যাল মিডিয়া নোটিফিকেশন - এগুলি সবই ইভেন্ট-চালিত আর্কিটেকচারের (EDA) উপর নির্ভর করে তাৎক্ষণিকভাবে ডেটা প্রক্রিয়া করার জন্য। EDA হল একটি কথোপকথনের মত যেখানে প্রতিটি নতুন তথ্য একটি তাৎক্ষণিক প্রতিক্রিয়া ট্রিগার করে। এটি একটি অ্যাপ্লিকেশনকে আরও ইন্টারেক্টিভ এবং প্রতিক্রিয়াশীল করে তোলে।
এই ওয়াকথ্রুতে, আমরা Heroku-এ Apache Kafka ব্যবহার করে একটি সাধারণ ইভেন্ট-চালিত অ্যাপ্লিকেশন তৈরি করার মাধ্যমে আপনাকে গাইড করব। আমরা কভার করব:
Apache Kafka EDA সিস্টেম তৈরির জন্য একটি শক্তিশালী হাতিয়ার। এটি একটি ওপেন সোর্স প্ল্যাটফর্ম যা রিয়েল-টাইম ডেটা ফিড পরিচালনা করার জন্য ডিজাইন করা হয়েছে। Apache Kafka on Heroku একটি Heroku অ্যাড-অন যা কাফকাকে একটি পরিষেবা হিসেবে প্রদান করে। Heroku অ্যাপ্লিকেশন স্থাপন এবং পরিচালনা করা বেশ সহজ করে তোলে এবং আমি সম্প্রতি আমার প্রকল্পগুলিতে এটি আরও ব্যবহার করছি। আপনি যখন একটি ইভেন্ট-চালিত অ্যাপ্লিকেশন চালাতে চান তখন Heroku এর সাথে কাফকাকে একত্রিত করা সেটআপ প্রক্রিয়াটিকে সহজ করে।
এই গাইডের শেষ নাগাদ, আপনার কাছে একটি চলমান অ্যাপ্লিকেশন থাকবে যা Heroku-এ Apache Kafka-এর সাথে EDA-এর ক্ষমতা প্রদর্শন করবে। চল শুরু করি!
আমরা কোডে ডুব দেওয়ার আগে, আসুন দ্রুত কিছু মূল ধারণা পর্যালোচনা করি। একবার আপনি এইগুলি বুঝতে পারলে, অনুসরণ করা সহজ হবে।
আমরা KafkaJS লাইব্রেরি ব্যবহার করে একটি Node.js অ্যাপ্লিকেশন তৈরি করব। এখানে আমাদের অ্যাপ্লিকেশন কিভাবে কাজ করবে তার একটি দ্রুত ওভারভিউ:
আমাদের আবহাওয়া সেন্সর (উৎপাদক) পর্যায়ক্রমে ডেটা তৈরি করবে — যেমন তাপমাত্রা, আর্দ্রতা এবং ব্যারোমেট্রিক চাপ — এবং এই ঘটনাগুলি অ্যাপাচি কাফকাকে পাঠাবে। ডেমো উদ্দেশ্যে, ডেটা এলোমেলোভাবে তৈরি করা হবে।
আমরা একটি ভোক্তা বিষয় শুনতে হবে. একটি নতুন ইভেন্ট প্রাপ্ত হলে, এটি একটি লগে ডেটা লিখবে।
আমরা পুরো সেটআপটি Heroku-এ স্থাপন করব এবং Heroku লগ ব্যবহার করে ইভেন্টগুলি ঘটলে তা নিরীক্ষণ করব।
আমরা শুরু করার আগে, নিশ্চিত করুন যে আপনার নিম্নলিখিত আছে:
এই সম্পূর্ণ প্রকল্পের কোডবেস এই GitHub সংগ্রহস্থলে উপলব্ধ। কোডটি নির্দ্বিধায় ক্লোন করুন এবং এই পোস্ট জুড়ে অনুসরণ করুন।
এখন যেহেতু আমরা বেসিকগুলি কভার করেছি, আসুন হেরোকুতে আমাদের কাফকা ক্লাস্টার সেট আপ করি এবং নির্মাণ শুরু করি।
হেরোকুতে সবকিছু সেট আপ করা যাক। এটি একটি চমত্কার দ্রুত এবং সহজ প্রক্রিয়া.
~/project$ heroku login
~/project$ heroku create weather-eda
(আমি আমার Heroku অ্যাপের নাম দিয়েছি weather-eda
, কিন্তু আপনি আপনার অ্যাপের জন্য একটি অনন্য নাম বেছে নিতে পারেন।)
~/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
আমাদের কাফকা ক্লাস্টার চালু হওয়ার সাথে সাথে, আমাদের শংসাপত্র এবং অন্যান্য কনফিগারেশন পেতে হবে। 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 যোগ করার বিষয়টি নিশ্চিত করি। আমরা আমাদের সংগ্রহস্থলে এই সংবেদনশীল ডেটা কমিট করতে চাই না।
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)
ঠিক একটি বিবেক চেক হিসাবে, আসুন আমাদের কাফকা ক্লাস্টারের সাথে খেলা করি। আমরা একটি বিষয় তৈরি করে শুরু করি।
~/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).
কাফকা ব্যবহার করার জন্য আমাদের অ্যাপ্লিকেশনের জন্য প্রস্তুত করতে, আমাদের দুটি জিনিস তৈরি করতে হবে: একটি বিষয় এবং একটি ভোক্তা গোষ্ঠী৷
আমাদের অ্যাপ্লিকেশন ব্যবহার করবে যে বিষয় তৈরি করা যাক.
~/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
আমাদের প্রকল্প দুটি প্রক্রিয়া চলমান থাকবে:
consumer.js
, যা এই বিষয়ে সদস্যতা নিয়েছে এবং প্রকাশিত যেকোনো ইভেন্ট লগ করে।
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_pressure
। getRandomReading
অবজেক্টের এই প্রতিটি রিডিংয়ের জন্য একটি ফাংশন রয়েছে, একটি যুক্তিসঙ্গত সংশ্লিষ্ট মান তৈরি করতে।
while
লুপ সহ একটি async
ফাংশন হিসাবে চলে।
while
লুপের মধ্যে, আমরা:
sensor
চয়ন করুন।reading
চয়ন করুন.value
তৈরি করুন।producer.send
কল করুন। এই তথ্যটি বিষয়ে প্রকাশ করতে পাঠান। sensor
ইভেন্টের key
হিসাবে কাজ করে, যখন reading
এবং value
ইভেন্ট বার্তা গঠন করবে। 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-এ এটি পরীক্ষা করুন এবং আশ্চর্যজনক কিছু তৈরি করুন। শুভ কোডিং!