我们如果要系统的理解和认识,整个后端系统的架构领域的知识
我们应该从那些角度和维度去理解
我们对架构先有一个全景式的理解,对整个结构
我们了解一下
nginx软件,需要的服务器的配置,短时间可以派发多少html静态资源
数据处理层
gateway网关
jar包
微服务如何划分,处理
缓存层
redis
中间件
mq层
存储层:
mysql
搜索层
es
我们想一下,我们需要对这些层,以及里面部署在linux上的软件
我们需要做哪些操作和准备
能力层:
让这些可以短时间接收大量的数据
运维监控层
使用普罗米修斯监控
我们从架构的领域,知道可以对这些东西,做什么处理
如何根据业务场景去选择。
这个在架构层面,做一个系统性的梳理和选择
一、理解后端架构的四个核心维度
-
分层与治理维度(你已列出)
- 接入层:Nginx。负责请求入口、限流、SSL卸载。
- 网关层:Gateway。负责路由、认证授权、日志、熔断。
- 业务层:微服务(jar包)。承载核心逻辑,如何划分、调用、治理。
- 支撑层:缓存(Redis)、消息(MQ)、搜索(ES)。
- 存储层:MySQL(及其分库分表、读写分离)。
- 运维观测层:Prometheus(监控)、日志、链路追踪。
-
非功能性需求维度(架构的灵魂)
- 性能:延迟(Latency)与吞吐(Throughput)。例如Nginx能派发多少静态资源。
- 可用性:SLA(99.9%/99.99%)、故障转移、降级、熔断。
- 可扩展性:水平扩容(加机器)vs 垂直扩容(换更强大的机器)。
- 数据一致性:强一致(金融)vs 最终一致(社交)。这决定了MQ和缓存的用法。
-
数据流与生命周期维度(追踪一个请求)
- 用户请求
→Nginx→Gateway→业务服务(查Redis/ES)→写MQ异步处理→最终落MySQL。 - 理解每一层数据的读写比例、热度分布、持久化要求。
- 用户请求
-
运维与容量规划维度
- 如何部署(容器化/物理机)、如何扩缩容、如何应对流量尖峰(秒杀)。
- 你提到的"短时间接收大量数据"对应削峰填谷 (MQ)、缓存穿透/击穿(Redis)等技术。
二、针对你列出的各个组件:需要做的操作和准备
以一个高并发内容社区(比如知乎)为例,说明每个组件在Linux上的关键操作和准备。
| 组件 | 核心作用 | 部署前准备 (Linux) | 短时间高吞吐能力 | 关键配置/操作 |
|---|---|---|---|---|
| Nginx | 静态资源、反向代理、负载均衡 | 调整 ulimit -n (文件句柄数)、优化内核参数 (net.core.somaxconn)、使用 epoll 模型 |
QPS:3-5万/秒 (纯静态HTML)。动态请求受后端限制。 | worker_processes auto; worker_connections 10240; 开启 sendfile; 配置缓存。 |
| Gateway (如Spring Cloud Gateway) | 统一入口、鉴权、路由、限流 | JVM堆内存设置 (-Xmx)、GC算法选择 (G1GC)、CPUSet绑定 | QPS约1-3万/秒 (取决于鉴权逻辑)。瓶颈常在IO和GC。 | 配置线程池大小、使用非阻塞编程模型 (WebFlux)。 |
| 微服务 (jar包) | 业务逻辑 | 同样需JVM调优、健康检查端点、优雅停机配置 | 取决于业务复杂度。简单服务单实例QPS几千,复杂计算可能仅几百。 | 服务划分原则:高内聚低耦合,按业务能力 (如订单、用户、商品) 或 DDD限界上下文划分。避免分布式事务。 |
| Redis | 缓存、分布式锁、计数器 | 关闭THP、设置 maxmemory 和淘汰策略 (如 allkeys-lru)、禁用危险命令 (keys, flushall) |
单实例10万+/秒 (纯内存操作)。瓶颈在网卡。 | 主从+哨兵或Cluster集群。开启AOF+RDB混合持久化。 |
| MQ (如Kafka/RocketMQ) | 异步解耦、削峰填谷 | 调整磁盘类型 (NVMe SSD)、设置 文件句柄数、内存映射参数 |
Kafka单机写入可达10万+/秒 (持久化)。 | 刷盘策略 (异步)、批量发送、分区数设置。核心:削峰------把瞬间10万请求平缓成下游能处理的速率。 |
| MySQL | 持久化、事务、强一致性 | 调整 innodb_buffer_pool_size (70%内存)、innodb_log_file_size、慢查询日志开启 |
单实例写入QPS约数千 (刷盘限制)。读通过从库扩容。 | 分库分表 (ShardingSphere/Proxy)、读写分离。主从半同步复制保证不丢数据。 |
| ES | 全文检索、日志分析、聚合 | 调整 heap size (不要超32G)、禁用交换分区、bootstrap.memory_lock |
写入QPS数千至数万 (近实时)。查询延迟毫秒级。 | 索引生命周期管理、分片数规划 (1-2TB一个分片)。 |
| Prometheus | 指标监控、告警 | 本地存储采用SSD,或使用远程存储 (如Thanos/Cortex) | 单个Prometheus可处理百万级活跃时序。 | 配置服务发现 (file_sd/consul)、定义合理采集间隔、告警规则。 |
"短时间接收大量数据"的能力层 :这本质是流量治理 。不靠单个组件,而是靠全链路协同:
- Nginx 限流(漏桶/令牌桶)
- Gateway 熔断降级(Sentinel/Hystrix)
- MQ 削峰填谷(积压在队列里)
- Redis 缓存热点数据(挡住大部分读请求)
- MySQL 分库分表 + 写缓冲(如批量提交)
三、如何根据业务场景选择架构?
架构是取舍的艺术。没有最优,只有最合适。下表展示了不同业务场景的典型侧重:
| 业务场景 | 核心诉求 | 技术选型/配置重点 | 可以弱化或牺牲什么 |
|---|---|---|---|
| 电商秒杀 | 超高并发、防超卖 | - MQ 做缓冲削峰 - Redis 库存扣减 (Lua脚本) - Nginx 挡在最前限流 - 网关层快速拒绝服务 | 强一致性 (最终一致即可)、实时复杂查询 |
| 金融支付 | 强一致性、事务、审计 | - MySQL 同步复制 + 分布式事务 (Seata/TCC) - MQ 用RocketMQ的事务消息 - 少用缓存,多用数据库锁 | 绝对高吞吐 (几百TPS可以接受)、响应延迟稍高 |
| 社交Feed流 | 高写 (发帖) + 高读 (刷首页) | - 推拉结合模式 :发帖写MQ,粉丝从Redis读收件箱 - ES 用于搜索历史帖子 - CDN存储图片/视频 | 强一致性 (帖子稍晚出现可以接受)、复杂Join |
| 内容社区 (你举的例子) | 读多写少、搜索质量高 | - Redis 缓存热门文章 (提前预热) - ES 替代MySQL的LIKE查询 - Gateway 聚合多个微服务数据 (BFF模式) | 写入实时性 (刚发布的文章需几秒才可搜到) |
决策的一般流程:
- 估算量级:预期DAU、峰值QPS、数据总量 (日增/月增)。
- 明确约束:预算、团队技术栈、延迟要求 (p99 < 100ms?)、可用性 (两个9还是四个9?)。
- 识别瓶颈:是读 (加缓存/从库)、写 (分库分表/MQ)、还是计算 (异步/提前预计算)?
- 由简到繁 :单体应用 → 数据库读写分离 → 加缓存 → 拆分微服务 → 引入MQ/ES。不要过度设计。