فراتر از اصول: پنجره سازی در آپاچی کافکا

پنجره سازی چیست؟
این پست در ابتدا در وبلاگ Confluent منتشر شده است.
اگر برنامهای را با Kafka Streams یا ksqlDB ایجاد میکنید و آن برنامه شامل تجمیعها میشود، احتمالاً از پنجرهسازی استفاده خواهید کرد.
چرا اینطور است؟
خوب، تجمیع دادهها در طول زمان انباشته میشوند و بدون محدودیت، این انباشتگیها متوقف نمیشوند. پنجره را وارد کنید، که مقدار داده ای را که می تواند جمع آوری کند را مشخص می کند.
توجه داشته باشید که پنجرهسازی به چهار شکل انجام میشود، بسته به اینکه پنجره بر اساس اندازه و دوره تعریف میشود یا اینکه پنجره توسط رویداد راهاندازی میشود.
به عنوان مثال، بگویید که در حال طراحی برنامه ای با استفاده از حسگرهای رطوبت هستید تا زمانی که گیاه آپارتمانی بیش از حد خشک می شود هشدار دهد. شما می توانید یک فیلتر برای گیاهانی که میزان رطوبت پایینی دارند در یک ساعت گذشته انجام دهید. اگر آن فیلتر چیزی را برگرداند، آن رویداد میتواند باعث تجمع در پنجرهای شود که هر ساعت در حال چرخش است. نتیجه به هشدارها نوشته می شود.
بیایید نگاهی به هر یک از انواع پنجره ها با جزئیات دقیق بیندازیم.
پریدن
پنجره پرش چیست؟
یک پنجره پرش با زمان محدود می شود و با اندازه پنجره و اندازه بلوک زمانی که در آن پیشرفت می کند (هر دو در ثانیه اندازه گیری می شوند) تعریف می شود.
پنجره قرمز رنگ در نمودار بالا را در نظر بگیرید و به پیشرفت آن در طول زمان فکر کنید: اگر اندازه پنجره 50 ثانیه بود اما اندازه پیشروی آن 15 ثانیه بود، 35 ثانیه بین پنجره ها همپوشانی وجود داشت. در یک پنجره پرش، اندازه پنجره معمولاً برای مدت زمان بیشتری نسبت به اندازه پیش تعیین می شود. نمودار بالا نشان می دهد که اگر پنجره را به صورت مستطیل بگیرید و آن را بر روی جریان موجی داده قرار دهید، یک همپوشانی ممکن است شبیه به چه شکلی باشد – مستطیل هایی که همپوشانی دارند پنجره همپوشانی را نشان می دهند.
توجه: پنجره های غلتشی هرگز روی هم قرار نمی گیرند یا شکاف ندارند. پنجره های پرش ممکن است دارای شکاف یا همپوشانی باشند، یا ممکن است نداشته باشند.
یک مثال کلاسیک از پیادهسازی پنجره پرش، داشبوردی با میانگینهای متحرک است – مثلاً کلیکهای متوسط روی یک صفحه تجارت الکترونیک خاص، مانند صفحه جزئیات محصول برای سرخکن هوا، برای پنجرههای 2 دقیقهای در 24 ساعت گذشته.
ایجاد یک پنجره پرش
همانطور که در بالا گفته شد، دو بخش کلیدی اطلاعاتی وجود دارد که برای پیکربندی پنجره های پرش نیاز دارید: اندازه پنجره و اندازه پیشرو.
هنگامی که با Kafka Streams کار می کنید، باید هم یک windowSize و هم advanceSize تنظیم کنید. نمونه کامل تر را در این آموزش Kafka Streams 101 مشاهده کنید.
اگر در حال پیاده سازی یک پنجره پرش با ksqlDB هستید، باید مطمئن شوید که یک جدول با استفاده از نحو WINDOW HOPPING ایجاد کرده اید. شما این دو اندازه را با SIZE و ADVANCE BY تنظیم خواهید کرد. در این آموزش می توانید نمونه کامل تری را مشاهده کنید.
غلت زدن
پنجره غلتشی چیست؟
مانند پنجره های پرش، پنجره های غلتشی نیز مبتنی بر زمان هستند. در واقع، پنجره غلتشی یک زیرگروه خاص از پنجره پرش است که در آن windowSize و advanceSize یکسان هستند. این بدان معناست که یک رویداد منحصر به فرد فقط در یک پنجره در حال چرخش وجود خواهد داشت – بدون تکرار. همانطور که می بینید، این نمودار با نمودار قبلی متفاوت است، زیرا مستطیل ها روی هم قرار نمی گیرند و پنجره های غیر همپوشانی را نشان می دهند.
پنجرههای نازک برای گزارش دادن مکانهایی که میخواهید رویدادها به یک پنجره واحد تعلق داشته باشند مفید هستند، مانند جمعآوری تند کشیدنهای کارت اعتباری در ۵۵ ثانیه گذشته.
ایجاد یک پنجره در حال چرخش
ایجاد یک پنجره غلتشی در Kafka Streams از همان فرآیند پنجره پرش استفاده می کند، اما باید مطمئن شوید که windowSize و advanceSize یکسان هستند.
در ksqlDB، شما از دستور WINDOW TUMBLING در TABLE استفاده می کنید و SIZE را تنظیم می کنید. بخش آموزش در وب سایت Confluent یک مثال کامل را در خود جای داده است: نحوه ایجاد پنجره های غلتشی.
جلسه
پنجره جلسه چیست؟
یک پنجره جلسه توسط رویدادها راه اندازی می شود. این مکانیسم شامل چیزی به نام “شکاف عدم فعالیت” است. این فاصله مقدار زمانی است که پنجره در آن رشد می کند مگر اینکه توسط یک رویداد جدید قطع شود. هنگامی که یک رویداد جدید به عنوان ورودی وارد می شود، پنجره عدم فعالیت بازنشانی می شود و پنجره به رشد خود ادامه می دهد. اگر پنجره عدم فعالیت شما خیلی کوتاه است یا رویدادهای زیادی دارید، این می تواند منجر به یک پنجره بسیار طولانی شود!
در نمودار بالا، شکافهای عدم فعالیت با مستطیلهای آبی نشان داده میشوند که با رویدادی که توسط یک ستاره نشان داده میشود، از هم جدا شدهاند. مستطیلی که پنجره جلسه را نشان می دهد، شکاف های عدم فعالیت را در بر می گیرد.
موارد استفاده شامل ردیابی فعالیت کاربر است، اگر میخواهید بدانید چه تعداد رویداد در یک دوره زمانی ایجاد شده است (به عنوان مثال، مدت زمان پرخوری FlixMovie کاربر دقیقا چقدر بوده است؟).
ایجاد یک پنجره جلسه
ایجاد یک پنجره جلسه در Kafka Streams مستلزم تنظیم inactivityGap است. توضیحات کامل تری را در این آموزش مشاهده می کنید: Windowing.
گزینه دیگر استفاده از ksqlDB است، با استفاده از جدولی با دستور WINDOW SESSION. شما می توانید یک آموزش در این مورد را در اینجا مشاهده کنید: ایجاد پنجره های جلسه.
کشویی
پنجره کشویی چیست؟
یک پنجره کشویی نیز مبتنی بر زمان است، بنابراین اندازه پنجره در ثانیه تعریف می شود. برای اینکه یک پنجره کشویی راه اندازی شود، برخی از رویدادهای کاربر باید در یک پنجره زمانی مشخص اتفاق بیفتند. برای مثال، اگر میخواهید دادههای بین رویدادهای «افزودن به سبد خرید» و «خرید» را از کاربرانی که در مدت زمان تعریفشده سه ساعت ساخته شدهاند، محاسبه کنید، ممکن است از این نوع پنجره استفاده کنید.
در نمودار بالا، مدت زمان تعریف شده با یک مستطیل بزرگ آبی روشن نشان داده شده است. رویدادهای کاربر با دو ستاره طلایی نشان داده می شوند و مستطیل بنفش بین آنها نمایانگر پنجره داده است.
ایجاد یک پنجره کشویی
هنگامی که یک پنجره کشویی در Streams API ایجاد می کنید، باید timeDifference را تنظیم کنید. می توانید مثال کامل تری را در این آموزش پنجره سازی Confluent Developer پیدا کنید.
پشتیبانی از تنظیم صریح پنجره های کشویی هنوز در ksqlDB موجود نیست.
یادداشتی در مورد حوادث متأخر
اگر رویدادهای شما دیر برسد چه؟ می تواند تحلیل شما را منحرف کند. بنابراین، می توانید “دوره های مهلت” را در پنجره های غلتشی، پرش و کشویی معرفی کنید. اساساً مدت زمان معینی است که در آن رویدادها توسط پنجره ثبت میشوند، حتی اگر زمان آن رویدادها بیشتر از پایان پنجره باشد. توجه داشته باشید که رویدادهایی که پس از مهلت رخ میدهند شامل نمیشوند – این رویدادها برای همیشه دیر هستند و از دست خواهند رفت. پنجرههای جلسه مهلت ندارند زیرا فقط بر اساس رفتار کاربر است و نه زمان.
از زمان KIP-633، هیچ مهلت پیشفرضی برای Kafka Streams وجود ندارد. با این حال، در ksqlDB، پیش فرض 24 ساعت است.
از اینجا به کجا برویم
اگر این مقدمه برای پنجره سازی با Apache Kafka® مفید بود، ممکن است به این لیست از منابع برای غواصی عمیق تر نیز علاقه مند شوید:
ویدئوی Kafka Stream از دوره Kafka Streams 101: Windowing
آموزش اپلیکیشن Kafka Streams
دوره ksqlDB 101
لیست آموزش های جریان
الگوی Event Aggregator را ببینید