首页 > 解决方案 > 如何让 changefeed 侦听器的多个实例获得相同的消息:Java

问题描述

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

标签: azureazure-cosmosdbazure-cosmosdb-sqlapiazure-java-sdk

解决方案


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

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

在这里,您有两个选择:

leases container为每个侦听器创建一个:这种方法可能会转化为额外的成本,除非您使用的是共享吞吐量数据库。请记住,容器级别的最小吞吐量是 400 个请求单元,并且在租用容器的情况下,它仅用于检查点进度和维护状态。

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

以下是使用 Java 语言实现此功能的函数应用示例: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.");
            }

推荐阅读