问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

消息队列在分布式系统中的应用场景详解

创作时间:
作者:
@小白创作中心

消息队列在分布式系统中的应用场景详解

引用
51CTO
1.
https://blog.51cto.com/u_16213577/10965299

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削峰等问题,实现高性能、高可用、可伸缩和最终一致性架构。常见的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。

消息队列应用场景

2.1 异步处理

在用户注册场景中,需要发注册邮件和注册短信。传统做法有串行和并行两种方式:

  • 串行方式:将注册信息写入数据库成功后,依次发送注册邮件和注册短信,全部完成后返回给客户端。
  • 并行方式:将注册信息写入数据库成功后,同时发送注册邮件和注册短信,三个任务完成后返回给客户端。

引入消息队列后,可以将非核心业务逻辑异步处理。改造后的架构如下:

这样用户的响应时间仅需50毫秒(注册信息写入数据库的时间),系统的吞吐量提高到每秒20 QPS,比串行提高了3倍,比并行提高了两倍。

2.2 应用解耦

在用户下单场景中,订单系统需要通知库存系统。传统做法是订单系统直接调用库存系统接口,存在以下缺点:

  • 库存系统不可用会导致订单失败
  • 订单系统与库存系统高度耦合

引入消息队列后的方案:

  • 订单系统完成持久化处理后,将消息写入消息队列,立即返回订单下单成功
  • 库存系统订阅下单消息,采用拉/推方式获取信息并处理库存

这样即使库存系统不可用,也不影响正常下单,实现了应用解耦。

2.3 流量削峰

在秒杀或抢购活动中,为避免流量暴增导致应用崩溃,可以在应用前端加入消息队列:

  • 用户请求先写入消息队列
  • 超过最大数量时直接抛弃请求或跳转错误页面
  • 秒杀业务根据队列信息进行后续处理

2.4 日志处理

Kafka常用于日志处理场景,架构如下:

  • 日志采集客户端负责数据采集并定时写入Kafka队列
  • Kafka负责接收、存储和转发日志数据
  • 日志处理应用订阅并消费Kafka队列中的日志数据

例如新浪的Kafka日志处理案例:

  • Kafka:接收用户日志的消息队列
  • Logstash:解析日志并输出JSON给Elasticsearch
  • Elasticsearch:实时日志分析服务,兼具搜索和统计功能
  • Kibana:基于Elasticsearch的数据可视化组件

2.5 消息通讯

消息队列内置高效通信机制,可用于纯消息通讯场景:

  • 点对点通讯:客户端A和B使用同一队列进行消息通讯
  • 聊天室通讯:多个客户端订阅同一主题,实现类似聊天室效果

以上是消息队列的两种基本模式:点对点和发布订阅模式。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号