zoukankan      html  css  js  c++  java
  • 目前常用的高并发处理手段

    最近看了很多高并发的解决方案,高并发并没有通用的解决方案,也不会有现成的demo或者源码可以参考,我在这方面也没有什么经验
    但是从我看到很多深度不高的文章来说,可以总结出一些可以真正落地的解决办法

    1.入口流量分发,软件硬件分发

    常见的nginx代理负载均衡,lvs虚拟ip流量分发,以及F5硬件负载均衡

    nginx负载均衡实际上是使用http代理来实现的,流量是先进入nginx服务器,然后请求后方应用服务器,应用服务器返回数据给nginx,nginx再输出给用户
    nginx负载均衡效果大部分取决于nginx服务器的性能,一般能应付一万左右并发量

    lvs 除了DR模式性能比较好之外,其他模式性能并没很大提高,其主要实现原理是修改请求报文(网络4层)中的mac地址,将请求发送到真实服务器
    lvs 与RS服务器必须在同一个网段内才能实现最好的效果,并且无法感知RS服务器是否正常访问
    通常使用lvs负载到nginx服务器,nginx服务器能获取应用的可用状态,从而实现高可用

    2.页面静态化,前端CDN缓存

    对于一些更新不是很频繁的页面,可用通过运维人员设置的定期计划任务,生成静态页面,然后提交到nginx服务器上,让nginx去处理静态请求
    前端js,css,images等资源打包,实现前后端分离,并按照hash定义为版本号,放置到cdn缓存服务器上,加快处理与响应速度,减少应用服务器负担

    3.服务切分,应用集群

    将业务拆分成多个服务,并按照服务的负载量来伸缩部署应用,负载高的就部署多一些,在特殊情况下,可用关闭一些不重要的服务来维持主要业务的处理

     

    4.消息队列,任务队列

    应对突发高并发情况,任务不能立即处理完成,此时建立消息队列,有专门的服务处理这些队列,完成后再通知应用服务器,应用服务器再返回结果给用户

     

    5.流量限制与服务降级

    在队列超过一定数量,请求量超过服务器处理能力的情况下,给用户返回 失败/预设内容/缓存信息/引导到上级页面,从而保证业务的正常运行

     

    6.应用自身缓存,分布式缓存

    对于频繁操作的数据,或者计算量大的数据,可用将数据存放到缓存中
    有些场景可以牺牲数据一致性,数据优先读写缓存,然后再由定期计划任务去更新到数据库,新浪微博的点赞就是这种解决方案

    7.数据库分表分库,读写分离

    根据业务或者数据量,将数据库拆分成多个表和多个库,按照 数据量/数据id/用户id 来将数据存储到具体的库与表中
    读取的时候从多个表和数据库里面获取数据,然后合并到一起返回

    数据库按照读写分离为主库和从库,主库主要负责数据更新写入,从库负责同步数据和读取数据,对读多写少的场景效果比较好
    从库同步是需要时间的,并不能写入后马上读取从库,解决方法目前我也想了一些,不过并不成熟

  • 相关阅读:
    高德引擎构建及持续集成技术演进之路
    Java的传值调用
    Java中真的只有值传递么?
    Centos7启动防火墙时报错Failed to start IPv4 firewall with iptables
    Redis入门(四)-Java操作Redis
    SecureCRT远程连接The remote system refused the connection问题
    [需求设计]从一个小需求感受Redis的独特魅力
    Oracle报错ORA-12516 TNS:listener could not find available handler with matching protocol stack
    编译Netty源码遇到的一些问题-缺少io.netty.util.collection包
    Linux使用alias自定义命令自定义快捷键
  • 原文地址:https://www.cnblogs.com/Gool/p/9411178.html
Copyright © 2011-2022 走看看