معاملات DynamoDB آمازون: چگونه کار می کند

ساخت وبلاگ

با معاملات DynamoDB Amazon ، می توانید چندین اقدام را با هم انجام داده و آنها را به عنوان یک tranactWriteItems تمام یا هیچ چیز و یا عملیات TrancactgetItems ارسال کنید. در بخش های زیر عملیات API ، مدیریت ظرفیت ، بهترین شیوه ها و سایر جزئیات در مورد استفاده از عملیات معامله ای در DynamoDB شرح داده شده است.

موضوعات موضوعاتی

tranactWriteItems api

tranactWriteItems یک عملیات نوشتن همزمان و idempotent است که در یک عمل همه یا هیچ چیز ، 100 عمل را می نویسند. این اقدامات می تواند تا 100 مورد مجزا را در یک یا چند جدول DynamoDB در همان حساب AWS و در همان منطقه هدف قرار دهد. اندازه کل موارد موجود در معامله نمی تواند از 4 مگابایت تجاوز کند. این اقدامات به صورت اتمی انجام می شود به طوری که همه آنها موفق می شوند یا هیچ یک از آنها موفق نمی شوند.

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

معاملات با استفاده از فهرست ها نمی توانند انجام شوند.

شما نمی توانید همان مورد را با چندین عمل در همان معامله هدف قرار دهید. به عنوان مثال ، شما نمی توانید در همان معامله ، یک ContrityCheck و همچنین یک عمل به روزرسانی را در همان مورد انجام دهید.

می توانید انواع اقدامات زیر را به معامله اضافه کنید:

قرار دادن - یک عملیات putitem را برای ایجاد یک مورد جدید یا جایگزینی یک مورد قدیمی با یک مورد جدید ، به صورت مشروط یا بدون مشخص کردن هیچ شرط آغاز می کند.

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

حذف - یک عمل DeleteItem را برای حذف یک مورد واحد در یک جدول مشخص شده توسط کلید اصلی آن آغاز می کند.

ContrityCheck - بررسی می کند که یک مورد وجود دارد یا وضعیت ویژگی های خاص مورد را بررسی می کند.

پس از اتمام معامله ، تغییرات انجام شده در آن معامله به شاخص های ثانویه جهانی (GSIS) ، جریان ها و پشتیبان گیری پخش می شود. از آنجا که انتشار فوری یا فوری نیست ، اگر یک جدول از نسخه پشتیبان تهیه شود (RestorEtableFromBackup) یا به یک نقطه از زمان (ExportTableTopointIntime) صادر می شود ، ممکن است حاوی برخی از تغییرات انجام شده در طی یک معامله اخیر باشد.

قدرت

هنگام برقراری تماس TranactWriteItems می توانید به صورت اختیاری یک نشانه مشتری را درج کنید تا اطمینان حاصل کنید که درخواست Idempotent است. انجام معاملات شما در صورت ارسال چندین بار به دلیل زمان اتصال یا مسئله اتصال دیگر ، به جلوگیری از خطاهای برنامه کمک می کند.

اگر تماس اصلی tranactWriteItems موفقیت آمیز بود ، پس از آن تماس های TranactWriteItems با همان نشان مشتری با موفقیت و بدون ایجاد تغییر تماس می گیرد. اگر پارامتر RetuConsumedCapacity تنظیم شود ، تماس اولیه tranactWriteItems تعداد واحدهای ظرفیت نوشتن را که در ایجاد تغییرات مصرف می شود ، برمی گرداند. تماس های TranactWriteItems متعاقب آن با همان مشتری مشتری تعداد واحدهای ظرفیت خوانده شده در خواندن مورد را برمی گرداند.

نکات مهم در مورد idempotency

توکن مشتری به مدت 10 دقیقه پس از درخواست که از آن استفاده می کند معتبر است. پس از 10 دقیقه ، هر درخواستی که از همان مشتری استفاده می کند ، به عنوان یک درخواست جدید رفتار می شود. بعد از 10 دقیقه نباید از همان توکن مشتری برای همان درخواست استفاده مجدد کنید.

اگر درخواستی را با همان نشانه مشتری در پنجره 10 دقیقه ای IdemPotency تکرار کنید اما پارامتر درخواست دیگر را تغییر دهید ، DynamoDB یک استثناء idempotentpotarametermismatch را برمی گرداند.

رسیدگی به خطا برای نوشتن

معاملات نوشتن تحت شرایط زیر موفق نمی شوند:

هنگامی که شرایطی در یکی از عبارات شرایط برآورده نمی شود.

هنگامی که یک خطای اعتبار سنجی معامله رخ می دهد زیرا بیش از یک عمل در همان عملیات TransactWriteItems همان مورد را هدف قرار می دهد.

هنگامی که یک tranactWriteItems درخواست می کند با یک عمل جراحی TransactWriteItems در یک یا چند مورد در درخواست TranactWriteItems تعارض کند. در این حالت ، درخواست با TransactionCaneledException انجام نمی شود.

هنگامی که ظرفیت تأمین کافی برای تکمیل معامله وجود ندارد.

هنگامی که اندازه مورد خیلی بزرگ شود (بزرگتر از 400 کیلوبایت) ، یا یک شاخص ثانویه محلی (LSI) خیلی بزرگ می شود ، یا یک خطای اعتبار سنجی مشابه به دلیل تغییراتی که توسط معامله انجام می شود رخ می دهد.

هنگامی که خطای کاربر وجود دارد ، مانند قالب داده نامعتبر.

برای کسب اطلاعات بیشتر در مورد نحوه انجام تعارض با عملیات tranactWriteItems ، به رسیدگی به مناقشه معامله در DynamoDB مراجعه کنید.

API TrancactgetItems

TrancactgetItems یک عمل خواندن همزمان است که گروه ها تا 100 اقدام به هم می کنند. این اقدامات می تواند تا 100 مورد مجزا را در یک یا چند جدول DynamoDB در همان حساب AWS و منطقه هدف قرار دهد. اندازه کل موارد موجود در معامله نمی تواند از 4 مگابایت تجاوز کند.

اقدامات دریافتی به صورت اتمی انجام می شود به طوری که همه آنها موفق می شوند یا همه آنها شکست می خورند:

دریافت - یک عملیات GetItem را برای بازیابی مجموعه ای از ویژگی های مورد با کلید اصلی داده شده آغاز می کند. اگر هیچ مورد تطبیق یافت نشود ، GET هیچ داده ای را برنگرداند.

رسیدگی به خطا برای خواندن

معاملات خوانده شده تحت شرایط زیر موفق نمی شوند:

هنگامی که یک tranactgetItems درخواست می کند با یک عمل جراحی TransactWriteItems در یک یا چند مورد در درخواست TrancactEtItems در حال تعارض باشد. در این حالت ، درخواست با TransactionCaneledException انجام نمی شود.

هنگامی که ظرفیت تأمین کافی برای تکمیل معامله وجود ندارد.

هنگامی که خطای کاربر وجود دارد ، مانند قالب داده نامعتبر.

برای کسب اطلاعات بیشتر در مورد نحوه انجام تعارض با عملیات TrancactEtItems ، به رسیدگی به مناقشه معاملات در DynamoDB مراجعه کنید.

سطح جداسازی برای معاملات DynamoDB

سطح جداسازی عملیات معامله ای (tranactWriteItems یا trancactgetItems) و سایر عملیات به شرح زیر است.

سریال پذیر

انزوای قابل سریال تضمین می کند که نتایج چندین عمل همزمان همزمان همان است که گویی تا زمان پایان کار قبلی هیچ عملیاتی شروع نمی شود.

بین انواع عملکرد زیر انزوا قابل سریال وجود دارد:

بین هر عملیات معامله ای و هر عملیات نوشتن استاندارد (Putitem ، UpdateItem یا DeleteItem).

بین هر عملیات معامله ای و هر عملیات خواندن استاندارد (GetItem).

بین یک عملیات tranactWriteItems و یک عمل transactgetitems.

اگرچه بین عملیات معامله ای انزوا قابل سریال وجود دارد ، و هر استاندارد شخصی در یک عملیات BatchWriteItem می نویسد ، اما هیچ انزوا قابل سریال بین معامله و عملکرد BatchWriteItem به عنوان یک واحد وجود ندارد.

به طور مشابه ، سطح جداسازی بین یک عملیات معامله ای و GetItems های فردی در یک عملیات BatchgetItem قابل استفاده است. اما سطح انزوا بین معامله و عملیات batchgetitem به عنوان یک واحد متعهد است.

یک درخواست GetItem با توجه به درخواست tranactWriteItems از یکی از دو روش ، قبل یا بعد از درخواست tranactWriteItems ، قابل استفاده است. درخواست های چندگانه GetItem ، در برابر کلیدها در یک درخواست TranactWriteItems همزمان می توانند به هر ترتیب اجرا شوند ، بنابراین نتایج به دست آمده است.

به عنوان مثال ، اگر درخواست GetItem برای مورد A و مورد B به طور همزمان با درخواست tranactWriteItems اجرا شود که هم مورد A و هم مورد B را اصلاح می کند ، چهار امکان وجود دارد:

هر دو درخواست GetItem قبل از درخواست tranactwriteitems اجرا می شوند.

هر دو درخواست GetItem پس از درخواست tranactwriteitems اجرا می شوند.

درخواست GetItem برای مورد A قبل از درخواست TrancactWriteItems اجرا می شود. برای مورد B GetItem پس از TransactWriteItems اجرا می شود.

درخواست GetItem برای مورد B قبل از درخواست TrancactWriteItems اجرا می شود. برای مورد A GetItem پس از TransactWriteItems اجرا می شود.

اگر سطح جداسازی سریال برای درخواست های متعدد GetItem ترجیح داده می شود ، لطفاً از TrancactGetItems استفاده کنید.

متعهد شده

انزوای متعهد به خواندن تضمین می کند که عملیات خوانده شده همیشه مقادیر متعهد را برای یک مورد باز می گرداند - خواندن هرگز دیدگاهی را به کالای ارائه نمی دهد که یک کشور را از یک نوشتن معامله ای نشان می دهد که در نهایت موفق نشد. انزوای متعهد به خواندن ، بلافاصله پس از عمل خواندن ، از اصلاح موارد جلوگیری نمی کند.

سطح جداسازی بین هر عملیاتی معامله و هر عملیاتی که شامل چندین خواندن استاندارد باشد (BatchgetItem ، پرس و جو یا اسکن) تأیید شده است. اگر یک نوشتن معامله ای یک مورد را در وسط عملکرد BatchgetItem ، پرس و جو یا اسکن به روز کند ، قسمت بعدی عملیات خواندن مقدار تازه متعهد (با خواندن سازگار) یا احتمالاً یک مقدار متعهد قبلی را برمی گرداند (در نهایت خوانده می شود).

خلاصه عمل

به طور خلاصه ، جدول زیر سطح جداسازی بین یک عملیات معامله (tranactWriteItems یا trancactgetItems) و سایر عملیات را نشان می دهد.

سایر عملیات معامله ای

سطوح مشخص شده با ستاره (*) به عنوان واحد در عملیات اعمال می شود. با این حال ، اقدامات فردی در این عملیات دارای یک سطح انزوا قابل سریال هستند.

رسیدگی به مناقشه معامله در DynamoDB

درگیری معامله ای می تواند در طی درخواست های سطح مورد همزمان در مورد یک مورد در یک معامله رخ دهد. درگیری های معامله می تواند در سناریوهای زیر رخ دهد:

درخواست PUTITEM ، UpdateItem یا DeleteItem برای یک مورد درگیری با یک درخواست TrancactWriteItems در حال انجام که شامل همان مورد است.

موردی که در یک درخواست tranactWriteItems وجود دارد ، بخشی از درخواست مداوم TranactWriteItems است.

موردی که در یک درخواست tranactgetItems وجود دارد بخشی از درخواست TrancactWriteItems ، BatchWriteItem ، Putitem ، UpdateItem یا DeleteItem است.

هنگامی که درخواست Putitem ، UpdateItem یا DeleteItem رد شد ، درخواست با TransactionConflictException انجام نمی شود.

اگر هر درخواست سطح مورد در TransactWriteItems یا TrancactgetItems رد شود ، درخواست با TransactionCanceLedException انجام نمی شود. در صورت عدم موفقیت این درخواست ، SDK های AWS درخواست را دوباره امتحان نمی کنند.

اگر از AWS SDK برای جاوا استفاده می کنید ، استثناء شامل لیست CancellationReasons است که مطابق با لیست موارد موجود در پارامتر درخواست TransactItems سفارش داده شده است. برای سایر زبانها ، نمایش رشته ای از لیست در پیام خطای استثناء گنجانده شده است.

اگر یک عملیات TransactWriteItems یا TransactgetItems در حال انجام با یک درخواست GetItem همزمان باشد ، هر دو عمل می توانند موفق شوند.

متریک CloudWatch TransactionConflict برای هر درخواست سطح مورد شکست افزایش یافته است.

استفاده از API های معامله ای در شتاب دهنده DynamoDB (DAX)

tranactWriteItems و trancactgetItems هر دو در شتاب دهنده DynamoDB (DAX) با سطح انزوا یکسان مانند DynamoDB پشتیبانی می شوند.

TranactWriteItems از طریق DAX می نویسد. DAX یک تماس tranactwriteitems را به DynamoDB منتقل می کند و پاسخ را برمی گرداند. برای جمع آوری حافظه پنهان پس از نوشتن ، DAX TrancactgetItems را در پس زمینه برای هر مورد در عملیات TransactWriteItems ، که از واحدهای ظرفیت خواندن اضافی استفاده می کند ، فراخوانی می کند.(برای کسب اطلاعات بیشتر ، به مدیریت ظرفیت برای معاملات مراجعه کنید.) این عملکرد به شما امکان می دهد منطق برنامه خود را ساده نگه دارید و از DAX برای هر دو عملیات معامله ای و موارد غیرمستقیم استفاده کنید.

تماس های TrancactgetItems از طریق DAX منتقل می شوند بدون اینکه مواردی که در آن ذخیره می شوند محلی باشند. این همان رفتار است که برای API های خوانده شده کاملاً سازگار در DAX.

مدیریت ظرفیت برای معاملات

هیچ هزینه اضافی برای فعال کردن معاملات برای جداول DynamoDB خود وجود ندارد. شما فقط برای خواندن یا می نویسید که بخشی از معامله شما است. DynamoDB دو مورد خواندن را انجام می دهد یا از هر مورد در معامله می نویسد: یکی برای تهیه معامله و دیگری برای انجام معامله. دو عملیات خواندن/نوشتن اساسی در معیارهای Amazon CloudWatch شما قابل مشاهده است.

برای خواندن های اضافی برنامه ریزی کنید و می نویسد که هنگام ارائه ظرفیت برای جداول خود ، توسط API های معامله ای لازم است. به عنوان مثال ، فرض کنید برنامه شما یک معامله در هر ثانیه انجام می دهد و هر معامله سه مورد 500 بایت را در جدول شما می نویسد. هر مورد به دو واحد ظرفیت نوشتن (WCU) نیاز دارد: یکی برای تهیه معامله و دیگری برای انجام معامله. بنابراین ، شما باید شش WCU را به جدول ارائه دهید.

اگر در مثال قبلی از شتاب دهنده DynamoDB (DAX) استفاده می کردید ، برای هر مورد در تماس TranactWriteItems از دو واحد ظرفیت خوانده شده (RCU) نیز استفاده می کنید. بنابراین شما باید شش RCU اضافی را به جدول ارائه دهید.

به همین ترتیب ، اگر درخواست شما یک معامله خوانده شده در هر ثانیه انجام می شود ، و هر معامله سه مورد 500 بایت را در جدول شما می خواند ، باید شش واحد ظرفیت خوانده شده (RCU) را به جدول ارائه دهید. خواندن هر مورد به دو RCU نیاز دارد: یکی برای تهیه معامله و دیگری برای انجام معامله.

همچنین ، رفتار پیش فرض SDK برای امتحان مجدد معاملات در صورت وجود استثناء TransactionInProgressException است. برای واحدهای اضافی با ظرفیت خواندن (RCU) که این آزمایشگاه ها مصرف می کنند ، برنامه ریزی کنید. اگر با استفاده از یک ClientRequestToken ، معاملات خود را در کد شخصی خود امتحان می کنید ، همین مسئله درست است.

بهترین روشها برای معاملات

روشهای پیشنهادی زیر را هنگام استفاده از معاملات DynamoDB در نظر بگیرید.

مقیاس بندی خودکار را روی جداول خود فعال کنید ، یا اطمینان حاصل کنید که ظرفیت توان کافی برای انجام دو عملیات خواندن یا نوشتن برای هر مورد در معامله خود را ارائه داده اید.

اگر از SDK ارائه شده از AWS استفاده نمی کنید ، هنگام برقراری تماس TranactWriteItems ، یک ویژگی ClientRequestToken را درج کنید تا اطمینان حاصل کنید که درخواست Idempotent است.

در صورت لزوم عملیات را در یک معامله گروه بندی نکنید. به عنوان مثال ، اگر یک معامله واحد با 10 عمل می تواند بدون به خطر انداختن صحت برنامه ، به معاملات متعدد تقسیم شود ، توصیه می کنیم معامله را تقسیم کنید. معاملات ساده تر توان را بهبود می بخشد و به احتمال زیاد موفق می شوند.

معاملات متعدد به روزرسانی همان موارد به طور همزمان می تواند باعث درگیری هایی شود که معاملات را لغو می کند. توصیه می کنیم بهترین روشهای DynamoDB را برای مدل سازی داده ها دنبال کنید تا چنین درگیری ها به حداقل برسد.

اگر مجموعه ای از ویژگی ها اغلب به عنوان بخشی از یک معامله واحد در چندین مورد به روز می شود ، برای کاهش دامنه معامله ، ویژگی ها را در یک مورد واحد در نظر بگیرید.

از استفاده از معاملات برای مصرف داده ها به صورت عمده خودداری کنید. برای نوشتن فله ، بهتر است از BatchWriteItem استفاده کنید.

استفاده از API های معامله با جداول جهانی

عملیات معاملاتی اتمی ، قوام ، انزوا و دوام (اسید) را فقط در منطقه ای که نوشتن در ابتدا در آن ساخته شده است ، تضمین می کند. معاملات در جداول جهانی در مناطق پشتیبانی نمی شوند. به عنوان مثال ، اگر یک جدول جهانی با ماکت در مناطق شرق ایالات متحده (اوهایو) و ایالات متحده غربی (اورگان) دارید و یک عملیات tranactwriteitems را در منطقه شرق ایالات متحده (N. ویرجینیا) انجام می دهید ، ممکن است معاملات جزئی کامل را در غرب ایالات متحده مشاهده کنید(اورگان) منطقه به عنوان تغییرات تکرار می شود. پس از انجام آنها در منطقه منبع ، تغییرات فقط در مناطق دیگر تکرار می شود.< Pan> از استفاده از معاملات برای مصرف داده ها به صورت عمده خودداری کنید. برای نوشتن فله ، بهتر است از BatchWriteItem استفاده کنید.

آشنایی با رمزارزها...
ما را در سایت آشنایی با رمزارزها دنبال می کنید

برچسب : نویسنده : بهاءالدین خرمشاهی بازدید : 85 تاريخ : سه شنبه 8 فروردين 1402 ساعت: 5:33