从 Azure 事件中心监听时,我收到错误
提供的偏移量 XXXXX 无效。系统中的最后一个偏移量是 XXXXX
分区 1 上出现错误:AMQP 对象会话已中止。 分区 0 上的错误:提供的偏移量无效。
我也有同样的问题。这是因为共享 EventPosition 类的实例。
var position = EventPosition.FromStart();
var eventProcessorHost = new EventProcessorHost(
eventHubName,
consumerGroupName,
eventHubConnectionString,
storageConnectionString,
LeaseContainerName);
host.RegisterEventProcessorFactoryAsync(
processorFactory,
new EventProcessorOptions
{
// Problem is the following line.
// In order to fix it replace 'position' with 'EventPosition.FromStart()'
InitialOffsetProvider = partitionId => position
}).Wait();
显然,如果共享位置类的实例,则 ProcessorHost 会对不同的 IEventProcessor 使用相同的对象。由于该对象包含偏移值,因此会导致将相同的偏移量传递到不同的分区 - 显然,如果分区之间的偏移量不同,则会导致问题。
发生此问题的原因很可能是 eventhub 消费者/侦听器保持的索引与 eventhub 可以提供的索引不同步。
在我的例子中,eventhub 被重新创建,因此它自己的索引返回到 -1 或空,而连接到它的 azure 函数则期望以上的内容,例如1000。从 eventhub 的角度来看,这是一个明显的错误,因为它自己从未达到过这样的索引。
重置azure函数保持连接到此eventhub的索引。
在云中运行时已解决此处在检查偏移部分。
func start
这是我的情况。对于这样的本地开发环境,您需要连接到一个网络存储。这很容易通过
local.settings.json
: 来完成
{
"Values": {
...
"AzureWebJobsStorage": "UseDevelopmentStorage=true"
}
}
并运行 azurite docker 镜像,如here:
$ docker pull mcr.microsoft.com/azure-storage/azurite
如果此设置发生这种情况,您应该使用终端进入 docker 容器并运行:
# rm -r /data/*
这将清除所有索引和以前的记录。肯定能解决问题。 但是如果您有兴趣保留其他订阅的记录,请小心使用它。