高并发解决方案

随着移动互联网发展,用户群体日益庞大,QPS和吞吐量等出现了技术上的高并发
本次对中小型企业高并发解决方案,不对地方请大家指正
先简单介绍下所用到的技术框架
SpringCloud/SpringBoot、mybatis、mysql、redis、RabbitMQ、Kafka、mongodb、hbase、elasticsearch、sharding-jdbc、ELK、maven等
目前没有设计到分布式存储HDFS和分布式数据库Hbase,因为项目决定技术
高并发解决方法如下:
1.项目分布式:目前SpringCloud就是微服务(每个功能就是一个服务,会员服务,产品服务,订单服务,支付服务,消息服务等等),每个服务部署到两台以上Linux服务器上,当用户请求进来SpringCloud路由Zuul根据负载均衡到不同的IP的服务上(功能跟zokkeeper相同)。
SpringCloud基础地址:https://blog.csdn.net/qq_39291929/article/details/81030317

2.数据库分库分表:对于平台用户订单数据超过1000万,查询性能问题下降(当超过500万条数据数据库查询用索引效率大大下降),那么就要考虑分库分表技术,我们采用会员id,进行hash获取到整数值,然后进行去模操作,存在不同数据库不同表中,所采用的技术是sharding-jdbc(类似阿里TDDL、mycat和Cobar等插件)。
分库分表地址:https://blog.csdn.net/qq_39291929/article/details/80795221

3.数据库分布式并且读写分离:每一个模块一个数据库,比如会员和会员信息是一个数据库。订单和订单信息是一个数据库,并且对数据查询较多的表进行主存配置
(举例为什么读写分离:当线上数据量大时,线上做数据查询或者导出报表数据之类的很容易对数据库造成压力)
mysql主存复制:https://blog.csdn.net/qq_39291929/article/details/80631940

4.redis集群:因为redis是内存型数据库,读取速度高于mysql数据库,所以在项目中得到很大推广,redis存储一些可变的数据(用户登陆token,产品信息(可以设置一分钟失效,程序读取,首先从redis读取,如果没有到数据库读取并存到redis中)等等),当服务庞大时和安全性着想,我们做服务集群,方案很多,一主一从,一主多从,多主多从,主用来存和修改数据,从用来取数据。重点说下:对于不可变的数据可以存到本地缓存中。HashMap或者CocurrentHashMap或者guava cache等等技术

5.分布式消息队列服务:异步消息,使用广泛,例如:(1).买火车票接口,首先支付,然后出票。如果同步,那么用户钱支付了,出票异常(使用第三方出票平台),那么事务要回滚,那么造成用户支付了钱(支付表显示未支付),但用户也没买到票,业务上无法退款,如果使用消息队列,如果支付了钱,支付表中显示已支付,出票业务就用消息通知出票功能。如果出票异常也可以退款。
(2).订单失效,订单30分钟后关闭,就可以使用消息队列中的延迟队列。
消息服务地址(RocketMQ):https://blog.csdn.net/qq_39291929/article/details/79250506

6.非关系性数据库使用(mongodb、hbase、elasticsearchMongoDB很适合业务系统中有大量“低价值”数据的和非事务安全数据,在存储方面不像mysql存在瓶颈,而且读取效率比mysql高。例如:操作日志,爬虫数据,第三方接口数据,物流订单实时信息等等

hbase:适合大数据存储,支持数百万列,支持亿级并发,写入数据毫秒级,强大的Phoenix功能(集成mybatis进行数据增删改查)    适合支付宝钱包的账单、淘宝里的物流详情,感知不到的有支付宝的风控

Elasticsearch:实时分析的分布式搜索引擎,复杂聚合查询效率高,适合电商、招聘、门户、百度等搜索等网站的搜索服务
mongodb使用地址:https://blog.csdn.net/qq_39291929/article/details/78936810

7.线程池使用:线程池分好多种,目前说两个给大家:一个是数据库线程池,一个是HTTP线程池。为了有效利用系统资源,提高数据处理能力,线程池解决了这样的问题,例如:当一个用户请求服务端,但是接口要调用3个外部接口。如果用同步效率很慢,所以使用线程池(异步),数据执行效率明显提升。
线程池使用地址:https://blog.csdn.net/qq_39291929/article/details/81142280

8.java程序使用技巧:尽量少嵌套循环,多研究分布式锁(redis,zokkeeper)以及缓存的使用,可以加入设计模式
策略模式地址:https://blog.csdn.net/qq_39291929/article/details/80863708


9.数据库优化:
(1).当多个表之间数据有限情况下,可以使用join,多表查询。比如用户、权限、角色之类数据有限的查询
(2).当多个表之间数据查询,一定要使用单表查询,不要使用关联查询。比如:当主表有100万数据,关联10万条数据,
多表查询不但效率底下,而且后期如果做分库分表业务,维护性大
(3).对表中的关键字段加索引,提高查询效率。比如在订单表中的会员Id上加索引
(4).对数据库经常查询不是经常变化的数据,在业务层使用缓存机制(redis可以实现)。比如产品表。
(5).对表中的某些重要字段进行设置唯一索引,防止业务层并发导致插入相同数据。比如订单表中的订单号
(6).不使用Select *,只查询需要的字段
(7).开启数据库慢日志功能(可以查询出数据库那些sql查询比较慢)
数据库优化地址(有好多mysql查询高级写法):https://blog.csdn.net/qq_39291929/article/details/79169553

10.日志管理:当分布式系统后。日志分布在不同的linux服务器上,日志也比较大,如果找日志(Info或者Error)特别麻烦,不好找,那么可以使用Kafka+ELK,解决日志问题。

11.CDN:内容加速器,比如图片,文件,视频。为什么要做这个,就是因为效率高,太慢数据半天展示不了,给大家普及一下计算机知识,图片,文件都存放在硬盘上,内存读取速度比硬盘快很多。不用CDN,计算机从硬盘读取到内存中。如果为了安全性考虑可以考虑自己公司做。如果成本太高可以使用第三方平台。列如:七牛云

12.页面静态化:Html+ajax请求接口,html单独部署,目前好多公司已经用前后台分离。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值