Azure cosmosdb 在多区域写入上改变馈送观测器
我正在使用多区域写入(和读取)COSMOSDB。我在同一个集合上有多个change feed观察员,每个观察员都更新不同的搜索索引(每个索引都有自己的租约前缀)。默认一致性级别设置为会话 使用SDK v2(并更改提要处理器库v2): 我的日志显示,三分之二的观察员收到了更新文件的旧版本:Azure cosmosdb 在多区域写入上改变馈送观测器,azure-cosmosdb,Azure Cosmosdb,我正在使用多区域写入(和读取)COSMOSDB。我在同一个集合上有多个change feed观察员,每个观察员都更新不同的搜索索引(每个索引都有自己的租约前缀)。默认一致性级别设置为会话 使用SDK v2(并更改提要处理器库v2): 我的日志显示,三分之二的观察员收到了更新文件的旧版本: 时间t1:document1已创建 时间t2(t1后的天):文档1已更新 时间t3: 观察者1收到文件1(t2版本) observer2收到文档1(t1版本) observer3收到文件1(t1版本) 问
- 观察者1收到文件1(t2版本)
- observer2收到文档1(t1版本)
- observer3收到文件1(t1版本)
问题:changefeed处理器实例是否与特定区域有关联?换句话说,它是否可能从一个区域读取LSN并从另一个区域提取文档?我找不到关于变更提要观察员和多区域的清晰文档。假设处理器实例一旦获得租约,就会一致地观察来自同一区域的更改,这是错误的假设吗?接触的区域是默认区域(在多主机情况下,中心区域是门户列表中的第一个区域),除非您在
collectionInfo
中指定了首选位置,否则您将在中使用FeedCollection
DocumentCollectionInfo
有一个ConnectionPolicy
属性,您可以通过PreferredLocations
来定义您的首选项(就像您可以使用普通SDK客户端一样)。参考:
所有更改都是从该区域提取的,返回的LSN和来自该区域的文档(它们来自相同的更改提要响应)
一旦观察者获得租约,它将从配置中定义的区域(默认为Hub或您在PreferredLocations中定义的任何区域)读取租约所针对的分区的更改
编辑:在获得更改后,您是否正在观察者中执行ReadDocument?如果是这样,为了保持会话一致性,您需要从
IChangeFeedObserverContext.FeedResponse
(参考)中获取SessionToken,谢谢您的回复!这实际上是一个假阴性。另一个地区的观察者仍在使用我们的代码的旧版本,该版本产生的痕迹使我们认为他们看到的是旧版本。
new ChangeFeedProcessorBuilder()
.WithHostName(hostName)
.WithProcessorOptions(hostOptions)
.WithFeedCollection(collectionInfo)
.WithLeaseCollection(leaseInfo)
.WithObserverFactory(observerFactory)
.BuildAsync();