۳۰ آذر ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

DBOS: راه بهتری برای ساخت برنامه ها؟

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

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

در پایان مارس ۲۰۲۴، مایک استون بریکر در یک پست وبلاگ انتشار را اعلام کرد. از DBOS Cloud، “یک پلت فرم محاسباتی بدون سرور تراکنشی، که توسط یک سیستم عامل جدید انقلابی، DBOS ممکن شده است. ، که خدمات سیستم عامل را در بالای یک پایگاه داده توزیع شده پیاده سازی می کند.” به بیان ملایم، عجیب به نظر می رسد، اما وقتی داستان اصلی را می خوانید، منطقی تر می شود:

ایده DBOS (سیستم عامل مبتنی بر پایگاه داده) ۳ سال پیش با درک من شکل گرفت که وضعیتی که یک سیستم عامل باید حفظ کند (فایل ها، فرآیندها، رشته ها، پیام ها و غیره) حدود ۶ مرتبه بزرگتر شده است. از زمانی که در سال ۱۹۷۳ از یونیکس روی PDP-11/40 استفاده کردم. به این ترتیب، ذخیره وضعیت سیستم عامل یک مشکل پایگاه داده است. همچنین، لینوکس در حال حاضر یک کد قدیمی است و در پیشرفت رو به جلو با مشکل مواجه است. برای مثال، هیچ نسخه چند گره‌ای از لینوکس وجود ندارد، که افراد را ملزم می‌کند تا یک ارکستراتور مانند Kubernetes را اجرا کنند. وقتی صحبتی از متی زهاریا شنیدم که در آن گفت Databricks نمی‌تواند از فناوری زمان‌بندی سیستم‌عامل سنتی در مقیاسی که در حال اجراست استفاده کند و به جای آن به یک راه‌حل DBMS روی آورده است، واضح بود که زمان انتقال DBMS به هسته است و یک سیستم عامل جدید بسازید.”

اگر Stonebraker را نمی‌دانید، او یک دانشمند کامپیوتر متمرکز بر پایگاه داده بوده است (و استاد) از اوایل دهه ۱۹۷۰، زمانی که او و همکارانش در دانشگاه برکلی یوجین ونگ و لری رو Ingres< را تأسیس کردند. /a>. انگرس بعداً از Sybase الهام گرفت که در نهایت مبنایی برای Microsoft SQL Server شد. پس از فروش Ingres به Computer Associates، Stonebraker و Rowe شروع به تحقیق در مورد Postgres کردند که بعداً به PostgreSQL تبدیل شد و همچنین به Illustra تبدیل شد که توسط Informix خریداری شد.

من شنیدم که Stonebraker در مورد Postgres در کنفرانس DBMS در سال ۱۹۸۰ صحبت می کرد. چیزی که از آن سخنرانی به دست آوردم، جدای از تصویری از “درام جنگلی” که SQL را فرا می خواند، این ایده بود که شما می توانید با پیاده سازی انواع فهرست جدید، گسترش زبان پرس و جو و افزودن پشتیبانی برای آن به تجزیه کننده پرس و جو و بهینه ساز، پشتیبانی از انواع داده های پیچیده را به پایگاه داده اضافه کنید. مثالی که او استفاده کرد اطلاعات مکانی بود، و یک نوع ساختار فهرست را توضیح داد که باعث می‌شود پرس‌وجوهای پایگاه داده هندسی دوبعدی بسیار سریع انجام شوند. (این تسهیلات در نهایت به PostGIS تبدیل شد. R-tree که در حال حاضر به‌طور پیش‌فرض در فهرست‌های PostGIS GiST استفاده می‌شود، تا سال ۱۹۸۴ اختراع نشده بود، بنابراین مایک احتمالاً در مورد quadtree index.)

با گذشت ۴۴ سال، هیچ کس در زمینه پایگاه داده نباید تعجب کند که DBOS از نسخه توزیع شده PostgreSQL به عنوان لایه پایگاه داده هسته خود استفاده می کند.

dbos 01

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

ویژگی های DBOS

DBOS Transact، یک چارچوب متن باز TypeScript، از Postgres-compatible پشتیبانی می کند. معاملات، قابل اعتماد ارکستراسیون گردش کار، سرویس HTTP< /a> با استفاده از GET و POST، ارتباط با خدمات خارجی و APIهای شخص ثالث، < a href="https://docs.dbos.dev/tutorials/idempotency-tutorial" rel="nofollow">درخواست‌های idempotent با استفاده از کلیدهای UUID، احراز هویت و مجوز، ادغام کافکا با معناشناسی دقیقاً یک بار، تست واحد، و خود میزبانی. DBOS Cloud، یک پلت فرم بدون سرور تراکنشی برای استقرار برنامه‌های DBOS Transact، از استقرار برنامه بدون سرور پشتیبانی می‌کند. ، اشکال‌زدایی سفر در زمان، مدیریت پایگاه داده ابری و مشاهده پذیری.

نحوه تست حداقل API در ASP.NET Core 6

بیایید برخی از زمینه های اصلی مورد علاقه را برجسته کنیم.

DBOS Transact

کدی که در تصویر زیر نشان داده شده است، تراکنش‌ها و همچنین سرویس HTTP با استفاده از GET را نشان می‌دهد. خواندن کد از نزدیک ارزشمند است. این فقط ۱۸ خط است، بدون احتساب خطوط خالی.

اولین وارد کردن (خط ۱) کلاس‌های DBOS SDK را وارد می‌کند که به آن‌ها نیاز داریم. وارد کردن دوم (خط ۲) سازنده کوئری Knex.js SQL را وارد می‌کند، که ارسال پرس و جوی پارامتر شده را به Postgres انجام می‌دهد. پایگاه داده و بازگرداندن ردیف های حاصل. طرح جدول پایگاه داده در خطوط ۴ تا ۸ تعریف شده است. تنها ستون ها یک رشته name و یک عدد صحیح greet_count هستند.

فقط یک روش در کلاس Hello وجود دارد، helloTransaction. این در دکوراتورهای @GetApi و @Transaction پیچیده شده است، که به ترتیب باعث می‌شوند روش در پاسخ به درخواست HTTP GET در مسیر ارائه شود. /greeting/ به دنبال آن پارامتر نام کاربری که می‌خواهید به آن منتقل کنید و فراخوانی پایگاه داده را در یک تراکنش بپیچید، به طوری که دو نمونه نمی‌توانند به طور همزمان پایگاه داده را به روز کنند.

رشته پرس و جو پایگاه داده (خط ۱۶) از نحو PostgreSQL برای درج ردیفی در پایگاه داده برای نام ارائه شده و تعداد اولیه ۱ استفاده می کند. اگر ردیف از قبل وجود داشته باشد، کد ON CONFLICT > trigger یک عملیات به روز رسانی را اجرا می کند که تعداد را در پایگاه داده افزایش می دهد.

خط ۱۷ از Knex.js برای ارسال کوئری SQL به پایگاه داده سیستم DBOS و بازیابی نتیجه استفاده می کند. خط ۱۸ تعداد را از ردیف اول نتایج خارج می کند و رشته تبریک را به برنامه تماس برمی گرداند.

استفاده از SQL و یک پایگاه داده برای آنچه که به نظر می رسد باید یک API سیستم هسته ای در حافظه باشد، مانند یک شمارنده اتمی لینوکس یا یک متغیر به هم پیوسته ویندوز، عمیقاً عجیب به نظر می رسد. با این وجود، کار می کند.

dbos 02

این کد TypeScript برای کلاس Hello زمانی ایجاد می شود که شما یک عملیات ایجاد DBOS را انجام می دهید. همانطور که می بینید، برای ارائه عملکرد از درخواست های HTTP GET و اجرای تابع به عنوان یک تراکنش پایگاه داده، به دکوراتورهای @GetApi و @Transaction متکی است.

DBOS Time Travel Debugger

وقتی برنامه‌ای را در DBOS Cloud اجرا می‌کنید، هر مرحله را ضبط می‌کند و تغییری که در آن ایجاد می‌کند (جریان کار) در پایگاه داده. می‌توانید با استفاده از کد ویژوال استودیو و اشکال‌زدایی کنید. پسوند DBOS Time Travel Debugger. اشکال زدای زمان سفر به شما اجازه می دهد تا برنامه DBOS خود را در برابر پایگاه داده همانگونه که در زمان اجرای اولیه گردش کار انتخاب شده وجود داشت، اشکال زدایی کنید.

dbos 03

برای انجام اشکال‌زدایی سفر در زمان، ابتدا با یک CodeLens شروع می‌کنید تا گردش‌های کاری ردیابی ذخیره‌شده را فهرست کنید. هنگامی که مورد مورد نظر خود را انتخاب کردید، می توانید با استفاده از کد ویژوال استودیو با یک افزونه یا از خط فرمان آن را اشکال زدایی کنید.

dbos 04

اشکال‌زدایی در سفر در زمان با یک گردش کار ذخیره‌شده، بسیار شبیه اشکال‌زدایی معمولی در Visual Studio Code است. کدی که اشکال زدایی می شود همان کلاس Hello است که قبلا دیدید.

راه اندازی سریع DBOS

آموزش شروع سریع DBOS به Node.js 20 یا جدیدتر و یک پایگاه داده PostgreSQL نیاز دارد که می توانید به صورت محلی، در ظرف Docker یا از راه دور به آن متصل شوید. من قبلاً Node.js v20.9.0 را روی مک بوک M1 خود نصب کرده بودم، اما آن را از وب سایت Node.js به نسخه ۲۰.۱۲.۱ ارتقا دادم.

من PostgreSQL را نصب نکرده بودم، بنابراین نصب کننده تعاملی v16.2 را از EnterpriseDB دانلود و اجرا کردم. این نصب کننده یک سرور macOS و برنامه های کاربردی کامل ایجاد می کند. اگر به جای آن از Homebrew استفاده می کردم، برنامه های خط فرمان ایجاد می کرد و اگر از Postgres.app استفاده می کردم، یک برنامه نوار منو دریافت می کردم.

راه‌اندازی سریع با ایجاد دایرکتوری برنامه DBOS با استفاده از Node.js شروع می‌شود.

martinheller@Martins-M1-MBP ~ % npx -y @dbos-inc/create@latest -n myapp
Merged .gitignore files saved to myapp/.gitignore
added 590 packages, and audited 591 packages in 25s
found 0 vulnerabilities
added 1 package, and audited 592 packages in 1s
found 0 vulnerabilities
added 129 packages, and audited 721 packages in 5s
found 0 vulnerabilities
Application initialized successfully!

سپس برنامه را برای استفاده از سرور Postgres خود پیکربندی می‌کنید و رمز عبور Postgres خود را به یک متغیر محیطی صادر می‌کنید.

martinheller@Martins-M1-MBP ~ % cd myapp
martinheller@Martins-M1-MBP myapp % npx dbos configure
? What is the hostname of your Postgres server? localhost
? What is the port of your Postgres server? 5432
? What is your Postgres username? postgres
martinheller@Martins-M1-MBP myapp % export PGPASSWORD=*********

پس از آن، با استفاده از Node.js و Knex.js یک پایگاه داده "Hello" ایجاد می کنید.

martinheller@Martins-M1-MBP myapp % npx dbos migrate
۲۰۲۴-۰۴-۰۹ ۱۵:۰۱:۴۲ [info]: Starting migration: creating database hello if it does not exist
۲۰۲۴-۰۴-۰۹ ۱۵:۰۱:۴۲ [info]: Database hello does not exist, creating...
۲۰۲۴-۰۴-۰۹ ۱۵:۰۱:۴۲ [info]: Executing migration command: npx knex migrate:latest
۲۰۲۴-۰۴-۰۹ ۱۵:۰۱:۴۳ [info]: Batch 1 run: 1 migrations
۲۰۲۴-۰۴-۰۹ ۱۵:۰۱:۴۳ [info]: Creating DBOS tables and system database.
۲۰۲۴-۰۴-۰۹ ۱۵:۰۱:۴۳ [info]: Migration successful!

با تکمیل آن، برنامه DBOS را به صورت محلی ایجاد و اجرا می کنید.

martinheller@Martins-M1-MBP myapp % npm run build
npx dbos start

> myapp@0.0.1 build
> tsc

۲۰۲۴-۰۴-۰۹ ۱۵:۰۲:۳۰ [info]: Workflow executor initialized
۲۰۲۴-۰۴-۰۹ ۱۵:۰۲:۳۰ [info]: HTTP endpoints supported:
۲۰۲۴-۰۴-۰۹ ۱۵:۰۲:۳۰ [info]:     GET   :  /greeting/:user
۲۰۲۴-۰۴-۰۹ ۱۵:۰۲:۳۰ [info]: DBOS Server is running at http://localhost:3000
۲۰۲۴-۰۴-۰۹ ۱۵:۰۲:۳۰ [info]: DBOS Admin Server is running at http://localhost:3001
^C

در این مرحله، می توانید برای آزمایش برنامه به http://localhost:3000 مراجعه کنید. با انجام این کار، شما برای DBOS Cloud ثبت نام می کنید و پایگاه داده خود را در آنجا ارائه می کنید.

martinheller@Martins-M1-MBP myapp % npx dbos-cloud register -u meheller
۲۰۲۴-۰۴-۰۹ ۱۵:۱۱:۳۵ [info]: Welcome to DBOS Cloud!
۲۰۲۴-۰۴-۰۹ ۱۵:۱۱:۳۵ [info]: Before creating an account, please tell us a bit about yourself!
Enter First/Given Name: Martin
Enter Last/Family Name: Heller
Enter Company: self
۲۰۲۴-۰۴-۰۹ ۱۵:۱۲:۰۶ [info]: Please authenticate with DBOS Cloud!
Login URL: https://login.dbos.dev/activate?user_code=QWKW-TXTB
۲۰۲۴-۰۴-۰۹ ۱۵:۱۲:۱۲ [info]: Waiting for login...
۲۰۲۴-۰۴-۰۹ ۱۵:۱۲:۱۷ [info]: Waiting for login...
۲۰۲۴-۰۴-۰۹ ۱۵:۱۲:۲۲ [info]: Waiting for login...
۲۰۲۴-۰۴-۰۹ ۱۵:۱۲:۲۷ [info]: Waiting for login...
۲۰۲۴-۰۴-۰۹ ۱۵:۱۲:۳۲ [info]: Waiting for login...
۲۰۲۴-۰۴-۰۹ ۱۵:۱۲:۳۸ [info]: Waiting for login...
۲۰۲۴-۰۴-۰۹ ۱۵:۱۲:۴۴ [info]: meheller successfully registered!
martinheller@Martins-M1-MBP myapp % npx dbos-cloud db provision iw_db -U meheller
Database Password: ********
۲۰۲۴-۰۴-۰۹ ۱۵:۱۹:۲۲ [info]: Successfully started provisioning database: iw_db
۲۰۲۴-۰۴-۰۹ ۱۵:۱۹:۲۸ [info]: {"PostgresInstanceName":"iw_db","HostName":"userdb-51fcc211-6ed3-4450-a90e-0f864fc1066c.cvc4gmaa6qm9.us-east-1.rds.amazonaws.com","Status":"available","Port":5432,"DatabaseUsername":"meheller","AdminUsername":"meheller"}
۲۰۲۴-۰۴-۰۹ ۱۵:۱۹:۲۸ [info]: Database successfully provisioned!

در نهایت، می‌توانید برنامه خود را در DBOS Cloud ثبت و اجرا کنید.

martinheller@Martins-M1-MBP myapp % npx dbos-cloud app register -d iw_db
۲۰۲۴-۰۴-۰۹ ۱۵:۲۰:۰۹ [info]: Loaded application name from package.json: myapp
۲۰۲۴-۰۴-۰۹ ۱۵:۲۰:۰۹ [info]: Registering application: myapp
۲۰۲۴-۰۴-۰۹ ۱۵:۲۰:۱۱ [info]: myapp ID: d8806829-c5b8-4df0-8b5a-2d1bf87c3322
۲۰۲۴-۰۴-۰۹ ۱۵:۲۰:۱۱ [info]: Successfully registered myapp!
martinheller@Martins-M1-MBP myapp % npx dbos-cloud app deploy
۲۰۲۴-۰۴-۰۹ ۱۵:۲۰:۳۵ [info]: Loaded application name from package.json: myapp
۲۰۲۴-۰۴-۰۹ ۱۵:۲۰:۳۵ [info]: Submitting deploy request for myapp
۲۰۲۴-۰۴-۰۹ ۱۵:۲۱:۰۹ [info]: Submitted deploy request for myapp. Assigned version: 1712676035
۲۰۲۴-۰۴-۰۹ ۱۵:۲۱:۱۳ [info]: Waiting for myapp with version 1712676035 to be available
۲۰۲۴-۰۴-۰۹ ۱۵:۲۱:۲۱ [info]: Successfully deployed myapp!
۲۰۲۴-۰۴-۰۹ ۱۵:۲۱:۲۱ [info]: Access your application at https://meheller-myapp.cloud.dbos.dev/

dbos 05

برنامه "Hello" در حال اجرا در DBOS Cloud هر تبریک را می شمارد. از کدی که قبلا دیدید استفاده می کند.

برنامه های DBOS

برنامه «Hello» برخی از ویژگی‌های اصلی DBOS Transact و DBOS Cloud را نشان می‌دهد، اما آنقدر ساده است که به سختی یک اسباب‌بازی است. شروع سریع برنامه‌نویسی جزئیات بیشتری را اضافه می‌کند، و ارزش وقت گذاشتن را دارد آی تی. نحوه استفاده از توابع ارتباط دهنده برای دسترسی به خدمات شخص ثالث (ایمیل، در این مثال) و همچنین نحوه ایجاد گردش کار قابل اعتماد را خواهید آموخت. شما به معنای واقعی کلمه جریان کار را قطع می‌کنید و بدون ارسال مجدد ایمیل، آن را مجدداً راه‌اندازی می‌کنید: گردش‌های کاری DBOS همیشه تا پایان کامل می‌شوند و هر یک از عملیات آن‌ها یک‌بار و تنها یک بار اجرا می‌شوند. این امکان پذیر است زیرا DBOS خروجی هر مرحله از پایگاه داده شما را ادامه می دهد.

وقتی برنامه‌نویسی Quickstart را فهمیدید، آماده خواهید بود که دو DBOS را امتحان کنید. برنامه‌های آزمایشی، که انجام می‌دهند به سطح اسباب‌بازی شدن می‌رسند. هر دو نسخه نمایشی از Next.js برای قسمت‌های جلویی خود استفاده می‌کنند و هر دو از گردش‌های کاری، تراکنش‌ها و ارتباطات DBOS استفاده می‌کنند.

اولین نسخه آزمایشی، تجارت الکترونیک، یک خرید اینترنتی است و سیستم پردازش پرداخت خواندن در بخش Covers README در مخزن نسخه نمایشی، برای درک نحوه عملکرد و نحوه ارتقاء آن به عنوان مثال، استفاده از یک ارائه دهنده پرداخت در دنیای واقعی.

نمونه نمایشی دوم، YKY Social، یک شبکه اجتماعی ساده را شبیه‌سازی می‌کند. و از TypeORM به جای Knex.js برای کد پایگاه داده خود استفاده می کند. همچنین از Amazon S3 برای عکس های پروفایل استفاده می کند. اگر خودتان در مورد استفاده از DBOS جدی هستید، باید با هر دو برنامه آزمایشی کار کنید.

یک نگاه اجمالی وسوسه انگیز

باید بگویم که DBOS و DBOS Cloud بسیار جالب به نظر می رسند. برای مثال اجرای قابل اعتماد و اشکال زدایی در سفر در زمان کاملاً مطلوب است. از طرف دیگر، من نمی خواهم در این مرحله یک برنامه واقعی روی DBOS یا DBOS Cloud بسازم. من سؤالات زیادی دارم که با «در عمل چگونه مقیاس می شود؟» شروع می شود. و احتمالاً با "هزینه آن در مقیاس X چقدر خواهد بود؟"

به پایان می رسد

من قبلاً اشاره کردم که کد DBOS عجیب به نظر می رسد اما کار می کند. تصور می‌کنم هر فروشگاه برنامه‌نویسی که قصد نوشتن برنامه‌ای روی آن را داشته باشد، با بخش "عجیب به نظر می‌رسد" دلسرد یا حتی دفع می‌شود، زیرا توسعه‌دهندگان تمایل دارند تا زمانی که کاری که انجام می‌دهند دیگر کار نکند، در مسیر خود قرار می‌گیرند.

همچنین باید اشاره کنم که اجرای فعلی DBOS با نمودار سیستمی که در ابتدای این بررسی دیدید بسیار دور است. هسته حداقل کجاست؟ DBOS در حال حاضر روی macOS، Linux و Windows اجرا می شود. هیچ کدام از آن ها هسته های حداقلی نیستند. DBOS Cloud در حال حاضر روی AWS اجرا می شود. باز هم، نه یک هسته حداقل.

بنابراین، به طور کلی، DBOS یک نگاه اجمالی وسوسه‌انگیز از چیزی است که در نهایت ممکن است جالب باشد. این جدید و براق است و از افراد باهوش می آید، اما مدتی طول می کشد تا احتمالاً به یک سیستم اصلی تبدیل شود.

هزینه: رایگان با محدودیت‌های استفاده؛ برنامه های پولی از شما می خواهند که با فروش تماس بگیرید.

پلتفرم: macOS، Linux، Windows، AWS.