Disruptor في Java: دليل شامل مع أمثلة عملية
1. ما هي مكتبة Disruptor ولماذا تحتاجها؟
Disruptor هي مكتبة عالية الأداء للتواصل بين الخيوط (IPC) في Java، طورتها شركة LMAX. صُممت لنقل البيانات بين الخيوط بأقل تأخير وأعلى إنتاجية ممكنة. على عكس قوائم الانتظار التقليدية (مثل LinkedBlockingQueue)، تستخدم Disruptor مخزنًا دائريًا (ring buffer) بحجم ثابت، مما يتجنب الأعباء الإضافية لتخصيص الذاكرة والمزامنة وجمع القمامة (Garbage Collection).
المشكلة الأساسية التي تحلها Disruptor هي "التنافس" بين الخيوط على الموارد. في قوائم الانتظار التقليدية، تتنافس عدة منتجين ومستهلكين على الأقفال (locks)، مما يؤدي إلى توقف مؤقت وانخفاض في الأداء. تستخدم Disruptor آلية "حواجز التسلسل" (sequence barriers) والقفل التفاؤلي (CAS — Compare-And-Swap)، مما يحقق تأخيرًا بالميكروثانية وإنتاجية تصل إلى ملايين الرسائل في الثانية.
المكتبة مثالية للأنظمة التي تكون فيها سرعة معالجة الأحداث أمرًا بالغ الأهمية: منصات التداول، خوادم الألعاب، أنظمة معالجة السجلات، وتطبيقات الويب عالية التحميل. تعتبر Disruptur أساسًا للعديد من الأطر الحديثة، بما في ذلك Apache Storm وبعض تطبيقات Event Sourcing.
2. التثبيت
يتم توزيع Disruptor عبر Maven Central. لاستخدامها في مشروعك، أضف التبعية التالية إلى ملف pom.xml (Maven):
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>4.0.0</version>
</dependency>
لـ Gradle (build.gradle):
implementation 'com.lmax:disruptor:4.0.0'
إذا كنت تستخدم مدير تبعيات آخر، قم بتنزيل ملف JAR من Maven Central.
3. بداية سريعة — مثال عملي بسيط
في هذا المثال، سننشئ Disruptor بسيطًا يستقبل أحداثًا نصية ويعرضها في وحدة التحكم.
import com.lmax.disruptor.*;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.util.DaemonThreadFactory;
// 1. تعريف فئة الحدث
public class StringEvent {
private String value;
public String getValue() { return value; }
public void setValue(String value) { this.value = value; }
}
// 2. مصنع الأحداث (ينشئ أحداثًا فارغة لإعادة الاستخدام)
public class StringEventFactory implements EventFactory<StringEvent> {
@Override
public StringEvent newInstance() {
return new StringEvent();
}
}
// 3. معالج الأحداث (المستهلك)
public class StringEventHandler implements EventHandler<StringEvent> {
@Override
public void onEvent(StringEvent event, long sequence, boolean endOfBatch) {
System.out.println("تم الاستلام: " + event.getValue());
}
}
// 4. الفئة الرئيسية
public class QuickStart {
public static void main(String[] args) throws InterruptedException {
// حجم المخزن الدائري (يجب أن يكون من مضاعفات العدد 2)
int bufferSize = 1024;
// إنشاء Disruptor
Disruptor<StringEvent> disruptor = new Disruptor<>(
new StringEventFactory(),
bufferSize,
DaemonThreadFactory.INSTANCE
);
// ربط المعالج
disruptor.handleEventsWith(new StringEventHandler());
// تشغيل Disruptor
disruptor.start();
// الحصول على مرجع إلى RingBuffer
RingBuffer<StringEvent> ringBuffer = disruptor.getRingBuffer();
// نشر الأحداث
for (int i = 0; i < 10; i++) {
long sequence = ringBuffer.next(); // حجز خانة
try {
StringEvent event = ringBuffer.