Coban یک تیم پلتفرم جریان داده در زمان واقعی برنامه Grab است. به عنوان یک تیم پلتفرم، ما بر تأمین منابع جریان داده خود سرو در دسترس برای کاربران داخلیمان از تمام عمودی ها تکیه می کنیم، مانند موضوعات کافکا، فلینک و خطوط CDC (ترکیب داده تغییر) ، انواع مختلف از کانکتورهای Kafka-Connect و همچنین دفترچه یادداشت Apache Zeppelin، به طوری که آنها بتوانند به سادگی از داده های واقعی زمان استفاده کنند برای ساخت برنامه ها و خدمات هوشمند.
در این مقاله، ما سفر خود را از زیرساخت به عنوان کد (IaC) تا یک صفحه کنترل پیشرفته تر که روشی نوین برای خودخدماتی منابع جریان داده در Grab را غیرممکن کرده است، معرفی می کنیم. این تغییر نیز منجر به بهبود قابلیت همپوشانی، پایداری، امنیت و پذیرش کاربران از پلتفرم جریان داده ما می شود.
بیان مسئله
در اوایل عصر ابر عموماً عملیات روزانه برای ایجاد منابع مجازی را با کلیک بر روی کنسول وب ارائه دهنده ابر انجام می دادند که گاهی به عنوان کلیک است ارجاع می شود.
کلیک است دارای معایبی است مانند:
- قابلیت مرور، پیگیری و بررسی تغییرات زیرساخت ناپذیر است.قابلیت مقیاس پذیری عملیات زیرساخت محدود است.عدم همسانی بین محیط ها، مانند محیط نمونه و تولید.قابلیت بازیابی سریع از فاجعه با بازسازی زیرساخت در مکان دیگر زمانی.
با این حال، کلیک است یک مزیت بسیار بزرگ دارد؛ این باعث می شود ایجاد منابع با استفاده از رابط کاربری گرافیکی (UI) برای هر کسی مانند مهندسان زیرساخت، مهندسان نرم افزار، مهندسان داده و غیره به سادگی امکان پذیر باشد. این نیز منجر به سرعت تکرار بالا به سمت نوآوری به طور کلی می شود.
IaC بسیاری از محدودیت های کلیک را به طوری که:
- تغییرات در سیستم کنترل نسخه (VCS) مانند گیت اعمال می شوند: آنها می توانند توسط همتاها قبل از ادغام بررسی شوند. تمام تاریخچه تغییرات در دسترس است برای بررسی موضوعات و برای آزمون.عملیات زیرساخت بهتر مقیاس می شود: کد برای بخش های مشابه زیرساخت قابل مدولاریت است. تغییرات می توانند به طور خودکار توسط لوله های CI در سیستم VCS اجرا شوند، زمانی که یک تغییر به شاخه اصلی ادغام می شود.همان کد می تواند برای استقرار محیط های نمونه و تولید به طور یکنواخت استفاده شود.زیرساخت هر زمان می تواند از کد منبع خود بازسازی شود، در صورت وقوع فاجعه.
با این حال، IaC به طور ناخواسته نیز موانع ورودی جدیدی را ایجاد کرد، که نیاز به یادگیری ابزارهای جدیدی مانند Ansible، Puppet، Chef، Terraform و غیره دارد.
بعضی سازمان ها تیم های Site Reliability Engineer (SRE) را برای مدیریت متمرکز، عملیات و پشتیبانی از این ابزارها و زیرساخت به طور کلی تنظیم می کنند، اما این به زودی باعث ایجاد مشکلات جدید در مسیر نوآوری می شود.
از طرف دیگر، دیگران به تیم های مهندسی اجازه می دهند زیرساخت خود را مدیریت کنند، و به همان رویکرد متصل شده اند. ما از Terraform برای مدیریت زیرساخت استفاده می کنیم و انتظار داریم تمام تیم ها مهندسانی را که دوره آموزش Terraform را گذرونده و درک واضحی از آن دارند، داشته باشند.
در این زمینه، پلتفرم Coban ابتدا به عنوان یک دسته از مخازن Git در نظر گرفته شده بود که کاربران برای ایجاد منابع جریان داده خود تغییرات Terraform خود را ارسال کنند. بعد از بررسی توسط یک مهندس Coban، این تغییرات توسط لوله CI داشت اجرا شود.
اگرچه این یک قدم معنادار در مسیر خودخدماتی و پلتفرمی شدن ارائه Coban در Grab بود، اما دارای چندین معایب مهم بود:
- پایداری: به دلیل عدم کنترل تغییرات Terraform، لوله CI به خطاها و شکست های مکرر تمایل داشت. به عنوان مثال، کاربران با تکثیر یک پروژه Terraform جدید ، اما سپس فراموش می کنند تا محل ذخیره state یا وضعیت از راه دور Terraform را تغییر دهند، که منجر به جایگزینی در محل موجود شدن یک منبع است.مقیاس پذیری: تیم Coban نیاز به بررسی همه MR ها و ارائه پشتیبانی به صورت اد hoc داشت هر زمان که لوله خراب شد.امنیت: در نبود Identity and Access Management (IAM) ، MR ها ممکن است شامل تغییرات مربوط به منابع تیم های دیگر باشند، یا حتی تغییرات در زیرساخت هسته Coban با بازبینی کد به عنوان یک حصار گارد.Limited user growth: ما تنها می توانیم کاربرانی را که در Terraform ماهر هستند، به دست آوریم.
به زودی روشن شد که نیازمندیم لایه ای از انتزاع بین کاربران و کد Terraform خود ایجاد کنیم تا سطح کنترل را افزایش دهیم و در عین حال تمام مزایای IaC را حفظ کنیم.
راه حل
ما یک صفحه کنترل سه سطحی داخلی طراحی و ایجاد کردیم که شامل:
- واسط کاربری Coban ، یک رابط کاربری وب پیشانی که کاربران خود را با تجربهی ClickOps یکپارچه فراهم می کند.Heimdall ، بک اند Go رابط کاربری ، کلیک است را به IaC تبدیل می کند.Khone ، لایه ذخیره و راه اندازی کننده ، یک مخزن Git است که کد Terraform و متادیتا همه منابع و همچنین لاین کشی های CI برای برنامهریزی و اجرای تغییرات را ذخیره می کند.
در بخش های بعدی، به این سه کامپوننت عمیق وارد خواهیم شد.
اگرچه ما سفر کاربر را از واسط کاربری Coban شروع کردیم، کاربران ما هنوز می توانند با Heimdall و Khone به صورت مستقیم ارتباط برقرار کنند ، به عنوان مثال برای تغییرات دسته ای ، یا فقط به این دلیل که بسیاری از مهندسان دوست دارند از Git استفاده کنند و ما می خواهیم ترویج گسترده ای را تشویق کنیم. برای اطمینان از هماهنگی نهایی داده در سه سیستم، ما Khone را تنها لایه ذخیره سازی دائمی انتخاب کردیم. Heimdall به طور منظم از Khone داده ها را بگیرد ، آنها را در حافظه نهان می کند و به واسط کاربری Coban در هر پرس و جویی ارائه می دهد.
ما همچنین به برای تمام منابع از Terraform استفاده کردیم، به جای ترکیب گونه های مختلفی از روش های زیرساخت اظهاری (به عنوان مثال Custom Resource Definition یا چارت های Helm) ، به منظور هماهنگی منطق در لایه های Khone CI.
واسط کاربری Coban
واسط کاربری Coban یک برنامه یک برگه React است که توسط تیم همکار ما Chroma ، یک تیم اختصاصی از مهندسان front-end که بر روی ایجاد UI های افسانه ای و کامپوننت های قابل استفاده مجدد برای تیم های پلتفرم در Grab افتخار می کنند ، طراحی شده است.
این به عنوان یک پورتال خدمات خودکار جامع عمل می کند و به کاربران امکان می دهد تنها با چند کلیک منابع جریان داده را ایجاد و پیکربندی کنند.
به علاوه از تسهیل ایجاد و پیکربندی منابع، واسط کاربری Coban به طور یکپارچه با چند سیستم نظارتی متصل شده است. این ادغام امکان نظارت بر زمان واقعی بر روی معیارهای بحرانی و وضعیت سلامتی برای اجزای زیرساخت Coban را فراهم می کند، از جمله خوشه های Kafka، نرخ بایت و وضعیت ورود خروج موضوعات Kafka و غیره. تحت پوست، تمام این اطلاعات توسط API های Heimdall ارائه شده است.
در مورد زیرساخت ، واسط کاربری Coban در هاستینگ وب سایت AWS S3 قرار دارد. تمام محتوای پویا با پرس و جو کردن API های پشتیبانی شده است: Heimdall.
Heimdall
Heimdall بک اند Go واسط کاربری Coban است. این مجموعه ای از API ها را برای ارائه می دهد:
- مدیریت منابع جریان داده پلتفرم Coban با عملیات CRUD (ساخت، خواندن، به روزرسانی و حذف) ، برای رسوندن واسط کاربری Coban به عنوان یک تابع اصلی.Exposing the metadata of all Coban resources, so that they can be exposed by the Coban UI.Exposing the metadata of all Coban resources, so that they can be