如何使用 2 个不同的连接字符串在带有 CQRS 的 postgre 中进行读取和写入?
How to use 2 different connection string for read and for writes in postgre with CQRS?
在我们的项目中,我们使用带有 CQRS 和 postgre 的 .net 5.0。
我们所有的应用程序都是容器化的,并在 kubernetes 上运行。对于 postgre,我们有 master -> slave 配置和 pgpool(用于写入),对于读取,它直接从 slaves 获取,但 pgpool 在 master 节点之前配置。
是否可以为 CQRS (MediatR) 配置一个读取连接和另一个写入连接?
我的 DI 配置如下:
services.AddDbContext<DataContext>(opt =>
{
opt.EnableDetailedErrors();
opt.UseLazyLoadingProxies();
opt.UseNpgsql(configuration.GetConnectionString("TaikunConnection"),
options =>
{
options.MigrationsAssembly(typeof(DataContext).Assembly.FullName);
options.EnableRetryOnFailure();
options.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds);
});
});
services.AddScoped<IDataContext>(provider => provider.GetService<DataContext>());
var builder = services.AddIdentityCore<User>()
.AddEntityFrameworkStores<DataContext>();
var identityBuilder = new IdentityBuilder(builder.UserType, builder.Services);
identityBuilder.AddSignInManager<SignInManager<User>>();
identityBuilder.AddUserManager<UserManager<User>>();
您可以使用 2 个不同的数据库上下文:
services.AddDbContext<DataWriteContext>(opt =>
{
opt.EnableDetailedErrors();
opt.UseLazyLoadingProxies();
opt.UseNpgsql(configuration.GetConnectionString("TaikunConnectionForWrite"),
options =>
{
options.MigrationsAssembly(typeof(DataContext).Assembly.FullName);
options.EnableRetryOnFailure();
options.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds);
});
});
services.AddDbContext<DataReadContext>(opt =>
{
opt.EnableDetailedErrors();
opt.UseLazyLoadingProxies();
opt.UseNpgsql(configuration.GetConnectionString("TaikunConnectionForRead"),
options =>
{
options.MigrationsAssembly(typeof(DataContext).Assembly.FullName);
options.EnableRetryOnFailure();
options.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds);
});
});
在我们的项目中,我们使用带有 CQRS 和 postgre 的 .net 5.0。 我们所有的应用程序都是容器化的,并在 kubernetes 上运行。对于 postgre,我们有 master -> slave 配置和 pgpool(用于写入),对于读取,它直接从 slaves 获取,但 pgpool 在 master 节点之前配置。
是否可以为 CQRS (MediatR) 配置一个读取连接和另一个写入连接?
我的 DI 配置如下:
services.AddDbContext<DataContext>(opt =>
{
opt.EnableDetailedErrors();
opt.UseLazyLoadingProxies();
opt.UseNpgsql(configuration.GetConnectionString("TaikunConnection"),
options =>
{
options.MigrationsAssembly(typeof(DataContext).Assembly.FullName);
options.EnableRetryOnFailure();
options.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds);
});
});
services.AddScoped<IDataContext>(provider => provider.GetService<DataContext>());
var builder = services.AddIdentityCore<User>()
.AddEntityFrameworkStores<DataContext>();
var identityBuilder = new IdentityBuilder(builder.UserType, builder.Services);
identityBuilder.AddSignInManager<SignInManager<User>>();
identityBuilder.AddUserManager<UserManager<User>>();
您可以使用 2 个不同的数据库上下文:
services.AddDbContext<DataWriteContext>(opt =>
{
opt.EnableDetailedErrors();
opt.UseLazyLoadingProxies();
opt.UseNpgsql(configuration.GetConnectionString("TaikunConnectionForWrite"),
options =>
{
options.MigrationsAssembly(typeof(DataContext).Assembly.FullName);
options.EnableRetryOnFailure();
options.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds);
});
});
services.AddDbContext<DataReadContext>(opt =>
{
opt.EnableDetailedErrors();
opt.UseLazyLoadingProxies();
opt.UseNpgsql(configuration.GetConnectionString("TaikunConnectionForRead"),
options =>
{
options.MigrationsAssembly(typeof(DataContext).Assembly.FullName);
options.EnableRetryOnFailure();
options.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds);
});
});