美文网首页
106 消息中间件

106 消息中间件

作者: 滔滔逐浪 | 来源:发表于2023-06-06 11:30 被阅读0次

    项目中有使用mq的地方
    1,使用mq 异步发送优惠券
    2,使用mq异步发送短信
    3,使用mq异步扣库存
    总之比较耗时的代码操作,交给mq异步实现接口。

    为什么使用mq
    1 ,异步处理(多线程和MQ);

    1. 实现解耦
      3,流量消峰(mq可以实现抗高并发)

    MQ 与多线程实现异步的区别

    1, 多线程方式实现异步可能会消耗我们的cpu资源,可能会影响到我们的业务线程执行,会发生cpu竞争的问题。
    2,MQ 方式实现异步是完全解耦。适合于大型互联网项目;
    3, 小的项目可以使用多线程实现异步,大项目建议使用mq实现异步。

    MQ如何避免消息堆积的问题
    1,产生背景

    生产者投递消息的速率与我们消费者的速率完全不匹配
    2,生产者投递消息的速率 > 消费者的速率
    导致我们消息会堆积在我们mq服务器端中,没有及时的被消费者消费,所以就产生消息堆积的问题。
    3,注意的是: rabbitmq消费者我们的消息如果成功的话 消息会被删除,kafka 或者rocketmq 消息消费如果成功的话,消息是不会被立即删除的。
    4,解决方法
    a 提高消费者消费的速率:(对我们的消费者实现集群)
    b 消费者应该批量形式获取消息 减少网络传输的次数
    MQ宕机了消息是否会丢失呢
    不会 因为消息会持久化在我们的硬盘中;

    mq如何保证消息不丢失

    1 MQ服务器
    消息持久化到硬盘中
    2 生产者
    消息确认机制
    必须确认消息刷盘到硬盘中,才能够人为消息投递成功
    3,消费者
    必须确认消息消费成功
    rabbitmq中: 才会将消息删除
    rocketmq 或者 kafka 中,才会提交offset。
    生产者投递消息,mq宕机了如何处理
    1, 生产者投递消息会将ms消息内容记录下来,后期如果发生生产者投递消息失败;

    1. 可以根据该日志记录实现补偿机制
    2. 补偿机制(获取到该msg日志消息内容实现重试)

    MQ如何保证消息顺序一致性问题
    1 大多数的项目是不需要保证mq消息顺序一致性的问题,只有在一些特定的场景可能会需要,比如 MySQL与Redis 实现异步同步数据;
    2, 所有消息需要投递到同一个mq服务器,同一个分区模型中存放,最终被同一个消费者消费,核心原理: 设定相同的消息key,根据相同的消息key 计算hash 存放到同一个分区中。
    3, 如果保证了消息顺序一致性有可能降低我们消费者消费的速率。
    MQ 如何保证消息幂等问题;
    1 消费者获取消息,如果消费消息失败,mq服务器则会间隔的形式,实现重试策略
    2 重试过程中,需要保证业务幂等性问题,保证业务不能够重复执行
    3, 我们可以通过全局的消息id,提前查询到如果该业务逻辑已经执行过则不会在执行
    4 我们也需要在数据库的db 层面需要保证幂等性问题 唯一主键约束 乐观锁等。

    MQ 与Redis 如何保证数据一致性的问题
    方案一 直接删除redis缓存
    2 基于mq异步同步更新
    3 基于canal 订阅binlog 同步。

    相关文章

      网友评论

          本文标题:106 消息中间件

          本文链接:https://www.haomeiwen.com/subject/pmkwedtx.html