【分布式】08 消息队列

    科技2022-08-17  160

    一、为什么要使用消息队列? 1、解决耦合

    随着需求频繁变化、功能增加。对于独立功能模块之间逐渐变成了调用关系!这种调用关系属于一种紧耦合关系。 紧耦合的缺点时不利于各模块独立演化,一个模块的变化会导致其他关联的变化。 解决方法:增加一个中间层来实现解决耦合。 对于一个模块而言只关心自己的核心流程,而依赖该模块执行结果的不是很重要的可以以通知的方式。重要的可以以事物的最终一致性、消息补偿的方式解决耦合。

    2、流量削峰

    在互联网中,某一时刻网站可能出现用户请求的高峰值的情况(双11、618、12306节假日抢票), 请求量特别大的适合可能就超过了原有系统的承载能力导致服务瘫痪、奔溃、还可能导致服务雪崩。 如果增加过多的机器成本会过高、过了特殊时期又会造成资源的浪费 使用消息队列,先将短时间的高并发请求持久化,然后逐步处理达到削平高峰期的并发流量,改善系统的性能

    3、日志收集

    日志对于开发、运维、公司都很重要,可以通过日志定位问题,追踪信息(各种用户访问信息、黑客攻击信息、产品bug等)。 系统增多、每天产生的日志就会越来越多,日志分析变得越来越重要。 引入消息队列可以避免因写入日志时的某些故障业务导致业务访问阻塞、中断、请求延迟。

    4、事物的最终一致性 (主要针对分布式事物)

    当执行的sql 语句在两个数据库中就需要考虑实现的最佳方式 例子 假如 支付宝账户 转余额宝账户 钱 (支付宝数据库和余额宝数据库) 分布式事务规范(XA ) XA主要定义了全局事物管理器(Transaction Manager) 和 局部资源管理器(Resource Manager)之间的接口。XA接口是双向的系统接口,在事务管理器之间形成通信桥梁。 => 引入 协调者 分布式事物最大缺点:性能差

    二、消息队列的功能、特点

    1、消息队列至少包含消息的发送、暂存、接受

    Producer: 生产者 负责将消息发送到消息中心、队列中 Broker: 消息处理中心 负责消息的接受、存储、转发 Consumer: 消息消费者,负责从消息中心获取消息,完成自己的业务处理。

    2、消息堆积

    由于消费者和生产者执行情况不同产生,消息积压

    解决方法: 超时丢弃(防止消费者都是拿到过时的消息)、超阀值拒绝(防止系统资源被耗尽、导致机器挂掉整个消息队列不可用)

    3、消息持久化

    做处理(保证消息不丢失、流量削峰)

    存储在内存宕机消息讲丢失

    消息保存再本地文件、分布式文件系统、数据库系统中

    4、可靠投递

    从消息的生命周期分析消息丢失发生在

    A1) 从生产者到消息处理中心

    A2) 从消息处理中心到消息消费者

    A3) 消息处理中心持久化消息

    5、消息重复(重复消费)

    为了保证消息投递保证可靠性。一般是先将消息持久化本地,然后发送给消费者。在消息上标记一个状态。当消息发送失败或者消息不知道是否发送成功时为待发送状态。通过定时任务轮训发送消息。 由于消息的的不丢失可能带来重复消费。 看具体情况做决定(银行转账、投递简历)

    6、严格有序

    有些场景需要按生产消息的顺序来消费(订单过程 提醒客户)

    7、集群

    实现高可用、负载均衡、提高消息通信的吞吐量

    Processed: 0.018, SQL: 9