بسته به موجودی شما، ممکن است لازم باشد فیدها را به چندین فایل تقسیم کنید (sharding).
چه زمانی از شاردینگ استفاده کنیم؟
حجم فید برای ۱ فایل (پس از فشردهسازی gzip) از ۲۰۰ مگابایت بیشتر است.
- مثال: فید دسترسی تولید شده ۱ گیگابایت است. این باید به بیش از ۵ فایل (یا تکه) جداگانه تقسیم شود.
موجودی شرکا در سیستمها و/یا مناطق مختلف توزیع شده است که منجر به دشواری تطبیق موجودی میشود.
- مثال: شریک موجودی ایالات متحده و اتحادیه اروپا دارد که در سیستمهای جداگانه قرار دارند. فید ممکن است با ۲ فایل (یا شارد) تولید شود، ۱ فایل برای ایالات متحده و ۱ فایل برای اتحادیه اروپا با
nonceوgeneration_timestampیکسان.
- مثال: شریک موجودی ایالات متحده و اتحادیه اروپا دارد که در سیستمهای جداگانه قرار دارند. فید ممکن است با ۲ فایل (یا شارد) تولید شود، ۱ فایل برای ایالات متحده و ۱ فایل برای اتحادیه اروپا با
قوانین عمومی
- هر Shard برای یک فایل نمیتواند از ۲۰۰ مگابایت (پس از فشردهسازی gzip) تجاوز کند.
- ما توصیه میکنیم بیش از ۲۰ شارد در هر فید نباشد. اگر توجیه تجاری شما به بیش از این مقدار نیاز دارد، لطفاً برای راهنمایی بیشتر با پشتیبانی تماس بگیرید.
- رکوردهای تکی (مثلاً یک شیء
Merchant) باید در یک Shard ارسال شوند، نمیتوان آنها را بین چندین Shard تقسیم کرد. با این حال، لازم نیست برای Feedهای بعدی در Shard با همانshard_numberارسال شوند. - برای عملکرد بهتر، دادههای شما باید به طور مساوی بین Shardها تقسیم شوند تا اندازه همه فایلهای Shard شده مشابه باشد.
How to shard feeds
برای هر فایل (یا shard)، FeedMetadata به صورت زیر تنظیم کنید:
-
processing_instructionرویPROCESS_AS_COMPLETEتنظیم شده است. -
shard_numberروی شارد فعلی فید تنظیم میشود (از ۰ شروع میشود تاtotal_shards- ۱ بدون ناپیوستگیها) -
total_shardsبرابر با تعداد کل خرده ریزهای فید (از ۱ شروع میشود) تنظیم میشود. -
nonceروی یک شناسه منحصر به فرد تنظیم میشود که در تمام بخشهای یک فید یکسان است اما با مقدار سایر فیدها متفاوت است. -
generation_timestampمهر زمانی در قالب یونیکس و EPOCH است. این باید در تمام بخشهای فید یکسان باشد.
توصیه میشود: برای هر فایل (یا shard)، نام فایل را طوری تنظیم کنید که نوع فید، برچسب زمانی، شماره shard و تعداد کل shardها را نشان دهد. shardها باید تقریباً اندازه یکسانی داشته باشند و پس از آپلود همه shardها پردازش شوند.
-
Example:«availability_feed_1574117613_001_of_002.json.gz»
مثال فید دسترسی خرد شده
خرده شیشه 0
{
"metadata": {
"processing_instruction": "PROCESS_AS_COMPLETE",
"shard_number": 0,
"total_shards": 3,
"nonce": "111111",
"generation_timestamp": 1524606581
},
"service_availability": [
{
"availability": [
{
"spots_total": 1,
"spots_open": 1,
"duration_sec": 3600,
"service_id": "1000",
"start_sec": 1577275200,
"merchant_id": "merchant1",
"confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
}
]
}
]
}شارد ۱
{
"metadata": {
"processing_instruction": "PROCESS_AS_COMPLETE",
"shard_number": 1,
"total_shards": 3,
"nonce": "111111",
"generation_timestamp": 1524606581
},
"service_availability": [
{
"availability": [
{
"spots_total": 1,
"spots_open": 1,
"duration_sec": 3600,
"service_id": "1000",
"start_sec": 1577620800,
"merchant_id": "merchant2",
"confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
}
]
}
]
}شارد ۲
{
"metadata": {
"processing_instruction": "PROCESS_AS_COMPLETE",
"shard_number": 2,
"total_shards": 3,
"nonce": "111111",
"generation_timestamp": 1524606581
},
"service_availability": [
{
"availability": [
{
"spots_total": 1,
"spots_open": 1,
"duration_sec": 3600,
"service_id": "1000",
"start_sec": 1576670400,
"merchant_id": "merchant3",
"confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
}
]
}
]
}استفاده از شاردینگ برای موجودی توزیعشدهی شرکا
تجمیع موجودی توزیعشده در چندین سیستم و یا منطقه در یک منبع واحد میتواند برای شرکا چالشبرانگیز باشد. با تنظیم هر شارد برای مطابقت با مجموعه موجودی هر سیستم توزیعشده، میتوان از شاردینگ برای حل چالشهای تطبیق استفاده کرد.
برای مثال، فرض کنید موجودی یک شریک به دو منطقه (موجودی ایالات متحده و اتحادیه اروپا) تقسیم شده است که در دو سیستم جداگانه قرار دارند.
شریک میتواند هر فید را به ۲ فایل (یا تکه) تقسیم کند:
- فید بازرگانان: ۱ شارد برای ایالات متحده، ۱ شارد برای اتحادیه اروپا
- فید خدمات: ۱ شارد برای ایالات متحده، ۱ شارد برای اتحادیه اروپا
- فید در دسترس بودن: ۱ شارد برای ایالات متحده، ۱ شارد برای اتحادیه اروپا
برای اطمینان از پردازش صحیح فیدها، مراحل زیر را دنبال کنید:
- یک برنامه آپلود تعیین کنید و هر نمونه از موجودی را طوری پیکربندی کنید که از این برنامه پیروی کند.
- برای هر نمونه، شمارههای شارد منحصر به فرد اختصاص دهید (مثلاً US = N، EU = N + 1).
total_shardsرا برابر با تعداد کل شاردها قرار دهید. - در هر زمان بارگذاری برنامهریزیشده، یک
generation_timestampوnonceانتخاب کنید. درFeedMetadata، تمام نمونهها را طوری تنظیم کنید که مقادیر یکسانی را برای این دو فیلد نگه دارند.-
generation_timestampباید مربوط به زمان حال یا گذشته نزدیک باشد (در حالت ایدهآل، مربوط به زمان خواندن از پایگاه دادهی شریک باشد)
-
- بعد از اینکه همه Shardها آپلود شدند، گوگل Shardها را از طریق
generation_timestampوnonceگروهبندی میکند.
گوگل این فید را به عنوان یک واحد پردازش خواهد کرد، حتی اگر هر شارد نشاندهندهی منطقهی متفاوتی از موجودی شریک باشد و تا زمانی که generation_timestamp در تمام شاردها یکسان باشد، میتواند در زمانهای مختلفی از روز آپلود شود.
مثال فید دسترسی خرد شده بر اساس منطقه
موجودی شارد ۰ در ایالات متحده
{
"metadata": {
"processing_instruction": "PROCESS_AS_COMPLETE",
"shard_number": 0,
"total_shards": 2,
"nonce": "111111",
"generation_timestamp": 1524606581
},
"service_availability": [
{
"availability": [
{
"spots_total": 1,
"spots_open": 1,
"duration_sec": 3600,
"service_id": "1000",
"start_sec": 1577275200,
"merchant_id": "US_merchant_1",
"confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
}
]
}
]
}شارد ۱ - موجودی اتحادیه اروپا
{
"metadata": {
"processing_instruction": "PROCESS_AS_COMPLETE",
"shard_number": 1,
"total_shards": 2,
"nonce": "111111",
"generation_timestamp": 1524606581
},
"service_availability": [
{
"availability": [
{
"spots_total": 1,
"spots_open": 1,
"duration_sec": 3600,
"service_id": "1000",
"start_sec": 1577620800,
"merchant_id": "EU_merchant_1",
"confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
}
]
}
]
}