نمط event sourcing نمط متقدم في معمارية البرمجيات يغيّر طريقة التعامل مع البيانات وتخزينها في التطبيقات الحديثة. فبدلًا من تخزين الحالة الحالية للتطبيق، يسجّل event sourcing كل تغيير على حدة كتسلسل من الأحداث. وهذا يتيح للمطورين إعادة إنشاء أي حالة سابقة للنظام بإعادة تشغيل هذه الأحداث بالترتيب. وكثيرًا ما يُستخدم event sourcing في الأنظمة التي يكون فيها الاحتفاظ بتاريخ كامل للتغييرات أمرًا حاسمًا، مثل التطبيقات المالية وأنظمة التجارة الإلكترونية وعمليات الأعمال المعقدة.
فبالتركيز على الأحداث بدلًا من الحالة، يقدم event sourcing عددًا من الفوائد، منها قابلية توسع محسنة ومرونة أكبر وأثر تدقيقي أكثر تفصيلًا. ويتيح هذا النهج للمطورين تطبيق ميزات مثل السفر عبر الزمن، حيث يمكن رؤية ما كانت عليه البيانات في أي لحظة في الماضي، ويسهّل التكامل مع الأنظمة الأخرى بنشر الأحداث إلى مشتركين خارجيين. ويُعدّ event sourcing أسلوبًا قويًا يمكنه، عند تطبيقه بشكل صحيح، أن يحدث تحولًا في طريقة بناء التطبيقات وصيانتها وأن يوفر معمارية متينة ومهيأة للمستقبل.
نمط event sourcing نمط متقدم في معمارية البرمجيات يخزن جميع التغييرات على حالة التطبيق كتسلسل من الأحداث. فبدلًا من تخزين الحالة الحالية مباشرة، يسجّل event sourcing كل تغيير على حدة، ما يتيح إعادة بناء الحالات السابقة بدقة وفهمًا معمقًا لسلوك النظام بمرور الوقت. وهذا النهج مناسب بشكل خاص للتطبيقات التي يكون فيها التدقيق والتاريخ وإعادة تشغيل البيانات أمورًا حاسمة، مثل الأنظمة المالية وإدارة المخزون وعمليات الأعمال المعقدة. وكثيرًا ما يُجمع event sourcing مع CQRS، الذي يفصل بين عمليات القراءة والكتابة بحيث يمكن تحسين كل جزء من النظام على حدة.
More about Event Sourcing
نمط event sourcing نمط متقدم في معمارية البرمجيات يتيح تسجيلًا دقيقًا ومفصلًا لكل تغيير على حالة التطبيق بتخزين تسلسل من الأحداث. فبدلًا من تخزين الحالة الحالية للبيانات، يخزن event sourcing كل تغيير يؤدي إلى الحالة الحالية. وهذا يتيح إعادة إنشاء أي حالة سابقة بإعادة تشغيل الأحداث بالترتيب، وهو أمر مفيد بشكل خاص في التطبيقات التي يكون فيها التاريخ والتدقيق أمرين حاسمين، مثل الأنظمة المالية وإدارة المخزون وعمليات الأعمال المعقدة.
من الناحية التقنية، يقوم event sourcing على سجل من الأحداث غير القابلة للتغيير التي لا تُضاف إلا في نهايته. ويمثل كل حدث تغييرًا في النظام ويُخزَّن مع طابع زمني ومعرّف فريد. وعندما يقع حدث جديد، يُلحق بالسجل، ويستطيع النظام بعد ذلك تحديث حالته بإعادة تشغيل الأحداث من السجل. ويجعل هذا النهج جميع التغييرات قابلة للتتبع، وتُصحَّح الأخطاء بإلحاق أحداث تعويضية بدلًا من تعديل التاريخ، ما يجعل event sourcing متينًا ومرنًا في آنٍ واحد لأغراض كثيرة.
ينطوي event sourcing على ثلاث خطوات رئيسية، تدعم كل منها نوعًا مختلفًا من التفاعل:
معالجة الأوامر: يستقبل النظام أمرًا يمثل نية لتغيير الحالة. ويُتحقق من صحة الأمر، وإذا كان صالحًا، يُولَّد حدث واحد أو أكثر يصف التغيير. وتُخزَّن هذه الأحداث في السجل وتُستخدم لتحديث حالة النظام.
معالجة الأحداث: بمجرد تخزين حدث، يمكن أن تعالجه مكوّنات مختلفة في النظام لتحديث الحالة أو تنفيذ آثار جانبية. وقد يشمل ذلك تحديث نماذج القراءة أو التكامل مع أنظمة خارجية أو توليد الإشعارات.
إعادة بناء الحالة: يمكن إعادة بناء الحالة الحالية للنظام بإعادة تشغيل جميع الأحداث من السجل. وهذا يتيح إعادة إنشاء أي حالة سابقة أو تحليل البيانات التاريخية لفهم كيفية تطور النظام بمرور الوقت.
ومن أكبر نقاط قوة event sourcing قدرته على توفير قابلية كاملة للتتبع والتدقيق. فبتخزين جميع الأحداث، يستطيع النظام دائمًا إعادة إنشاء الحالات السابقة وفهم كيف ولماذا أُجريت التغييرات. وهذا يجعل اكتشاف الأخطاء والتغييرات غير المصرح بها والتحقيق فيها أسهل بكثير. كما يمكن تطبيق طبقات أمان إضافية، مثل التحكم في الوصول والتشفير، لحماية بيانات الأحداث وضمان ألا يجري التغييرات إلا المستخدمون المصرح لهم.
وتُعدّ قدرة event sourcing على تخزين جميع التغييرات كأحداث ميزة مهمة أخرى. إذ يتيح هذا النهج تحليل البيانات بطرق جديدة وتحديد الأنماط وتحسين عمليات الأعمال بناءً على البيانات التاريخية. كما يتيح تجربة ميزات جديدة ومنطق أعمال جديد دون التأثير في الحالة الموجودة، إذ يمكن إعادة تشغيل الأحداث واختبارها في بيئات معزولة.
عمليًا، غيّر event sourcing طريقة بناء كثير من الأنظمة المعقدة وصيانتها. فهو يُستخدم في التطبيقات المالية، حيث يُعدّ التاريخ الدقيق والتدقيق أمرين حاسمين، وفي منصات التجارة الإلكترونية لتتبع سلوك العملاء، وفي أنظمة إنترنت الأشياء للتعامل مع كميات كبيرة من بيانات المستشعرات. كما يتيح event sourcing إعادة بناء الحالة بسرعة وموثوقية بعد الأعطال أو الانهيارات المفاجئة بإعادة تشغيل الأحداث من السجل.
خلاصة القول، event sourcing نمط معماري يجمع بين الدقة والمرونة والأمان وقابلية التتبع في حل يتيح بناء أنظمة أكثر متانة وقابلية للتوسع. وقدرته على تخزين جميع التغييرات كأحداث وإعادة بناء الحالة تجعله أداة مهمة في تطوير البرمجيات الحديث، حيث تُعدّ الدقة والتاريخ أمرين أساسيين.
Frequently asked questions about Event Sourcing
ما المبادئ الأساسية لنمط event sourcing؟
نمط event sourcing نمط معماري يركز على تخزين تغييرات الحالة كتسلسل من الأحداث بدلًا من تخزين الحالة الحالية مباشرة. وهذا يعني أن كل تغيير على حالة النظام يُسجَّل كحدث منفصل، ما يوفر تاريخًا مفصلًا لجميع التغييرات.
ومن المبادئ الأساسية لنمط event sourcing أن الأحداث غير قابلة للتغيير ولا يمكن إلا إلحاقها بتدفق الأحداث، ولا تُغيَّر أو تُحذف أبدًا. وهذا يضمن وجود تاريخ كامل ودقيق لجميع تغييرات الحالة دائمًا، وهو ما قد يكون لا يُقدَّر بثمن لتصحيح الأخطاء والتدقيق وإعادة تشغيل حالة النظام.
كما يتيح event sourcing إعادة بناء الحالة الحالية للنظام بإعادة تشغيل جميع الأحداث من بداية تدفق الأحداث. وهذا يتيح إعادة بناء حالة النظام في أي لحظة سابقة، وهو ما قد يكون مفيدًا لاستكشاف الأخطاء وإصلاحها والتحليل.
ومقارنة بالأساليب التقليدية لإدارة الحالة، حيث لا تُخزَّن إلا الحالة الحالية، يوفر event sourcing طريقة أكثر تفصيلًا ومرونة للتعامل مع البيانات، لا سيما في الأنظمة المعقدة حيث يُعدّ فهم التغييرات التاريخية أمرًا حاسمًا.
كيف يختلف event sourcing عن نماذج قواعد البيانات التقليدية؟
نمط event sourcing نمط معماري يختلف اختلافًا كبيرًا عن نماذج قواعد البيانات التقليدية بتخزين جميع التغييرات على حالة النظام كتسلسل من الأحداث. فبدلًا من تخزين الحالة الحالية للبيانات، كما في عمليات CRUD (Create, Read, Update, Delete) التقليدية، يسجّل event sourcing كل تغيير يقع بمرور الوقت. وهذا يعني أنه يمكن إعادة إنشاء أي حالة سابقة بإعادة تشغيل تاريخ الأحداث من البداية.
ومن أكبر فوائد event sourcing أنه يوفر سجل تدقيق كاملًا، ما يتيح تتبع كيف ولماذا تغيرت البيانات بالضبط. وهذا مفيد بشكل خاص في الأنظمة التي تكون فيها قابلية التتبع والتدقيق أمرين حاسمين، مثل التطبيقات المالية. كما يسهّل تاريخ الأحداث تطبيق ميزات مثل السفر عبر الزمن، حيث يمكن عرض حالة النظام في أي لحظة في الماضي.
ومقارنة بنماذج قواعد البيانات التقليدية، حيث كثيرًا ما يتطلب تغيير مخطط البيانات عمليات ترحيل معقدة، يمكن أن يكون event sourcing أكثر مرونة، لأنه يمكن بناء نماذج قراءة جديدة من الأحداث الموجودة دون تغيير التاريخ المخزن. غير أن الأحداث نفسها تظل ذات بنية، وتغييرها يتطلب إدارة دقيقة للإصدارات كي تظل الأحداث القديمة قابلة للقراءة. لذلك قد يكون تطبيق event sourcing أكثر تعقيدًا، وكثيرًا ما يتطلب عملية تصميم دقيقة لضمان أن تكون الأحداث محددة جيدًا وذات معنى.
ما المزايا التي يقدمها event sourcing من حيث سلامة البيانات والتاريخ؟
يقدم event sourcing مزايا كبيرة من حيث سلامة البيانات والتاريخ بتخزين كل تغيير على حدة على حالة التطبيق كتسلسل من الأحداث. فبدلًا من تحديث قاعدة بيانات بالحالة الحالية، يسجّل event sourcing كل تغيير، ما يضمن أن تكون جميع تغييرات البيانات قابلة للتتبع بالكامل وإعادة إنتاجها بدقة.
ويوفر هذا النهج تاريخًا شاملًا لجميع التغييرات، ما يتيح إعادة إنشاء الحالات السابقة للنظام بإعادة تشغيل الأحداث بالترتيب الذي وُلِّدت به. وهذا مفيد بشكل خاص عندما يلزم فهم كيفية الوصول إلى حالة معينة، أو عندما يلزم تصحيح الأخطاء؛ ويتم ذلك بإلحاق أحداث تعويضية جديدة بدلًا من حذف القديمة.
ومقارنة بنماذج قواعد البيانات التقليدية، حيث لا تُخزَّن إلا الحالة الحالية، يقدم event sourcing حلًا أكثر متانة لسلامة البيانات. فبالحفاظ على تاريخ كامل للأحداث، يضمن النظام ألا تضيع أي معلومات تاريخية وأن تكون جميع التغييرات قابلة للتحقق والتدقيق، وهو أمر حاسم للتطبيقات التي تتطلب موثوقية عالية وقابلية للتتبع.
كيف يمكن لنمط event sourcing تحسين قابلية التطبيق للتوسع؟
يستطيع event sourcing تحسين قابلية التطبيق للتوسع بتغيير طريقة التعامل مع البيانات وتخزينها. فبدلًا من تخزين الحالة الحالية للبيانات، يخزن event sourcing جميع التغييرات كتسلسل من الأحداث. ولأن عمليات الكتابة مجرد إلحاقات بسيطة بسجل، فقد يقلل ذلك الحاجة إلى المعاملات المعقدة وأقفال قواعد البيانات، ما يتيح توسيع جانب الكتابة بكفاءة أكبر.
كما يستطيع event sourcing تحسين قابلية التوسع بإتاحة معالجة الأحداث بالتوازي. إذ يمكن معالجة الأحداث التي تخص كيانات مختلفة بشكل غير متزامن وتوزيعها على عدة خوادم، بينما يجب التعامل مع أحداث الكيان نفسه بالترتيب. وهذا يقلل الحمل على أي خادم منفرد ويحسّن الأداء العام للتطبيق، ما يتيح له التعامل مع كميات أكبر من البيانات ومزيد من المستخدمين المتزامنين دون التفريط في السرعة أو الموثوقية.
ومقارنة بنماذج قواعد البيانات التقليدية، التي كثيرًا ما تتطلب عمليات معقدة ومستهلكة للموارد لتحديث البيانات وصيانتها، يقدم event sourcing حلًا أكثر قابلية للتوسع. فبالتركيز على الأحداث بدلًا من الحالة، يمكن تكييف التطبيق وتوسيعه بسهولة أكبر، ما يجعله مناسبًا جيدًا للأنظمة الموزعة الحديثة التي تتطلب توافرًا وأداءً عاليين.
ما التحديات التي قد تنشأ مع event sourcing؟
يوفر event sourcing تاريخًا كاملًا، لكنه يأتي أيضًا بمتطلبات. فحساب الحالة الحالية من أحداث كثيرة قد يستغرق وقتًا، ولهذا كثيرًا ما تُستخدم اللقطات لتخزين الحالة في لحظات معينة.
وقد يكون من الصعب تغيير بنية الأحداث بعد أن يعمل النظام لفترة، لأن الأحداث القديمة لا تزال بحاجة إلى أن تكون قابلة للقراءة. وتتطلب الاستعلامات عبر البيانات عادةً نماذج قراءة منفصلة تُحدَّث بشكل غير متزامن، فقد تكون البيانات قديمة لفترة وجيزة. كما أن طريقة التفكير هذه جديدة على كثير من المطورين، وقد يتطلب حذف البيانات الشخصية حلولًا خاصة، مثل crypto-shredding، حيث يُحذف مفتاح التشفير الخاص ببيانات الشخص.
كيف يمكن الجمع بين event sourcing و CQRS (Command Query Responsibility Segregation)؟
عند الجمع بين event sourcing و CQRS (Command Query Responsibility Segregation)، يكون ثمة فصل واضح بين الأوامر التي تغيّر الحالة والاستعلامات التي تقرأ الحالة. ويتيح هذا الفصل تحسين كل جزء وتوسيعه باستقلالية، ما يمكن أن يحسّن أداء النظام وقابليته للتوسع.
في معمارية CQRS مع event sourcing، تُعالَج الأوامر بإنشاء أحداث جديدة تصف التغييرات في النظام. وتُخزَّن هذه الأحداث في مخزن أحداث يعمل مصدرًا وحيدًا للحقيقة. وعندما يُخزَّن حدث جديد، يمكن استخدامه لتحديث نماذج القراءة المحسّنة للاستعلامات. وعادةً ما تُحدَّث نماذج القراءة بشكل غير متزامن، ولذلك تكون متسقة في النهاية، ما يعني أنها قد تتأخر قليلًا عن أحدث التغييرات.
ومقارنة بمعماريات CRUD التقليدية، حيث كثيرًا ما تكون تغييرات البيانات والاستعلامات مترابطة بإحكام، يوفر الجمع بين event sourcing و CQRS حلًا أكثر مرونة ومتانة. ذلك أن الأنظمة القائمة على الأحداث تستطيع التعامل مع منطق الأعمال المعقد وتتبع التاريخ بفعالية أكبر مع دعم المعالجة غير المتزامنة وقابلية التوسع. ويُعدّ هذا الجمع مفيدًا بشكل خاص في الأنظمة التي تتطلب توافرًا عاليًا وتحديثات شبه فورية، مثل التطبيقات المالية ومنصات إنترنت الأشياء.
Event Sourcing for dummies
نمط event sourcing طريقة ذكية لتخزين البيانات تتتبع كل تغيير يحدث في النظام، أشبه قليلًا بتسجيل فيلم. فبدلًا من حفظ أحدث حالة للبيانات فقط، يُحفظ كل تغيير على حدة يحدث بمرور الوقت. والأمر أشبه بالاحتفاظ بمذكرات يُدوَّن فيها شيء ما كلما حدث شيء جديد، بدلًا من الاكتفاء بصفحة واحدة تحمل أحدث المعلومات. وهذا يسهّل معرفة كيف ولماذا تغيرت الأشياء، ويمكن أن يساعد على إعادة إنشاء حالات سابقة أو فهم ما الذي حدث خطأً إذا وقعت مشكلات. وهي طريقة فعالة لضمان وجود صورة كاملة دائمًا لما حدث في النظام.