.NetCore框架Surging系列(一)介绍
.NetCore框架Surging系列(二)HTTP
.NetCore框架Surging系列(三)HTTP本地路由发现过程
.NetCore框架Surging系列(四)RPC客户端过程
.NetCore框架Surging系列(五)路由注册
.NetCore框架Surging系列(六)路由发现
.NetCore框架Surging系列(七)路由监听
.NetCore框架Surging系列(八)性能评估
.NetCore框架Surging系列(九)性能提升
.NetCore框架Surging系列(十)RPC机密传输数据 - DotNetty开启TLS
缓存资源池,在cacheSettings.json设定
minSize
和
maxSize
配置时,这里
maxSize配置资源池中缓存客户端保持的TCP连接数,
minSize为第一次初始换资源池时一次性创建的资源数。
流程
源码
源码不长,如下
public class ObjectPool<T>
{
//省略 字段
/// <summary>
/// 构造一个对象池
/// </summary>
/// <param name="func">用来初始化对象的函数</param>
/// <param name="minSize">对象池下限</param>
/// <param name="maxSize">对象池上限</param>
public ObjectPool(Func<T> func, int minSize = 100, int maxSize = 100)
{
//省略 参数格式检查
//省略 字段赋值
// 这里 给资源池创建最小对象
for (var i = 0; i < this.minSize; i++)
{
this.queue.Enqueue(func());
}
//省略 字段赋值
}
/// <summary>
/// 从对象池中取一个对象出来, 执行完成以后会自动将对象放回池中
/// </summary>
public T GetObject()
{
var t = default(T);
try
{
// 在获取资源时 如果资源池没有充满则,创建资源并添加到池中
if (this.tryNewObject < this.maxSize)
{
Interlocked.Increment(ref this.tryNewObject);
t = func();
// Interlocked.Increment(ref this.currentResource);
}
// 在获取资源时 如果资源池满了则直接获取一个资源
// 注 这里采用队列存储资源,获取资源时为出队操作
else
{
this.Enter();
t = this.queue.Dequeue();
this.Leave();
Interlocked.Decrement(ref this.currentResource);
}
return t;
}
finally
{
//在方法返回资源时 将资源重新加入队列中
this.Enter();
this.queue.Enqueue(t);
this.Leave();
Interlocked.Increment(ref currentResource);
}
}
}
总结
- minSize、maxSize设定范围
minSize不能设置过大1-100,在之前的并发测试中,设定100,建议设为10
。设置1000系统启动速度非常慢。
maxSize也不能设置太大,设置太大也没有什么用,之前并发测试中设置200
能够支持3000以上的吞吐量。 - 资源池不能通用
因为资源池中的资源还没用完就归还到池中,当然Redis连接同时被多个线程使用无所谓。如果资源占用有排他性,那么资源在使用完毕之后才能归还。