baby sword‘s blog baby sword‘s blog
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)

zhengjian

不敢承担失去的风险,是不可能抓住梦想的
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)
  • 消息队列

    • 消息队列的特性
      • 异步
      • 削峰
      • 解耦
    • 消息队列存在的问题
    • MQ与kafka有什么区别
    • 消息投递语义
  • kafka

  • zookeeper

  • rocketMq

  • 中间件
  • 消息队列
xugaoyi
2023-01-02
目录

消息队列的特性

# 异步

当一个接口调用的逻辑链路过程,可能会导致一个接口的RT(Response Time)时间过长,这样的话对用户方面肯定是不友好的。

这时候我们就可以使用异步的方式,将接口中业务逻辑没有相互依赖的模块异步进行处理,这样速度肯定就会加快,如图

img

解决方案,使用线程池。

优点:简单,使用线程池,将一些业务放在一个线程中

缺点:你一个订单流程,你扣积分,扣优惠券,发短信,扣库存。。。等等这么多业务要调用这么多的接口,每次加一个你要调用一个接口然后还要重新发布系统,写一次两次还好。而且写在一起的话,会使多个业务耦合在一起,难以维护。另外这里使用线程池就必须保证这几个服务写在一个机器节点里,在高并发的情况下肯定是不行的。

解决方案:

使用消息队列,将非核心业务逻辑放到消息队列中,让处理对应逻辑的机器订阅这个消息队列,老结点支付成功后,新的结点就可以从消息队列中拉取信息进行消费。

问题:其他非核心业务逻辑是否成功,主节点无法感知,否则会对时间造成影响(结点成功后返回ack,速度太慢)。

解决需要依靠分布式事务

# 削峰

就拿我上一期写的秒杀来说(暗示新同学看我上一期),你平时流量很低,但是你要做秒杀活动00 :00的时候流量疯狂怼进来,你的服务器,Redis,MySQL各自的承受能力都不一样,你直接全部流量照单全收肯定有问题啊,直接就打挂了

解决方法

简单,把请求放到队列里面,然后至于每秒消费多少请求,就看自己的服务器处理能力,你能处理5000QPS你就消费这么多,可能会比正常的慢一点,但是不至于打挂服务器,等流量高峰下去了,你的服务也就没压力了。

使用消息队列的缺点:

增加系统复杂性:重复消费、消息丢失、消息的顺序消费

数据一致性:就那上面的下单问题来讲,下单的业务成功了,但是后面异步的调用万一失败了呢,那不就导致数据不一致了吗(本来该要么全部成功要么全部失败)。所以又需要分布式事务

额外需要保证消息队列的可用性

根据业务和消息队列选择合适的消息队列

img

现在公司都非常看重吞吐量。

重点看kafka

# 解耦

这个很容易理解,就是使不同的业务处理进行了解耦

编辑 (opens new window)
上次更新: 2024/02/22, 14:03:19
消息队列存在的问题

消息队列存在的问题→

最近更新
01
spark基础
02-22
02
mysql读写分离和分库分表
02-22
03
数据库迁移
02-22
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式