RabbitMQ ما يلي:
- نشر تدفقات البيانات أو الاشتراك بها.
- معالجة التدفقات بمجرد توفرها.
إنشاء جدول
rabbitmq_host_port– المضيف:المنفذ (على سبيل المثال،localhost:5672).rabbitmq_exchange_name– اسم الـ exchange في RabbitMQ.rabbitmq_format– تنسيق الرسالة. يستخدم الاصطلاح نفسه المستخدم في دالة SQL FORMAT، مثلJSONEachRow. لمزيد من المعلومات، راجع قسم التنسيقات.
rabbitmq_exchange_type– نوع RabbitMQ exchange: directوfanoutوtopicوheadersوconsistent_hash. القيمة الافتراضية:fanout.rabbitmq_routing_key_list– قائمة بمفاتيح التوجيه مفصولة بفواصل.rabbitmq_schema– معلمة يجب استخدامها إذا كانتformatتتطلب تعريفschema. على سبيل المثال، يتطلب Cap’n Proto مسار ملفschemaواسم الكائن الجذرschema.capnp:Message.rabbitmq_num_consumers– عدد الـ المستهلكين لكل table. حدّد عددًا أكبر من الـ المستهلكين إذا كانthroughputالخاص بـ مستهلك واحد غير كافٍ. القيمة الافتراضية:1rabbitmq_num_queues– العدد الإجمالي لـ قوائم الانتظار. قد تؤدي زيادة هذا العدد إلى تحسين الأداء بشكل ملحوظ. القيمة الافتراضية:1.rabbitmq_queue_base- حدّد بادئة لأسماء الـ قوائم الانتظار. ترد حالات استخدام هذا الإعداد أدناه.rabbitmq_persistent- إذا ضُبطت على 1 (true)، فسيُضبط وضع تسليمinsert queryعلى 2 (لوضع علامة على الرسائل بأنها ‘persistent’). القيمة الافتراضية:0.rabbitmq_skip_broken_messages– مستوى تحمّل RabbitMQ message parser للرسائل غير المتوافقة معschemaلكل كتلة. إذا كانتrabbitmq_skip_broken_messages = Nفإن الـ engine يتخطى N من رسائل RabbitMQ التي يتعذرparseلها (الرسالة الواحدة تعادل row بيانات واحدة). القيمة الافتراضية:0.rabbitmq_max_block_size- عدد الـ row التي تُجمع قبلflushالبيانات من RabbitMQ. القيمة الافتراضية: max_insert_block_size.rabbitmq_flush_interval_ms-timeoutالخاص بعمليةflushالبيانات من RabbitMQ. القيمة الافتراضية: stream_flush_interval_ms.rabbitmq_queue_settings_list- يتيح ضبط إعدادات RabbitMQ عند إنشاء قائمة انتظار. الإعدادات المتاحة:x-max-lengthوx-max-length-bytesوx-message-ttlوx-expiresوx-priorityوx-max-priorityوx-overflowوx-dead-letter-exchangeوx-queue-type. يتم تمكين الإعدادdurableتلقائيًا للـ قائمة انتظار.rabbitmq_address- عنوان الـ connection. استخدم هذا الإعداد أوrabbitmq_host_port.rabbitmq_vhost- RabbitMQ vhost. القيمة الافتراضية:'/'.rabbitmq_queue_consume- استخدم قوائم انتظار معرّفة من قبل المستخدم، ولا تُجرِ أي إعداد لـ RabbitMQ: تعريف exchanges وقوائم الانتظار وbindings. القيمة الافتراضية:false.rabbitmq_username- اسم مستخدم RabbitMQ.rabbitmq_password- كلمة مرور RabbitMQ.reject_unhandled_messages- ارفض الرسائل (أرسل إقرارًا سلبيًا إلى RabbitMQ) عند حدوثerror. يتم تمكين هذا الإعداد تلقائيًا إذا كان هناكx-dead-letter-exchangeمعرّف فيrabbitmq_queue_settings_list.rabbitmq_commit_on_select- نفّذcommitللرسائل عند تنفيذselect query. القيمة الافتراضية:false.rabbitmq_max_rows_per_message— الحد الأقصى لعدد الـ rows المكتوبة في رسالة RabbitMQ واحدة للتنسيقات المعتمدة على الصفوف. القيمة الافتراضية:1.rabbitmq_empty_queue_backoff_start_ms— نقطة بدايةbackoffلإعادة جدولة القراءة إذا كانت RabbitMQ قائمة انتظار فارغة.rabbitmq_empty_queue_backoff_end_ms— نقطة نهايةbackoffلإعادة جدولة القراءة إذا كانت RabbitMQ قائمة انتظار فارغة.rabbitmq_empty_queue_backoff_step_ms— قيمة خطوةbackoffلإعادة جدولة القراءة إذا كانت RabbitMQ قائمة انتظار فارغة.rabbitmq_handle_error_mode— كيفية التعامل معerrorفي RabbitMQ engine. القيم الممكنة: default (سيتم طرح الاستثناء إذا فشلنا فيparseرسالة)، stream (سيتم حفظ رسالة الاستثناء والرسالة الخام في أعمدة افتراضية_errorو_raw_message)، dead_letter_queue (سيتم حفظ البيانات المرتبطة بالخطأ في system.dead_letter_queue).
اتصال SSL
rabbitmq_secure = 1 أو amqps في عنوان الاتصال: rabbitmq_address = 'amqps://guest:guest@localhost/vhost'.
السلوك الافتراضي للمكتبة المستخدمة هو عدم التحقق مما إذا كان اتصال TLS المُنشأ آمنًا بما يكفي. فسواء كانت الشهادة منتهية الصلاحية أو موقَّعة ذاتيًا أو مفقودة أو غير صالحة، يُسمح بالاتصال بكل بساطة. وقد يُطبَّق في المستقبل تحقّق أكثر صرامة من الشهادات.
يمكن أيضًا إضافة إعدادات التنسيق إلى جانب الإعدادات المتعلقة بـ rabbitmq.
مثال:
الوصف
SELECT مفيدًا كثيرًا لقراءة الرسائل (إلا لأغراض Debug)، لأن كل رسالة لا يمكن قراءتها إلا مرة واحدة. والأكثر عملية هو إنشاء مسارات في الوقت الفعلي باستخدام العروض المادية. وللقيام بذلك:
- استخدم المحرّك لإنشاء مستهلك RabbitMQ واعتبره تدفق بيانات.
- أنشئ جدولًا بالبنية المطلوبة.
- أنشئ عرضًا ماديًا يحوّل البيانات من المحرّك ويضعها في جدول أُنشئ مسبقًا.
MATERIALIZED VIEW بالمحرّك، يبدأ في جمع البيانات في الخلفية. يتيح لك ذلك الاستمرار في تلقي الرسائل من RabbitMQ وتحويلها إلى التنسيق المطلوب باستخدام SELECT.
يمكن لجدول RabbitMQ واحد أن يحتوي على أي عدد تريده من العروض المادية.
يمكن توجيه البيانات استنادًا إلى rabbitmq_exchange_type وrabbitmq_routing_key_list المحددَين.
لا يمكن أن يوجد أكثر من exchange واحد لكل جدول. ويمكن مشاركة exchange واحد بين عدة جداول، مما يتيح التوجيه إلى عدة جداول في الوقت نفسه.
خيارات نوع exchange:
direct- يعتمد التوجيه على المطابقة التامة للمفاتيح. مثال على قائمة مفاتيح الجدول:key1,key2,key3,key4,key5، ويمكن أن يطابق مفتاح الرسالة أيًا منها.fanout- توجيه إلى جميع الجداول (حيث يكون اسم exchange نفسه) بغض النظر عن المفاتيح.topic- يعتمد التوجيه على patterns بمفاتيح مفصولة بنقاط. أمثلة:*.logs,records.*.*.2020,*.2018,*.2019,*.2020.headers- يعتمد التوجيه على مطابقاتkey=valueمع الإعدادx-match=allأوx-match=any. مثال على قائمة مفاتيح الجدول:x-match=all,format=logs,type=report,year=2020.consistent_hash- تُوزَّع البيانات بالتساوي بين جميع الجداول المرتبطة (حيث يكون اسم exchange نفسه). لاحظ أن نوع exchange هذا يجب تمكينه عبر إضافة RabbitMQ:rabbitmq-plugins enable rabbitmq_consistent_hash_exchange.
rabbitmq_queue_base في الحالات التالية:
- للسماح لجداول مختلفة بمشاركة قوائم الانتظار، بحيث يمكن تسجيل عدة مستهلكين لقوائم الانتظار نفسها، مما يحسن الأداء. وعند استخدام الإعدادين
rabbitmq_num_consumersو/أوrabbitmq_num_queues، تتحقق المطابقة التامة لقوائم الانتظار إذا كانت هذه المعلمات متماثلة. - لإتاحة استعادة القراءة من قوائم انتظار durable محددة عندما لا تكون كل الرسائل قد استُهلكت بنجاح. لاستئناف الاستهلاك من قائمة انتظار واحدة محددة، اضبط اسمها في الإعداد
rabbitmq_queue_baseولا تحددrabbitmq_num_consumersوrabbitmq_num_queues(القيمة الافتراضية هي 1). ولاستئناف الاستهلاك من جميع قوائم الانتظار التي أُعلنت لجدول محدد، ما عليك سوى تحديد الإعدادات نفسها:rabbitmq_queue_baseوrabbitmq_num_consumersوrabbitmq_num_queues. افتراضيًا، ستكون أسماء قوائم الانتظار فريدة لكل جدول. - لإعادة استخدام قوائم الانتظار لأنها مُعلنة كـ durable ولا تُحذف تلقائيًا. (يمكن حذفها عبر أي أداة من أدوات RabbitMQ CLI.)
rabbitmq_num_consumers و/أو rabbitmq_num_queues مع rabbitmq_exchange_type، فعندئذٍ:
- يجب تمكين إضافة
rabbitmq-consistent-hash-exchange. - يجب تحديد الخاصية
message_idللرسائل المنشورة (فريدة لكل رسالة/Batch).
messageID والعَلم republished (تكون قيمته true إذا نُشرت أكثر من مرة) — ويمكن الوصول إليهما عبر headers الرسالة.
لا تستخدم الجدول نفسه لعمليات insert والعروض المادية.
مثال:
الأعمدة الافتراضية
_exchange_name- اسم الـ exchange في RabbitMQ. نوع البيانات:String._channel_id- معرّف القناة ChannelID التي أُعلن عليها المستهلك الذي استلم الرسالة. نوع البيانات:String._delivery_tag- قيمة DeliveryTag للرسالة المستلمة. وهي ضمن نطاق كل قناة. نوع البيانات:UInt64._redelivered- العلامةredeliveredالخاصة بالرسالة. نوع البيانات:UInt8._message_id- قيمة messageID للرسالة المستلمة؛ وتكون غير فارغة إذا كان قد جرى تعيينها عند نشر الرسالة. نوع البيانات:String._timestamp- الطابع الزمني للرسالة المستلمة؛ ويكون غير فارغ إذا كان قد جرى تعيينه عند نشر الرسالة. نوع البيانات:UInt64.
rabbitmq_handle_error_mode='stream':
_raw_message- الرسالة الخام التي تعذّر تحليلها بنجاح. نوع البيانات:Nullable(String)._error- رسالة الاستثناء التي حدثت أثناء فشل التحليل. نوع البيانات:Nullable(String).
_raw_message و _error إلا عند حدوث استثناء أثناء التحليل، وتكون دائمًا NULL عندما تُحلَّل الرسالة بنجاح.
محاذير
DEFAULT وMATERIALIZED وALIAS) في تعريف الجدول، فسيتم تجاهلها. وبدلاً من ذلك، ستُملأ الأعمدة بالقيم الافتراضية المقابلة لأنواعها.
دعم تنسيقات البيانات
- بالنسبة إلى التنسيقات المعتمدة على الصفوف، يمكن التحكم في عدد الصفوف في رسالة RabbitMQ الواحدة من خلال ضبط
rabbitmq_max_rows_per_message. - بالنسبة إلى التنسيقات المعتمدة على الكتل، لا يمكن تقسيم الكتلة إلى أجزاء أصغر، ولكن يمكن التحكم في عدد الصفوف في الكتلة الواحدة باستخدام الإعداد العام max_block_size.