MongoDB C# 2.0 驱动程序:每个 Web 应用程序分别有多少个 MongoClients 套接字?
MongoDB C# 2.0 Driver: How many MongoClients respectively Sockets per Web Application?
Typically you only create one MongoClient instance for a given cluster
and use it across your application. Creating multiple MongoClients
will, however, still share the same pool of connections if and only if
the connection strings are identical.
来源:http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/
我们的情况是有两个不同的"clusters".
我们不使用复制或分片,但我们有两个不同的数据库。
这意味着我们的某些 API 函数将从一个数据库中获取数据,而其他 API 函数将从第二个数据库中获取数据。
这是硬编码的。
我们在每个 class 中创建了一个 SelectDatabase 方法,然后用给定的设置创建了一个 MongoClient。
相同的class将始终访问相同的数据库。
我预计驱动程序会处理 "optimum way" 中的秒数。
但事实证明,每次我刷新浏览器时,都会完成一个新的 Web API 控制器调用,因此也会完成一个新的 SelectDatabase 调用。
这每次都会产生一个新的套接字(使用 TCPView 检查)。
所以当然每个 API 控制器调用都应该导致 SelectDatabase,但我认为每次都创建一个套接字是一种矫枉过正。
我们正在像这样创建新的 MongoClients:
//Creating multiple MongoClients will, however, still share the same pool of connections
//if and only if the connection strings are identical.
MongoClientSettings clientSettings1 = new MongoClientSettings()
{
Server = new MongoServerAddress(host, port),
ClusterConfigurator = builder =>
{
builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(serverSelectionTimeoutInSeconds)));
}
};
在我们的项目情况下,同时打开的套接字(Web 应用程序和数据库之间)的最佳数量是多少?分别是 MongoClient 实例?
Web 浏览器 "Socket" 生命周期应该只导致 Web 应用程序创建 1 个到数据库的套接字
Web 应用程序应该只使用一个套接字,每个数据库一个,完全独立于有多少 Web 浏览器或套接字对 Web 应用程序打开。
每次有 Web API 调用时都应该打开一个新连接
我 运行 进行了一些 Postman 测试,我在其中创建了数百个 API 调用,我发现它 运行 资源耗尽分别进入超时状态。当我选择方法 2 而不是 3 时,我发现它 运行 更好。
但是我担心当 Web API 被如此频繁地调用时创建的不同任务可能会以某种方式干扰然后在套接字级别上导致错误发生。
更新
我做了两个测试:
第一个是基于在每个请求上生成一个新的 MongoClient 的原则。 TCPView 告诉我每个请求都会打开一个新套接字。
第二个测试是使用单例模式,它允许我每次访问相同的两个 MongoClients。第二个测试只使用了两个插座。
我还需要说的是,我更改了异步调用,以便方法在 return 之前被阻塞(为简单起见,我不希望每个方法中都有这些任务 return 类型)。
一个 MongoClient 实例并不意味着一个套接字,它内部有一个连接池,您可以控制池大小的最小值和最大值。最大池大小的默认值为 100,这意味着它可以增长到 100 个打开 connections/sockets。
根据文档,您如何创建 MongoClient 并不重要,因为您最终应该有 2 个连接池,因为您有 2 个不同的连接字符串。但我会选择第 2 个,每个数据库一个 MongoClient 实例,因为无论采用何种技术,这都是 all mongo clients 的推荐方法。
在您的情况下,当您 运行 使用 Postman 进行测试时,超时可能来自 Web 服务器? mongodb .NET 客户端的优点在于它公开了异步方法,因此您可以一直异步到 Web api 控制器。这应该可以扩展您的 Web 应用程序,因为所有 asp.net 线程都将被重用并且不会在 IO 上阻塞。
而且你不应该担心混合 sockets/connections 因为一个 MongoClient 并不意味着一个套接字。下面有许多正在使用的连接,它们只有在完成之前的工作后才会被重用。如果你看一下 csharp-driver 的代码,你会发现它看起来很专业:)
我做了一些试验,结果表明,如果您使用 MongoClientSettings 对象,即使连接字符串参数(主机、端口)相同,创建多个 MongoClient 也不会共享相同的连接池。
MongoDB 文档可能意味着 "connection strings" 字面意思,即只有字符串。
简而言之,以下内容按预期工作:
_client = new MongoClient("mongodb://localhost:27017");
但不是以下内容:
MongoClientSettings clientSettings = new MongoClientSettings()
{
Server = new MongoServerAddress(host, port),
ClusterConfigurator = builder =>
{
builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(serverSelectionTimeoutInSeconds)));
}
};
_client = new MongoClient(clientSettings);
即使您从单例中使用了完全相同的 MongoClientSettings 对象,您仍然会得到不同的连接池。我也验证了。
Typically you only create one MongoClient instance for a given cluster and use it across your application. Creating multiple MongoClients will, however, still share the same pool of connections if and only if the connection strings are identical.
来源:http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/
我们的情况是有两个不同的"clusters".
我们不使用复制或分片,但我们有两个不同的数据库。
这意味着我们的某些 API 函数将从一个数据库中获取数据,而其他 API 函数将从第二个数据库中获取数据。 这是硬编码的。
我们在每个 class 中创建了一个 SelectDatabase 方法,然后用给定的设置创建了一个 MongoClient。
相同的class将始终访问相同的数据库。
我预计驱动程序会处理 "optimum way" 中的秒数。
但事实证明,每次我刷新浏览器时,都会完成一个新的 Web API 控制器调用,因此也会完成一个新的 SelectDatabase 调用。 这每次都会产生一个新的套接字(使用 TCPView 检查)。
所以当然每个 API 控制器调用都应该导致 SelectDatabase,但我认为每次都创建一个套接字是一种矫枉过正。
我们正在像这样创建新的 MongoClients:
//Creating multiple MongoClients will, however, still share the same pool of connections
//if and only if the connection strings are identical.
MongoClientSettings clientSettings1 = new MongoClientSettings()
{
Server = new MongoServerAddress(host, port),
ClusterConfigurator = builder =>
{
builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(serverSelectionTimeoutInSeconds)));
}
};
在我们的项目情况下,同时打开的套接字(Web 应用程序和数据库之间)的最佳数量是多少?分别是 MongoClient 实例?
Web 浏览器 "Socket" 生命周期应该只导致 Web 应用程序创建 1 个到数据库的套接字
Web 应用程序应该只使用一个套接字,每个数据库一个,完全独立于有多少 Web 浏览器或套接字对 Web 应用程序打开。
每次有 Web API 调用时都应该打开一个新连接
我 运行 进行了一些 Postman 测试,我在其中创建了数百个 API 调用,我发现它 运行 资源耗尽分别进入超时状态。当我选择方法 2 而不是 3 时,我发现它 运行 更好。 但是我担心当 Web API 被如此频繁地调用时创建的不同任务可能会以某种方式干扰然后在套接字级别上导致错误发生。
更新 我做了两个测试: 第一个是基于在每个请求上生成一个新的 MongoClient 的原则。 TCPView 告诉我每个请求都会打开一个新套接字。 第二个测试是使用单例模式,它允许我每次访问相同的两个 MongoClients。第二个测试只使用了两个插座。 我还需要说的是,我更改了异步调用,以便方法在 return 之前被阻塞(为简单起见,我不希望每个方法中都有这些任务 return 类型)。
一个 MongoClient 实例并不意味着一个套接字,它内部有一个连接池,您可以控制池大小的最小值和最大值。最大池大小的默认值为 100,这意味着它可以增长到 100 个打开 connections/sockets。
根据文档,您如何创建 MongoClient 并不重要,因为您最终应该有 2 个连接池,因为您有 2 个不同的连接字符串。但我会选择第 2 个,每个数据库一个 MongoClient 实例,因为无论采用何种技术,这都是 all mongo clients 的推荐方法。
在您的情况下,当您 运行 使用 Postman 进行测试时,超时可能来自 Web 服务器? mongodb .NET 客户端的优点在于它公开了异步方法,因此您可以一直异步到 Web api 控制器。这应该可以扩展您的 Web 应用程序,因为所有 asp.net 线程都将被重用并且不会在 IO 上阻塞。
而且你不应该担心混合 sockets/connections 因为一个 MongoClient 并不意味着一个套接字。下面有许多正在使用的连接,它们只有在完成之前的工作后才会被重用。如果你看一下 csharp-driver 的代码,你会发现它看起来很专业:)
我做了一些试验,结果表明,如果您使用 MongoClientSettings 对象,即使连接字符串参数(主机、端口)相同,创建多个 MongoClient 也不会共享相同的连接池。
MongoDB 文档可能意味着 "connection strings" 字面意思,即只有字符串。
简而言之,以下内容按预期工作:
_client = new MongoClient("mongodb://localhost:27017");
但不是以下内容:
MongoClientSettings clientSettings = new MongoClientSettings()
{
Server = new MongoServerAddress(host, port),
ClusterConfigurator = builder =>
{
builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(serverSelectionTimeoutInSeconds)));
}
};
_client = new MongoClient(clientSettings);
即使您从单例中使用了完全相同的 MongoClientSettings 对象,您仍然会得到不同的连接池。我也验证了。