feat: enforce canonical container identity across regions
This commit is contained in:
+26
@@ -106,6 +106,32 @@ class EventInboxServiceTest {
|
||||
.hasMessageContaining("事件信封");
|
||||
}
|
||||
|
||||
@Test
|
||||
void 相同业务eventKey的新eventId只允许同负载重放并拒绝柜号漂移() {
|
||||
EventEnvelope envelope = withHash(envelope("sha256:placeholder"));
|
||||
BridgeInbox existing = existing(envelope, envelope.payloadHash());
|
||||
when(store.findByEventId(envelope.eventId())).thenReturn(null);
|
||||
when(store.findByIdempotencyKey("CN:flow-1")).thenReturn(existing);
|
||||
EventEnvelope replay = new EventEnvelope("550e8400-e29b-41d4-a716-446655440001",
|
||||
envelope.eventType(), envelope.eventVersion(), Instant.parse("2026-07-29T09:00:00Z"),
|
||||
envelope.sourceRegion(), envelope.targetRegion(), envelope.tenantId(), envelope.aggregateType(),
|
||||
envelope.aggregateId(), envelope.aggregateVersion(), envelope.handoverVersion(), "trace-2",
|
||||
envelope.correlationId(), null, envelope.payload(), envelope.payloadHash());
|
||||
assertThat(service.receive(replay).result()).isEqualTo("重复");
|
||||
|
||||
com.fasterxml.jackson.databind.node.ObjectNode driftPayload =
|
||||
(com.fasterxml.jackson.databind.node.ObjectNode) envelope.payload().deepCopy();
|
||||
driftPayload.put("containerNo", "DIFFERENT");
|
||||
String driftHash = EventPayloadHash.sha256(EventPayloadCanonicalizer.canonicalize(driftPayload));
|
||||
EventEnvelope drift = new EventEnvelope("550e8400-e29b-41d4-a716-446655440002",
|
||||
envelope.eventType(), envelope.eventVersion(), envelope.occurredAt(), envelope.sourceRegion(),
|
||||
envelope.targetRegion(), envelope.tenantId(), envelope.aggregateType(), envelope.aggregateId(),
|
||||
envelope.aggregateVersion(), envelope.handoverVersion(), "trace-3", envelope.correlationId(),
|
||||
null, driftPayload, driftHash);
|
||||
assertThatThrownBy(() -> service.receive(drift))
|
||||
.hasMessageContaining("eventKey").hasMessageContaining("漂移");
|
||||
}
|
||||
|
||||
@Test
|
||||
void 并发插入冲突后按既有记录判定为重复() {
|
||||
EventEnvelope envelope = withHash(envelope("sha256:placeholder"));
|
||||
|
||||
Reference in New Issue
Block a user