.net core открывает много соединений одновременно с базой данных mongo - PullRequest
0 голосов
/ 07 апреля 2019

Я строю сайты с ядром 2.1 и БД Mongo, драйвер.Развертывание на сервере AWS в ОС Ubuntu на веб-сервере Nginx. Проблема в том, что веб-сайт не работает, когда трафик увеличивается до 1400 пользователей.Журнал ядра .Net пуст, а служба запущена и работает.и Nginx запущен и работает.но журнал базы данных открывает много соединений одновременно

База данных журнала:

2019-04-05T10:41:51.545+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32768 #50628 (999 connections now open)
2019-04-05T10:41:51.545+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32770 #50629 (1000 connections now open)
2019-04-05T10:41:51.545+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32772 #50630 (1001 connections now open)
2019-04-05T10:41:51.545+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32774 #50631 (1002 connections now open)
2019-04-05T10:41:51.545+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32776 #50632 (1003 connections now open)
2019-04-05T10:41:51.545+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32778 #50633 (1004 connections now open)
2019-04-05T10:41:51.545+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32780 #50634 (1005 connections now open)
2019-04-05T10:41:51.545+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32782 #50635 (1006 connections now open)
2019-04-05T10:41:51.546+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32784 #50636 (1007 connections now open)
2019-04-05T10:41:51.546+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32786 #50637 (1008 connections now open)
2019-04-05T10:41:51.546+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32788 #50638 (1009 connections now open)
2019-04-05T10:41:51.552+0000 I NETWORK  [listener] connection accepted from 10.142.0.4:32790 #50639 (1010 connections now open)

C # Метод подключения к базе данных:

     private IMongoDatabase Connect(string con)
    {
        try
        {
            lock (padlock)
            {
                if (_db == null)
                {
                    var mongoConnectionUrl = new MongoUrl(con);
                    var seetings = new MongoClientSettings
                    {
                        Server = new MongoServerAddress(mongoConnectionUrl.Server.Host, mongoConnectionUrl.Server.Port),
                        WaitQueueSize = 10000,
                        MaxConnectionPoolSize = 500,
                        Credential = MongoCredential.CreateCredential(mongoConnectionUrl.DatabaseName, mongoConnectionUrl.Username, mongoConnectionUrl.Password),
                        ConnectTimeout = TimeSpan.FromSeconds(60),
                        SocketTimeout = TimeSpan.FromSeconds(15),
                        MaxConnectionIdleTime = TimeSpan.FromSeconds(15),

                    };
                    void SocketConfigurator(Socket s) => s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
                    seetings.ClusterConfigurator = builder =>
                        builder.ConfigureTcp(tcp => tcp.With(socketConfigurator: (Action<Socket>)SocketConfigurator));
                    MongoClient client = new MongoClient(seetings);

                    var database = client.GetDatabase(mongoConnectionUrl.DatabaseName);

                    var pack = new ConventionPack();
                    pack.Add(new CamelCaseElementNameConvention());
                    pack.Add(new IgnoreIfDefaultConvention(true));
                    pack.Add(new IgnoreExtraElementsConvention(true));
                    ConventionRegistry.Register("camel case", pack, t => true);
                    _db = database;

                }
            }

            return _db;
        }
        catch (Exception ex)
        {
            throw new Exception("Error While connecting to db");
        }
    }

1 Ответ

1 голос
/ 14 апреля 2019

Вы должны использовать только один экземпляр MongoClient для всего приложения (если у вас есть один кластер базы данных / mongo). В зависимости от того, как часто вы вызываете метод Connect, следующая строка может привести к слишком большому количеству открытых соединений:

MongoClient client = new MongoClient(seetings);

В монгольских документах сказано:

Обычно вы создаете только один экземпляр MongoClient для данного кластера и используете его в своем приложении. Однако создание нескольких клиентов MongoClient будет по-прежнему использовать один и тот же пул соединений, если и только если строки соединений идентичны.

В вашем случае вы используете объект настроек, поэтому я не уверен, удалось ли Mongo объединить всех ваших клиентов или нет, но это должно легко проверяться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...