This code shows how sharing a database directly causes tight coupling and data conflicts. After applying the pattern, each service owns its data and communicates via events, enabling independent evolution and reducing risk.
### Before: Two services sharing the same database table directly
class OrderService:
def create_order(self, order_data):
# Directly insert into shared orders table
db.execute("INSERT INTO orders ...", order_data)
class PaymentService:
def update_payment_status(self, order_id, status):
# Directly update shared orders table
db.execute("UPDATE orders SET payment_status=? WHERE id=?", (status, order_id))
### After: Each service owns its own database and communicates via API
# Order Service with private DB
class OrderService:
def __init__(self, db, event_bus):
self.db = db
self.event_bus = event_bus
def create_order(self, order_data):
self.db.insert_order(order_data)
# Notify Payment Service via event
self.event_bus.publish('order_created', order_data)
# Payment Service with private DB
class PaymentService:
def __init__(self, db):
self.db = db
def on_order_created(self, order_data):
self.db.create_payment_record(order_data['id'])
def update_payment_status(self, order_id, status):
self.db.update_payment_status(order_id, status)
# Event bus simulates communication
class EventBus:
def __init__(self):
self.subscribers = {}
def publish(self, event, data):
for handler in self.subscribers.get(event, []):
handler(data)
def subscribe(self, event, handler):
self.subscribers.setdefault(event, []).append(handler)
# Wiring up
# Assuming db instances are provided
order_db = ... # some database instance for orders
payment_db = ... # some database instance for payments
event_bus = EventBus()
order_service = OrderService(order_db, event_bus)
payment_service = PaymentService(payment_db)
event_bus.subscribe('order_created', payment_service.on_order_created)
# Explanation:
# The OrderService owns its orders database and publishes events.
# The PaymentService owns its payment database and reacts to events.
# No direct database sharing occurs.