
یک نویسنده، چند عامل: کنترل همزمانی مقاوم در برابر خرابی
راهنمای انتخاب صف، کنترل نسخه، تراکنش، اجاره و توکن حصارکشی وقتی چند عامل هوش مصنوعی میتوانند یک وضعیت مشترک را تغییر دهند.
ادامه مطلبثبت موفق با دیدهشدن در نسخه خواندنی یا جستوجو یکی نیست. مسیر تأیید نتیجه را درست انتخاب کنید تا داده قدیمی، دستیار را به اجرای دوباره یک کار نکشاند.

دستیار وضعیت یک درخواست پشتیبانی را به «بسته» تغییر میدهد. ابزار ثبت، موفقیت را تأیید میکند. دستیار برای اطمینان جستوجو میکند و همان درخواست را هنوز «باز» میبیند. حالا میخواهد دوباره آن را ببندد. مشکل شاید در مدل یا ثبت تغییر نباشد؛ نسخهای که ابزار جستوجو میخواند هنوز بهروز نشده است.
این صحنه فرضی، پرسش راهنما را روشن میکند: پس از ثبت یک تغییر، کدام مشاهده برای تأیید نتیجه معتبر است؟ مخاطب، سازنده دستیار متصل به پایگاه داده و مسئول عملیات است. تصمیم میان خواندن مستقیم از مرجع، حفظ سابقه نشست، انتظار محدود برای نمای جستوجو و اعلام نتیجه نامعلوم قرار دارد. هیچکدام از این مسیرها نباید بیدلیل به اجرای دوباره کار تبدیل شود.
«انجام شد» ممکن است سه معنای متفاوت داشته باشد: مرجع اصلی تغییر را ثبت کرده؛ نمای مورد استفاده کاربر آن را نشان میدهد؛ یا شرایط لازم برای اقدام بعدی برقرار است. این سه رویداد لزوماً همزمان نیستند. رسید معتبرِ ثبت، درباره مورد اول شاهد میدهد. درباره دو مورد بعد باید جداگانه سؤال کرد.
مثلاً بستهشدن درخواست پشتیبانی به معنی ارسال ایمیل اطلاعرسانی نیست. ظاهرشدن وضعیت تازه در جستوجو هم ثابت نمیکند کاربر هنوز اجازه حذف پیوست را دارد. تیم محصول باید کنار هر پیام موفقیت بنویسد دقیقاً کدام تعهد را اعلام میکند. در غیر این صورت، یک علامت سبز، چند وعده ناسازگار را به دوش میکشد.
پیشنهاد مهندسی ژرف این است که تأیید ثبت و تأیید قابلمشاهدهبودن دو وضعیت جدا داشته باشند. رفتار محصولات در بخشهای بعد مستند است؛ مثال، جدول تصمیم و آزمونهای این مقاله طراحی پیشنهادیاند، نه نتیجه سنجش یک سامانه مشتری.
اگر رسید معتبر، ثبت را تأیید کرده است، این شاهد را هنگام بررسی مسیر خواندن نگه دارید. عقببودن نمای دیگر نباید آن را پاک کند و جای آن یک خطای کلی بنشاند. ممکن است کار انجام شده باشد و تنها نمایش آن عقب مانده باشد.
در تکثیر غیرهمزمان، تغییر ابتدا در مرجع ثبت میشود و بعد به نسخه دیگر میرسد. یک درخواست خواندن میتواند کاملاً موفق باشد، اما مقدار پیشین را برگرداند. بنابراین کد موفق پاسخ و زمان تازه دریافت آن، بهتنهایی تازگی محتوا را ثابت نمیکنند. ابزار باید روشن کند چه چیزی را از کدام مسیر خوانده است.
مستندات PostgreSQL 18 تکثیر جریانی را در حالت پیشفرض غیرهمزمان توصیف میکند. تنظیم remote_apply در پیکربندی تکثیر همزمان، تأیید را تا اعمال تغییر و قابلمشاهدهشدن آن در نسخه همزمان مربوط عقب میاندازد. این تضمین را نباید به هر نسخه دیگر یا کش بیرون از پایگاه داده تعمیم داد.
در طراحی خود، تفاوت «رسیدن»، «ذخیرهشدن» و «اعمالشدن» را ثبت کنید. ممکن است گزارش سلامت زیرساخت از دریافت داده خبر بدهد، درحالیکه مسیر خواندن هنوز نسخه قبلی را نشان میدهد. انتخاب مسیر درست از افزودن جمله «لطفاً دقیق بررسی کن» به دستور مدل مؤثرتر است؛ مدل نمیتواند دادهای را ببیند که ابزار هنوز دریافت نکرده است.
مسیر واقعی را تا انتها دنبال کنید، از جمله کش و واسطهای که میان ابزار و پایگاه داده قرار دارد. خواندن قوی از پایگاه داده، اگر در لایه برنامه با پاسخ کش قدیمی جایگزین شود، شاهد تازهای به دستیار نمیرساند. تضمین باید درباره همان مسیری باشد که تأیید نتیجه از آن میگذرد.
اگر ابزار ثبت شناسه درخواست را برگردانده، تأیید نتیجه را از همان شناسه و حساب آغاز کنید. جستوجوی عبارتی مثل «آخرین درخواست بستهشده مشتری» یک مسئله دیگر است: رتبهبندی، فیلتر و پوشش نتایج نیز وارد تصمیم میشوند. حتی نمای کاملاً تازه هم شاید رکورد مورد نظر را در چند نتیجه اول نیاورد.
راهنمای سازگاری خواندن DynamoDB برای جدول و نمایه ثانویه محلی، امکان خواندن با سازگاری قوی را توضیح میدهد؛ نمایه ثانویه سراسری چنین گزینهای ندارد و خواندن آن با سازگاری نهایی است. پس نام یک محصول، قرارداد همه مسیرهای داخل آن را تعیین نمیکند.
برای ابزار خود یک قرارداد محدود بنویسید: شناسه رکورد، محدوده حساب، مسیر خواندن و شاهد نسخه لازم. اگر خواندن قوی برای آن مسیر وجود ندارد، درخواست چنین گزینهای در لایه برنامه تضمین تازهای نمیسازد. باید مسیر دیگری انتخاب شود یا محدودیت صریح باقی بماند.
مقاله نتیجه خالی جستوجو به کاملبودن پیمایش و معنای نبود نتیجه میپردازد. اینجا پرسش محدودتر است: آیا مشاهده بعدی به تغییر مشخصی که همین حالا ثبت شده وابسته است؟ اگر بله، قرارداد عمومی جستوجو شاید برای این کار کافی نباشد.
فرض کنید یک خدمت تغییر را ثبت میکند و خدمت دیگری نتیجه را میخواند. اتصال دوم ممکن است نداند خواندن باید پس از کدام تغییر باشد. شناسه گفتوگوی دستیار این رابطه را خودکار به پایگاه داده منتقل نمیکند. رابطه باید در لایه اتصال و مطابق قرارداد محصول حفظ شود.
مستندات MongoDB خواندن نوشتههای قبلی را در نشست علّی، با تنظیم majority برای خواندن و نوشتن، تضمین میکند. عملیات نشست باید در هر لحظه از یک رشته اجرا شوند. این نشست جلوی درهمآمیختن تغییرات دیگران را نمیگیرد؛ پس نتیجه بعدی میتواند تغییری جدیدتر را نیز نشان دهد.
راهنمای Azure Cosmos DB نیز توضیح میدهد که چند نمونه جداگانه اتصال، برای ادامه همان نشست باید نشان نشست را منتقل کنند. این نشانها به پارتیشن وابستهاند و بسته رسمی معمولاً آنها را خودکار مدیریت میکند. جابهجایی کار بین خدمتها جایی است که باید رفتار واقعی را آزمود.
نشان فنی نشست را به متن مدل نسپارید و از آن مجوز دسترسی نسازید. برنامه آن را همراه محدوده مجاز منبع نگه دارد؛ مدل فقط وضعیت قابلفهم دریافت کند. اگر ابزار بعدی این سابقه را نمیپذیرد، وانمود نکنید که رابطه حفظ شده است. مسیر جایگزین یا حالت «تأیید در انتظار» لازم است.
در سامانهای با پایگاه داده، صف انتقال و نمایه جستوجو، تغییر از چند مرحله عبور میکند. حتی اگر خود نمایه آماده نمایش داده تازه باشد، ابتدا باید تغییر به آن رسیده باشد. تازهسازی نمایهای که هنوز پیام را دریافت نکرده، نمیتواند آن پیام را از هیچ بسازد.
مرجع Elasticsearch میگوید refresh=wait_for پاسخ درخواست نوشتن را تا قابلجستوجوشدن تغییر همان درخواست نگه میدارد. تازهسازی اجباری هزینه دارد؛ انتظار نیز زمان پاسخ را زیاد میکند و با خاموشبودن تازهسازی خودکار ممکن است بدون اقدام دیگری ادامه یابد. این گزینه، تأخیر مسیر بالادستی شما را پوشش نمیدهد.
اگر نمایش فوری در جستوجو جزو وعده محصول است، برای هر دو مرحله شاهد بخواهید: رسیدن تغییر به نمایه و قابلمشاهدهشدن نسخه مورد نظر. اگر وعده فقط ثبت موفق است، رابط میتواند همان را اعلام کند و تازهشدن جستوجو را جدا نشان دهد. لازم نیست همه نوشتنها را برای خدمتی که به نمایش فوری نیاز ندارد کند کنید.
این انتخاب به کاربرد بستگی دارد. شاید ویرایش جلوی چشم کاربر، انتظار بیشتر را توجیه کند؛ برای ورود انبوه داده در پسزمینه، نمایش وضعیت انتظار کافی باشد. تیم باید این بدهبستان را از ابتدا در قرارداد قابلیت مشخص کند، نه پس از اولین جستوجوی ناموفق، تنظیم پایگاه داده را بهعجله تغییر دهد.
در مثال آموزشی، درخواست T-41 در نسخه ۷ باز است. ابزار بستن، تغییر را ثبت میکند و رسیدی با نسخه ۸ برمیگرداند. جستوجو هنوز نسخه ۷ را دارد. برنامه باید بگوید «ثبت شد؛ نمای جستوجو هنوز بهروز نشده»، نه اینکه شکست ثبت را نتیجه بگیرد. شمارهها در این مثال متعلق به یک رکورد با ترتیب نسخه تعریفشدهاند.
اگر خواندن مستقیم نسخه ۸ و وضعیت بسته را برگرداند، تأیید همان تغییر کامل است. اگر همکار دیگری درخواست را دوباره باز کرده و نسخه ۹ برگردد، نتیجه متفاوت است: بستن انجام شده، سپس تغییر دیگری رخ داده است. بازنویسی نسخه ۹ برای بازگرداندن مقدار دلخواه، تأیید نتیجه نیست؛ اقدام تازهای است که اختیار و بررسی تازه میخواهد.
اگر نسخه ۹ فقط عنوان را تغییر داده و وضعیت همچنان بسته باشد، شرط کسبوکار شاید هنوز برقرار باشد. بنابراین «نسخه برابر با ۸ نیست» آزمون کافی نیست. باید روشن شود سؤال درباره تاریخچه وقوع عمل است، مقدار فعلی فیلد است یا آمادگی مرحله بعد. هرکدام شاهد متفاوتی میخواهند.
همه محصولات شماره نسخه قابلمقایسه ندارند. یک نشان مبهم را عدد فرض نکنید و دو نشان از پارتیشنهای مختلف را مرتب نکنید. در سامانهای که ترتیب نسخه را ارائه نمیکند، از وضعیت عملیات یا سازوکار رسمی مشاهده استفاده کنید. مقایسه متن دو نشان جای قرارداد را نمیگیرد.
به همین دلیل، رسید عملیات و رکورد فعلی را دو شاهد جدا نگه دارید. رکورد ممکن است بعداً بهدرستی تغییر کند؛ رسید نگهداشتهشده توضیح میدهد چه اتفاقی افتاده، بیآنکه ادعا کند وضعیت از آن لحظه ثابت مانده است.
انتظار باید سقف داشته باشد، اما پایان مهلت معنای ثابتی ندارد. اگر رسید قطعی ثبت داریم و نمای جستوجو عقب است، تنها تأیید نمایش ناتمام مانده است. اگر پاسخ ثبت گم شده، خود نتیجه عمل نامعلوم است. این دو مورد نباید یک پیام خطا یا یک سیاست تلاش مجدد داشته باشند.
| شاهد موجود | نتیجه مجاز | گام بعدی پیشنهادی |
|---|---|---|
| رسید قطعی ثبت و نمای قدیمی | ثبت موفق؛ نمایش در انتظار | خواندن از مسیر مناسب یا انتظار محدود |
| نسخه مناسب و شرط مورد نظر برقرار | نتیجه در آن مشاهده تأیید شد | ادامه فقط با کنترل لازم برای اقدام بعدی |
| نسخه جدیدتر با شرط تغییرکرده | تغییر بعدی رخ داده است | بازبینی تصمیم، بدون بازنویسی خودکار |
| پاسخ ثبت نامعلوم و نتیجه جستوجو قدیمی | نتیجه عمل هنوز معلوم نیست | تطبیق با مرجع یا وضعیت عملیات |
| پایان مهلت مشاهده بدون شاهد کافی | تأیید تمام نشده است | حفظ رسید و ارجاع برای پیگیری |
راهنمای تلاش مجدد و اثرهای جانبی مسئله تکرار امن یک قصد را باز میکند. در این طراحی، خواندن دوباره و نوشتن دوباره دو مسیر جدا هستند. بودجه مشاهده تمامشده نباید خودبهخود یک قصد تازه برای نوشتن بسازد یا کلید جلوگیری از تکرار را عوض کند.
برای مشاهدههای بعدی، برنامهای با مهلت مشخص و مسئول پیگیری تعیین کنید. چند ثانیه مکث فقط گذشت زمان را ثابت میکند، نه رسیدن نسخه خواندنی به تغییر مورد نظر را. انتظار بیشتر شاید بعضی خطاها را کمتر کند، ولی جای قرارداد مشاهده را نمیگیرد.
حتی وقتی مشاهده به تغییر خودمان رسیده باشد، فاصلهای تا اقدام بعدی وجود دارد. کاربر دیگر ممکن است همان رکورد را عوض کند. خواندن تازه، وضعیت را برای همیشه ثابت نمیکند. شرط لازم باید در جایی اجرا شود که عمل بعدی واقعاً اثر میگذارد.
برای نمونه، اگر پس از بستن درخواست قرار است یک پرونده وابسته تغییر کند، نسخه مورد انتظار و قواعد همان عملیات باید در مرز اجرای آن بررسی شوند. راهنمای کنترل همزمانی عاملها این بخش را توضیح میدهد. قرارداد مشاهده، جای قفل، تراکنش یا شرط نسخه را نمیگیرد.
مرز امنیت نیز مستقل است. خواندن مستقیم نباید راهی برای دورزدن فیلتر حساب یا سطح دسترسی شود. مسیر قویتر از نظر تازگی، باید همان دامنه مجاز کاربر را رعایت کند. اطلاعات قدیمی را نباید با اطلاعات تازه اما متعلق به فرد دیگری جایگزین کرد و نتیجه را «اصلاحشده» نامید.
یک محیط جدا بسازید که در آن ثبت موفق میشود، اما خواندن برای چند نوبت نسخه قدیمی برمیگرداند. زمان انتظار تصادفی، آزمون را شکننده میکند؛ بهتر است پیشروی نمای خواندنی تحت کنترل آزمون باشد. شمار نوشتنها، رسید ثبت و پیام کاربر را هم ثبت کنید. انتظار اصلی، نبودن نوشتن اضافی است.
سپس خدمت خواننده را عوض کنید تا سابقه نشست از دست برود. بررسی کنید مسیر واقعی آن را منتقل میکند یا بهروشنی به حالت انتظار میرود. آزمون فقط روی یک اتصال پایدار، خطای توزیع بار میان چند نمونه برنامه را آشکار نمیکند. تغییر مسیر خواندن باید بخشی از سناریو باشد.
دو حالت نسخه ۹ را جدا امتحان کنید: تغییر نامرتبط عنوان و بازشدن دوباره درخواست. همچنین پاسخ گمشده ثبت، کش قدیمی در جلوی خواندن تازه، نرسیدن پیام به نمایه و پایان مهلت را بیازمایید. برای هر مورد، نتیجه مورد انتظار را از قبل بنویسید؛ صرف اینکه برنامه در نهایت «موفق» شده، معیار پذیرش نیست.
دلیل تصمیم را ثبت کنید، نه متن کامل رکوردهای خصوصی یا نشانهای خام نشست را در گزارش عمومی. مسئول عملیات باید بتواند مشاهده قدیمی، سابقه نشست گمشده، تغییر بعدی و اجرای نامعلوم را از هم تشخیص دهد. هرکدام راه اصلاح متفاوتی دارد؛ یک شمارنده کلیِ خطای تأیید، این تفاوت را پنهان میکند.
زمان پاسخ نوشتن و زمان رسیدن نمای مورد استفاده به نسخه لازم را دو سنجه مستقل بگیرید. مخرج را نیز مشخص کنید: از میان تغییرات ثبتشده، چند مورد در مهلت مورد توافق قابلمشاهده شدند؟ چند مورد هنوز منتظرند؟ کنار درصد، سن قدیمیترین موردِ تأییدنشده را نشان دهید تا کارهای رهاشده پشت میانگین پنهان نشوند.
نرخ خواندن قدیمی را برحسب مسیر، منطقه، نوع نمایه و نسخه اتصال بررسی کنید. تغییر تنظیمات تکثیر، تعویض بسته نرمافزاری، افزودن کش یا انتقال کار به خدمت دیگر باید آزمونهای وابستگی خواندن را دوباره فعال کند. عدد خوبِ تأخیر زیرساخت، جای شاهد مربوط به همان تغییر را نمیگیرد.
پیش از انتشار دستیار، تیم باید بتواند یک مسیر کامل را نشان دهد: این عمل ثبت شد؛ این مشاهده از مسیری مجاز و با تضمین لازم به آن رسید؛ و هر اقدام بعدی شرط مستقل خود را داشت. اگر یکی از این جملهها هنوز شاهد ندارد، همان بخش را ناتمام اعلام کنید. کاری را که انجام شده صرفاً برای ساختن یک مشاهده دلخواه تکرار نکنید.
پنج مرجع اصلی زیر رفتار محصول را توضیح میدهند. مستندات زندهاند؛ تاریخ بازبینی را با تاریخ انتشار محصول یکی نگیرید. مثال درخواست، انتخاب مسیر، آزمونها و سنجهها تحلیل ژرف هستند و تضمین یکپارچه میان این پنج محصول ایجاد نمیکنند.

راهنمای انتخاب صف، کنترل نسخه، تراکنش، اجاره و توکن حصارکشی وقتی چند عامل هوش مصنوعی میتوانند یک وضعیت مشترک را تغییر دهند.
ادامه مطلب
وبهوک امضاشده هنوز مجوز اجرای ابزار نیست. ثبت پایدار دریافت، تشخیص پیام تکراری و بررسی اختیار کاربر را جدا کنید تا تحویل دوباره به اقدام تازه تبدیل نشود.
ادامه مطلب
بستهشدن اتصال، کاملشدن پاسخ دستیار را ثابت نمیکند. مرز بایت، رویداد، دلیل توقف مدل و پذیرش برنامه را جدا کنید تا متن نیمهرسیده به پاسخ نهایی تبدیل نشود.
ادامه مطلباگر میخواهید ایجنتهای هوش مصنوعی و اتوماسیون این راهنما را در تیم نرمافزار یا فرایندهای سازمانتان به کار بگیرید، از یک آزمایش کوچک شروع کنید که بتوانید نتیجهاش را بسنجید.