Прерывистое TimeoutException, соединяющее Atlas MongoDb из .net core 2.2 в док-контейнере на базе Linux в Azure - PullRequest
0 голосов
/ 07 марта 2019

У меня есть приложение на основе .Net Core 2.2, которое подключается к кластеру MondoDb V3.6 в Atlas. Приложение размещается в Azure как контейнер Linux Docker. Приложение использует драйвер MongoDB .Net 2.7.3. Приложение периодически (раз в пару минут) получает следующие исключения тайм-аута:

System.TimeoutException at MongoDB.Driver.Core.Clusters.Cluster.ThrowTimeoutException

и

System.TimeoutException at MongoDB.Driver.Core.Connections.TcpStreamFactory.ConnectAsync

Экземпляр клиента mongo настроен в соответствии с документацией MongoDb, т.е.

var url = MongoUrl.Create("mongodb+srv://user:password@cluster.gcp.mongodb.net/?authSource=admin&retryWrites=true&ssl=true");
        var clientSettings = MongoClientSettings.FromUrl(url);
        clientSettings.SslSettings = new SslSettings() { EnabledSslProtocols = SslProtocols.Tls12 };

        void SocketConfigurator(Socket s) => s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

        clientSettings.ClusterConfigurator = builder =>
            builder.ConfigureTcp(tcp => tcp.With(socketConfigurator: (Action<Socket>)SocketConfigurator));

        return new MongoClient(clientSettings);

Я проверил количество вопросов SO, включая MongoDB C # 2.0 TimeoutException и SocketTimeout с открытым соединением в MongoDB , но предложения кажутся устаревшими (сообщается как исправленные в текущей версии драйвер) или не имеют постоянного положительного эффекта (установка таймаутов в строке подключения, т.е. connectTimeoutMS = 90000 & socketTimeoutMS = 90000 & maxIdleTimeMS = 90000). Второй вариант (установка tcp_keepalive_time), по-видимому, не применим к док-контейнеру в Azure. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 18 марта 2019

Вы пробовали установить так:

var client = new MongoClient(new MongoClientSettings
{
       Server = new MongoServerAddress("xxxx"),
       ClusterConfigurator = builder =>
       {
             builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(10)));
       }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...