Azure eventhub:偏移量与序列号
Azure eventhub : Offset vs Sequence number
我看到很多论坛上有人问这个问题,但 none 解决了我的困惑。
该文档似乎表明偏移量和序列号在一个分区内都是唯一的。
https://docs.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-4da4-95ce-4139aac9bc44/sequence-number-vs-offset?forum=azureiothub#:~:text=SequenceNumber%20is%20the%20logical%20sequence,the%20Event%20Hub%20partition%20stream.&text=The%20sequence%20number%20can%20be,authority%20and%20not%20by%20clients.
但是偏移量呢?它是只在一个分区内唯一,还是在一个消费者组内的所有分区内唯一?如果是前一种情况,为什么会有两个不同的变量?
Offset指的是consumer groups而不是partitions。
Offset 是为每个消费者组创建的一个小型存储容器,每个消费者组都有自己的读取偏移量,你可以有多个消费者组,每个组都会在自己平静的情况下读取事件中心数据。换句话说,偏移量容器包含一个小的 blob,其中包含有关读取检查点的数据,每次执行 context.CheckpointAsync() 时都会前进。如果你会删除消费组创建的容器,那么这个组会从头开始读取数据,
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 构造函数的存储容器。
偏移量是分区事件流中的相对位置。在当前的事件中心实现中,它表示从分区开始到给定事件中第一个字节的字节数。
在分区的上下文中,偏移量是唯一的。相同的偏移值可能会出现在其他分区中 - 它不应被视为在整个事件中心内是全局唯一的。
If it is the former condition, why have two different variables?
偏移量保证只在分区内唯一标识一个事件。推断值或它如何从事件到事件变化是不安全的。
另一方面,序列号遵循可预测的模式,其中编号在分区范围内是连续且唯一的。因此,可以安全地用于诸如“如果我想倒回 5 个事件,我将使用当前序列号并减去 5”之类的计算。
我看到很多论坛上有人问这个问题,但 none 解决了我的困惑。
该文档似乎表明偏移量和序列号在一个分区内都是唯一的。 https://docs.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-4da4-95ce-4139aac9bc44/sequence-number-vs-offset?forum=azureiothub#:~:text=SequenceNumber%20is%20the%20logical%20sequence,the%20Event%20Hub%20partition%20stream.&text=The%20sequence%20number%20can%20be,authority%20and%20not%20by%20clients.
但是偏移量呢?它是只在一个分区内唯一,还是在一个消费者组内的所有分区内唯一?如果是前一种情况,为什么会有两个不同的变量?
Offset指的是consumer groups而不是partitions。 Offset 是为每个消费者组创建的一个小型存储容器,每个消费者组都有自己的读取偏移量,你可以有多个消费者组,每个组都会在自己平静的情况下读取事件中心数据。换句话说,偏移量容器包含一个小的 blob,其中包含有关读取检查点的数据,每次执行 context.CheckpointAsync() 时都会前进。如果你会删除消费组创建的容器,那么这个组会从头开始读取数据,
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 构造函数的存储容器。
偏移量是分区事件流中的相对位置。在当前的事件中心实现中,它表示从分区开始到给定事件中第一个字节的字节数。
在分区的上下文中,偏移量是唯一的。相同的偏移值可能会出现在其他分区中 - 它不应被视为在整个事件中心内是全局唯一的。
If it is the former condition, why have two different variables?
偏移量保证只在分区内唯一标识一个事件。推断值或它如何从事件到事件变化是不安全的。
另一方面,序列号遵循可预测的模式,其中编号在分区范围内是连续且唯一的。因此,可以安全地用于诸如“如果我想倒回 5 个事件,我将使用当前序列号并减去 5”之类的计算。