使用 Azure Event Hubs 构建 .NET 事件溯源系统,需将领域事件序列化并写入高吞吐消息管道;2. 定义不可变事件如 OrderCreated、OrderShipped,用 System.Text.Json 序列化为字节数组,并通过 ContentType 和 EventType 属性标识类型;3. 使用 EventHubProducerClient 批量发送事件,设置 PartitionKey 确保同一聚合根事件有序;4. 消费端通过 EventProcessorClient 结合 BlobCheckpointStore 实现至少一次处理,业务逻辑需幂等;5. 可选重建聚合时从指定分区读取事件流,高频场景引入快照减少回放开销;6. Event Hubs 适合作为 CQRS 架构中的事件分发通道,虽无版本管理与复杂查询,但保障了事件的有序性、不可变性与可重播性。

用 Azure Event Hubs 构建 .NET 事件溯源系统,核心是将领域事件持久化到高吞吐的消息管道中,并由消费者按顺序处理。Event Hubs 虽非传统事件存储(如 EventStoreDB),但结合正确设计,可支撑轻量级事件溯源架构。
定义领域事件与序列化
事件溯源的基础是不可变的事件流。在 .NET 中,先定义清晰的事件类型:
public record OrderCreated(
Guid OrderId,
string CustomerName,
DateTime CreatedAt
);
public record OrderShipped(
Guid OrderId,
DateTime ShippedAt
);
使用 System.Text.Json 或 MessagePack 序列化事件为字节数组。建议附加事件类型名到消息属性,便于反序列化:
- 将事件写入 EventData 时,设置 ContentType 或 EventType 属性
- 统一采用 UTF-8 编码避免乱码问题
发布事件到 Event Hubs
使用 Azure.Messaging.EventHubs.Producer.EventHubProducerClient 发布事件:
var producer = new EventHubProducerClient(connectionString, eventHubName);
using var eventBatch = await producer.CreateBatchAsync();
var eventData = new EventData(Encoding.UTF8.GetBytes(json));
eventData.ContentType = "application/json";
eventData.ApplicationProperties["EventType"] = "OrderCreated";
if (!eventBatch.TryAdd(eventData))
throw new Exception("Event too large");
await producer.SendAsync(eventBatch);
- 启用批次发送提升吞吐量
- 通过 PartitionKey 确保同一聚合根的事件顺序一致(如使用 OrderId 做哈希)
消费事件并更新读模型
使用 EventProcessorClient 持久化处理检查点,确保至少一次语义:
var processor = new EventProcessorClient(
checkpointStore, // 如 BlobCheckpointStore
consumerGroup,
connectionString,
eventHubName);
processor.ProcessEventAsync += async args =>
{
var json = Encoding.UTF8.GetString(args.Data.Body);
var eventType = args.Data.ApplicationProperties["EventType"].ToString();
var domainEvent = DeserializeEvent(json, eventType);
await UpdateReadModel(domainEvent); // 写入数据库或缓存
await args.UpdateCheckpointAsync();
};
await processor.StartProcessingAsync();
- Blob 存储作为检查点存储,防止重复处理
- 处理逻辑需幂等,应对重试场景
聚合重建与快照(可选)
若需重建聚合状态,从 Event Hub 读取特定分区(即聚合 ID 对应的流):
- 使用 EventHubConsumerClient 从起始位置读取指定 PartitionKey 的事件
- 对高频聚合引入定期快照,减少回放开销
- 快照可存于 Azure Blob 或 Cosmos DB
基本上就这些。Azure Event Hubs 提供了高吞吐、低延迟的事件管道,适合做事件分发。虽然它不支持事件版本管理或复杂查询,但在 CQRS + 事件溯源架构中,作为写模型的事件发布通道非常合适。关键在于保证事件不可变、有序、可重播。










