zoukankan      html  css  js  c++  java
  • MQ 架构与细节

    MQ 架构与细节

    MQ 是什么?

    MQ:MessageQueue,消息队列的简称,用于进程间通信或同一进程的不同线程间的通信方式。

    什么时候该使用MQ?

    1. 数据驱动的任务依赖
    2. 上游不关心执行结果
    3. 上游关心执行结果,但执行时间很长

    MQ 是架构中常见的解耦利器:实时关注结果的用 RPC,任务依赖、上游不关心执行结果,异步执行结果返回时间很长,通常可以使用 MQ

    MQ 如何做到,消息必达?

    1. 消息落地
    2. 超时,重传,确认

    MQ 核心架构

    MQ 消息可靠投递

    消息重传可能导致收到重复的消息!

    必须要保证消息幂等!

    MQ 如何做到,消息幂等?

    什么是幂等性?

    使用同样的条件,一次请求和重复多次请求对系统资源的影响是一致的。

    对技术方案的启示是: 分布式系统设计中,设计必须考虑,底层重试时(并不一定是应用层发起的,有时候是TCP 层,有时候是链接池层,有时候是框架层,这些重试,并不是应用层能够控制的),系统不会异常,数据不会不一致。

    MQ 消息可靠投递,会不会有幂等性问题?

    上半场幂等的关键:inner-msg-id

    核心是消息去重

    下半场幂等的关键:unique-biz-id

    业务方通过全局唯一的业务 id 去自行保证

    业务幂等性,需要 MQ 和消息接收方配合完成!

    MQ 如何做到,削峰填谷?

    缓冲流量:将 MQ-server 给下游推送消息,升级为由下游主动去拉取 MQ-Server 里面的消息

    MQ 如何做到,消息延时?

    消息延时的业务场景

    场景:在一段时间之后,完成一个工作任务

    核心数据结构:

    1. 环形队列 queue
    2. 任务集合 Set
  • 相关阅读:
    从句分析
    artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 11 盛最多水的容器
    Java实现 LeetCode 11 盛最多水的容器
  • 原文地址:https://www.cnblogs.com/ice-image/p/14550603.html
Copyright © 2011-2022 走看看