Event sourcing: इतिहास खोना बंद करो, उसे इस्तेमाल करो
Event sourcing क्या है (और नहीं, ये सिर्फ logging नहीं है)
Event sourcing में events ही source of truth होते हैं। तुम किसी object का "final state" नहीं रखते, बल्कि जो कुछ भी उसके साथ होता है वो save करते हो। फिर उन्हीं events को replay करके state बनाते हो। हां, जैसे replay. और नहीं, ये "बस logs" नहीं हैं: log कहानी बताता है, event सच होता है।
सरल उदाहरण: balance = 120 सेव करने की जगह तुम MoneyDeposited(200) और फिर MoneyWithdrawn(80) रिकॉर्ड करते हो। balance नतीजा है, कोई जादुई नंबर नहीं।
ये झंझट क्यों उठाओ?
क्योंकि future-you तब धन्यवाद देगा जब:
- तुम्हें audit करना हो कि किसने क्या किया, कब और क्यों,
- तुम debug के लिए reality को replay करना चाहो,
- business changes के बाद model rebuild करना पड़े,
- तुम projections (read models) चाहो बिना database को तोड़े।
संक्षेप में: अभी थोड़ी complexity, बाद में कम post-mortem ड्रामा।
ज़रूरी हिस्से (धुएं के बिना)
- Event: past में हुआ immutable fact.
OrderPlaced, नहींPlaceOrder. - Stream: एक aggregate के events की sequence.
- Aggregate: domain object जो events apply करके state बनाता है.
- Projection: derived view (SQL, Elastic, cache, आदि) तेज़ read के लिए.
कब इस्तेमाल करें (और कब नहीं)
इस्तेमाल करो अगर:
- तुम्हारा domain अक्सर बदलता है,
- history critical है,
- तुम्हें solid traceability चाहिए।
Avoid करो अगर:
- तुम्हारा CRUD बहुत basic है,
- audit की जरूरत नहीं है,
- टीम अभी repositories सीख रही है।
Symfony में छोटा शुरुआती उदाहरण
बहुत simple रखते हैं: Cart aggregate, events, और in-memory event store. ना full CQRS, ना Kafka, ना जादू. बस core idea.
1) Event define करो
php
2) Aggregate जो events replay करता है
php
3) Minimal in-memory event store
php
4) Symfony service में usage
php
बस हो गया. न ORM, न cache, न parade. सिर्फ core idea: events ही truth हैं, state एक computed view है। बाद में projections और Symfony Messenger listeners जोड़ लेना अगर बड़ी लीग में खेलना है।
याद रखने लायक बातें
- Event sourcing history स्टोर करता है, सिर्फ result नहीं.
- Events replay करके state बनती है.
- Audit और बदलते domains के लिए बढ़िया, boring CRUD के लिए बेकार.
- Symfony खुद सब नहीं करता, लेकिन structure साफ रखने देता है.
अगर ये भारी लगे, तो सही है: तुम short-term comfort के बदले long-term clarity ले रहे हो। अभी भुगतान करो या future-you करेगा। पसंद तुम्हारी।