হার্টবিট

নোট: দীর্ঘ সংযোগের অ্যাপ্লিকেশনগুলির জন্য হার্টবিট যুক্ত করা প্রয়োজন, নইলে সংযোগ দীর্ঘ সময়ের জন্য যোগাযোগ না করার কারণে রাউটিং নোড দ্বারা বেয়ারলিকভাবে বিচ্ছিন্ন হতে পারে।

হার্টবিটের প্রধান দুটি কার্যকারিতা রয়েছে:

  1. ক্লায়েন্ট সংযোগ বন্ধ হওয়ার পরিস্থিতি এড়াতে সময়মত সার্ভারে কিছু ডেটা পাঠায় কারণ দীর্ঘ সময়ের জন্য যোগাযোগ না করলে কিছু নোডের ফায়ারওয়াল সংযোগটি বন্ধ করে দিতে পারে।

  2. সার্ভার হার্টবিটের মাধ্যমে নির্ধারণ করতে পারে যে ক্লায়েন্ট অনলাইনে আছে কি না। যদি ক্লায়েন্ট নির্ধারিত সময়ের মধ্যে কোনো ডেটা না পাঠায়, তাহলে ধরা হয় ক্লায়েন্ট অফলাইন। এইভাবে ক্লায়েন্টের বিদ্যুৎ বিভ্রাট, নেটওয়ার্ক বিচ্ছিন্নতা ইত্যাদির কারণে অফলাইনের ঘটনা সনাক্ত করা যায়।

হার্টবিটের মধ্যে অতিরিক্ত সময়ের পরামর্শ:

প্রস্তাবিত ক্লায়েন্টের হার্টবিট পাঠানোর সময় অবশ্যই 60 সেকেন্ডের কম হওয়া উচিত, যেমন 55 সেকেন্ড।

হার্টবিটের ডেটা ফরম্যাটের উপর কোন নির্দিষ্টতা নেই, সার্ভারটি কেবল পছন্দসই হতে হবে।

হার্টবিটের উদাহরণ

<?php
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// হার্টবিটের সময়সীমা 55 সেকেন্ড
define('HEARTBEAT_TIME', 55);

$worker = new Worker('text://0.0.0.0:1234');

$worker->onMessage = function(TcpConnection $connection, $msg) {
    // connection-এর জন্য একটি lastMessageTime বৈশিষ্ট্য অস্থায়ীভাবে সেট করুন, শেষবার সংবেদনশীল সময় রেকর্ড করতে
    $connection->lastMessageTime = time();
    // অন্যান্য ব্যবসায়িক লজিক...
};

// প্রক্রিয়া শুরু হলে প্রতি 10 সেকেন্ড পর একটি টাইমার সেট করুন
$worker->onWorkerStart = function($worker) {
    Timer::add(10, function()use($worker){
        $time_now = time();
        foreach($worker->connections as $connection) {
            // সম্ভবত ওই connection কখনোই কোন বার্তা পায়নি, তাহলে lastMessageTime বর্তমান সময়ে সেট করুন
            if (empty($connection->lastMessageTime)) {
                $connection->lastMessageTime = $time_now;
                continue;
            }
            // শেষ যোগাযোগের সময়সীমা হার্টবিট সময়সীমার চেয়ে বেশি হলে ক্লায়েন্ট অফলাইন হিসাবে বিবেচিত হয়, সংযোগ বন্ধ করুন
            if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
                $connection->close();
            }
        }
    });
};

Worker::runAll();

উপরোক্ত কনফিগারেশন অনুযায়ী, যদি ক্লায়েন্ট 55 সেকেন্ড এর অধিক সময় সার্ভারকে কোন ডেটা পাঠায় না, তবে সার্ভার ক্লায়েন্টকে অফলাইন হিসাবে বিবেচনা করবে, সংযোগ বন্ধ করবে এবং onClose ট্রিগার করবে।

সংযোগ বিচ্ছিন্ন হলে পুনঃসংযোগ (গুরুতর)

ক্লায়েন্টের হার্টবিট পাঠানো বা সার্ভারের হার্টবিট পাঠানো যে কোনো ক্ষেত্রে সংযোগ বিচ্ছিন্ন হতে পারে। উদাহরণস্বরূপ, ব্রাউজার সর্বনিম্ন করার সময় js বিরতি, ব্রাউজার অন্য ট্যাব পৃষ্ঠায় পরিবর্তিত হলে js বিরতি, কম্পিউটার স্লিপ মুডে প্রবেশ করা ইত্যাদি, মোবাইল ডিভাইস নেটওয়ার্ক পরিবর্তন করা, সিগন্যাল দুর্বল হওয়া, ফোন স্ক্রীন বন্ধ হওয়া, মোবাইল অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে চলে যাওয়া, রাউটার ব্যর্থতা, ব্যবসা সক্রিয়ভাবে বিচ্ছিন্ন করা ইত্যাদি। বিশেষ করে বাহ্যিক ইন্টারনেট পরিবেশ জটিল, অনেক রাউটিং নোড 1 মিনিটের মধ্যে সক্রিয় সংযোগ পরিষ্কার করে, এটি কারণ যে হার্টবিটের সময়সীমা 1 মিনিটের কম সুপারিশ করা হয়।

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