Azure eventhub:偏移量与序列号

Azure eventhub:偏移量与序列号,azure,azure-eventhub,Azure,Azure Eventhub,我看到很多论坛都在问这个问题,但没有一个能解决我的困惑 此文档似乎表明偏移量和序列号在分区中都是唯一的。 显然,序列号是一个按顺序递增的整数: 但补偿又如何呢?它是否仅在一个分区内是唯一的,还是在一个使用者组内的所有分区中都是唯一的?如果是前一种情况,为什么有两个不同的变量?偏移量指的是消费者组,而不是分区。 偏移量是为每个使用者组创建的一个小存储容器,每个使用者组都有自己的读取偏移量,您可以有几个使用者组,每个组都将以自己的方式读取事件中心数据。换句话说,偏移量容器包含一个小blob,其中

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

此文档似乎表明偏移量和序列号在分区中都是唯一的。

显然,序列号是一个按顺序递增的整数:


但补偿又如何呢?它是否仅在一个分区内是唯一的,还是在一个使用者组内的所有分区中都是唯一的?如果是前一种情况,为什么有两个不同的变量?

偏移量指的是消费者组,而不是分区。 偏移量是为每个使用者组创建的一个小存储容器,每个使用者组都有自己的读取偏移量,您可以有几个使用者组,每个组都将以自己的方式读取事件中心数据。换句话说,偏移量容器包含一个小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();
}
List eventProcessorHosts=new List();
var eventProcessorHost=新的eventProcessorHost(
事件名称,
PartitionReceiver.DefaultConsumerGroupName,
EventHub连接字符串,
StorageConnectionString,
存储容器名称);
添加(eventProcessorHost);
eventProcessorHosts[0]。RegisterEventProcessorAsync();
...
公共任务进程事件同步(PartitionContext上下文,IEnumerable消息)
{
foreach(消息中的var eventData)
{
var data=Encoding.UTF8.GetString(eventData.Body.Array、eventData.Body.Offset、eventData.Body.Count);
Console.WriteLine($“消息计数:{messages.count()}已接收消息。分区:{context.PartitionId}”,数据:{Data},线程:{thread.CurrentThread.ManagedThreadId}”);
}
//通过将当前偏移量和sequenceNumber写入检查点存储
//检查点管理器。
返回context.CheckpointAsync();
}

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

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

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

如果是前一种情况,为什么有两个不同的变量

偏移量仅保证唯一标识分区内的事件。对该值或其在不同事件中的变化进行推理是不安全的


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

这是不正确的;偏移量应用于分区。检查点时引用使用者组,以确保在不同使用者组的上下文中运行的处理器彼此独立运行。