rocksdb-js: بالاخره RocksDB درست برای Node.js
خلاصهٔ کاملتر
اگه تا حالا خواستی از RocksDB توی Node.js استفاده کنی، احتمالاً با یه بنبست آشنا روبرو شدی: بایندینگهایی که نصفهنیمهان، فورکهایی که مدتهاست رها شدن، و wrapper هایی که روی انتزاعهای قدیمی LevelDB ساخته شدن و از قابلیتهای واقعی RocksDB فقط یه بخش کوچیک رو در معرض دید میذارن. بدون تراکنش، بدون ایتریتور درست، بدون TypeScript. تیم Harper برای ساخت نسخه پنجم محصولشون به یه راهحل جدی نیاز داشت، به همین خاطر تصمیم گرفتن rocksdb-js رو از صفر بسازن.
rocksdb-js یه بایندینگ native به زبان C++ هست که مستقیماً از طریق Node-API (N-API) با RocksDB ارتباط برقرار میکنه. عمداً از لایههای انتزاعی قدیمی مثل node-addon-api فاصله گرفته تا کنترل بیشتری روی رابط native داشته باشه و سربار اضافه رو حذف کنه. API اون خیلی شبیه به lmdb-js طراحی شده تا توسعهدهندههایی که با اون کتابخانه آشنان بدون یادگیری از صفر بتونن سوئیچ کنن.
Harper قبلاً از LMDB استفاده میکرد که برای بارهای کاری سنگین روی خواندن عالیه؛ از حافظه مپشده استفاده میکنه و سرعت خواندنش فوقالعادهست. اما RocksDB یه جای دیگه میدرخشه: معماری LSM-tree اون با compaction مداوم، برای بارهای کاری با نوشتن زیاد و رکوردهای ناهمگون و متنوع فوقالعادهست. مشکل fragmentation که LMDB زیر نوشتن سنگین مداوم ممکنه داشته باشه رو هم نداره. Harper 5.0 هر دو موتور رو پشتیبانی میکنه؛ LMDB برای دیپلویهای قبلی همچنان موجوده، ولی RocksDB حالا پیشفرض برای workload های جدیده.
مهمترین ویژگیای که باعث شد این کتابخانه ساخته بشه پشتیبانی از تراکنشهای واقعیه. rocksdb-js هم تراکنش optimistic و هم pessimistic رو پشتیبانی میکنه. در حالت optimistic (که پیشفرضه) تضادها موقع commit شناسایی میشن، و در حالت pessimistic تضادها فوری شناسایی میشن که برای وقتی که میدونی احتمال contention زیاده مناسبتره. این امکان، الگوهایی مثل آپدیتهای چند رکوردی پیچیده، نوشتن شرطی، و چرخههای read-modify-write رو با ایزولاسیون درست ممکن میکنه.
Range queryها به صورت lazy اجرا میشن؛ یعنی نتیجهها یه iterable هستن نه یه آرایه از پیش بارگذاریشده. رکوردها فقط وقتی ازشون استفاده میکنی از دیسک خونده میشن. این برای dataset های بزرگ خیلی مهمه چون مجبور نیستی ۱۰ هزار رکورد رو توی حافظه بریزی تا ۵۰ تاشون رو پیدا کنی. متدهایی شبیه filter و map هم به صورت lazy روی این ایتریتورها کار میکنن.
یه ویژگی جالب که rocksdb-js رو از بقیه بایندینگها متمایز میکنه سیستم Transaction Log یکپارچهست. این سیستم تغییرات رو در فایلهای log دنبالهدار ثبت میکنه و برای Harper پایه سیستم replication، sync بین nodeها، پیامرسانی real-time از طریق WebSocket و MQTT، و دوام دادههاست. هر اپلیکیشنی که به change tracking، event sourcing، یا replication نیاز داشته باشه میتونه ازش استفاده کنه.
از نظر نصب هم تجربه خوبیه؛ باینریهای از پیش کامپایلشده برای macOS، Linux (هم glibc هم musl)، و Windows در هر دو معماری arm64 و x64 آمادهست. بدون این prebuilding، کامپایل RocksDB از سورس ۱۰ تا ۳۰ دقیقه طول میکشه، ولی با prebuilt ها نصب کامل حدود ۱۲ ثانیهست. کتابخانه با Apache 2.0 متنباز شده و تیم Harper امیدواره جامعه توسعهدهندگان در شکلدادن به آیندهش نقش داشته باشن.
نکات کلیدی:
- بایندینگ native C++ با API تایپاسکریپتی که از صفر ساخته شده، نه wrapper روی انتزاعهای قدیمی
- پشتیبانی کامل از تراکنشهای optimistic و pessimistic با ایزولاسیون واقعی
- Range queryهای lazy که حافظه رو بیجهت پر نمیکنن
- سیستم Transaction Log یکپارچه برای replication و event sourcing
- باینری آماده برای همه پلتفرمهای اصلی؛ نصب در ۱۲ ثانیه
- پشتیبانی کامل از worker threads برای پردازش موازی
- متنباز با لایسنس Apache 2.0




