从业务读写流程出发,理解各种分布式系统组件的意义

从业务读写流程出发,理解各种分布式系统组件的意义

根本原理:一种组件解决的是一种场景下如何快速读/写后立刻返回,但是同时保证读/写数据的安全(特别是写),安全是指不丢数据,数据与其他节点和组件正确及时同步,通常满足最终一致性。

说明:本节不单独阐述 MySQL,因为各类分布式/高并发组件正是为了弥补单一 MySQL 在高可用、弹性扩展与性能方面的不足。每个组件均应结合 MySQL 的协同配合与互补作用进行描述。

Redis 的应用场景与优势及与 MySQL 的协作

在高并发场景下,例如需要高速响应的登录、查询用户会话、排行榜、热点数据缓存,若直接访问 MySQL,延迟高且主库压力大,并发下易出现瓶颈和数据不一致风险。
引入 Redis(常做 MySQL 的缓存/会话层)后:

  • a)用户请求可直接命中内存缓存(Redis),微秒级返回,大幅提升响应速度,减少 MySQL 访问压力。
  • b)数据支持持久化(RDB/AOF),异常时可恢复数据,保障安全;部分关键数据仍定期同步至 MySQL 保证最终一致。
  • c)主从复制+集群模式让缓存数据多节点分摊压力,即便部分节点宕机,数据库(MySQL)仍可兜底读写。

举例

  • 高频访问的登录态/会话缓存数据先放 Redis,真实数据定期刷新入 MySQL。
  • 实时榜单/计数先计入缓存,异步同步到后端 MySQL 持久数据库。

Mermaid 图:

graph LR User[用户请求] Redis[Redis 高速缓存] MySQL[MySQL 数据库] User -->|查询/请求| Redis Redis -- 查询命中 --> User Redis -- 缓存未命中/失效 --> MySQL MySQL -- 结果返回缓存 --> Redis Redis -- 定期/异步写入 --> MySQL

磁盘队列(如 Go diskqueue、NSQ diskqueue、DiskQueue-CPP、Chronicle Queue 等)的价值及与下游 Kafka 的协作

对于高并发场景下的日志、埋点、订单等数据写入,直连下游 Kafka 虽然吞吐高,但如果网络抖动或 Kafka 集群不稳定,极容易导致消息丢失或调用阻塞。
此时,采用语言层本地磁盘队列(如 Go diskqueue、NSQ diskqueue、DiskQueue-CPP、Chronicle Queue 等)作为“前置缓冲”,显著提升系统可靠性和业务弹性:

  • a)上游业务首先将消息高效写入本地磁盘队列(顺序 IO,超快落盘),即使服务重启也不丢失消息,隔离了 Kafka 的实时状态波动。
  • b)独立的消费进程/线程持续异步拉取本地磁盘队列数据,并推送至下游 Kafka,可实现批量和速率控制。
  • c)当 Kafka 出现压力、网络不畅或短暂不可用时,消息仍安全留存在本地队列,等恢复后自动继续投递,不阻塞主业务、不丢数。
  • d)磁盘队列的消费进度可持久化,防止重复投递或消息丢失,保障端到端的数据可靠传输。

举例

  • 埋点数据、订单事件等大量消息,先进入 Go diskqueue 等本地磁盘队列,由守护进程稳定推送到 Kafka 日志链路,实现高峰削峰与抗抖动,系统稳定性大幅提升。

Mermaid 图:

graph LR App[上游业务/应用] DiskQ[本地磁盘队列] Consumer[消费者线程/进程] Kafka[Kafka 集群] App -->|高并发写入| DiskQ DiskQ -- 异步拉取 --> Consumer Consumer -->|批量推送| Kafka Kafka -- 状态波动时 --> DiskQ subgraph 本地可靠缓冲 DiskQ end

RabbitMQ 和 Kafka 什么关系?都是消息队列吗?各自如何和 MySQL 协作?

RabbitMQ 和 Kafka 都属于消息队列系统,核心都是用来实现异步解耦、削峰填谷,把生产者与消费者分离。但它们的定位和应用重点有所不同:

RabbitMQ 与 Kafka 的关系与区别

  • RabbitMQ
    • 基于 AMQP 协议,强调消息“可靠投递”“灵活路由”,常用于任务队列、事务事件通知、支付订单等场景。
    • 支持复杂交换机(直连、广播、主题等),适合要求事务性、可靠性和实时性兼顾的业务系统。
    • 消息投递强调实时、去重、防止丢失。
  • Kafka
    • 最初为大数据日志流设计,更关注“高吞吐”“批量日志”“顺序持久化”“水平扩展”。
    • 消费者自己管理 offset,可重放历史消息,天然适合大数据采集/分析、实时 ETL、监控等场景。
    • 路由机制简单,但可以支撑大规模数据流。

两者关系:都属于“消息队列”范畴,都是分布式系统的基础解耦中间件,但 RabbitMQ 偏向通用可靠队列、微服务事件链路;Kafka 偏向大数据流管道与日志持久化传输。部分企业会混用两者满足不同侧重业务。

Mermaid 图:

graph TD Producer[消息生产者] RabbitMQ[RabbitMQ] Kafka[Kafka] ConsumerA[消费方A(服务/任务)] ConsumerB[消费方B(日志/分析)] Producer --> RabbitMQ Producer --> Kafka RabbitMQ --> ConsumerA Kafka --> ConsumerB

RabbitMQ/Kafka 与 MySQL 的协作方式

RabbitMQ + MySQL

  • 通常用于业务数据落库保障与异步分发
    • 生产端写业务数据到 MySQL,并投递消息到 RabbitMQ,RabbitMQ 保证消息可靠分发给其他服务(如发短信、扣减库存等),防止单点 MySQL 同步调用拥塞。
    • 消费者从 RabbitMQ 拉取消息后处理事件,同时需要有“消费幂等性”,消费结果可写回 MySQL。
    • 常用于下单、支付、业务事件等需要高速、可靠多方通知且最终一致的场合。

Kafka + MySQL

  • 通常用于高并发日志/事件流入库
    • 大量事件/日志数据产生产生后写入 Kafka,Kafka 起到缓冲削峰和异步解耦作用。
    • 后台数据服务启动独立消费程序批量拉取数据,从 Kafka 消费并写入 MySQL(可以合并写,提升写入吞吐量)。
    • 如果写入 MySQL 失败,还可以根据 Kafka offset 重复消费、补偿数据,保证落库可靠性与最终一致性。
    • 应用于埋点上报、订单流水、大数据采集等。

Mermaid 图:RabbitMQ+MySQL 场景

sequenceDiagram participant Client as 生产者 participant MySQL as MySQL participant RabbitMQ as RabbitMQ participant Service as 其他服务/消费者 Client->>MySQL: 写业务数据 Client->>RabbitMQ: 投递消息 RabbitMQ->>Service: 分发可靠事件 Service-->>MySQL: 消费结果写回(可选)

Mermaid 图:Kafka+MySQL 场景

sequenceDiagram participant Producer as 事件/日志生产者 participant Kafka as Kafka participant Backend as 后台消费程序 participant MySQL as MySQL Producer->>Kafka: 写入高并发日志/事件 Backend->>Kafka: 批量拉取消息 Backend->>MySQL: 合并批量写入 Kafka-->>Backend: 支持offset重试

举例说明

  • 用户下单时,先把订单信息写入 MySQL,再发消息到 RabbitMQ,库存/通知/分析等多系统并行消费,避免同步调用。
  • 业务埋点、日志、订单变更等实时高并发数据先写 Kafka,后台异步批量落地 MySQL,若 MySQL 拥塞或中断可自动补偿。

总结

  • RabbitMQ 和 Kafka 都是消息队列,RabbitMQ 偏事件和“可靠投递”,Kafka 偏大数据“高吞吐流式处理”;
  • 它们都支持与 MySQL 的协作:RabbitMQ 用于业务事件分发同步 MySQL 状态,Kafka 用于大流量数据异步批量写入 MySQL,实现高性能与可靠性并存。

ClickHouse 的性能与安全提升及与 MySQL 的协作

复杂分析和 OLAP 场景下,ClickHouse 作为 MySQL 的数仓分析扩展:

  • a)MySQL 适合高频事务写入,定期将热点业务数据同步到 ClickHouse(列式分析),实现大宽表/复杂聚合分析。
  • b)ClickHouse 支持分布式、批量异步写入,不影响 MySQL 在线业务库性能。
  • c)MySQL 负责业务实时数据,ClickHouse 负责大数据量的实时/历史报表聚合。

举例

  • 电商业务流水实时写入 MySQL,夜间 ETL 或实时导入 ClickHouse,供大屏报表或复杂分析查询调用。

Mermaid 图:

graph TD MySQL[MySQL 业务数据库] -- 定期同步/ETL --> ClickHouse[ClickHouse] ClickHouse -- 聚合分析查询 --> BI[报表/BI应用] MySQL -- 实时写入 --> MySQL

ElasticSearch 的场景与关键价值及与 MySQL 的协作

针对全文检索、复杂多条件查询,用 ElasticSearch 做 MySQL 的高效搜索/分析“加速器”:

  • a)业务主数据落地 MySQL,写入后通过同步/异步机制实时或定时同步至 ElasticSearch 建立倒排索引。
  • b)查询请求先命中 ElasticSearch(高并发、复杂搜索),命中后可回查 MySQL 获得精准/实时业务数据。
  • c)ElasticSearch 自动分片/副本,故障时可回退至 MySQL 源库。

举例

  • 商品/日志检索先查 ElasticSearch,命中后取 ID 去 MySQL 查详情,兼顾搜索体验与数据一致性。

Mermaid 图:

graph LR User[用户查询请求] ES[ElasticSearch] MySQL[MySQL 业务库] User --> ES ES -- 命中 --> User ES -- 查详情 --> MySQL MySQL -- 业务数据回查 --> User MySQL -- 实时/定时同步 --> ES

etcd / Consul 等分布式一致性 KV 存储的应用场景

在分布式系统中,像 etcd、Consul 这样的强一致性 KV 存储广泛用于全局配置管理、服务注册与发现、分布式锁等场景,能满足极高的一致性和低延迟需求。这类系统一般不与 MySQL 做数据归档,业务实时状态全部由 KV 存储保障,只有在极少数追溯需求下相关操作日志可能单独存入 MySQL,但并非业界常规实践。

  • a)核心业务状态、注册信息、分布式锁等全部通过 etcd/Consul 实时维护,保证一致性与高可用。
  • b)通常不与 MySQL 集成归档,MySQL 主要作为业务数据和历史记录的数据库,实时配置和锁状态不会同步落在数据库中。
  • c)etcd/Consul 支持自动容错和故障恢复,无需依赖传统关系型数据库的持久化。

举例

  • 分布式锁和服务发现全由 etcd 实时管理,无需同步至 MySQL,真正支撑大规模分布式系统配置与协调。

Mermaid 图:

graph TD Service1[业务服务1] -- 配置/注册/锁定 --> etcd Service2[业务服务2] -- 配置/注册/锁定 --> etcd etcd -- 实时状态同步 --> Service1 etcd -- 故障容错/恢复 --> Service2

对象存储(Minio/S3/Ceph 等)在文件读写中的作用及与 MySQL 的协作

面对大体量文件,传统 MySQL 仅存文件元数据或指针:

  • a)文件本体写对象存储,实现高并发上传/下载,MySQL 只存文件索引、路径等元数据。
  • b)对象存储实现副本、自动修复,MySQL 实际不存文件二进制,降低存储与运维压力。
  • c)“写前校验”/“落盘通知”等信息通过 MySQL 保证业务一致性,超大文件由对象存储保证可靠归档。

举例

  • 用户上传图片或视频,实际文件上传对象存储,MySQL 记录文件路径及业务关系,实现跨组件协同读写。

Mermaid 图:

graph LR User[用户上传/下载] OSS_Storage["对象存储(Minio/S3/Ceph)"] MySQLDB[MySQL文件元数据库] User -- 上传/下载 --> OSS_Storage OSS_Storage -- 文件索引/状态通知 --> MySQLDB User -- 文件业务操作 --> MySQLDB MySQLDB -- 元数据(路径/关系) --> User

结论

如果允许读/写慢,随便来。需要读/写又快,又安全,就是这些组件被创造出来的原因。


posted @ 2025-12-15 14:54  ffl  阅读(1)  评论(0)    收藏  举报