.Net高并发解决思路

转自:

本文如有不对之处,欢迎各位拍砖扶正。另源码在文章最下面,大家下载过后先还原一下nuget包,需要改一下redis的配置,rabbitmq的配置以及Ef的连接字符串。另外使用的是CodeFirst,先update-database生成数据库后再进行操作

高并发

高并发一直是网站上线后会遇到的一个严峻的考验,渡过了一切都好,渡不过就是宕机。

在电商时代如此发达的今天,高并发无此不在双十一 、618、双十二,还有雷猴王的某米手机抢购。首先我们要分析高并发究竟会给我们开发者带来什么样的挑战

大量的请求,如果仅仅只有一台服务器肯定是吃不消的,通常一些公司都是一台服务器上部署了很多个网站也充当了数据库服务器、redis服务器。如果要应用高并发没有足够的硬件支持是不行的。我们需要进行 分布式集群 以及 负载均衡

硬件支持有了过后,我们就需要下一步的分析

这时我们还需要提高网站的吞吐量,怎么提高呢?首先我们需要针对IO密集型异步化操作,抢单的页面不只是有抢单按钮,还有商品的介绍,图片,文字描述等。对于这些数据我们要进行缓存,一万个用户一万次请求都从数据库中取数据与只取一次剩下9999次从缓存中取效率自然是不一样的

上面说的都是为了解决一个  字,而并发才是我们真正需要准备的,假如两个用户同时请求,这时库存还有1,程序里先判断库存是不是1,现在都符合条件,然后进行生成订单等操作。就发生了资源共享的问题,明明只有一个订单,但是两个用户都完成了订单,那么这个商品应该给谁呢?

并发

假设现在是一个电商网站,今天要举办活动,有10个商品低价销售,但是会来抢购的人会特别多,最后只有十个人可以成功的买到商品

假设的逻辑,我们用户进行了请求,我们把他们的信息放到库里,但是只有前十个人是可以购买商品的,因为库存只有10个

也许我们可以用锁来解决并发的问题,但是锁无疑带来的是效率的低下,用户体验也极低。我们想要的是快速返回,但是后面那一堆的逻辑怎么办呢?我们可以使用RabbitMq队列,用户的请求到达了抢单接口,我们只向队列中丢一条数据后就立即返回

这时又来了一个问题,会有同一个用户多次进行请求的情况,如果像之前的逻辑,前10条信息有二条是属于一个人的呢,(这里假设每个人只可以购买一次)我们就需要进行判断了,同一个账户发送的多次请求,我们只认为第一次请求是有效的,剩下的都请都直接返回。因为是并发,我们又怎么做到第一次请求有效呢?这时我们可以使用Redis incr存储用户的标识,Redis是单线程的,不存在并发的问题。incr返回为1那么是第一次请求,为N则是第N请求那么它就是无效的。这是请求标识

请求标识我们可以在抢单接口就进行判断,也就是先拿用户的标识去Incr,返回为1则丢到队列,不为1则不丢到队列。

也可以在rabbitmq的消费端进行处理,从rabbitmq消息队列中拿到用户信息后,进行incr。再进行下一步操作

丢到了消息队列中,我们还需要去处理,consumer我们肯定是要有多个的,我们可以使用平分分发手动交付。在这里我们把用户的信息进行入库,当然入库后我们再向Redis中存入一条入库标识

上面都是在后端,客户端这里点击了抢单按钮后可以立即导向排队界面(是不是很熟悉,某米。。。)在这个界面进行轮询五秒一次,判断当前用户在库中的位置,如果是前十,那么就进行订单操作,不是。。。那就再等,看看会不会有其他用户放弃购买资格。

其实讲到这里,已经差不多了,成功的把并行变成了串行。剩下的就是业务处理,怎么做都可以。其实对于并发还可以有其它的处理方式,比如乐观锁也可以有效的控制并发,可以看我的相关文章,其中就有关于乐观锁的实现

原文地址:https://www.cnblogs.com/sheseido/p/11243323.html

时间: 2024-10-01 10:39:37

.Net高并发解决思路的相关文章

Java多线程与高并发:高并发解决思路

Java多线程与高并发:高并发解决思路 小玲子之凌空蹈虚关注 122018.11.21 09:55:30字数 1,553阅读 4,228 來源:http://www.wangtianyi.top/blog/2018/05/11/javaduo-xian-cheng-yu-gao-bing-fa-liu-gao-bing-fa-jie-jue-si-lu/ 缓存并发 image.png 当大量请求访问同一个没有被缓存的数据的时候,会发送大量请求给数据库,导致数据库压力过大,还会导致一致性问题,所以

JAVA高性能高并发解决思路

1.代码质量,不要性能低下的sql和代码.有的一条sql搞定的事,有人用了多个循环才能搞定.取决于程序员的经验!2.项目前期的规划,由于java历史多用于企业开发,导致好多团队至今依然思想僵化.其实并发最高的是互联网,他们有很多非常好的实践经验和架构是可以直接照搬过来用的.tomcat的并发取决于每个请求执行的占用时常,如果一个请求耗时1秒,那按tomcat开启的线程数默认就几十个.江湖谣传tomcat并发400/秒左右,但是我又看到有的人说单机过万/秒,其实就是测试场景中请求执行时间不同,结果

每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享

本文来源于caoz梦呓公众号高并发专辑,以图形化.松耦合的方式,对互联网高并发问题做了详细解读与分析,"技术在短期内被高估,而在长期中又被低估",而不同的场景和人员成本又导致了巨头的方案可能并不适合创业公司,那么如何保证高并发问题不成为创业路上的拦路虎,是每一个全栈工程师.资深系统工程师.有理想的程序员必备的技能,希望本文助您寻找属于自己的"成金之路",发亮发光. 目录: 场景及解决方法解读 认识负载 数据跟踪 脑图.caoz大神公众号分享 参考资料 秉承知其然及其

关于php 高并发解决的一点思路

涉及抢购.秒杀.抽奖.抢票等活动时,为了避免超卖,那么库存数量是有限的,但是如果同时下单人数超过了库存数量,就会导致商品超卖问题.那么我们怎么来解决这个问题呢,我的思路如下(伪代码): sql1:查询商品库存if(库存数量 > 0){  //生成订单...  sql2:同时库存-1} 当没有并发时,上面的流程看起来是再正常不过了,假设同时两个人下单,而库存只有1个了,在sql1阶段两个人查询到的库存都是>0的,于是最终都执行了sql2,库存最后变为-1,超售了,这不是我们想要的结果吧. 解决这

数据库高并发解决方法总结

一个项目刚开始的时候是为了实现基本功能,随着版本和功能的迭代,大数据和高并发成了软件设计必须考虑的问题! 本质很简单,一个是慢,一个是等. 两者是相互关联的,因为慢,所以要等,因为等,所以慢,解决了慢,也就解决了等,解决了等,也就解决了慢. 关键是如何解决慢和等,核心一个是短,一个是少,一个是分流,最后一个是集群/横向扩张/读写分离/建立主从. 短是指路径要短: 典型的mvc结构是请求->controller->model->dao->view,然后把页面返回给用户.要想短的话,

磁盘I/O很高的解决思路

介绍 磁盘IO突然很高是运维人员经常碰到的问题,这是由于有大量的磁盘读和写造成的,通常发生在数据库身上,然而发生的场景各种各样.本文举几个例子阐述解决思路. 正文 找到是什么程序在大量的进行读写操作.可以通过监控软件(如zabbix)或工具(如atop)查看磁盘IO的历史记录. 本文假设场景发生在xen虚拟机上,在母机上用iostat查看IO状态 # iostat -xdk 2 输出如下: Device:         rrqm/s   wrqm/s     r/s     w/s    rk

(整理三)高并发架构思路,附十万定时任务执行解决方案

一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求. 高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等. 响应时间:系统对请求做出响应的时间.例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间. 吞吐量:单位时间内处理的请求数量. QPS:每秒响应

SSM(Spring+SpringMVC+MyBatis)高并发优化思路

SSM(Spring+SpringMVC+MyBatis)框架集由Spring.MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容).常作为数据源较简单的web项目的框架. 学习课程的地址:https://www.imooc.com/learn/632 老师的GitHub地址:https://github.com/geekyijun/seckill 高并发发生在哪里?分析整个系统流程,用户进行秒杀时最感兴趣的进入详情页进行秒杀.图中红色表示可能会出现高并发的点,绿色

高并发解决套路

  高并发访问的核心原则其实就一句话"把所有的用户访问请求都尽量往前推". 如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不能让他们的请求一下打到我们的指挥部(指挥部就是数据库及分布式存储). 如:能缓存在用户电脑本地的,就不要让他去访问CDN. 能缓存CDN服务器上的,就不要让CDN去访问源(静态服务器)了.能访问静态服务器的,就不要去访问动态服务器.以此类推:能不访问数据库和存储就一定不要去访问数据库和存储. 说起来很轻松,实际做起来却