如何让多个 changefeed 侦听器实例获得相同的消息:Java

How to have multiple instances of changefeed listeners get the same message: Java

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

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

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

这里,你有两个选择:

为每个侦听器创建一个 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.");
            }