ধীর ব্যবসায়ের প্রক্রিয়া
কখনও কখনও আমাদের ধীর ব্যবসায়ের প্রক্রিয়া করার প্রয়োজন হয়, অন্য অনুরোধগুলির প্রক্রিয়াকরণের উপর ধীর ব্যবসায়ের প্রভাব কমাতে বিভিন্ন পরিস্থিতিতে এই ব্যবসাগুলি বিভিন্ন প্রক্রিয়া পরিকল্পনা ব্যবহার করতে পারে।
পরিকল্পনা এক: বার্তা কিউ ব্যবহার করা
redis কিউ stomp কিউ গাইড অনুসরণ করুন।
সুবিধা
বিপর্যয়জনক বিপুল ব্যবসায়ের প্রক্রিয়া অনুরোধগুলির মোকাবেলা করতে পারে
অসুবিধা
মালিকদের জন্য সরাসরি ফলাফল প্রদান করতে পারে না। ফলাফলগুলি জারি করতে চাইলে অন্যান্য পরিষেবার সঙ্গে সহযোগিতা প্রয়োজন, যেমন webman/push ব্যবহার করে কার্যকরী ফলাফলগুলি প্রেরণ করা।
পরিকল্পনা দুই: নতুন HTTP পোর্ট যোগ করা
নতুন HTTP পোর্ট ধীর অনুরোধগুলি প্রক্রিয়া করার জন্য তৈরি করুন, এই ধীর অনুরোধগুলি এই পোর্টে প্রবেশ করতে বিশেষ প্রক্রিয়া সেটের সাথে মোকাবেলা করে, প্রক্রিয়া করার পর সরাসরি ফলাফলগুলি ক্লায়েন্টকে ফেরত দেয়।
সুবিধা
ডেটা সরাসরি ক্লায়েন্টকে ফিরিয়ে দিতে পারে
অসুবিধা
বিপর্যয়জনক বিপুল অনুরোধগুলির মোকাবেলা করতে পারে না
কার্যকরী পদক্ষেপ
config/process.php
এ নিম্নলিখিত কনফিগারেশনটি যুক্ত করুন।
return [
// ... এখানে অন্যান্য কনফিগারেশন বাদ দেওয়া হয়েছে ...
'task' => [
'handler' => \Webman\App::class,
'listen' => 'http://0.0.0.0:8686',
'count' => 8, // প্রক্রিয়ার সংখ্যা
'user' => '',
'group' => '',
'reusePort' => true,
'constructor' => [
'requestClass' => \support\Request::class, // request ক্লাস সেট
'logger' => \support\Log::channel('default'), // লগ ইনস্ট্যান্স
'appPath' => app_path(), // অ্যাপ ডিরেক্টরি অবস্থান
'publicPath' => public_path() // পাবলিক ডিরেক্টরি অবস্থান
]
]
];
এভাবে ধীর এপিআইগুলি http://127.0.0.1:8686/
এই প্রক্রিয়াগুলির মাধ্যমে যাবে, অন্যান্য প্রক্রিয়ার ব্যবসায়ের প্রক্রিয়াকরণের উপর কোনও প্রভাব ফেলবে না।
ফ্রন্টএন্ডকে পোর্টের পার্থক্য বুঝাতে না দিয়ে, nginx-এ 8686 পোর্টের জন্য একটি প্রক্সি যোগ করতে পারেন। ধরুন ধীর এপিআই অনুরোধের পথগুলি সব \tast
দিয়ে শুরু হয়, সম্পূর্ণ nginx কনফিগারেশনটি নিম্নরূপ হবে:
upstream webman {
server 127.0.0.1:8787;
keepalive 10240;
}
# নতুন 8686 আপস্ট্রিম যোগ করা
upstream task {
server 127.0.0.1:8686;
keepalive 10240;
}
server {
server_name webman.com;
listen 80;
access_log off;
root /path/webman/public;
# /tast দিয়ে শুরু হওয়া অনুরোধগুলি 8686 পোর্টের মাধ্যমে যাবে, দয়া করে আপনার প্রয়োজনীয় প্রিফিক্সের জন্য /tast পরিবর্তন করুন
location /tast {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://task;
}
# অন্যান্য অনুরোধগুলি মূল 8787 পোর্টের মাধ্যমে যাবে
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Connection "";
if (!-f $request_filename){
proxy_pass http://webman;
}
}
}
এভাবে ক্লায়েন্ট domain.com/tast/xxx
এ প্রবেশ করার সময় সেটা আলাদা 8686 পোর্টের মাধ্যমে প্রক্রিয়া হবে, 8787 পোর্টের অনুরোধ প্রক্রিয়াকরণের উপর কোনও প্রভাব ফেলবে না।
পরিকল্পনা তিন: HTTP chunked ব্যবহার করে অ্যালাইনকভাবে ডেটা পাঠানো
সুবিধা
সরাসরি ডেটা ক্লায়েন্টকে ফিরিয়ে দেওয়া যেতে পারে
workerman/http-client ইনস্টল করুন
composer require workerman/http-client
app/controller/IndexController.php
<?php
namespace app\controller;
use support\Request;
use support\Response;
use Workerman\Protocols\Http\Chunk;
class IndexController
{
public function index(Request $request)
{
$connection = $request->connection;
$http = new \Workerman\Http\Client();
$http->get('https://example.com/', function ($response) use ($connection) {
$connection->send(new Chunk($response->getBody()));
$connection->send(new Chunk('')); // খালি chunk পাঠানোতে response শেষ নির্দেশ করে
});
// প্রথমে একটি HTTP হেডার পাঠানো হয়, পরবর্তী ডেটা অ্যালাইনকভাবে প্রেরিত হয়
return response()->withHeaders([
"Transfer-Encoding" => "chunked",
]);
}
}
নোট
এই উদাহরণেworkerman/http-client
ক্লায়েন্ট HTTP ফলাফলগুলি অ্যালাইনকভাবে সংগ্রহ করে এবং ডেটা ফেরত দেয়, এছাড়াও অন্যান্য অ্যালাইনক ক্লায়েন্ট যেমন AsyncTcpConnection ব্যবহার করা যেতে পারে।