百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

高并发架构设计详解(图文全面总结)

mhr18 2025-03-26 14:14 45 浏览 0 评论

高并发架构设计是大型网站架构核心,也是大厂重点考察内容,下面我就全面来详解高并发架构设计@mikechen

本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。

负载均衡

负载均衡,是将用户请求分散到多台服务器,以减少单台服务器的压力,提高系统的吞吐量、和响应速度。

如下图所示:

可以将 Nginx 配置为负载均衡服务器,然后将请求转发到不同的 Tomcat 实例(比如:Tomcat1、Tomcat2、Tomcat3)。

http {
    upstream tomcat_cluster {
        # 定义三个 Tomcat 服务器的 IP 地址和端口
        server 192.168.0.101:8080;
        server 192.168.0.102:8080;
        server 192.168.0.103:8080;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://tomcat_cluster;  # 请求转发到 Tomcat 集群
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

当然,除了软件的方式,你也可以使用硬件负载均衡的方式,唯一的缺点就是:贵。

比如:专用硬件负载均衡设备(如: F5、Citrix NetScaler 等),可以配置设备将 HTTP 流量分配到 Tomcat1、Tomcat2、Tomcat3 上。

负载均衡能够有效提高并发请求的处理能力,确保系统在高并发时的稳定性。

分布式架构

为了应对大规模的并发请求,系统通常采用分布式架构,即将应用拆分成多个独立的模块、和服务。

比如:分布式架构里面,最典型的就是:微服务架构。

微服务架构

微服务架构,每个服务可以独立部署、扩展、和管理。

一旦采用微服务架构,就会涉及到:微服务拆分、微服务通信、微服务发现...等等功能。

微服务拆分

将单体应用拆分成多个微服务(如:账户服务、订单服务、库存服务),每个服务负责特定的功能模块。

这种拆分可以避免单个服务成为性能瓶颈,并且易于独立扩展。

微服务间通信

服务之间通过HTTP/REST、gRPC、消息队列等方式进行通信。

当然,你也可以采用消息队列的这种典型的“异步通信”的方式,来提升性能。

一方面,既解耦了服务,另一方面,也提升了吞吐量、和性能。

微服务发现

使用服务注册中心,(如Nacos、Eureka、Consul...等等),来实现服务的自动发现、和负载均衡,避免硬编码服务地址。

通过分布式架构,你可以更容易的扩展性能,但同样也带来了很多技术挑战,比如:分布式事务/分布式一致性...等等技术难题。

数据库优化

在高并发系统中,数据库往往是性能瓶颈,合理的数据库设计、和优化对高并发架构至关重要:

这里,很多数据量大的场景,都会涉及到:分库分表

假设有一个用户表 users,该表的记录超过亿级,为了减轻单表的读写压力,可以按照用户 ID 对其进行水平拆分。

try (Connection conn = dataSource.getConnection()) {
            String sql = "INSERT INTO users (user_id, name) VALUES (?, ?)";
            try (PreparedStatement ps = conn.prepareStatement(sql)) {
                ps.setLong(1, 1001L); // user_id 用于分库分表
                ps.setString(2, "John");
                ps.executeUpdate();
            }
        }

通常需要配合数据库中间件(如 :ShardingSphere、MyCat...等等)来实现,或者自行编写逻辑来处理。

除此之外,你也可以采用垂直拆分。

垂直拆分:是根据业务逻辑将数据库中的不同表,拆分到不同的数据库中,每个库只负责存储一部分业务数据。

假设有三个业务模块:用户管理、订单管理、和库存管理。

初始时所有表都在一个数据库中,随着数据量和并发的增加,可以将这三个模块拆分到不同的数据库。

如下所示:

  • user_db:存储用户相关的表,如: users、user_profiles 等;
  • order_db:存储订单相关的表,如 :orders、order_items 等;
  • inventory_db:存储库存相关的表,如: inventory、products 等。

NoSQL数据库

在某些场景下,使用NoSQL数据库(如:MongoDB、Cassandra...等等),可以提供更好的扩展性和读写性能。

NoSQL数据库设计初衷,就是为了应对大规模数据处理、和高并发访问,尤其是在读写性能方面具有优势。

比如:MongoDB 使用文档存储模型,数据以JSON-like的BSON格式存储,减少了复杂的表关系、和Join操作。

并且,MongoDB在存储用户生成内容(如:评论、帖子...等)。

// 插入帖子数据
            Document post = new Document("title", "MongoDB")
                    .append("content", "MongoDB allows flexible data modeling...")
                    .append("author", new Document("userId", "64eab56f9f7c1a").append("username", "mikechen"))
                    .append("createdAt", new java.util.Date())
                    .append("likes", 123)
                    .append("comments", List.of(
                            new Document("commentId", "64ea567fc2b1")
                                    .append("author", new Document("userId", "64ea67234f7b1").append("username", "mikechen"))
                                    .append("content", "Great post! I love MongoDB.")
                                    .append("createdAt", new java.util.Date()),
                            new Document("commentId", "64ea8765121b")
                                    .append("author", new Document("userId", "64eab1234f7c2").append("username", "alice"))
                                    .append("content", "Thanks for sharing!")
                                    .append("createdAt", new java.util.Date())
                    ));

处理大规模社交网络数据时表现出色,因其灵活的数据结构和快速的文档存储和检索能力。

在数据结构相对简单的场景下,读写效率远高于传统关系型数据库。

与关系型数据库相比,NoSQL数据库在数据模型上更为灵活,适用于不定结构、或者动态变化的数据。

并且,NoSQL数据库大多遵循CAP定理,在一致性、可用性和分区容错性之间做出权衡。

许多NoSQL数据库,如:Cassandra,选择牺牲强一致性,以实现更高的可用性和分区容错性。

所以,NoSQL尤其适合在对数据一致性要求不那么严格、需要处理海量数据、以及需要在多个数据中心部署的场景下使用。

分布式缓存

缓存是高并发系统中常用的优化手段,通过缓存热点数据,可以减少对数据库的访问,降低系统响应时间。

比如:Redis 、和 Memcached,是常用的分布式缓存解决方案,广泛用于处理高并发、和跨多个应用实例的场景。

Redis

适用于更多复杂场景,支持多种数据结构和持久化,具有高可用性、和强扩展性;

Memcached

更轻量级,适合简单的键值对缓存,不需要持久化的场景。

可以根据自己的业务场景,你可以选择Redis、或者Memcached,当然,目前用的最多的还是:Redis。

热门商品、首页数据...等,可以放入缓存,缓存可以极大地减少数据库的压力。

例如:可以将首页的商品列表...缓存到 Redis 中,每次首页加载时直接从缓存读取,而不必重复查询数据库。

除此之外,缓存还可以应用到:分布式会话管理、热点数据缓存、排行榜、计数器...等功能。

异步处理

在高并发场景下,某些操作不需要立即完成,适合通过异步处理来解耦、和缓解系统压力。

例如:

例如:在电商平台上进行秒杀活动时,用户同时发起大量购买请求。

通过使用消息队列,可以将所有购买请求写入队列,然后逐一处理库存更新操作,从而避免瞬时大流量压垮数据库。

public class OrderService {
    private final KafkaTemplate kafkaTemplate;

    @Autowired
    public OrderService(KafkaTemplate kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void placeOrder(Order order) {
        // 订单处理逻辑
        System.out.println("Order placed: " + order.getId());

        // 向消息队列发送消息
        kafkaTemplate.send("order_topic", order.getId());
    }
}

消息队列,通过异步处理耗时任务、缓冲流量峰值、解耦系统模块...等手段,极大提升了系统的性能、和扩展性。

本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: