@clickhouse/client- Node.js فقط@clickhouse/client-web- المتصفحات (Chrome/Firefox)، Cloudflare workers
مهارات AI agentيأتي عميل JS مزودًا بمهارات AI agent يمكن أن تساعد وكلاء البرمجة على العمل مع العميل. ثبّتها باستخدام:
متطلبات البيئة (Node.js)
متطلبات البيئة (الويب)
التثبيت
التوافق مع ClickHouse
من المرجّح أن يعمل العميل أيضًا مع الإصدارات الأقدم؛ لكن هذا الدعم يُقدَّم على أساس بذل أفضل جهد وليس مضمونًا. إذا كنت تستخدم إصدارًا من ClickHouse أقدم من 23.3، فيُرجى الرجوع إلى سياسة الأمان الخاصة بـ ClickHouse والنظر في الترقية.
أمثلة
واجهة برمجة تطبيقات Client
إنشاء مثيل للعميل
createClient:
التهيئة
معلمات الإعداد الخاصة بـ Node.js
إعداد URL
http[s]://[username:password@]hostname:port[/database][?param1=value1¶m2=value2]. في معظم الحالات، يعكس اسم المَعلمة مسارها في واجهة خيارات config، مع بعض الاستثناءات. المَعلمات التالية مدعومة:
- (1) بالنسبة إلى القيم المنطقية، تكون القيم الصالحة هي
true/1وfalse/0. - (2) ستُزال هذه البادئة من أي مَعلمة تبدأ بـ
clickhouse_setting_أوch_، وسيُضاف ما تبقى إلىclickhouse_settingsالخاصة بالعميل. على سبيل المثال، سيكون?ch_async_insert=1&ch_wait_for_async_insert=1مماثلًا لما يلي:
clickhouse_settings بصيغة 1/0 في عنوان URL.
- (3) مماثل لـ (2)، ولكن لتهيئة
http_header. على سبيل المثال، يكون?http_header_x-clickhouse-auth=foobarمكافئًا لـ:
الاتصال
اجمع بيانات الاتصال الخاصة بك
تتوفر تفاصيل خدمة ClickHouse Cloud الخاصة بك في ClickHouse Cloud console.
حدِّد خدمة ثم انقر على Connect:
اختر HTTPS. ستظهر تفاصيل الاتصال في مثال لأمر
curl.
إذا كنت تستخدم ClickHouse مُدارًا ذاتيًا، فسيُحدِّد مسؤول ClickHouse لديك تفاصيل الاتصال.
نظرة عامة على الاتصال
url (بما في ذلك
البروتوكول والمنفذ) وpassword محددتان عبر متغيرات البيئة، وأن المستخدم default هو المستخدم المعتمد.
Example: إنشاء مثيل Client في Node.js باستخدام متغيرات البيئة في التهيئة.
مجمع الاتصالات (Node.js فقط)
10، ولكن يمكنك تغييره باستخدام خيار configuration max_open_connections.
لا يوجد ما يضمن استخدام الاتصال نفسه داخل المجمع للاستعلامات اللاحقة، ما لم يضبط المستخدم max_open_connections: 1. نادرًا ما تكون هناك حاجة إلى ذلك، لكنه قد يكون مطلوبًا في الحالات التي يستخدم فيها المستخدمون الجداول المؤقتة.
راجع أيضًا: إعداد Keep-Alive.
معرّف الاستعلام
command, exec, insert, select) ستوفّر query_id في النتيجة. يعيّن العميل هذا المعرّف الفريد لكل استعلام، وقد يكون مفيدًا لاسترجاع البيانات من system.query_log،
إذا كان مفعّلًا في إعدادات الخادم، أو لإلغاء الاستعلامات طويلة التشغيل (راجع المثال). وعند الحاجة، يمكن للمستخدم تجاوز query_id في معاملات طرق command/query/exec/insert.
المعلمات الأساسية لجميع طرق العميل
طريقة query
SELECT، أو لإرسال تعليمات DDL مثل CREATE TABLE، ويجب استخدام await معها. ومن المتوقّع أن يستهلك التطبيق مجموعة النتائج المُعادة.
تجريدات مجموعة النتائج والصفوف
ResultSet عدة أساليب مريحة لمعالجة البيانات في تطبيقك.
يعتمد تنفيذ ResultSet في Node.js على Stream.Readable داخليًا، بينما يستخدم إصدار الويب واجهة Web API ReadableStream.
يمكنك استهلاك ResultSet باستدعاء الأسلوب text أو json على ResultSet، ما يؤدي إلى تحميل مجموعة الصفوف الكاملة التي يُرجعها الاستعلام إلى الذاكرة.
يجب أن تبدأ استهلاك ResultSet في أقرب وقت ممكن، لأنه يُبقي تدفق الاستجابة مفتوحًا، وبالتالي يُبقي الاتصال الأساسي مشغولًا. ولا يخزّن العميل البيانات الواردة مؤقتًا لتجنّب احتمال الاستهلاك المفرط للذاكرة من قِبل التطبيق.
بدلًا من ذلك، إذا كان كبيرًا جدًا بحيث لا يمكن تحميله في الذاكرة دفعةً واحدة، يمكنك استدعاء الأسلوب stream ومعالجة البيانات في وضع التدفق. في هذه الحالة، سيُحوَّل كل جزء من الاستجابة إلى مصفوفات صغيرة نسبيًا من الصفوف (ويعتمد حجم هذه المصفوفة على حجم الجزء الذي يستقبله العميل من الخادم، إذ قد يختلف، وكذلك على حجم الصف الواحد)، جزءًا تلو الآخر.
يُرجى الرجوع إلى قائمة تنسيقات البيانات المدعومة لتحديد التنسيق الأنسب للتدفق في حالتك. على سبيل المثال، إذا كنت تريد تدفق كائنات JSON، فيمكنك اختيار JSONEachRow، وعندها سيُحلَّل كل صف على أنه كائن JS، أو ربما التنسيق الأكثر إحكامًا JSONCompactColumns، حيث تكون كل صف عبارة عن مصفوفة مدمجة من القيم. انظر أيضًا: تدفق الملفات.
JSONEachRow، ويستهلك التدفق بالكامل ويحلّل المحتويات ككائنات JS.
الشيفرة المصدرية.
JSONEachRow باستخدام الأسلوب التقليدي on('data'). وهذه الطريقة قابلة للتبديل مع صياغة for await const. الشيفرة المصدرية.
CSV باستخدام الأسلوب التقليدي on('data'). ويمكن استخدام هذا بالتبادل مع صياغة for await const.
الشيفرة المصدرية
JSONEachRow مع استهلاكها باستخدام صياغة for await const. ويمكن استخدام هذا بالتبادل مع الأسلوب التقليدي on('data').
الشيفرة المصدرية.
بنية
for await const تتطلب شيفرة أقل قليلًا من أسلوب on('data')، لكنها قد تؤثر سلبًا على الأداء.
راجع هذه التذكرة في مستودع Node.js لمزيد من التفاصيل.ReadableStream للكائنات.
طريقة الإدراج
insert، فلن تُرسل تعليمة insert إلى الخادم؛ وبدلًا من ذلك، ستُعيد الطريقة فورًا القيمة { query_id: '...', executed: false }. وإذا لم يتم تمرير query_id ضمن params الخاصة بالطريقة في هذه الحالة، فسيكون عبارة عن سلسلة فارغة في النتيجة، لأن إرجاع UUID عشوائي يُنشئه العميل قد يكون مُربكًا، إذ إن الاستعلام الذي يحمل query_id كهذا لن يكون موجودًا في جدول system.query_log.
إذا أُرسلت تعليمة insert إلى الخادم، فستكون قيمة العلامة executed هي true.
طريقة insert والبث في Node.js
Stream.Readable أو مع Array<T> عادية، وذلك حسب تنسيق البيانات المحدد لطريقة insert. راجع أيضًا هذا القسم حول بثّ الملفات.
يُفترض عادةً انتظار طريقة insert باستخدام await؛ ومع ذلك، يمكن تحديد تدفق إدخال ثم انتظار اكتمال عملية insert لاحقًا، عند اكتمال التدفق فقط (وسيؤدي ذلك أيضًا إلى حلّ الوعد insert). قد يكون هذا مفيدًا في مستمعي الأحداث والسيناريوهات المشابهة، لكن معالجة الأخطاء قد تكون معقدة بسبب كثرة الحالات الطرفية على جانب العميل. بدلًا من ذلك، ننصح باستخدام عمليات الإدخال غير المتزامنة كما هو موضح في هذا المثال.
قيود نسخة الويب
@clickhouse/client-web إلا مع التنسيقات Array<T> وJSON*.
ولا تزال عمليات الإدراج باستخدام التدفقات غير مدعومة في نسخة الويب بسبب ضعف التوافق مع المتصفحات.
وبناءً على ذلك، تبدو الواجهة InsertParams في نسخة الويب مختلفة قليلًا عن إصدار Node.js،
إذ تقتصر values على النوع ReadonlyArray<T> فقط:
طريقة Command
CREATE TABLE أو ALTER TABLE.
يجب انتظارها باستخدام await.
يتم إنهاء response stream فورًا، ما يعني تحرير الـ socket الأساسي.
الدالة Exec
query/insert،
وكنت مهتمًا بالنتيجة، فيمكنك استخدام exec كبديل عن command.
تعيد exec تدفقًا قابلاً للقراءة ويجب أن يستهلكه التطبيق أو يتلفه.
Ping
ping المخصّصة للتحقق من حالة الاتصال القيمة true إذا كان الوصول إلى الخادم ممكنًا.
إذا تعذر الوصول إلى الخادم، فسيُضمَّن الخطأ الأساسي أيضًا في النتيجة.
/ping، بينما يستخدم إصدار الويب استعلام SELECT 1 بسيطًا لتحقيق نتيجة مماثلة، لأن نقطة النهاية /ping لا تدعم CORS.
مثال: (Node.js/Web) إجراء ping بسيط على مثيل خادم ClickHouse. ملاحظة: بالنسبة إلى إصدار الويب، ستكون الأخطاء التي يتم التقاطها مختلفة.
الشفرة المصدرية.
ping، أو تمرير معلمات إضافية مثل query_id، فيمكنك القيام بذلك على النحو التالي:
query القياسية — راجع تعريف النوع PingParamsWithSelectQuery.
إغلاق (Node.js فقط)
تدفق الملفات (Node.js فقط)
query (JSONEachRow وCSV وما إلى ذلك) واسم ملف الإخراج.
تنسيقات البيانات المدعومة
format كأحد التنسيقات من عائلة JSON (JSONEachRow وJSONCompactEachRow وما إلى ذلك)، فسيقوم العميل بتسلسل البيانات وفك تسلسلها أثناء نقلها.
أما البيانات المقدَّمة بتنسيقات النص “الخام” (عائلتا CSV وTabSeparated وCustomSeparated) فتُرسل كما هي من دون أي تحويلات إضافية.
بالنسبة إلى Parquet، يُرجَّح أن تكون حالة الاستخدام الرئيسية لعمليات SELECT هي كتابة التدفق الناتج إلى ملف. راجع المثال في مستودع العميل.
JSONEachRowWithProgress هو تنسيق مخصص للإخراج فقط ويدعم الإبلاغ عن التقدم ضمن التدفق. راجع هذا المثال لمزيد من التفاصيل.
تتوفّر القائمة الكاملة لتنسيقات الإدخال والإخراج في ClickHouse
هنا.
أنواع بيانات ClickHouse المدعومة
يكون نوع JS المقابل ذا صلة بأي من تنسيقات
JSON*، باستثناء التنسيقات التي تمثل كل شيء كسلسلة نصية (مثل JSONStringEachRow)
القائمة الكاملة بتنسيقات ClickHouse المدعومة متاحة
هنا.
انظر أيضًا:
محاذير أنواع Date/Date32
Date/Date32 إلا
على هيئة سلاسل نصية.
مثال: أدرِج قيمة من النوع Date.
الشفرة المصدرية
DateTime أو DateTime64، يمكنك استخدام كلٍّ من السلاسل النصية وكائنات JS Date. ويمكن تمرير كائنات JS Date إلى insert كما هي عند تعيين date_time_input_format إلى best_effort. راجع هذا المثال لمزيد من التفاصيل.
محاذير أنواع Decimal*
JSON*. بافتراض أن لدينا جدولًا معرّفًا على النحو التالي:
JSON*، سيُرجع ClickHouse قيم Decimal على شكل أرقام افتراضيًا، ما قد يؤدي إلى فقدان الدقة. ولتجنّب ذلك، يمكنك تحويل قيم Decimal إلى سلاسل نصية في الاستعلام:
الأنواع الصحيحة: Int64, Int128, Int256, UInt64, UInt128, UInt256
JSON* لتجنّب
تجاوز سعة الأعداد الصحيحة، لأن القيم القصوى لهذه الأنواع أكبر من Number.MAX_SAFE_INTEGER.
ومع ذلك، يمكن تعديل هذا السلوك
باستخدام إعداد output_format_json_quote_64bit_integers
.
مثال: اضبط تنسيق إخراج JSON للأرقام ذات 64 بت.
إعدادات ClickHouse
مواضيع متقدمة
الاستعلامات ذات المعلمات
name— معرّف بديل.data_type- نوع البيانات لقيمة معلمة التطبيق.
الضغط
GZIP باستخدام zlib.
response: trueيوجّه ClickHouse server إلى إرسال محتوى استجابة مضغوط. القيمة الافتراضية:response: falserequest: trueيفعّل الضغط لمحتوى طلب العميل. القيمة الافتراضية:request: false
التسجيل (Node.js فقط)
logger الافتراضية سجلات التسجيل إلى stdout عبر الطريقتين console.debug/info، وإلى stderr عبر الطريقتين console.warn/error.
يمكنك تخصيص منطق التسجيل من خلال توفير LoggerClass، واختيار مستوى السجل المطلوب عبر المَعلَمة level (القيمة الافتراضية هي WARN):
TRACE- معلومات منخفضة المستوى حول دورة حياة اتصالات Keep-AliveDEBUG- معلومات الاستجابة (من دون رؤوس التفويض ومعلومات المضيف)INFO- غير مستخدم في الغالب، وسيطبع مستوى السجل الحالي عند تهيئة العميلWARN- أخطاء غير جسيمة؛ يُسجَّل طلبpingالفاشل كتحذير، لأن الخطأ الأساسي يكون مضمنًا في النتيجة المُعادةERROR- أخطاء جسيمة من طرائقquery/insert/exec/command، مثل فشل الطلب
شهادات TLS (Node.js فقط)
certs
وأن اسم ملف CA هو CA.pem:
إعداد Keep-Alive (Node.js فقط)
Connection: keep-alive. وتبقى المقابس الخاملة في تجمّع الاتصالات لمدة 2500 مللي ثانية افتراضيًا (راجِع الملاحظات حول ضبط هذا الخيار).
يُفترض أن تكون قيمة keep_alive.idle_socket_ttl أقل بفارق ملحوظ من إعداد الخادم/موازن التحميل. والسبب الرئيسي هو أنه نظرًا إلى أن HTTP/1.1 يسمح للخادم بإغلاق المقابس من دون إخطار العميل، فإذا أغلق الخادم أو موازن التحميل الاتصال قبل أن يفعل العميل ذلك، فقد يحاول العميل إعادة استخدام مقبس مغلق، ما يؤدي إلى الخطأ socket hang up.
إذا كنت تعدّل keep_alive.idle_socket_ttl، فضع في اعتبارك أنه ينبغي أن يظل متزامنًا دائمًا مع إعداد Keep-Alive في الخادم/موازن التحميل لديك، ويجب أن يكون أقل منه دائمًا، بما يضمن ألا يغلق الخادم الاتصال المفتوح أولًا.
ضبط idle_socket_ttl
keep_alive.idle_socket_ttl على 2500 مللي ثانية، إذ يمكن اعتبارها القيمة الافتراضية الأكثر أمانًا؛ وعلى جانب الخادم، قد يُضبط keep_alive_timeout إلى قيمة منخفضة تصل إلى 3 ثوانٍ في إصدارات ClickHouse الأقدم من 23.11 من دون أي تعديلات على config.xml.
يمكنك العثور على قيمة مهلة Keep-Alive الصحيحة في ترويسات استجابة الخادم عبر تشغيل الأمر التالي:
Connection وKeep-Alive في الاستجابة. على سبيل المثال:
keep_alive_timeout 10 ثوانٍ، ويمكنك محاولة زيادة keep_alive.idle_socket_ttl إلى 9000 أو حتى 9500 مللي ثانية لإبقاء المقابس الخاملة مفتوحةً لفترة أطول قليلًا من الإعداد الافتراضي. راقب أخطاء “Socket hang-up” المحتملة، إذ تشير إلى أن الخادم يغلق الاتصالات قبل أن يفعل العميل ذلك، وخفِّض القيمة حتى تختفي الأخطاء.
استكشاف الأخطاء وإصلاحها
socket hang up حتى عند استخدام أحدث إصدار من العميل، فإليك الخيارات التالية لحل هذه المشكلة:
-
فعِّل السجلات بمستوى
WARNعلى الأقل (وهو المستوى الافتراضي). يتيح لك ذلك التحقق مما إذا كان هناكstreamغير مُستهلك أو معلّق في شيفرة التطبيق: إذ ستسجّله طبقة النقل عند مستوى WARN، لأن ذلك قد يؤدي إلى إغلاقsocketمن جانب الخادم. يمكنك تفعيل التسجيل في إعدادات العميل كما يلي: -
تأكد من تطبيق الإعدادات المطلوبة على مثيل العميل الصحيح. إذا كان لديك عدة مثيلات للعميل في تطبيقك، فتحقق مرة أخرى من أن المثيل الذي تستخدمه للاستعلامات يحتوي على القيمة الصحيحة للإعداد
keep_alive.idle_socket_ttl. -
خفِّض قيمة الإعداد
keep_alive.idle_socket_ttlفي إعدادات العميل بمقدار 500 ملي ثانية. في بعض الحالات، مثل ارتفاع كمون الشبكة بين العميل والخادم، قد يكون ذلك مفيدًا لتفادي الحالة التي يحصل فيها الطلب الصادر علىsocketيكون الخادم على وشك إغلاقها. -
إذا كان هذا الخطأ يحدث أثناء استعلامات طويلة التشغيل من دون دخول أو خروج أي بيانات (على سبيل المثال،
INSERT FROM SELECTطويلة التشغيل)، فقد يكون السبب هو موازن تحميل أو مكونات شبكة أخرى تغلق الاتصالات طويلة الأمد أو الطلبات طويلة التشغيل. يمكنك محاولة فرض ورود بعض البيانات أثناء الاستعلامات طويلة التشغيل باستخدام مجموعة إعدادات ClickHouse التالية:ومع ذلك، ضع في اعتبارك أن الحجم الإجمالي للترويسات المستلمة له حد أقصى قدره 16KB في الإصدارات الحديثة من Node.js؛ وبعد عدد معيّن من ترويسات التقدّم المستلمة، والذي كان في اختباراتنا نحو 70-80، سيُنشأ استثناء. ومن الممكن أيضًا استخدام نهج مختلف تمامًا، بتجنب وقت الانتظار على الشبكة بالكامل؛ ويمكن تنفيذ ذلك بالاستفادة من “ميزة” في واجهة HTTP مفادها أنmutationsلا تُلغى عند فقدان الاتصال. راجع هذا المثال (الجزء 2) لمزيد من التفاصيل. -
يمكن تعطيل ميزة Keep-Alive بالكامل. في هذه الحالة، سيضيف العميل أيضًا الترويسة
Connection: closeإلى كل HTTP request، ولن يعيد وكيل HTTP الأساسي استخدام الاتصالات. وسيتم تجاهل الإعدادkeep_alive.idle_socket_ttl، إذ لن تكون هناكsocketsخاملة. وسيؤدي ذلك إلى حمل إضافي، لأن اتصالًا جديدًا سيُنشأ لكل طلب. -
استبعد المشكلات المحتملة في بقية مكدس الشبكة، بما في ذلك Node.js نفسها، وذلك عبر تشغيل اختبار بسيط من سطر الأوامر على مثيل ClickHouse نفسه وعبر مسار الشبكة نفسه (أي من الجهاز نفسه أو من مقطع الشبكة نفسه، مثل Kubernetes pod)، على سبيل المثال باستخدام
curl:قد ترغب في تشغيله ضمن حلقة لعدة دقائق. إذا رأيت أخطاء مشابهة فيcurl، فمن المرجح أن المشكلة لا تتعلق بإعدادات العميل، بل بمكدس الشبكة أو إعدادات الخادم. -
لاختبار الاتصال باستخدام وظائف Node.js الأساسية، يمكنك محاولة إنشاء HTTP request بسيطة إلى ClickHouse server باستخدام واجهة
fetchAPI المضمنة:
-
في بعض الحالات، قد تضيف شيفرة التطبيق أو مهايئات إطار العمل استدعاء
ping()استباقيًا قبل تنفيذ الاستعلام الفعلي، ما قد يؤدي إلى نجاح طلبping()ثم فشل طلب الاستعلام اللاحق بخطأ “socket hang up” بسبب المشكلة الأساسية نفسها المرتبطة بالاتصالات الخاملة. إذا لاحظت هذا النمط في السجلات، فحاول التحقق مما إذا كان إطار العمل أو شيفرة التطبيق يوفّران خيارًا لتعطيل عملياتping()الاستباقية. ومن شأن ذلك أيضًا تقليل احتمال فرض قيود على المعدل من أي من مكوّنات الشبكة الوسيطة. - تأكد من أن التطبيق نفسه يحصل على وقت CPU كافٍ، وأن الشبكة لا يفرض عليها موفّر الاستضافة تقييدًا على المعدل. كما يمكن أن تساعد وسائل المراقبة المختلفة، مثل مقاييس توقّف GC ومقاييس تأخر حلقة الأحداث وغيرها من المقاييس المشابهة، في استبعاد المشكلات المحتملة المتعلقة بشحّ الموارد.
- جرّب فحص شيفرة تطبيقك مع تفعيل قاعدة ESLint no-floating-promises، إذ سيساعد ذلك في تحديد الوعود غير المعالَجة التي قد تؤدي إلى تدفقات ومقابس معلّقة.
المستخدمون ذوو صلاحية القراءة فقط
enable_http_compression. سينتج عن التكوين التالي خطأ:
readonly=1.
وكيل مع مسار
clickhouse_server كقيمة لخيار الإعداد pathname (مع أو بدون شرطة مائلة في البداية)؛ وإلا، فإذا أُدرج مباشرةً في url فسيُعامَل على أنه قيمة الخيار database. كما أن المسارات متعددة المقاطع مدعومة، مثل /my_proxy/db.
وكيل عكسي مع المصادقة
http_headers لتمرير الترويسات اللازمة من خلاله:
وكيل HTTP/HTTPS مخصّص (تجريبي، Node.js فقط)
max_open_connections وkeep_alive.enabled وtls) ليتولى إدارة الاتصالات مع خادم ClickHouse. بالإضافة إلى ذلك، إذا استُخدمت شهادات TLS، فسيُهيّأ الوكيل الأساسي بالشهادات اللازمة، وسيُفرض استخدام ترويسات مصادقة TLS الصحيحة.
بعد 1.2.0، أصبح من الممكن تزويد العميل بوكيل HTTP أو HTTPS مخصّص ليحل محل الوكيل الأساسي الافتراضي. وقد يكون ذلك مفيدًا في حالات إعدادات الشبكة المعقدة. تنطبق الشروط التالية إذا جرى توفير وكيل مخصّص:
- لن يكون للخيارين
max_open_connectionsوtlsأي تأثير، وسيتجاهلهما العميل، لأنهما جزء من إعداد الوكيل الأساسي. - سيقتصر دور
keep_alive.enabledعلى تحديد القيمة الافتراضية لترويسةConnection(true->Connection: keep-alive،false->Connection: close). - رغم أن إدارة مقابس keep-alive الخاملة ستظل تعمل (لأنها غير مرتبطة بالوكيل بل بالمقبس نفسه)، فقد أصبح الآن من الممكن تعطيلها بالكامل بتعيين قيمة
keep_alive.idle_socket_ttlإلى0.
أمثلة على استخدام الوكيل المخصّص
Authorization الافتراضية عبر الإعداد set_basic_auth_header (المُضافة في 1.2.0)، لأنها تتعارض مع ترويسات TLS. يجب توفير جميع ترويسات TLS يدويًا.
القيود المعروفة (Node.js/web)
- لا توجد مُحوِّلات بيانات لمجموعات النتائج، لذا لا تُستخدم إلا الأنواع البدائية في اللغة. ومن المخطط إضافة بعض مُحوِّلات أنواع البيانات مع دعم تنسيق RowBinary.
- هناك بعض الملاحظات المتعلقة بأنواع البيانات Decimal* وDate* / DateTime*.
- عند استخدام تنسيقات عائلة JSON*، تُمثَّل الأرقام الأكبر من Int32 كسلاسل نصية، لأن القيم القصوى لأنواع Int64+ أكبر من
Number.MAX_SAFE_INTEGER. راجع قسم Integral types لمزيد من التفاصيل.
القيود المعروفة (الويب)
- يعمل البث مع استعلامات SELECT، لكنه معطّل لعمليات الإدراج (وعلى مستوى النوع أيضًا).
- ضغط الطلبات معطّل، ويتم تجاهل التهيئة الخاصة به. أمّا ضغط الاستجابات فيعمل.
- لا يتوفر دعم للتسجيل حتى الآن.
نصائح لتحسين الأداء
- لتقليل استهلاك ذاكرة التطبيق، فكّر في استخدام التدفقات مع عمليات
insertالكبيرة (مثلًا من الملفات) وعملياتselectعند الاقتضاء. وبالنسبة إلى مستمعي الأحداث وحالات الاستخدام المشابهة، قد تكون عمليات insert غير المتزامنة خيارًا جيدًا آخر، إذ تتيح تقليل التجميع على جانب العميل إلى الحد الأدنى، أو حتى تجنّبه تمامًا. تتوفر أمثلة على عمليات insert غير المتزامنة في مستودع العميل، معasync_insert_كبادئة لاسم الملف. - لا يفعّل العميل ضغط الطلبات أو الاستجابات افتراضيًا. ومع ذلك، عند تنفيذ عمليات
selectأوinsertعلى مجموعات بيانات كبيرة، يمكنك التفكير في تفعيله عبرClickHouseClientConfigOptions.compression(إما لـrequestفقط أوresponseفقط أو لكليهما). - يترتب على الضغط أثر ملحوظ على الأداء. فتفعيله لـ
requestأوresponseسيؤثر سلبًا في سرعة عملياتselectأوinsert، على التوالي، لكنه سيقلّل مقدار حركة مرور الشبكة التي ينقلها التطبيق.
تواصل معنا
#clickhouse-js) أو من خلال المشكلات على GitHub.