المعالجة الموازية لقائمة انتظار قاعدة البيانات

StackOverflow https://stackoverflow.com/questions/249573

سؤال

يوجد نظام صغير ، حيث يوجد جدول قاعدة بيانات كطابور على MSSQL 2005. تكتب العديد من التطبيقات إلى هذا الجدول ، وتطبيق واحد هو القراءة والمعالجة بطريقة FIFO.

يجب أن أجعل الأمر أكثر تقدمًا قليلاً لأتمكن من إنشاء نظام موزع ، حيث يمكن تشغيل العديد من تطبيقات المعالجة. يجب أن تكون النتيجة هي أن تطبيق المعالجة من 2 إلى 10 يمكن أن يكون قادرًا على التشغيل ويجب ألا يتدخلوا في بعضهم البعض أثناء العمل.

فكرتي هي تمديد جدول قائمة الانتظار مع صف يوضح أن العملية تعمل بالفعل عليها. سيقوم تطبيق المعالجة أولاً بتحديث الجدول باستخدام Idetifyer ، ثم يسأل عن السجلات المحدثة.

لذلك شيء من هذا القبيل:

start transaction
update top(10) queue set processing = 'myid' where processing is null
select * from processing where processing = 'myid'
end transaction

بعد المعالجة ، يقوم بتعيين عمود المعالجة في الجدول على شيء آخر ، مثل "تم" ، أو أي شيء آخر.

لدي ثلاثة أسئلة حول هذا النهج.

أولاً: هل يمكن لهذا العمل في هذا النموذج؟

ثانياً: إذا كان يعمل ، هل هو فعال؟ هل لديك أي أفكار أخرى لإنشاء مثل هذا التوزيع؟

ثالثًا: في MSSQL ، يعتمد القفل على الصف ، ولكن بعد قفل كمية من الصفوف ، يمتد القفل إلى الجدول بأكمله. لذلك لا يمكن للتطبيق الثاني الوصول إليه ، حتى لا يقوم التطبيق الأول بإصدار المعاملة. ما هو حجم التحديد (أعلى x) من أجل عدم قفل الجدول بأكمله ، فقط إنشاء أقفال صف؟

هل كانت مفيدة؟

المحلول

سيعمل هذا ، ولكن من المحتمل أن تجد أنك ستعمل على حظر أو تمتد حيث تحاول عمليات متعددة قراءة/تحديث نفس البيانات. لقد كتبت إجراءًا للقيام بذلك بالضبط لأحد أنظمتنا التي تستخدم بعض الدلالات المثيرة للاهتمام لضمان تشغيل هذا النوع من الأشياء دون حظر أو مصلتة ، ، الموصوفة هنا.

نصائح أخرى

هذا النهج يبدو معقولًا بالنسبة لي ، وهو مشابه للنهج الذي استخدمته في الماضي - بنجاح.

أيضًا ، سيتم قفل الصف/ الجدول فقط أثناء إجراء التحديث وعمليات تحديد ، لذلك أشك في أن سؤال الصف مقابل الجدول هو حقًا اعتبار كبير.

ما لم تكن المعالجة العامة لتطبيقك منخفضة للغاية بحيث تكون ضئيلة ، فسأحتفظ بالقيمة "العلوية" منخفضة - ربما فقط 1. بالطبع يعتمد ذلك تمامًا على تفاصيل تطبيقك.

بعد قول كل ذلك ، أنا لست DBA ، وبالتالي سأكون مهتمًا أيضًا بأي إجابات خبراء أخرى

فيما يتعلق بسؤالك حول القفل. يمكنك استخدام تلميح القفل لإجباره على قفل الصفوف فقط

update mytable with (rowlock) set x=y where a=b

أكبر مشكلة في هذا النهج هي زيادة عدد "التحديثات" إلى الجدول. جرب هذا من خلال عملية واحدة فقط تستهلك (تحديث + حذف) والبعض الآخر إدراج البيانات في الجدول وستجد أنه في حوالي مليون سجل ، يبدأ في الانهيار.

أفضل أن يكون لدي مستهلك واحد لـ DB واستخدام قوائم قوائم الرسائل لتقديم بيانات المعالجة للمستهلكين الآخرين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top