您在项目开发中的遇到的并发问题是怎么解决的

1、相关概念

并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行;在互联网时代,所讲的并发,高并发通常是指并发访问,也就是在某个时间点,有多少个访问同时到来。通常一个系统的日PV在千万以上,有可能是一个高并发的系统。有的公司完全不走技术路线,全靠机器堆,这不在讨论范围内。

  QPS:每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求);并发连接数是系统同时处理的请求数量

  吞吐量:单位时间内处理的请求数量(通常由QPS与并发数决定)

  响应时间:从请求发出到收到响应花费的时间。例如系统处理一个HTTP请求需要100ms。

  PV:综合浏览量(page view),即页面浏览量或者点击量,一个访客在24小时内访问的页面数量;同一个人浏览网站同一页面,只记作一次PV

  UV:独立访客(unique visitor),即一定时间范围内相同访客多次访问网站,只计算为一个独立访客

  带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小

  日网站带宽=PV/统计时间(换算到s)*平均页面大小(单位KB)*8;峰值一般是平均值的倍数,根据实际情况来定

  峰值每秒请求数(QPS)=(总PV数*80%)/(6小时秒数*20%);80%的访问量集中在20%的时间

  压力测试:测试能承受的最大并发,测试最大承受的QPS值

QPS达到极限:随着QPS的增长,每个阶段需要根据实际情况来进行优化,优化的方案也与硬件条件、网络带宽息息相关;QPS达到50,可以称之为小型网站,一般的服务器就可以应付;QPS达到100,假设关系型数据库的每次请求在0.01s完成,假设单页面只有一个SQL查询,那么100QPS意味着1s完成100次请求,但是此时并不能保证数据库查询能完成100次,数据库缓存层,数据库的负载均衡;QPS达到800,假设使用百兆带宽,意味着网站出口的实际带宽是8M左右,假设每个页面只有10k,在这个并发条件下,百兆带宽已经吃完,CDN加速,负载均衡;QPS达到1000,假设使用memcache缓存数据库查询数据,每个页面对memcache的请求远大于直接对db的请求,memcache的悲观并发数在2w左右,但有可能在之前内网带宽已经吃光,表现出不稳定,静态HTML缓存;QPS达到2000,这个级别下,文件系统访问锁都成为了灾难,做业务分离,分布式存储高并发解决方案案例。

高并发解决方案案例

流量优化:防盗链处理。https://blog.csdn.net/linshichen/article/details/51679074

前端优化:减少HTTP请求,合并css或js,添加异步请求,启用浏览器缓存和文件压缩,CDN加速,建立独立图片服务器,

服务端优化:页面静态化,并发处理,队列处理

数据库优化:数据库缓存,分库分表,分区操作,读写分离,负载均衡

web服务器优化:负载均衡,nginx反向代理,7,4层LVS软件

2、核心问题

并发问题核心是如何解决慢和等,核心一个是短,一个是少,一个是分流。

短是指路径要短。典型的mvc结构是请求->controller->model->dao->view,然后把页面返回给用户。要想短的话,

1)页面静态化- 用户可以直接获取页面,不用走那么多流程,比较适用于页面不频繁更新。

2)使用缓存- 第一次获取数据从数据库准提取,然后保存在缓存中,以后就可以直接从缓存提取数据。不过需要有机制维持缓存和数据库的一致性。

3)批量读取 - 高并发情况下,可以把多个请求的查询合并到一次进行,以减少数据库的访问次数

4)延迟修改 - 高并发情况下,可以把多次修改请求,先保存在缓存中,然后定时将缓存中的数据保存到数据库中,风险是可能会断电丢失缓存中的数据。

5)使用索引 - 索引可以看作是特殊的缓存,尽量使用索引就要求where字句中精确的给出索引列的值。

少是指查询的数据要少。

1)分表 - 把本来同一张表的内容,可以按照地区,类别等分成多张表,很简单的一个思路,但是要尽量避免分出来的多表关联查询。

2)分离活跃数据 - 例如登录用户业务,注册用户很多,但是活跃的登录用户很少,可以把活跃用户专门保存一张表,查询是先查询活跃表,没有的话再查总表,这也类似与缓存。

分流就是将原有的一个并发的流进行拆分

1)微服务

2)分布式

3)负载均衡

https://blog.csdn.net/qq_37788067/article/details/79250623

4)读写分离(主从复制)

核心最重点:分流

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目,使用Java编程语言可能会遇到各种问题解决这些问题的关键在于良好的编程实践和经验。 首先,Java的常见问题是NullPointerExpection,这是由于将一个空对象(null)用于引用其他对象导致的错误。为了解决这个问题开发人员应该在使用对象之前进行空值检查,并确保对象的正确初始化。 另一个常见问题是内存泄漏(Memory Leak),它会导致内存消耗过多而导致应用程序的崩溃或运行缓慢。为了解决这个问题开发人员应该注意及时释放不再使用的对象,并优化内存管理。 除此之外,线程同步也是一个常见的问题。多线程环境下,数据共享和互斥访问可能导致数据一致性问题解决这个问题的方法是使用同步关键字或锁机制来确保多个线程之间的同步访问。 在项目开发过程,还可能会遇到性能问题。为了解决这个问题开发人员可以使用性能分析工具来识别瓶颈,并进行代码优化和并发处理来提高系统的性能。 此外,代码的可维护性也是一个重要的问题。为了解决这个问题,应该遵循良好的编码规范和设计模式,并进行适当的注释和文档编写,以方便他人理解和维护代码。 总结起来,解决Java项目问题需要对编程语言和平台的深入理解,以及良好的编码实践和经验。开发人员应该注意错误处理、内存管理、线程同步、性能优化和代码可维护性等方面,以确保项目的顺利进行和成功交付。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值