TurboKV، دیتابیس کلید-مقدار امبدد برای Rust
خلاصهٔ کاملتر
تو مخزن TurboKV اومده که این پروژه یه دیتابیس کلید-مقدار امبدده، یعنی بهجای اینکه سرور جدایی باشه، مثل یه کتابخونه داخل خود برنامه اجرا میشه. با Rust نوشته شده، APIش آسنکرونه و روی Tokio کار میکنه. نسخهٔ فعلیش ۰.۶ هست و کلید و مقدار رو بهصورت بایت خام نگه میداره، پس اگه رشته داری خودت باید انکودش کنی.
کل کار با یه هندل Db انجام میشه و write_batch تضمین میکنه که خوانندهها یا کل دسته رو میبینن یا هیچکدوم رو:
let db = Db::open_with_options("./my-database", DbOptions::durable()).await?;
db.insert(b"user:1", b"Ada").await?;
let mut batch = WriteBatch::new();
batch.put(b"user:2", b"Grace");
batch.delete(b"user:1");
db.write_batch(&batch).await?;یعنی برای عوض کردن چندتا کلید با هم، لازم نیست خودت قفل بذاری یا نگران حالت نیمهکاره باشی.
مهمترین انتخاب موقع باز کردن دیتابیس، حالت دوامه. DbOptions::fast() اصلاً WAL نمینویسه (WAL یعنی فایل لاگی که تغییر قبل از اعمال توش نوشته میشه تا بعد از کرش بشه بازیابی کرد) و فقط به درد کش و دادهٔ قابل بازتولید میخوره. durable() که پیشنهاد خود پروژهست، رکورد رو به WAL اضافه میکنه ولی برای هر نوشتن sync نمیزنه. paranoid() قبل از اینکه جواب موفق بده، منتظر میمونه sync تموم شه.
عددهای بنچمارک همینو نشون میده. با TurboKV 0.6.0 روی Apple M4، پر کردن ترتیبی تککلیدی تو حالت Fast حدود ۲.۹۹ میلیون کلید در ثانیه میده، Durable حدود ۱.۷۷ میلیون، و Paranoid فقط ۲۱۳ تا، چون هر نوشتن باید منتظر بمونه دیسک واقعاً کارشو تموم کنه. با دستهٔ هزارتایی همون Paranoid میره روی ۱۶۲ هزار، چون یه بار sync بین هزار کلید تقسیم میشه.
تو مستندات تأکید شده که Durable سقف دقیقی برای از دست رفتن داده نمیده: فلاش آسنکرونه و حساب حافظه تقریبیه، پس اگه هر تأیید موفق حتماً باید از مرز sync رد شده باشه، باید بری سراغ Paranoid. یه نکتهٔ عملی هم هست: فرمت Bloom filter از AES سختافزاری استفاده میکنه، پس موقع build باید RUSTFLAGS رو با فیچر aes ست کنی وگرنه به مشکل میخوری.
نکات کلیدی:
- نسخهٔ ۰.۶، نوشتهشده با Rust، آسنکرون روی Tokio
- سه پریست دوام: fast() بدون WAL، durable() بهعنوان پیشفرض پیشنهادی، و paranoid() با sync قبل از تأیید
- پیشفرض هر سه پریست: memtable و block cache هرکدوم ۶۴ مگابایت و فشردهسازی LZ4
- بنچمارک روی Apple M4: نوشتن ترتیبی تککلیدی ۲,۹۸۹,۵۳۷ کلید در ثانیه در Fast مقابل ۲۱۳ تا در Paranoid
- فقط یه هندل باز میتونه صاحب پوشهٔ داده باشه و close() تنها راه خاموش کردن تمیزه




