java高并发,如何解决,什么方式解决,高并发

java高并发,如何解决,什么方式解决,高并发,第1张

首先,为防止高并发带来的系统压力,或者高并发带来的系统处理异常,数据紊乱,可以以下几方面考虑:1、加锁,这里的加锁不是指加java的多线程的锁,是指加应用所和数据库锁,应用锁这边通常是使用redis的setnx来做,其次加数据库锁,因为代码中加了应用所,所以数据库不建议加悲观锁(排他锁),一般加乐观锁(通过设置一个seq_no来解决),这两个锁一般能解决了,最后做合理的流控,丢弃一部分请求也是必不可少的

消息服务器使用socket,为避免服务器过载,单台只允许500个socket连接,当一台不够的时候,扩充消息服务器是必然,问题来了,如何让链接在不同消息服务器上的用户可以实现消息发送呢?

要实现消息互通就必须要让这些消息服务器本身能互通,想了两个方式,一种是消息服务器之间交叉链接,另一种是增加一个特殊的消息服务器,这个消息服务器不对外开放,只负责消息转发和推送。

下列测试不考虑防火墙等。仅测试可行性和效率。

消息服务器

转发服务器

公共缓存

软件环境

client1 可向 client2 或者其他 client 发送消息,并接收其他 client 发送的消息
Redis 中保存 client 连接的信息,给每个用户分配唯一的 key ,包括链接的哪台服务器,转发服务器定时检测消息服务器,如消息服务器挂掉,由转发服务器清理掉Redis已经挂掉的所有链接。

1 Client1 给 Client2 发送一条消息
2 Socket1 接收到消息,根据 key从Redis 取出 Client2 的连接信息,连接在本机,直接推送给 Client2 ,流程结束。
3如果连接不在本机,把消息推送到转发服务器,由转发服务器把该消息推送给连接所在消息服务器,消息服务器接收消息,推送给 Client2 。

服务器上创建一个serverphp,内容如下:

上只需把ip变更一下即可。1921680201变更为1921680202

在转发服务器上建立脚本proxyphp,内容如下:

注意开启顺序

1开启转发服务器php proxyphp

2分别开启socket服务器php serverphp

可以在转发服务器上看到两个消息服务器已经连接
3开始测试,分别打开两个telnet,连接两个消息服务器,发送消息测试:
登陆

基于强大的 swoole 扩展,让php高效的实现这些成为可能,目前消息服务器到转发服务器是长连接,转发服务器到消息服务器是短连接,存在性能瓶颈,也浪费了连接资源。下一步改造成长连接,消息服务器的client使用异步。

高并发架构的难点是什么?
高并发架构最大问题主要是由于网站PV访问量大,单台服务器承载大量访问所带来的压力,所以会采用多台服务器进行分流,采用服务器集群技术,对于每个请求访问会被 发送到不同的服务器。
这样架构的难点就在管理、维护、监控、负载等等都面临很大的技术问题,同时还需要应对某些业务的突发流量,像秒杀、促销等场景化使用什么技术解决高并发?
互联网分布式架构设计,提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。
垂直扩展:提升单机处理能力。垂直扩展的方式又有两种:
(1)增强单机硬件性能,例如:增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G;
(2)提升单机架构性能,例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间;
在互联网业务发展非常迅猛的早期,如果预算不是问题,强烈建议使用“增强单机硬件性能”的方式提升系统并发能力,因为这个阶段,公司的战略往往是发展业务抢时间,而“增强单机硬件性能”往往是最快的方法。
不管是提升单机硬件性能,还是提升单机架构性能,都有一个致命的不足:单机性能总是有极限的。所以互联网分布式架构设计高并发终极解决方案还是水平扩展。
水平扩展:只要增加服务器数量,就能线性扩充系统性能。水平扩展对系统架构设计是有要求的,如何在架构各层进行可水平扩展的设计,以及互联网公司架构各层常见的水平扩展实践。
水平扩展要怎么来做?首先是软件服务拆分到不同的服务器进行部署,全部堆积在一台上性能将会受限。例如:Redis 就只是部署在独立的服务器上,其它软件都在这服务器上出现增加各个软件服务部署的服务后,采用技相关技术手段分担到各个服务器上。nginx反向代理层可以通过“DNS轮询”的方式来进行水平扩展。dns-server对于一个域名配置了多个解析ip,每次DNS解析请求来访问dns-server,会轮询返回这些ip。PHP站点层可以通过修改nginxconf实现负载均衡机制来进行水平扩展。从而设置多个web后端。服务层可以通过服务连接池来进行水平扩展;这里一部需要实现服务化,PHP像swoole tarsphp等数据库可以按照数据范围,或者数据哈希的方式来进行水平扩展;那高并发架构是什么样的?
常见互联网分布式架构如上,分为:
(1)客户端层:典型调用方是浏览器browser或者手机应用APP
(2)反向代理层:系统入口,反向代理
(3)站点应用层:实现核心应用逻辑,返回html或者json数据
(4)服务层:服务化,例如像Swoole
(5)数据-缓存层:缓存加速访问存储
(6)数据-数据库层:数据库固化数据存储

首先要结合具体的业务场景,不根据业务就云设计就是在耍流氓。

业务场景

首先你要确定你所架构的系统服务于什么业务。假如我们现在是一个小创业公司,注册用户就20万,每天活跃用户就1万,每天单表数据量就1000,然后高峰期每秒钟并发请求最多就10。但是你要考虑到后面注册用户数达到了2000万!每天活跃用户数100万!每天单表新增数据量达到50万条!高峰期每秒请求量达到1万。

静态资源

大宽带、CDN、缓存(页面缓存、对象缓存),WEB服务器缓存等N级分布式缓存,Redis、Memcached缓存集群。

动态资源

计算:多组服务器,负载均衡等技术控制流量。

存储:存储这里就比较麻烦,按照KV存储简单的资源,然后在计算部分进行整合。真的没办法做KV的,采用跨库索引来做。单机存储数量要合理,不能太多。还有就是事务性的问题,解决方案就是BASE思想或者采用日志方式。

纵向拆分、水平扩展

系统按照模块功能纵向拆分,再水平扩展,抽象服务层利用各种中间件完善,优化JVM应用服务器。

消息中间件

用mq解决稳定性。将耗时比较长或者耗费资源的请求排队,异步处理,减轻服务器压力增加稳定性

数据库

关系型、非关系型数据库上最牛比SSD硬盘,分库分表,读写分离,读的流量多时还要增加从库提高IO性能。每秒1万请求到5台数据库上,每台数据库就承载每秒2000的请求,相应的压力也就会减少。

SQL语句避免跨表查询,优化好存储过程,此时注意存储过程利用好了是把利剑,利用不好就成为了累赘。

负载均衡

负载均衡由多种实现方式,一种是在硬件上的,常用软件由F5、NetScaler、Radware和Array等商用的,但是价格较昂贵。另外一种就是软件的,常见的软件有LVS、Nginx、Apache等,它们是基于Linux系统并且开源的负载均衡策略。

简单架构图

结语

系统架构中需要注意的点太多,具体业务也不尽相同。实现方案也有多种,此处只提供一个思路。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/12966796.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存