У нас есть приложение с C# и As pNet Core 2.2, и мы используем AWS document db, наш db настроен с replicaSet, который 1 является основным и 3 вторичными.
Запуск приложения штраф на производстве, но когда он достигает определенного количества операций записи, приложение начинает отказывать, и создаются новые экземпляры mon go, это происходит до тех пор, пока не будет создано больше соединений mon go, и не начнется ошибка тайм-аута и aws начинает завершать работу машин и воссоздавать их снова, даже если он запускается быстро, есть время, когда приложение не работает, выдавая 500 ошибок.
Я уже проверил Тайм-аут произошел после 30000 мс выбрав сервер с помощью CompositeServerSelector , который является проблемой с mongolabs, но это не решает нашу проблему, и попытался добавить «? connect = replicaSet» в конец строки подключения, и ошибки все еще произошли.
Вот наша строка подключения
ConnectionString": "mongodb://root:someurl:27017/?ssl=true&ssl_ca_certs=archive.pem&replicaSet=rs0
Здесь мы делаем пн go connection
Наш MongoDbContext:
using DataMongo.Entities;
using Microsoft.Extensions.Options;
using MongoDB.Driver;
using System;
using System.IO;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using MongoDB.Bson;
using MongoDB.Driver.Core.Events;
namespace DataMongo
{
public class MongoDbContext
{
private IMongoDatabase _database { get; }
public MongoDbContext(MongoSettings settings, bool readOnly = false)
{
try
{
var connectionString = readOnly ? settings.ConnectionStringReadOnly : settings.ConnectionString;
var ms = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
ms.AllowInsecureTls = true;
var client = new MongoClient(ms);
if (client != null)
_database = client.GetDatabase(settings.Database);
}
catch (Exception ex)
{
throw new Exception("Não foi possível se conectar com o servidor.", ex);
}
}
public IMongoCollection<Session> Sessions
{
get
{
return _database.GetCollection<Session>("Sessions");
}
}
public IMongoCollection<PageViewList> PageViewList
{
get
{
return _database.GetCollection<PageViewList>("PageViewList");
}
}
public IMongoCollection<Pagina> Paginas
{
get
{
return _database.GetCollection<Pagina>("Paginas");
}
}
public IMongoCollection<Cache> Caches
{
get
{
return _database.GetCollection<Cache>("Caches");
}
}
}
}
И наш MongoDbContextFactory:
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace DataMongo
{
public class MongoDbContextFactory : IMongoDbContextFactory
{
private MongoDbContext _db;
private MongoDbContext _dbEdit;
private string _connection;
private string _connectionEdit;
public MongoDbContextFactory(MongoSettings mongoSettings)
{
_mongoSettings = mongoSettings;
}
private MongoSettings _mongoSettings;
public MongoDbContext MongoContext
{
get { return _db ?? (_db = Create()); }
}
public MongoDbContext MongoContextReadOnly
{
get { return _dbEdit ?? (_dbEdit = Create(readOnly: true)); }
}
private MongoDbContext Create(bool readOnly = false)
{
return new MongoDbContext(_mongoSettings, readOnly);
}
}
}
Вот Stacktrace:
TimeoutException: A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "Automatic", Type : "Standalone", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/localhost:27017" }", EndPoint: "Unspecified/localhost:27017", State: "Disconnected", Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: Connection refused [::1]:27017 at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult) at System.Net.Sockets.Socket.<>c.<ConnectAsync>b__271_0(IAsyncResult iar) --- End of stack trace from previous location where exception was thrown --- at MongoDB.Driver.Core.Connections.TcpStreamFactory.ConnectAsync(Socket socket, EndPoint endPoint, CancellationToken cancellationToken) at MongoDB.Driver.Core.Connections.TcpStreamFactory.CreateStreamAsync(EndPoint endPoint, CancellationToken cancellationToken) at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync(CancellationToken cancellationToken) --- End of inner exception stack trace --- at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync(CancellationToken cancellationToken) at MongoDB.Driver.Core.Servers.ServerMonitor.HeartbeatAsync(CancellationToken cancellationToken)", LastUpdateTimestamp: "2020-03-06T18:05:54.1680430Z" }] }.