问题描述
以下配置有问题,
驱动程序版本:3.12.1,适用于Java的mongodb驱动程序
服务器版本:Azure Cosmos DB的Mongo API 3.2(古老,我知道)
我们运行了相当高的读/写负载,并且可能会受到Cosmos API for Mongo的速率限制。在这种情况下,我期望发生异常。我们正在做一些普通的查询,代码片段看起来类似于
public DatabaseQueryResult find(String collectionName,Map<String,Object> queryData) {
Document toFind = new Document(queryData);
MongoCollection<Document> collection = this.mongoDatabase.getCollection(collectionName);
FindIterable<Document> findResults = collection.find(toFind);
if (findResults != null) {
Document dataFound = findResults.first();
return new DatabaseQueryResult(dataFound.toJson(this.settings))
}
// other stuff...
}
当Azure限制价格时,您会收到类似的回复
{
"$err":"Message: {\"Errors\":[\"Request rate is large. More Request Units may be needed,so no changes were made. Please retry this request later. Learn more: http://aka.ms/cosmosdb-error-429\"]}\r\n s","code":16500,"_t":"OKMongoResponse","errmsg":"Message: {\"Errors\":[\"Request rate is large. More Request Units may be needed,so no changes were made. Please retry this request later. Learn more: http://aka.ms/cosmosdb-error-429\"]}\r\n","ok":0
}
我希望在这里抛出异常-但更高版本的驱动程序似乎并非如此。发生了什么事,
我不希望发生这种情况-我更希望mongo驱动程序抛出一个 MongoCommandException / MongoQueryException (如果查询操作返回OKMongoResponse,其中“确定”为0)。写道, 它将使用CommandProtocol对象,并且响应已按我的期望进行了验证-只是读取似乎已更改。
与2个驱动程序版本相比,这似乎是读取行为的变化-可能是由于3.11版引入了可重试的读取?现在,响应验证似乎在this section.
附近问:是否可以配置我的Mongo客户端,以便驱动程序将验证读取操作时的服务器响应,并在收到OKMongoResponse且ok == 0时引发异常? >
我当然可以自己验证结果,但我不希望这样做,如果可能的话,让驾驶员这样做
解决方法
我不确定Mongo为什么更改了该驱动程序。波斯菊方面有些帮助。您可以提出支持请求,并要求他们打开服务器端重试。这将改变Cosmos的行为,以便请求过多时,请求将排队而不是抛出429。
这更多地反映了Mongo在VM或Atlas(也在VM上运行)而不是像Cosmos DB这样的多租户服务中运行时的行为。
,在3.2-3.4服务器上,驱动程序使用here中描述的find命令,而不是OP_QUERY。
驱动程序肯定没有“返回OKMongoResponse”,因为它不是为cosmosdb编写的。
如果您认为存在驱动程序问题,请使用收到的确切有线协议响应以及从驱动程序收到的确切结果来更新问题。
可重试的写入需要会话(cosmosdb发布但不支持会话,请参见Importing BSON to CosmosDB MongoDB API using mongorestore),并且通常使用3.6+服务器随附的OP_MSG协议。我不知道如果3.2服务器通告会话支持,驱动程序会怎么做,这不是MongoDB可以实现的。
请注意,MongoDB不支持cosmosdb(因此,MongoDB驱动程序也官方不支持)。