DuckDB 2.0؛ راه‌اندازی server با Quack و اتصال از Java

چرا مهم است

اگر چند برنامه باید داده‌های مشترک DuckDB را بخوانند، Quack امکان اتصال به یک نمونه مشترک را می‌دهد. برای برنامه Java هم می‌توانی از همین مسیر استفاده کنی؛ query کنار داده اجرا می‌شود و فقط نتیجه برمی‌گردد.

قبل از خواندن، این‌ها را بدان۴ مفهوم
token

مقداری که هنگام اتصال برای اثبات مجاز بودن دسترسی ارائه می‌شود؛ در این کاربرد، رازی مشترک میان دو سمت اتصال است.

بیشتر: token

Protocol

مجموعه قواعدی که نحوه ارتباط و تبادل پیام میان دو برنامه را مشخص می‌کند.

بیشتر: Protocol

certificate

سندی دیجیتال که یک هویت را به کلید عمومی مرتبط می‌کند و در برقراری ارتباط امن به کار می‌رود.

بیشتر: certificate

client

برنامه یا بخشی از برنامه که درخواست را به server می‌فرستد و پاسخ را دریافت می‌کند.

در حال نگارش: client

DuckDB معمولاً به‌صورت یک database درون برنامه اجرا می‌شود و به server جداگانه نیاز ندارد. DuckDB 2.0 در کنار این شیوه، حالت client-server را با Protocol موسوم به Quack ارائه می‌کند: یک نمونه DuckDB به query‌های نمونه‌ای دیگر از طریق شبکه پاسخ می‌دهد. هر دو سمت همان DuckDB هستند؛ نه برنامه جداگانه‌ای برای server لازم است و نه زبان تازه‌ای برای query.

این حالت برای دسترسی چند process به داده‌های مشترک کاربرد دارد. فایل DuckDB در حالت معمول single-writer است؛ اما با اجرای server محلی، worker‌های یک برنامه وب، dashboard و notebook می‌توانند هم‌زمان داده‌های مشترک را query کنند. query در محل داده اجرا می‌شود و client فقط نتیجه را دریافت می‌کند، نه کل مجموعه داده. اتصال JDBC نیز می‌تواند نقش client را برای یک برنامه Java داشته باشد.

آموزش به نسخه v2.0.0 یا جدیدتر نیاز دارد. extension رسمی quack هنگام اولین استفاده خودکار نصب و بارگذاری می‌شود. برای شروع، در terminal اول دستور duckdb hello.duckdb یک database مبتنی بر فایل باز می‌کند. سپس CALL quack_serve('quack:localhost', token = 'super_secret');،؜ server را راه می‌اندازد. دستور CREATE TABLE hello AS FROM VALUES ('world') v(s); هم داده نمونه را می‌سازد. port پیش‌فرض 9494 است و این terminal باید باز بماند.

token راز مشترک اتصال است. اگر تعیین نشود، Quack مقدار تصادفی تولید می‌کند و آن را در ستون auth_token برمی‌گرداند. در terminal دوم، یک DuckDB تازه اجرا می‌شود و دستور CREATE SECRET (TYPE quack, TOKEN 'super_secret', SCOPE 'quack:localhost'); اطلاعات اتصال را نگه می‌دارد. سپس ATTACH 'quack:localhost' AS remote; و FROM remote.hello; یک سطر شامل world برمی‌گردانند.

با CONNECT remote; تمام session به server هدایت می‌شود و دیگر نوشتن پیشوند remote. لازم نیست؛ DISCONNECT; آن را به database محلی برمی‌گرداند. برای یک query مستقل نیز quack_query بدون ATTACH قابل استفاده است. توقف server با CALL quack_stop('quack:localhost'); انجام می‌شود.

برای اتصال از ماشین دیگر، تنظیم allow_other_hostname لازم است. اتصال غیرمحلی به‌طور پیش‌فرض از HTTPS و certificate از نوع self-signed استفاده می‌کند؛ برای production،؜ منبع استفاده از TLS-terminating reverse proxy یا certificate اختصاصی را مطرح می‌کند. در Java نیز همان دستورهای CREATE SECRET و ATTACH از طریق JDBC اجرا می‌شوند.

نکته کلیدی

برای شروع، نمونه محلی را در دو terminal اجرا کن و اتصال را در هر دو سمت یکسان بگذار. بستن terminal اول، server را متوقف می‌کند؛ برای دسترسی از ماشین دیگر هم تنظیمات جداگانه لازم است.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۲)