名词百科
什么是消息队列?
一句话定义
消息队列是用于在系统之间异步传递消息的中间件:生产者发送消息,消费者按自己的节奏处理。它解决的是解耦、削峰与异步三个问题。
它到底是什么
它的价值不在「传数据」,而在把同步调用变成异步事件。下单后要发短信、减库存、加积分,如果同步串行执行,任何一步慢都会拖住用户请求;发一条消息出去,各环节各自处理,主流程立刻返回。
代价是一致性从「强」变成「最终」:消息发出去之后,下游什么时候处理完不确定,中间状态需要业务能容忍。
怎么运作的
模型:生产者 → 队列/主题 → 消费者。点对点模式下一条消息只被一个消费者处理;发布订阅模式下多个消费者组各自收到一份。
投递保证:最多一次(可能丢)、至少一次(可能重复)、恰好一次(实现代价高)。实际项目多用至少一次 + 消费端幂等。
顺序:全局有序代价高,通常只保证同一分区或同一业务键内有序。
失败处理:消费失败重试,多次失败进入死信队列,由人工或补偿任务处理。没有死信机制的系统,异常消息会阻塞整条链路。
容易混的几个概念
- 消息队列与 RPC:前者异步解耦,后者同步调用。
- 队列与主题:前者点对点,后者发布订阅。
- 死信队列:处理失败消息的兜底通道。
- 事件驱动:以消息为纽带的一种架构风格,消息队列是其基础设施。
常见问题
什么情况下需要引入消息队列?
出现三种情况之一:主流程被非核心环节拖慢、下游系统不稳定需要隔离、流量峰值需要削平。仅为「代码好看」引入队列,会增加运维与排查难度。
消息重复消费怎么办?
消费端做幂等:用业务唯一键判断是否已处理,或用状态机限制重复流转。这是比追求「恰好一次」更现实的做法。
E 后端架构 · 同组词条
缓存缓存是把访问频繁的数据临时存放在更快的存储介质中,以减少对慢速数据源的访问。常见位置有浏览器、CDN、应用内存、Redis。微服务微服务架构是把一个应用拆成多个独立部署、独立运行的小服务,各自负责一块业务能力,通过接口或消息通信。每个服务可单独开发、发布和扩容。数据库数据库是结构化存储与管理数据的系统。MySQL 是关系型数据库,用表与行组织数据、支持事务;Redis 是键值型内存数据库,常用于缓存、计数与队列。业务中台业务中台是把多个业务线共用的能力(用户、商品、订单、支付、营销)抽取成统一服务,供各业务线调用的架构思路。它强调的是能力复用,而不是技术统一。RESTfulRESTful 是一种以资源为中心的接口设计风格,用 HTTP 方法与状态码表达操作;GraphQL 是一种查询语言,由客户端声明需要哪些字段,服务端一次返回。多租户多租户架构是一套系统同时服务多个客户(租户),各租户的数据相互隔离、配置互不影响。它是 SaaS 能把成本压低的根本原因。APIAPI(Application Programming Interface,应用程序编程接口)是系统之间约定好的调用方式:调用方按约定传入参数,服务方返回结果。它是软件之间协作的接口。高并发高并发指系统在同一时间承受大量请求的能力,通常用每秒请求数、并发连接数、响应时间来衡量。它考验的是系统在压力下的稳定性,而不是单次请求的速度。