ذخیره پاسخهای استریمی AI: پیام رو نگه دار، نه توکنها
خلاصهٔ کاملتر
این مقاله از تیم Ably یه سؤال مشخص رو بررسی میکنه: وقتی یه کلاینت وسط تولید پاسخ AI وصل میشه، چی میبینه؟ به این کلاینت میگن late joiner، یعنی هر کلاینتی که بعد از شروع پاسخ وصل بشه، مثل مرورگری که رفرش شده، یه دستگاه دوم یا یه اپراتور پشتیبانی که گفتگو رو تحویل میگیره. به گفته مقاله یه روش ذخیره وقتی قبوله که چنین کلاینتی کل پاسخ تا اون لحظه، وضعیت پاسخ (در حال تولید، تموم شده یا لغو شده) و ادامه پاسخ رو بدون جاافتادگی یا تکرار بگیره.
روش اول ارسال لحظهای با SSE یا WebSocket هست. سرور هر توکن رو یه بار میفرسته و هیچ کپیای نگه نمیداره، پس با رفرش کل پاسخ از دست میره. روش دوم chunk log هست، یعنی هر تکه پاسخ تو یه لاگ append-only مثل Redis Streams یا NATS JetStream ذخیره میشه. این روش قطعی اتصال رو حل میکنه، ولی کلاینت به جای متن قابل خوندن یه لیست از تکهها میگیره و هر کلاینت باید خودش اونا رو کنار هم بچینه، تکراریها رو حذف کنه و پایان پاسخ رو تشخیص بده.
روش سوم بازنویسی مکرر یه رکورد تو Postgres، Firestore یا Sendbird هست. اینجا late joiner با یه درخواست کل پاسخ رو میگیره، ولی دیتابیس باید برای هر توکن یه بار بنویسه. مقاله حساب میکنه که هزار پاسخ همزمان با سرعت ۱۰۰ توکن در ثانیه میشه ۱۰۰ هزار آپدیت در ثانیه. با batch کردن هر ۲۰ توکن، نوشتنها بیست برابر کم میشه ولی متن ذخیرهشده حدود ۲۰۰ میلیثانیه از استریم زنده عقب میمونه.
روش چهارم message appends هست که Ably ارائه میده. هر پاسخ یه پیامه که بزرگ میشه: بکاند یه پیام میسازه، یه serial میگیره و برای هر توکن فقط یه append کوچیک میفرسته. Ably خودش اینا رو کنار هم میذاره، پس late joiner کل پاسخ رو به شکل یه پیام میگیره و بعد بقیه رو زنده دریافت میکنه. دیتابیس خودت فقط یه بار، موقع تموم شدن پاسخ، مینویسه. Ably appendها رو تو بازههای ۴۰ میلیثانیهای جمع میکنه، پس هر پاسخ حداکثر ۲۵ پیام در ثانیه تولید میکنه.
مقاله میگه ساختن این روش بهصورت دستی یعنی ساختن یه append store توزیعشده که باید ترتیب appendها، نگه داشتن کپی قابل خوندن، تحویل بینقص از history به استریم زنده و تصمیم درباره پایان پاسخ رو درست انجام بده. یه سری محدودیت هم هست: سقف اندازه پیام ۶۴ کیلوبایت تو پلنهای Free و Standard و ۲۵۶ کیلوبایت تو Pro و Enterprise هست، SDK مخصوص AI Transport فعلاً فقط JavaScript و React داره و بخش appendها تو مستندات هنوز برچسب Public Preview داره. چون مقاله از خود Ably هست، طبیعتاً نتیجهگیریش به نفع محصول خودشونه.
نکات کلیدی:
- ارسال لحظهای با SSE یا WebSocket هیچی ذخیره نمیکنه و late joiner چیزی نمیگیره
- chunk log مثل Redis Streams قطعی رو حل میکنه ولی هر کلاینت باید تکهها رو خودش سرهم کنه و تکراریها رو حذف کنه
- بازنویسی رکورد برای هزار پاسخ همزمان با ۱۰۰ توکن در ثانیه یعنی ۱۰۰ هزار نوشتن در ثانیه
- Ably appendها رو تو بازه ۴۰ میلیثانیه جمع میکنه و حداکثر ۲۵ پیام در ثانیه برای هر پاسخ میفرسته
- سقف اندازه پیام Ably برابر ۶۴ کیلوبایت تو Free و Standard و ۲۵۶ کیلوبایت تو Pro و Enterprise هست




