56 lines
2.0 KiB
Java
56 lines
2.0 KiB
Java
package com.baiyue.common.event;
|
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
|
import java.time.Instant;
|
|
|
|
/**
|
|
* 跨服务和跨区域传输使用的不可变事件信封。
|
|
*
|
|
* <p>租户 ID 和聚合 ID 使用字符串,避免跨语言传输时发生大整数精度丢失。
|
|
* {@code payloadHash} 是原始规范化负载字节的 SHA-256 摘要。</p>
|
|
*
|
|
* @param eventId 事件全局唯一 ID,使用标准 UUID 或 26 位 ULID
|
|
* @param eventType 事件类型,不包含版本号
|
|
* @param eventVersion 事件契约版本,从 1 开始
|
|
* @param occurredAt 业务事实实际发生时间,使用 UTC 时间点
|
|
* @param sourceRegion 事件来源业务单元
|
|
* @param targetRegion 事件目标业务单元;国内一期允许与来源区域相同
|
|
* @param tenantId 事件所属客户租户 ID
|
|
* @param aggregateType 聚合类型
|
|
* @param aggregateId 聚合 ID
|
|
* @param aggregateVersion 聚合版本,用于阻止乱序事件覆盖新状态
|
|
* @param handoverVersion 跨区交接版本;非交接事件可为空
|
|
* @param traceId 分布式链路 ID
|
|
* @param correlationId 同一业务流程的关联 ID
|
|
* @param causationId 直接触发当前事件的上游事件 ID;根事件可为空
|
|
* @param payload 事件业务负载
|
|
* @param payloadHash 负载摘要,格式为 sha256 加冒号和 64 位十六进制字符
|
|
*/
|
|
public record EventEnvelope(
|
|
String eventId,
|
|
String eventType,
|
|
int eventVersion,
|
|
Instant occurredAt,
|
|
RegionCode sourceRegion,
|
|
RegionCode targetRegion,
|
|
String tenantId,
|
|
String aggregateType,
|
|
String aggregateId,
|
|
long aggregateVersion,
|
|
Long handoverVersion,
|
|
String traceId,
|
|
String correlationId,
|
|
String causationId,
|
|
JsonNode payload,
|
|
String payloadHash
|
|
) {
|
|
/**
|
|
* 校验事件信封,不符合基础契约时抛出异常。
|
|
*/
|
|
public EventEnvelope requireValid() {
|
|
EventEnvelopeValidator.requireValid(this);
|
|
return this;
|
|
}
|
|
}
|