NATS ما يلي:
- نشر subject الرسائل أو الاشتراك فيها.
- معالجة الرسائل الجديدة عند توفرها.
إنشاء جدول
nats_url–host:port(على سبيل المثال،localhost:4222)..nats_subjects– قائمة بالـsubjectالتي يشترك فيها جدول NATS أو ينشر إليها. يدعمsubjectأحرف البدل مثلfoo.*.barأوbaz.>nats_format– تنسيق الرسالة. يستخدم الصياغة نفسها المستخدمة في دالة SQLFORMAT، مثلJSONEachRow. لمزيد من المعلومات، راجع قسم التنسيقات.
nats_schema– معلمة يجب استخدامها إذا كان التنسيق يتطلب تعريفschema. على سبيل المثال، يتطلب Cap’n Proto مسار ملفschemaواسم الكائن الجذرschema.capnp:Message.nats_stream– اسمstreamموجود في NATS JetStream.nats_consumer_name– اسم durable pull مستهلك موجود في NATS JetStream.nats_num_consumers– عدد الـمستهلكينلكل جدول. القيمة الافتراضية:1. حدِّد عددًا أكبر من الـمستهلكينإذا كان معدل النقل لمستهلك واحد غير كافٍ في NATS core فقط.nats_queue_group– اسم مجموعة queue لمشتركي NATS. القيمة الافتراضية هي اسم الجدول.nats_max_reconnect– مهمل وليس له أي تأثير، إذ تتم إعادة الاتصال بشكل دائم مع مهلةnats_reconnect_wait.nats_reconnect_wait– مقدار الوقت بالمللي ثانية للانتظار بين كل محاولة إعادة اتصال. القيمة الافتراضية:2000.nats_server_list- قائمة الخوادم الخاصة بالاتصال. يمكن تحديدها للاتصال بعنقود NATS.nats_skip_broken_messages- مدى تحمّل محلل رسائل NATS للرسائل غير المتوافقة معschemaلكلblock. القيمة الافتراضية:0. إذا كانnats_skip_broken_messages = Nفسيتخطى المحرك عدد N من رسائل NATS التي يتعذر تحليلها (الرسالة الواحدة تعادل صفًا واحدًا من البيانات).nats_max_block_size- عدد الـrowالتي تجمعها عملية أو عملياتpollلتفريغ البيانات من NATS. القيمة الافتراضية: max_insert_block_size.nats_flush_interval_ms- مهلة تفريغ البيانات المقروءة من NATS. القيمة الافتراضية: stream_flush_interval_ms.nats_wait_for_flush_interval- إذا كانت القيمةtrue، فستبقى دورة البث في الخلفية مفتوحة طوال فترة التفريغ (nats_flush_interval_ms، أوstream_flush_interval_msبخلاف ذلك) بدلًا من الانتهاء بمجرد تفريغ queue المستهلك، مما يتيح تراكم المزيد من الرسائل فيblockواحد مقابل زمن استيعاب إضافي يصل إلى فترة تفريغ واحدة. القيمة الافتراضية:false(سلوك تفريغ فوري منخفض الكمون).nats_username- اسم مستخدم NATS. عند تخزينه في مجموعة مسماة معرّفة في ملف إعدادات الخادم، لا يمكن لـ query تجاوزnats_urlأوnats_server_listالخاصين بالمجموعة.nats_password- كلمة مرور NATS. عند تخزينها في مجموعة مسماة معرّفة في ملف إعدادات الخادم، لا يمكن لـ query تجاوزnats_urlأوnats_server_listالخاصين بالمجموعة.nats_token- رمز مصادقة NATS. عند تخزينه في مجموعة مسماة معرّفة في ملف إعدادات الخادم، لا يمكن لـ query تجاوزnats_urlأوnats_server_listالخاصين بالمجموعة.nats_credential_file- مسار ملف بيانات اعتماد NATS. لا يُقبل إلا من مجموعة مسماة معرّفة في ملف إعدادات الخادم لا يتم تجاوزnats_urlوnats_server_listالخاصين بها بواسطة query، لأن الخادم يفتح المسار بصلاحياته الخاصة. في query، مرّر محتويات الملف فيnats_credentialsبدلًا من ذلك.nats_credentials- محتوى بيانات اعتماد NATS (نفس الحمولة الموجودة في ملف.credsالذي يتضمن JWT المستخدم والبذرة). نظرًا إلى أنه الصيغة الوحيدة التي يمكن لـ query استخدامها، فإنه يستبدلnats_credential_fileالموروث من مجموعة مسماة بدلًا من التعارض معه، ما لم يقفل المشغّل ذلك المسار باستخدام<nats_credential_file overridable="false">. لا يمكن تعيين سلسلة فارغة له لإزالة بيانات الاعتماد التي تحملها مجموعة مسماة.nats_ca_file- مسار ملف يحتوي على شهادات CA الموثوقة المستخدمة للتحقق من شهادة خادم NATS. يتطلبnats_secure. ومثلnats_credential_file، لا يُقبل إلا من مجموعة مسماة معرّفة في ملف إعدادات الخادم لا يتم تجاوزnats_urlوnats_server_listالخاصين بها بواسطة query، لأن الخادم يفتح المسار بصلاحياته الخاصة.nats_client_cert_file- مسار شهادة العميل المقدمة إلى خادم NATS. يتطلبnats_secureوnats_client_key_file. يُقبل من المصادر نفسها التي يُقبل منهاnats_ca_file.nats_client_key_file- مسار المفتاح الخاص بـnats_client_cert_file. يُقبل من المصادر نفسها التي يُقبل منهاnats_ca_file.nats_startup_connect_tries- عدد محاولات الاتصال عند بدء التشغيل. القيمة الافتراضية:5.nats_max_rows_per_message— الحد الأقصى لعددrowsالمكتوبة في رسالة NATS واحدة للتنسيقات المعتمدة على الصفوف. (القيمة الافتراضية:1).nats_commit_on_select- ثبّت الرسائل عند تنفيذ query. ينطبق على JetStream فقط؛ إذ لا يحتوي NATS core على إقرارات. القيمة الافتراضية:0.nats_handle_error_mode— كيفية التعامل مع الأخطاء في محرك NATS. القيم الممكنة: default (سيتم طرح الاستثناء إذا فشل تحليل رسالة)، stream (ستُحفَظ رسالة الاستثناء والرسالة الخام فيأعمدة افتراضية_errorو_raw_message).
nats_secure = 1.
يتحكم متغير البيئة CLICKHOUSE_NATS_TLS_SECURE في التحقق من الشهادة؛
إذا كانت الشهادة منتهية الصلاحية أو موقعة ذاتيًا أو مفقودة أو غير صالحة لسبب آخر، فعطّل التحقق بتعيين CLICKHOUSE_NATS_TLS_SECURE=0.
يتم التحقق من شهادة خادم موقعة بواسطة CA خاصة عبر توجيه nats_ca_file إلى شهادة CA،
وهو أفضل من إيقاف التحقق. عندما يتطلب الخادم شهادات العميل،
زوّده بها باستخدام nats_client_cert_file وnats_client_key_file. الخيارات الثلاثة كلها إعدادات للمشغّل:
إذ تأتي من مجموعة مُسمّاة محددة في ملف إعدادات الخادم. يُقرأ كل ملف عند اتصال
الجدول، لذلك يؤدي الملف غير القابل للقراءة أو المشوّه إلى فشل الاستعلام بدلًا من المصافحة.
الكتابة إلى جدول NATS:
إذا كان الجدول يقرأ فقط من subject واحد، فسيُنشَر أي إدراج إلى نفس subject.
ومع ذلك، إذا كان الجدول يقرأ من عدة subject، فسنحتاج إلى تحديد الـ subject الذي نرغب في النشر إليه.
لذلك، عند الإدراج في جدول يقرأ من عدة subject، يلزم ضبط stream_like_engine_insert_queue.
يمكنك اختيار أحد الـ subject التي يقرأ منها الجدول ونشر بياناتك هناك. على سبيل المثال:
الوصف
لا تكونSELECT مفيدة كثيرًا لقراءة الرسائل (إلا لأغراض استكشاف الأخطاء وإصلاحها)، لأن كل رسالة لا يمكن قراءتها إلا مرة واحدة. والأكثر عملية هو إنشاء مسارات في الوقت الفعلي باستخدام العروض المادية. للقيام بذلك:
- استخدم المحرك لإنشاء مستهلك NATS واعتبره stream بيانات.
- أنشئ جدولًا بالبنية المطلوبة.
- أنشئ عرضًا ماديًا يحوّل البيانات من المحرك ويضعها في جدول أُنشئ مسبقًا.
MATERIALIZED VIEW بالمحرك، يبدأ في جمع البيانات في الخلفية. يتيح لك ذلك الاستمرار في تلقي الرسائل من NATS وتحويلها إلى التنسيق المطلوب باستخدام SELECT.
يمكن أن يحتوي جدول NATS واحد على أي عدد تريده من العروض المادية؛ فهي لا تقرأ البيانات من الجدول مباشرةً، بل تستقبل السجلات الجديدة (على شكل كتل)، وبهذه الطريقة يمكنك الكتابة إلى عدة جداول بمستويات مختلفة من التفصيل (مع التجميع وبدونه).
مثال:
ALTER، فنوصي بتعطيل العرض المادي لتجنّب حدوث اختلافات بين الجدول الهدف والبيانات الواردة من العرض.
الأعمدة الافتراضية
_subject- الـsubject لرسالة NATS. نوع البيانات:String.
nats_handle_error_mode='stream':
_raw_message- الرسالة الخام التي تعذّر تحليلها بنجاح. نوع البيانات:Nullable(String)._error- رسالة الاستثناء التي حدثت أثناء فشل التحليل. نوع البيانات:Nullable(String).
_raw_message و _error إلا عند حدوث استثناء أثناء التحليل، وتكون دائمًا NULL عندما يُحلَّلَت الرسالة بنجاح.
دعم تنسيقات البيانات
يدعم محرك NATS جميع التنسيقات التي يدعمها ClickHouse. ويعتمد عدد الصفوف في رسالة NATS الواحدة على ما إذا كان التنسيق يعتمد على الصفوف أم على الكتل:- بالنسبة إلى التنسيقات المعتمدة على الصفوف، يمكن التحكم في عدد الصفوف في رسالة NATS الواحدة عبر ضبط
nats_max_rows_per_message. - أما بالنسبة إلى التنسيقات المعتمدة على الكتل، فلا يمكن تقسيم الكتلة إلى أجزاء أصغر، لكن يمكن التحكم في عدد الصفوف في الكتلة الواحدة من خلال الإعداد العام max_block_size.
استخدام JetStream
قبل استخدام محرك NATS مع NATS JetStream، يجب إنشاء stream في NATS وdurable pull مستهلك. ويمكنك لهذا الغرض استخدام أداةnats، على سبيل المثال، من حزمة NATS CLI:
إنشاء stream
إنشاء stream
إنشاء durable pull مستهلك
إنشاء durable pull مستهلك
متانة البيانات
ينطبق هذا القسم على JetStream فقط. لا يوفّر Core NATS إقرارات استلام ويعمل بأسلوب التسليم مرة واحدة على الأكثر، كما هو موضح أعلاه، لذلك لا توجد فترة يمكن خلالها فقدان رسالة تم الإقرار باستلامها. قد يفقد جدول JetStream بصمت صفوفًا سبق استهلاكها إذا فُقدت ذاكرة تخزين الصفحات المؤقتة لنظام التشغيل قبل كتابة البيانات المُدرجة على القرص. بعد دفع دفعة إلى العروض المادية التابعة، يقرّ المستهلك باستلام تلك الرسائل، مما يسمح للتدفق بتجاوزها. لكن الصفوف المُدرجة لا تصبح دائمة إلا بعد إجراء fsync للجزء الهدف، وهو ما لا يحدث بصورة متزامنة افتراضيًا (fsync_after_insert = 0). إذا فُقدت ذاكرة التخزين المؤقت للصفحات بعد الإقرار بالاستلام وقبل إجراء fsync للجزء الهدف، فلن تُعاد تسليم الرسائل، وبالتالي تُفقد الصفوف دون ظهور أي خطأ، وتكون نتيجة count() أصغر فحسب. لا يكشف إنهاء العملية العادي عن ذلك، لأن النواة تحتفظ بذاكرة التخزين المؤقت للصفحات وتكتبها في النهاية. لكن فقدان ذاكرة التخزين المؤقت للصفحات يكشف هذه المشكلة؛ ومن أمثلته انقطاع الطاقة على مستوى الجهاز وإعادة تشغيل غير نظيفة للمضيف أو النواة.
بالنسبة إلى مسار الاستهلاك الموصى به عبر العرض المادي (لا يُرسل الإقرار بالاستلام إلا بعد اكتمال مسار الإدراج بالكامل)، فإن ضبط fsync_after_insert = 1 (وfsync_part_directory = 1) على جداول MergeTree الهدف يجعل الأجزاء المُدرجة دائمة قبل إرسال الإقرار بالاستلام، مما يضيّق هذه الفترة بدرجة كبيرة. يجب تمكين الإعداد على كل جدول MergeTree تُدرج فيه الدفعة، بما في ذلك أهداف العروض المادية المتسلسلة؛ إذ يمكن لأي جدول من هذا النوع يُترك على الإعداد الافتراضي أن يفقد جزأه. لا تكتسب المكونات الوسيطة غير المتزامنة المتانة من هذا الإعداد وحده: فعلى سبيل المثال، يُدرج الهدف Distributed البيانات في الخلفية عندما يكون distributed_foreground_insert = 0، وهو الإعداد الافتراضي خارج ClickHouse Cloud، لذا يحتاج إلى إعدادات متانة خاصة به أو إلى إدراج متزامن. لا ينطبق هذا التخفيف أيضًا على INSERT ... SELECT ... FROM <nats_table> مباشر مع nats_commit_on_select = 1، حيث يُقر باستلام الرسائل عند وصول القراءة إلى نهايتها، بدلًا من بعد أن تكتب الوجهة جزءًا دائمًا.