如何让多个Changefeed侦听器实例收到相同的消息:Java

问题描述

我们正在使用Cosmos Changefeed侦听器来更新临时Java服务中的边缘缓存。这意味着,所有任意数量的实例都应接收每个变更提要。我们使用UUID作为“主机名”,但并非所有实例都在获取更改提要。我读到某处有leasePrefix。那行得通吗?如果是这样,该如何在Java方面做到这一点?

解决方法

是的,在这种情况下,Lease prefix将为您提供帮助。 一种情况,当特定的Azure Cosmos容器中发生新事件时,您希望执行多项操作。如果要触发的动作彼此独立,则理想的解决方案是创建一个您想要执行的每个动作的Cosmos DB侦听器,所有侦听器都在同一个Azure Cosmos容器上侦听更改。

鉴于Cosmos DB的侦听器要求,我们需要第二个容器来存储状态,也称为“租约”容器。 这是否意味着每个Azure功能都需要一个单独的租用容器?

在这里,您有两个选择:

为每个侦听器创建一个leases container :除非您使用共享的吞吐量数据库,否则这种方法可能会转化为额外的费用。请记住,容器级别的最小吞吐量为400个请求单位,对于租用容器,该吞吐量仅用于检查进度并保持状态。

拥有一个租用容器并为所有侦听器共享它:第二个选项可以更好地利用容器上的预配置请求单元,因为它使多个侦听器可以共享和使用相同的预配置吞吐量

以下是使用Java语言实现此功能的Function App示例:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-cosmosdb-v2-trigger?tabs=java

代码以供快速参考:

@FunctionName("cosmosDBMonitor")
    public void cosmosDbProcessor(
        @CosmosDBTrigger(name = "items",databaseName = "ToDoList",collectionName = "Items",leaseCollectionName = "leases",leaseCollectionPrefix = "prefix",createLeaseCollectionIfNotExists = true,connectionStringSetting = "AzureCosmosDBConnection") String[] items,final ExecutionContext context ) {
                context.getLogger().info(items.length + "item(s) is/are changed.");
            }

让我知道是否需要进一步说明。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...