سلام خدمت همگی!!!!!
در این مقاله می خواهم آپاچی نای فای رو به شما معرفی کنم و تجربیاتی که در استفاده از این ابزار بسیار عالی داشتم رو در اختیار شما بزارم.
من حدودا پنج شیش ساله که دارم برنامه نویسی می کنم و زمانی که تقریبا دو سال پیش اسم آپاچی نا فای رو شنیدم و فهمیدم چه کار های بزرگی میشه باهاش انجام داد خیلی تعجب کردم که چرا در مدت چهار سال برنامه نویسی حتی اسم نای فای رو نشنیده بودم واسه همین تصمیم گرفتم این ابزار بسیار عالی رو به شما معرفی کنم چون این ابزار علی رغم بسیار بسیار پر کاربرد بودن بین برنامه نویس های ایرانی زیاد شناخته شده نیست و فقط شرکت هایی که پروژه های بزرگی که با معماری ماژول وار یا میکروسرویس رو انجام میدن با این ابزار آشنا هستن که تعداد این شرکت ها توی ایران زیاد نیست و شاید بعضی از پروژه های دولتی در حدی باشن که از معماری ماژول وار استفاده کنن ( پروژه ی با معماری میکروسرویس فک نکنم تو ایران وجود داشته باشه ).
چه کار هایی میشه با نای فای انجام داد؟
اگه بخوام تو یه کلمه بگم همه چی ! مثلاً میشه باهاش وب سرور درست کرد یا میشه باهاش کار postman و انجام داد یعنی واسه یه url خاص api فرستاد و نتیجه رو دریافت کرد ( با پراسسور InvokeHttp ) یا میشه داخل تموم صف های مختلف Kafka یا Rabbitmq یه سری اطلاعات خاصی publish کرد یا با یک صف خاص یا حتی به یک پورت (چه فیزیکی چه مجازی) listen کرد! مثلاً من با بچههای c++ شرکتمون یه پروژه داشتیم که باید با نای فای به پورت فیزیکی کارتشبکه listen میکردیم و اطلاعات و به صورت سری دریافت میکردیم و بعدش تبدیلش میکردیم به json و بعد توی کافکا اونو publish میکردیم و تموم این مراحل و با نای فای انجام دادیم (البته کار خیلی سختی بود )!
مهمترین کار هایی که با نای فای انجام میدن چیا هستن؟
مهمترین کار برد نای فای کار با دیتابیس های مختلف هستش که توی معماری میکرو سرویس و ماژول وار خیلی استفاده میشه. مثلاً فرض کنید من می خوام یه اپلیکیشن بسازم که هر کسی می تونه داخلش به عنوان ادمین ثبت نام کنه و محصولاتشو بفروشه همچنین یک سری کاربر های عادی هست که می تونن ثبت نام کنن و محصولات و بخرن ( یه چیزی شبیه دیوار ).
واسه انجام این کار چهار تا دیتابیس دارم که یکیش mysql هست،دومی redis،سومی postgresql و چهارمی mongodb . فرض کنید من چهار تا سرویس مختلف دارم مثلاً یه سرویس دارم برای ثبت نام ادمین و کاربر های معمولی هستکه به دیتابیس postgres وصله، یه سرویس دارم برای کنترل کردن توکن ها که به دیتابیس redis وصله، سرویس بعدیم مربوط هست به ثبت محصول که به دیتابیس mysql وصله و سرویس آخر مربوط به کار های مالی هست که به mongodb متصل هست.
تموم این سرویس ها از هم جدا هستن و هیچ ارتباطی باهم ندارن. فرض کنید یه نفر تو سرویس ثبت نام به عنوان ادمین ثبت نام میکنه این دیتا باید همون موقع توی سه تا دیتابیس دیگه هم وارد بشه چون توی اون سرویس ها باید بدونیم که کی داره از اون سرویس خاص استفاده می کنه و آیا مجوز استفاده از اون سرویس خاص رو داره یا نه! برای این کار میشه از نای فای استفاده کرد! وقتی رکورد جدیدی توی یک دیتابیس وارد میشه بلافاصله اون دیتا رو به دیتابیس های دیگه منتقل میکنه.
فرض کنید یک سرویس دیگه هم دارم که به کافکا متصل هست و داره گوش میکنه که اطلاعات جدیدی وارد شده یا نه (اصطلاحاً تو کافکا به گوش کردن میگن consume و به فرستادن اطلاعات میگن publish )پس میام با نای فای به یک دیتابیس خاص گوش میدم (البته برای دیتابیس نای فای گوش نمیده یا اصطلاحاً listen نمیکنه ولی اینجا برای درک بهتر از گوش دادن استفاده کردم) که ببینم محصول جدیدی برای خرید وارد شده یا نه، به محض اینکه کسی محصول جدیدی و برای خرید ثبت کرد با نای فای اطلاعات شخصی خریدار و اطلاعات محصول رو میگیرم و توی کافکا اون اطلاعات و اصطلاحاً publish میکنم، از اون طرف یه سرویس دارم که توی کافکا منتظر هست که ببینه محصول جدیدی publish شده یا نه، بعد از publish شدن محصول با نای فای سرویسی که داره consume میکنه اطلاعات خریدار و اطلاعات محصول رو به شکل ایمیل یا نوتیفیکیشن برای اون ادمین میفرسته تا ادمین مشاوره های لازم رو به خریدار بده!
این مثال یک نمونه از هزارانکاری هست که میشه با نای فای انجام داد!
توضیحات فنی تر:
تعریف processor : جزئی ترین بخش جریان داده ی نای فای هست و هر processor کار خاصی انجام میده. مثلاً یک processor هست که دیتا رو از دیتابیس ها می خونه (مثل ExecuteSql, QueryDatabaseTable البته این دو تا processor یک تفاوت کوچیک دارن که بعداً با جزئیات بیشتری توضیح میدم ) یا یه processor هست که فرمت دیتا رو تغییر میده مثلاً فرمت json رو تبدیل به csv می کنه یا مثلا فرمت avro رو به json تبدیل میکنه اسم این پراسسور ( یا پردازنده ) ConvertRecord هست یا یک processor دیگه هست که اطلاعات و از داخل json بیرون میکشه و به صورت key و value داخل اتربیوت ذخیره میکنه اسم این پراسسور EvaluateJsonPath هست.
تعریف Queue: پراسسور ها به وسیله ی queue به هم وصل میشوند و نتیجه ی تسک انجام شده توسط پراسسور، بسته به نوع نتیجه از طریق queue به پراسسور بعدی منتقل میشود.
تعریف Relationship: پراسسور ها (processor) ها بعد از اینکه تسک خاص خودشونو انجام دادن ممکنه انجام تسک موفقیت آمیز بوده باشه ( success ) و یا شکستخورده باشه ( failure )، نکته ی بسیار جالب اینجاست که هر relationship یک queue هست و بسته به نتیجه ی انجام تسک، نتیجه ( یا همون output ) وارد مسیر ( یا queue ) مربوط به success میشود یا وارد مسیر failure میشود.
مثلاً من میخواهم با استفاده از نای فای از تیبل users در دیتابیس shop کوئری بگیرم برای این کار از پراسسور ExecuteSql استفاده می کنم. اگر عملیات کوئری گرفتن موفقیت آمیز باشد نتیجه وارد مسیر success میشود و اگر در طی کوئری گرفتن مشکلی پیش بیاید وارد مسیر failure میشود.
تعریف service : یکی از اجزای مهم نای فای است و قابلیت این را دارد که یک سرویس بسازیم و چند بار از آن استفاده کنیم. هر سرویس یک وظیفه ی خاص انجام میده. این وظیفه ممکنه کانکشن به دیتابیس باشه مثلاً یک کانکشن به دیتابیس shop درست میکنم و در چندین processor از این سرویس برای وصل شدن به دیتابیس shop استفاده میکنم یا مثلاً یک سرویس میسازم که وظیفش اینه که فایلهای csv رو بخونه، یا یک سرویس دیگه میسازم که بتونه فایل csv بنویسه و در چندین پراسسور از آن استفاده می کنیم.
تعریف Process group: برای اینکه تسک هایی که انجام میدیم منظمتر بشن هر تسک خاص رو می تونیم گروه داخل یک گروه خاص به نام process group قرار بدیم. در داخل هر process group یک چندین پراسسور متصل به هم وجود داره که یک کار خاص رو انجام میدن. البته میتونیم داخل یک process group چند تا process group دیگه بسازیم و توی اونا پروژهمونو قرار بدیم.
نای فای چندین بخش دیگه هم داره ( مثل funnel (قیف) که چند تا اطلاعات مختلف و میگیره و با هم ترکیب میکنه و میده به بعدی یا مثلاً label که می تونیم یک سری توضیحات یا یادداشتهای خاصی و تو بخشهای مختلف بنویسیم ) که توی دوره تموم این بخشها رو مفصلتر بررسی میکنیم البته مهمترین بخشها همون موارد بالا هستن
توضیح: در مثال بالا پراسسور اول (ExecuteSql) که یک کوئری روی دیتابیس اجرا می کنه و نتیجه ( که همون دیتای کوئری گرفته شده از دیتابیس هست ) رو میده به پراسسور بعدی.
پراسسور ExecuteSql دیتای avro برگشتی رو میده به پراسسور بعدی یعنی ConvertAvroToJson، این پراسسور همون طور که از اسمش پیداست دیتای avro رو از ExecuteSql میگیره و اونو تبدیل میکنه به Json و اونو پاس میده به SplitJson، این پراسسور ( باز هم همون طور که از اسمش مشخصه! ) دیتا ( که یک ارایه از مشخصات کاربر ها مختلف هست ) رو به index های اون ارایه تقسیم میکنه مثلاً یک ارایه از 16 کاربر رو به 16 کاربر جدا از هم تبدیل می کنه و 16 دیتا رو پاس میده به پراسسور بعدی یعنی EvaluateJsonPath این پراسسور هر index رو به key و value تبدیل می کنه ( مثلاً firstname: javad ) و نتیجه رو پاس میده به processor بعدی یعنی ExecuteSql توی این پراسسور یک کوئری نوشتم که دیتای خارج شده از json به وسیله ی EvaluateJsonPath و وارد تیبل linkdin میکنه. البته یک پراسسور دیگه هم هست به اسم PutSql که دیتا رو وارد دیتابیس می کنه و برای وارد کردن دیتا بهتره از این processor استفاده بشه ولی از اونجایی که عادت کردم برای وارد کردن دیتا به دیتابیس از ExecuteSql استفاده میکنم که کار قشنگی نیست!
فرمت avro یک فرمت باینری هست و چون سرعت انجام query رو چندین برابر میکنه نای فای در پراسسور هاش از این فرمت استفاده می کنه و دیتای برگشتی از پراسسور ها ( البته فقط پراسسور هایی که با دیتابیس ارتباط دارن ) همیشه فرمت avro هست
خلاصه: نای فای و ناسا برای کنترل جریان داده درست کرد. هر پراسسور یک کار خاصی و روی دیتا انجام میده و نتیجه رو میده به پراسسور بعدی.
حرف آخر:
تو این مقاله آپاچی نای فای معرفی شد و سعی کردم یک معرفی خوب از این نرم افزار بسیار قوی داشته باشم که امیدوارم به هدفم رسیده باشم. تو آینده ی نزدیک سعی می کنم یک دوره ی جامع از apache nifi تهیه کنم و در اختیار برنامه نویس های عزیز بزارم چون یادگیری این ابزار کمک بسیار زیادی میکنه که یک مرحله به برنامه نویس سطح بالا شدن نزدیک بشیم و درک جامع تر و بهتری از معماری های ماژول وار و میکروسرویس داشته باشیم که برنامه نویس های کمی به این معماری ها تسلط کامل دارن.