Files
Mutual_Fund/service/event_publisher.py
T

64 lines
1.8 KiB
Python

"""跨模块事件双写发布器。"""
from __future__ import annotations
import json
import uuid
from sqlalchemy import text
from common_const import EVENT_STATUS_PENDING
async def publish_event(
redis,
db,
*,
event_id: str | None = None,
event_name: str,
trace_id: str,
trigger_user_id: int | None,
customer_id: int | None,
payload: dict,
) -> str:
requested_event_id = event_id
event_id = event_id or uuid.uuid4().hex
envelope = {
"event_id": event_id,
"event_name": event_name,
"trace_id": trace_id,
"trigger_user_id": trigger_user_id,
"customer_id": customer_id,
"payload": payload,
}
if requested_event_id:
existing = await db.scalar(
text("SELECT event_id FROM event_log WHERE event_id = :event_id"),
{"event_id": event_id},
)
if existing:
await redis.publish(event_name, json.dumps(envelope, ensure_ascii=False))
return event_id
statement = text(
"""
INSERT INTO event_log
(event_id, event_name, trace_id, trigger_user_id, customer_id, payload, status)
VALUES
(:event_id, :event_name, :trace_id, :trigger_user_id, :customer_id, :payload, :status)
"""
)
await db.execute(
statement,
{
"event_id": event_id,
"event_name": event_name,
"trace_id": trace_id,
"trigger_user_id": trigger_user_id,
"customer_id": customer_id,
"payload": json.dumps(payload, ensure_ascii=False),
"status": EVENT_STATUS_PENDING,
},
)
await db.commit()
await redis.publish(event_name, json.dumps(envelope, ensure_ascii=False))
return event_id