Azure节点:偏移量vs序列号



我看到这个问题在很多论坛上被问到,但没有一个能解决我的困惑。

这个文档似乎表明偏移量和序列号在一个分区内都是唯一的。https://learn.microsoft.com/en-us/dotnet/api/microsoft.servicebus.messaging.eventdata?view=azure-dotnet

显然,sequence number是一个顺序递增的整数:https://social.msdn.microsoft.com/forums/azure/en - us/acc25820 a28a公元4 - da4 - 95 - 4139 - aac9bc44/sequence - - vs offset?forum=azureiothub #: ~:文本= SequenceNumber % 20 % 20 % 20逻辑% 20序列,% 20事件% 20中心% 20分区% 20流。amp;文本= % 20序列% 20号% 20 % 20可以,权威% 20和% 20没有% 20 % 20客户。

但是偏移量呢?它是仅在一个分区内唯一的,还是在一个消费者组内的所有分区中唯一的?如果是前一种情况,为什么有两个不同的变量?

偏移量是分区事件流中的相对位置。在当前的Event Hubs实现中,它表示给定事件中从分区开始到第一个字节的字节数。

在分区上下文中,偏移量是唯一的。相同的偏移值可能出现在其他分区中-不应将其视为跨Event Hub的全局唯一。

如果是前一个条件,为什么有两个不同的变量?

保证偏移量仅用于唯一标识分区内的事件。推断该值或它如何随事件而变化是不安全的。

另一方面,Sequence Number遵循可预测的模式,其中编号在分区范围内是连续且唯一的。正因为如此,在计算中使用它是安全的,例如"如果我想倒带5个事件,我将使用当前序列号并减去5。">

Offset指的是消费者组,而不是分区。Offset是为每个消费者组创建的一个小型存储容器,每个消费者组都有自己的读取偏移量,您可以有几个消费者组,每个组将以自己的方式读取事件中心数据。换句话说,偏移量容器保存了一小块与读取检查点相关的数据,每次执行上下文时,这些数据都会向前移动。. 如果删除消费者组创建的容器,则消费者组将从头开始读取数据,

List<EventProcessorHost> eventProcessorHosts = new List<EventProcessorHost>();
var eventProcessorHost = new EventProcessorHost(
EventHubName,
PartitionReceiver.DefaultConsumerGroupName,
EventHubConnectionString,
StorageConnectionString,
StorageContainerName);
eventProcessorHosts.Add(eventProcessorHost);
eventProcessorHosts[0].RegisterEventProcessorAsync<SimpleEventProcessor>();
...
public Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
{
foreach (var eventData in messages)
{
var data = Encoding.UTF8.GetString(eventData.Body.Array, eventData.Body.Offset, eventData.Body.Count);
                                       
Console.WriteLine($"messages count: {messages.Count()} Message received. Partition: '{context.PartitionId}', Data: '{data}',  thread:{Thread.CurrentThread.ManagedThreadId}");
}
// Writes the current offset and sequenceNumber to the checkpoint store via the
// checkpoint manager.
return context.CheckpointAsync();
}

检查传递给EventProcessorHost的存储容器构造函数。

最新更新