龙空技术网

NET6 高并发场景-200行代码实现请求合并

码上尽宝 154

前言:

今天朋友们对“net高并发处理方案”大概比较关注,我们都需要知道一些“net高并发处理方案”的相关文章。那么小编同时在网摘上收集了一些有关“net高并发处理方案””的相关知识,希望同学们能喜欢,大家快快来学习一下吧!

上文在.NET 6高并发下,可以通过请求合并来减少网络请求次数,从而提高性能。 很多朋友反馈需要说明下在哪些场景会用到,还有些朋友强烈要求调通代码。

我先简单说下使用场景,把重点放在撸代码上,提高完整代码和演示结果。

在高并发系统中,我们经常遇到这样的需求:系统产生大量的请求,但是这些请求实时性要求不高。我们就可以将这些请求合并,达到一定数量我们统一提交。最大化的利用系统性IO,提升系统的吞吐性能。

所以请求合并框架需要考虑以下两个需求:

当请求收集到一定数量时提交数据一段时间后如果请求没有达到指定的数量也进行提交

目的

减少访问数据库的次数 单位时间内的多个请求,合并为一个请求。让业务逻辑层把单个查询的sql,改为批量查询的sql,减少数据库压力。

撸代码

1、定义Request.cs 类用于存储合并请求对象。

   /// <summary>    /// 请求参数    /// </summary>    public class Request    {        /// <summary>        /// 请求参数.        /// </summary>        public int Id { get; set; }        /// <summary>        /// 完成结果集.        /// </summary>        public TaskCompletionSource<string> CompletionSource { get; set; }    }

2、定义MergedRequestProvider.cs 核心合并处理类

    /// <summary>    /// 合并请求.    /// </summary>    public class MergedRequestProvider    {        /// <summary>        /// 请求队列        /// </summary>        public readonly Queue<Request> Qequests = new Queue<Request>();        private readonly Timer _timer;        public MergedRequestProvider()        {            _timer = new Timer(TimeInterval, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));        }        private void TimeInterval(object? obj)        {            List<Request> requests;            lock (Qequests)            {                requests = Qequests.ToList();                Qequests.Clear();            }            if (requests.Any())            {                var mergedRequest = MergeRequests(requests);                var response = SendMergedRequestToServerAsync(mergedRequest);                int index = 0;                foreach (var request in requests)                {                    request.CompletionSource.SetResult(response[index]);                    index++;                }            }            Console.WriteLine($"{DateTime.Now} 合并请求,共处理{requests.Count}个请求。");        }        /// <summary>        /// 请求数据库返回结果        /// </summary>        /// <param name="mergedRequest"></param>        /// <returns></returns>        /// <exception cref="NotImplementedException"></exception>        private List<string> SendMergedRequestToServerAsync(List<int> mergedRequest)        {            // 这类模拟请求查询数据            var result = new List<string>();            foreach (var item in mergedRequest)            {                result.Add($"id={item},result= Name_{item}");            }            return result;        }        /// <summary>        /// 合并请求参数        /// </summary>        /// <param name="requests"></param>        /// <returns></returns>        private List<int> MergeRequests(List<Request> requests)        {            return requests.Select(p => p.Id).ToList();        }    }

3、Program.cs DI注册MergedRequestProvider.cs

builder.Services.AddSingleton<MergedRequestProvider>();

4、测试代码Controller API

       /// <summary>        /// 合并请求,时间换空间.        /// </summary>        /// <returns></returns>        [HttpGet]        [Route("/Test/BatchQuery")]        public async Task<string> BatchQuery([FromQuery] int id)        {            var request = new Request { Id = id, CompletionSource = new TaskCompletionSource<string>() };            _mergedRequest.Qequests.Enqueue(request);            return await request.CompletionSource.Task;        }

5、运行测试,浏览器访问

运行结果

标签: #net高并发处理方案 #net高并发解决方案 #net怎么处理高并发 #net高并发处理