07
مهخب، بیاید اول ببینیم Soketi وب سوکت متن باز اصلاً چیه؟ به زبون ساده، Soketi یه سرور وبسوکت سبک و سریعِ متنبازه که به شما کمک میکنه قابلیتهای بلادرنگ (Real-Time) رو به اپلیکیشنهاتون اضافه کنید. حالا این قابلیتهای بلادرنگ چیان؟ فکر کن یه اپ چت مثل تلگرام داری که پیامها همون لحظه که یکی میفرسته، برای بقیه نمایش داده میشه. یا یه داشبورد که دادههای سهام یا سنسورهای IoT رو لحظهای آپدیت میکنه. اینا همش با Soketi وب سوکت متن باز شدنیه.
Soketi یه جایگزین باحال برای سرویسهای پولی مثل Pusherه. اگه قبلاً با Pusher کار کردید، میدونید که برای پروژههای بزرگ حسابی گرونه! 😅 اما Soketi وب سوکت متن باز رایگانه و با پروتکل Pusher نسخه 7 سازگاره. یعنی اگه پروژهتون با Pusher کار میکنه، با چندتا تغییر ساده میتونید به Soketi سوئیچ کنید و کلی هزینه صرفهجویی کنید.
این سرور روی یه کتابخونه سریع به اسم uWebSockets.js ساخته شده که تو Node.js اجرا میشه. بنچمارکها نشون میدن که Soketi وب سوکت متن باز حدود 8.5 برابر از Fastify و 10 برابر از Socket.IO سریعتره! 😮 این سرعت باعث میشه اپلیکیشنهاتون مثل یه ماشین فرمول یک کار کنن.
شاید بگید: «ابزارهای دیگه هم هستن، چرا Soketi وب سوکت متن باز؟» بیاید چندتا دلیل محکم بیارم که چرا این ابزار میتونه رفیق شفیقتون تو برنامهنویسی بشه:
رایگان و متنباز
برخلاف سرویسهایی مثل Pusher یا Ably که باید اشتراک ماهیانه بدید، Soketi وب سوکت متن باز کاملاً رایگانه و کدش روی گیتهاب در دسترسه. میتونید هر تغییری که خواستید توش بدید.
فوقالعاده سریع و سبک
به لطف uWebSockets.js، Soketi خیلی کممصرفه. مثلاً یه سرور با 1 گیگ رم و 1 هسته CPU میتونه 500 اتصال همزمان با ترافیک بالا رو مدیریت کنه.
سازگاری با Pusher
اگه پروژهتون با Pusher کار میکنه، مهاجرت به Soketi وب سوکت متن باز مثل آب خوردنه. فقط کافیه هاست و پورت رو عوض کنید.
انعطافپذیری بالا
چه بخواید تو لوکال تست کنید، چه روی سرورهای بزرگ پروژهتون رو اجرا کنید، Soketi باهاتون راه میاد. از دیتابیسهایی مثل Redis، DynamoDB، و Postgres پشتیبانی میکنه.
متریکهای مانیتورینگ
Soketi وب سوکت متن باز متریکهایی مثل تعداد اتصالها و پیامها ارائه میده که میتونید با ابزارهایی مثل Prometheus و Grafana مانیتورشون کنید.
استقرار انعطافپذیر
میتونید Soketi رو روی سرورهای ابری مثل AWS، DigitalOcean، یا Cloudflare Workers اجرا کنید.
Soketi وب سوکت متن باز توسط تیمی به اسم Renoki Co. توسعه داده شده. هدفشون ساخت یه جایگزین رایگان و سریع برای سرویسهای تجاری مثل Pusher بوده. این پروژه از همون اول بهصورت متنباز روی گیتهاب منتشر شد و تا سال 2025 بیش از 1.2K ستاره گرفته. تو Reddit و Hacker News، کاربرها از سرعت و سادگی Soketi وب سوکت متن باز تعریف کردن و گفتن که هزینههای پروژهشون رو حسابی کم کرده.
وبسوکت یه پروتکله که به سرور و کلاینت اجازه میده یه ارتباط دوطرفه و مداوم داشته باشن. برخلاف HTTP که باید مدام درخواست بفرستی، وبسوکت یه کانال باز نگه میداره. مثلاً تو یه اپ چت، سرور به محض دریافت پیام جدید به کلاینت خبر میده. Soketi وب سوکت متن باز این ارتباط رو سریع و ساده مدیریت میکنه.
بیاید چندتا سناریو ببینیم که Soketi توش میدرخشه:
چت رومها
برای اپهای چت مثل تلگرام، Soketi وب سوکت متن باز پیامها رو لحظهای منتقل میکنه.
نوتیفیکیشنهای بلادرنگ
تو فروشگاه آنلاین، وقتی سفارش جدید ثبت میشه، Soketi اعلان رو همون لحظه نشون میده.
بازیهای آنلاین
برای بازیهای چندنفره مثل شطرنج، Soketi وب سوکت متن باز حرکتها رو سریع منتقل میکنه.
داشبوردهای دادهای
برای نمایش دادههای مالی یا IoT، Soketi دادهها رو لحظهای آپدیت میکنه.
ابزارهای همکاری تیمی
مثل Google Docs، Soketi وب سوکت متن باز تغییرات رو بین کاربرها سینک میکنه.
بیایم Soketi رو با Pusher، Laravel WebSockets، و Socket.IO مقایسه کنیم:
ویژگی | Soketi وب سوکت متن باز | Pusher | Laravel WebSockets | Socket.IO |
---|---|---|---|---|
متنباز بودن | بله، کاملاً رایگانه! 😍 | خیر، پولیه | بله، اما مشکلات پایداری داره | بله، ولی سنگینتره |
سرعت | خیلی سریع (8.5x Fastify) | سریع، اما وابسته به پلن پولی | متوسط، گاهی کرش میکنه | کندتر از Soketi |
مصرف منابع | خیلی کم | وابسته به زیرساخت ابری | مشکلات Memory Leak | مصرف منابع بالاست |
سازگاری با Pusher | کاملاً سازگار با پروتکل v7 | خودش Pusherه! | تا حدی سازگار | خیر، پروتکل اختصاصی داره |
مقیاسپذیری | عالی با Redis و Cloudflare | عالی، اما گرونه | محدود | متوسط |
Pusher برای پروژههای بزرگ گرونه. مثلاً پلن 49 دلاری فقط 500 اتصال همزمان میده. اما با Soketi وب سوکت متن باز، با یه سرور 5 دلاری میتونید خیلی بیشتر از اینا رو مدیریت کنید.
Laravel WebSockets گاهی با مشکلاتی مثل Memory Leak مواجه میشه، ولی Soketi وب سوکت متن باز پایدارتره و راهاندازیش سادهتره.
Socket.IO سنگینتره و سرعتش از Soketi وب سوکت متن باز کمتره. اگه دنبال یه ابزار سبک هستید، Soketi بهترینه.
حالا وقتشه دست به کار بشیم و ببینیم چطور میتونیم Soketi وب سوکت متن باز رو نصب کنیم. من این بخش رو با یه مثال برای لاراول توضیح میدم، چون Soketi با لاراول خیلی خوب جفت و جور میشه.
Node.js (نسخه LTS مثل 16.x یا 18.x)
NPM یا Yarn
پروژه لاراولی با Laravel Echo و Pusher-JS
برای نصب:
npm install -g @soketi/soketi
اگه خطای uWebSockets.js گرفتید، Node.js رو آپدیت کنید یا کش npm رو پاک کنید:
npm cache clean --force
بعد سرور رو اجرا کنید:
soketi start
این یه سرور روی 127.0.0.1:6001 با credentials پیشفرض راه میندازه:
App ID: app-id
App Key: app-key
App Secret: app-secret
فایل .env رو آپدیت کنید:
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=app-id
PUSHER_APP_KEY=app-key
PUSHER_APP_SECRET=app-secret
PUSHER_HOST=127.0.0.1
PUSHER_PORT=6001
PUSHER_SCHEME=http
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
فایل resources/js/bootstrap.js رو ویرایش کنید:
import Echo from 'laravel-echo';
import Pusher from 'pusher-js';
window.Pusher = Pusher;
window.Echo = new Echo({
broadcaster: 'pusher',
key: import.meta.env.VITE_PUSHER_APP_KEY,
wsHost: import.meta.env.VITE_PUSHER_HOST,
wsPort: import.meta.env.VITE_PUSHER_PORT,
forceTLS: false,
});
یه ایونت بسازید:
php artisan make:event MessageSent
فایل app/Events/MessageSent.php:
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
class MessageSent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets;
public $message;
public function __construct($message)
{
$this->message = $message;
}
public function broadcastOn()
{
return new Channel('chat-room');
}
}
یه روت تو routes/web.php:
Route::get('/send-message', function () {
event(new \App\Events\MessageSent('سلام دنیا!'));
return 'پیام ارسال شد!';
});
تو کلاینت:
window.Echo.channel('chat-room').listen('MessageSent', (e) => {
console.log(e.message);
});
برای پروژههای واقعی:
انتخاب سرور: یه سرور با 1 گیگ رم (مثل DigitalOcean) کافیه.
نصب Soketi:
npm install -g @soketi/soketi
sudo ufw allow 6001
اجرا با PM2:
npm install -g pm2
pm2 start soketi --name soketi -- start
pm2 startup
pm2 save
تنظیمات امنیتی: فایل config.json:
{
"appManager": {
"driver": "array",
"apps": [
{
"id": "your-app-id",
"key": "your-app-key",
"secret": "your-app-secret"
}
]
}
}
برای ترافیک بالا، از Redis استفاده کنید:
{
"appManager": {
"driver": "redis",
"redis": {
"host": "your-redis-host",
"port": 6379,
"password": "your-redis-password"
}
}
}
یه پروژه لاراول بسازید:
composer create-project laravel/laravel chat-app
مدل پیام:
php artisan make:model Message -m
مهاجرت:
Schema::create('messages', function (Blueprint $table) {
$table->id();
$table->string('user');
$table->text('content');
$table->timestamps();
});
ایونت NewMessage:
class NewMessage implements ShouldBroadcast
{
public $message;
public function __construct($message)
{
$this->message = $message;
}
public function broadcastOn()
{
return new Channel('chat');
}
}
کنترلر:
class ChatController extends Controller
{
public function index()
{
return view('chat');
}
public function send(Request $request)
{
$message = Message::create([
'user' => $request->user,
'content' => $request->content,
]);
event(new NewMessage($message));
return response()->json(['status' => 'Message Sent!']);
}
}
فایل chat.blade.php:
<!DOCTYPE html>
<html>
<head>
<title>چت روم با Soketi</title>
<script src="{{ asset('js/app.js') }}" defer></script>
</head>
<body>
<h1>چت روم</h1>
<input type="text" id="user" placeholder="نام شما">
<input type="text" id="message" placeholder="پیام خود را بنویسید">
<button onclick="sendMessage()">ارسال</button>
<ul id="messages"></ul>
<script>
function sendMessage() {
const user = document.getElementById('user').value;
const message = document.getElementById('message').value;
fetch('/chat/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
body: JSON.stringify({ user, message })
}).then(() => {
document.getElementById('message').value = '';
});
}
window.Echo.channel('chat').listen('NewMessage', (e) => {
const li = document.createElement('li');
li.textContent = `${e.message.user}: ${e.message.content}`;
document.getElementById('messages').appendChild(li);
});
</script>
</body>
</html>
Soketi وب سوکت متن باز متریکهای آمادهای تو :9601/metrics داره. برای اتصال به Prometheus:
scrape_configs:
- job_name: 'soketi'
static_configs:
- targets: ['your-server-ip:9601']
برای استقرار بدون سرور:
import { Server } from '@soketi/soketi';
const server = new Server({
appManager: {
driver: 'array',
apps: [{ id: 'your-app-id', key: 'your-app-key', secret: 'your-app-secret' }]
}
});
addEventListener('fetch', (event) => {
event.respondWith(server.handle(event.request));
});
با wrangler publish دیپلوی کنید.
برای پروژههای بزرگ، از DynamoDB:
{
"appManager": {
"driver": "dynamodb",
"dynamodb": {
"region": "us-east-1",
"table": "soketi-apps",
"accessKeyId": "your-access-key",
"secretAccessKey": "your-secret-key"
}
}
}
برای کانالهای مختلف:
public function broadcastOn()
{
return new Channel('chat-room');
}
یکی از چیزایی که بعضی کاربرها تو انجمنها (مثل Reddit یا گیتهاب) درباره Soketi گفتن، اینه که مستندات رسمیش گاهی اوقات ناکامله یا به اندازه کافی جزئیات نداره. مثلاً ممکنه دنبال یه تنظیم خاص باشید و تو مستندات رسمی چیزی گیرتون نیاد. اما نگران نباشید، چون جامعه کاربری Soketi خیلی فعاله و کلی راهحل تو گیتهاب، Reddit، و بقیه جاها پیدا میشه.
Soketi یه پروژه متنبازه که توسط یه تیم کوچیک (Renoki Co.) توسعه داده میشه. به همین خاطر، مستنداتش به اندازه ابزارهای تجاری مثل Pusher پرجزئیات نیست. اما نکته مثبت اینه که جامعه کاربری و توسعهدهندهها حسابی فعالن و معمولاً هر سؤالی داشته باشید، یه نفر قبلاً اون رو پرسیده و جوابش رو پیدا کرده.
فرض کنید میخواید Soketi رو با DynamoDB تنظیم کنید، ولی مستندات رسمی فقط یه توضیح کلی داره. میتونید تو گیتهاب یه Issue پیدا کنید که یکی تنظیمات کامل DynamoDB رو نوشته، مثلاً:
{
"appManager": {
"driver": "dynamodb",
"dynamodb": {
"region": "us-east-1",
"table": "soketi-apps",
"accessKeyId": "your-access-key",
"secretAccessKey": "your-secret-key"
}
}
}
یا تو Reddit ممکنه یه نفر توضیح داده باشه که چطور جدول DynamoDB رو باید بسازید و چه permissionهایی نیازه.
اگه خودتون یه راهحل پیدا کردید، حتماً تو گیتهاب یا Reddit به اشتراک بذارید. اینجوری هم به بقیه کمک میکنید، هم جامعه Soketi قویتر میشه! 😊
یکی از مشکلات رایج موقع نصب Soketi، خطاهای مربوط به uWebSockets.js هست. چون Soketi روی این کتابخونه ساخته شده، اگه uWebSockets.js درست نصب نشه، Soketi هم کار نمیکنه. این خطاها معمولاً به خاطر نسخه Node.js، مشکلات کش npm، یا وابستگیهای سیستمیه.
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v
npm cache clean --force
npm install -g @soketi/soketi
sudo apt update
sudo apt install -y build-essential libuv1-dev
sudo yum groupinstall 'Development Tools'
sudo yum install libuv-devel
npm install uWebSockets.js@uNetworking/uWebSockets.js#v0.17.0
فرض کنید موقع نصب Soketi این خطا رو میگیرید:
gyp ERR! stack Error: Could not find any Visual Studio installation to use
این یعنی سیستم شما ابزارهای لازم برای کامپایل uWebSockets.js رو نداره. تو ویندوز، میتونید پکیج windows-build-tools رو نصب کنید:
npm install -g windows-build-tools
تو لینوکس، مطمئن بشید که build-essential نصب شده.
اگه روی سرورهای ابری مثل AWS یا DigitalOcean کار میکنید، از یه ایمیج آماده با Node.js و ابزارهای Build استفاده کنید تا این مشکلات کمتر پیش بیاد.
اگه پروژهتون حسابی شلوغ شده و تعداد کاربرها یا اتصالهای همزمانتون زیاد شده (مثلاً چند هزار کاربر همزمان)، Soketi بهتنهایی با تنظیمات پیشفرض ممکنه کم بیاره. برای مدیریت ترافیک بالا، باید از یه App Manager مقیاسپذیر مثل Redis یا DynamoDB استفاده کنید.
sudo apt install redis-server
sudo systemctl enable redis
sudo systemctl start redis
{
"appManager": {
"driver": "redis",
"redis": {
"host": "127.0.0.1",
"port": 6379,
"password": "your-redis-password",
"db": 0
}
},
"pubsub": {
"driver": "redis",
"redis": {
"host": "127.0.0.1",
"port": 6379,
"password": "your-redis-password"
}
}
}
soketi start --config=/path/to/config.json
{
"appManager": {
"driver": "dynamodb",
"dynamodb": {
"region": "us-east-1",
"table": "soketi-apps",
"accessKeyId": "your-access-key",
"secretAccessKey": "your-secret-key"
}
}
}
فرض کنید یه اپلیکیشن چت دارید با 10,000 کاربر همزمان. با تنظیمات پیشفرض (Array)، ممکنه سرور Soketi نتونه این حجم اتصال رو مدیریت کنه. اما با فعال کردن Redis، میتونید چندتا نمونه Soketi رو روی سرورهای مختلف اجرا کنید و Redis همه اتصالها و پیامها رو بینشون هماهنگ میکنه. یه کاربر تو گیتهاب گفته که با Redis تونسته 50,000 اتصال همزمان رو با یه سرور 4 گیگ رم مدیریت کنه!
برای ترافیکهای خیلی بالا، میتونید از Redis Cluster یا DynamoDB Global Tables استفاده کنید تا حتی اگه کاربرهاتون تو مناطق مختلف دنیا باشن، تأخیر کم بشه.
Soketi وب سوکت متن باز یه ابزار بینظیره برای ساخت اپلیکیشنهای بلادرنگ. با سرعت بالا، مصرف کم منابع، و سازگاری با Pusher، میتونه جایگزین سرویسهای گرون بشه. تو این پست سعی کردیم با زبون خودمونی همهچیز درباره Soketi وب سوکت متن باز رو توضیح بدیم، از نصب و راهاندازی تا مثال عملی و نکات پیشرفته. امیدوارم حالا آماده باشید که تو پروژه بعدیتون از Soketi وب سوکت متن باز استفاده کنید! 😊
اگه سؤالی دارید یا تجربهای با Soketi وب سوکت متن باز دارید، تو کامنتها بنویسید. تا پست بعدی، کد بزنید و حالشو ببرید! 💻
در خبرنامه ما مشترک شوید و آخرین اخبار و به روزرسانی های را در صندوق ورودی خود مستقیماً دریافت کنید.
دیدگاه بگذارید