forked from hesabix/arc
27 lines
2 KiB
Markdown
Executable file
27 lines
2 KiB
Markdown
Executable file
# چت CRM و WebSocket (`/ws/crm-chat`)
|
|
|
|
وضعیت اتصال وبسوکت و رویدادهای زندهٔ چت وب (تایپ، ورود عامل، پیامها) در حافظهٔ **هر فرایند uvicorn گیر میکنند.**
|
|
|
|
## Redis خاموش است
|
|
|
|
بدون Redis **هیچ پخشی بین چند worker وجود ندارد.** باید یکی از دو کار را انجام دهید:
|
|
|
|
1. **یک worker برای API که پشت آن WebSocket باز میشود**
|
|
مثال: `--workers 1` یا تنها یک نمونهٔ برنامهٔ ASGI؛ یا کل ترافیک `wss://…/ws/crm-chat` را به یک نمونه هدایت کنید.
|
|
|
|
2. **Sticky وبسوکت در لودبالانسر**
|
|
هر دو اتصال (ویجیت سایت بازدیدکننده و اپراتور CRM که به همان `apiBase`/دامنه وبسوکت وصل میشوند) باید تا پایان عمر سکشن وبسوکت به **یک** upstream بروند (`ip_hash`، cookie sticky، یا مکانیزم معادل).
|
|
|
|
اگر همزمان **چند worker** داشته باشید و بازدیدکننده روی worker A و عامل روی worker B باشد، تایپ و `agent.joined` به طرف مقابل نمیرسد — این رفتار مورد انتظار است تا Redis روشن نشود.
|
|
|
|
## Redis روشن است
|
|
|
|
میتوانید چند worker داشته باشید؛ کانال Pub/Sub داخلی رویدادها را به همهٔ فرایندها میرساند (بعد از هر رویداد، تحویل محلی هم روی کارگر فرستنده انجام میشود تا حتی بدون تأخیر شبکهٔ Redis، کلاینتهای همان کارگر آپدیت شوند).
|
|
|
|
## مسیر وبسوکت
|
|
|
|
نقطهٔ اتصال معمولا زیر پیشوند API است، مثلاً:
|
|
|
|
`{base}/ws/crm-chat`
|
|
|
|
همان میزبانی را که کلاینتهای Flutter وب و ویجیت وردپرس استفاده میکنند، در تنظیمات sticky در نظر بگیرید.
|