Quack: پروتکل کلاینت-سرور برای DuckDB
خلاصهٔ کاملتر
DuckDB از همون ابتدا بهعنوان یه پایگاه داده in-process طراحی شده بود — یعنی مستقیم داخل اپلیکیشن اجرا میشه و خبری از کلاینت، سرور، یا پروتکل شبکهای نیست. این رویکرد برای کارهایی مثل تحلیل داده در Python notebook خیلی خوب جواب میده، ولی یه مشکل جدی داشت: وقتی چند پروسس بخوان همزمان روی یه فایل دیتابیس بنویسن، همه چیز به هم میریخت. دلیلش اینه که DuckDB بخشی از state خودش رو در حافظه نگه میداره و همگامسازی اون بین چند پروسس کار پیچیدهایه.
برای حل این مشکل، جامعه کاربری راهحلهای مختلفی مثل Arrow Flight SQL یا RPC های سفارشی ساخته بود. این حجم از workaround نشون داد که کاربرها واقعاً به یه راهحل رسمی نیاز دارن. تیم DuckDB در نهایت تصمیم گرفت خودش یه پروتکل بومی طراحی کنه که هم ساده باشه، هم سریع، و هم با روح DuckDB سازگار.
نتیجه این تلاش پروتکل Quack شد — اسمش از صدای اردک میاد! با Quack، یه نمونه DuckDB میتونه بهعنوان سرور عمل کنه و نمونه دیگهای بهش بهعنوان کلاینت وصل بشه. پروتکل روی HTTP ساخته شده و از اکستنشن DuckDB استفاده میکنه. راهاندازی سرور به همین سادگیه:
CALL quack_serve(
'quack:localhost',
token = 'super_secret'
);و از طرف کلاینت هم کافیه یه Secret تعریف کنی و دیتابیس رو ATTACH بزنی:
CREATE SECRET (TYPE quack, TOKEN 'super_secret');
ATTACH 'quack:localhost' AS remote;
FROM remote.hello;Quack به کاربر اجازه میده جداول روی سرور رو بخونه، داده جدید بنویسه، یا حتی جدول جدید از کلاینت روی سرور بسازه — همه با سینتکس آشنای SQL. این پروتکل هم برای عملیات bulk (مثل انتقال حجم زیاد داده) و هم تراکنشهای کوچیک بهینه شده. فعلاً Quack در مخزن core_nightly موجوده و از نسخه v1.5.2 به بعد قابل نصبه.
نکات کلیدی:
- Quack یه پروتکل کلاینت-سرور بومی برای DuckDB است که ارتباط بین دو نمونه DuckDB رو ممکن میکنه
- مشکل اصلی یعنی نوشتن همزمان از چند پروسس رو بهصورت رسمی حل میکنه
- روی HTTP ساخته شده و راهاندازیش بسیار سادهست
- هم برای bulk load و هم تراکنشهای کوچیک مناسبه
- فعلاً در
core_nightlyموجوده و با DuckDB v1.5.2 کار میکنه




