专栏首页雪山飞猪消息队列小总结

消息队列小总结

一、什么是消息队列?

消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候

二、消息队列有什么用?

1. 提高响应速度

异步处理,串行化的功能变成并行化,从而提升系统性能,缩短响应时间 常用于于秒杀、发送短信通知等,需要立即返回结果

2. 流量控制

在高并发的情况,为了避免大量的请求冲击后端服务,可以使用消息队列暂存请求,后端服务按照自己的重能力,从队列中消费,例如秒杀、埋点场景。 这样可以随时增加服务的实例数量水平扩容,而不用对系统的其他部分做修改

3.系统解耦

例如一个下单的信息需要同步多个子系统,每个子系统都需要保存订单的数据的一部分,如果光靠订单服务的团队去维护所有的子系统数据同步,代价太大 解决方法是,通过发布订阅模型,订单服务在订单变化 时发送一条消息到一个主题中,所有的下游子系统都订单主题,这样可以每个子系统都可以获得一份完整的订单数据 即使是增加、减少子系统,也不会对订单服务造成任务电话号

三、消息队列有什么缺点?

  1. 同步消息改成了异步,增加了系统的调用链,增加了系统的复杂度
  2. 降低了数据一致性,如果要保持一致性,需要高代价的补偿(如分布式事务、对账)
  3. 引入了消息队列带来的延迟问题

四、常见的消息队列

RabbitMQ https://www.rabbitmq.com/

优点:轻量,迅捷,容易部署和使用,拥有灵活的路由配置 缺点:性能和吞吐量较差,由于其采用的是Erlang语言不易进行二次开发

RocketMQ http://activemq.apache.org/

优点:性能好,稳定可选,有活跃的中文社区,实时性比较好, 缺点:但是兼容性较差,但随影响力的扩大,以后会有改善

Kafka http://kafka.apache.org/

优点:拥有强大的性能及吞吐量,在大数据和流计算领域,几乎所有的相关开源软件都会优先支持kafka 缺点:当消息数量没有那么多的时候,时延会比较高

五、消息队列的两种模型

1. 点对点模型

  • 每个消息只有一个接收者(Consumer),一旦被消息,就不再在消息队列中
  • 发送者和接收者间没有依赖性,发送者发送消息后,不管有没有接收者在运行,不会影响下一次发送

2. 发布订阅模型

  • 每个消息可以有多个订阅者
  • 每个订阅者都可以接收到主题的所有消息

两种模型区别

两个模型的区别:一份消息是否能被多次消费 如果只有一个订阅者,两个模型基本一样,所以发布订阅模型在功能层面是兼容队列模型的

六、消息队列如何实现分布式事务

一个严格意义的事务实现是ACID4个属性:原子性、一致性、隔离性、持久性

  • 原子性:一个事务操作不可分割,要么全部成功,要么全部失败,不能一半成功一半失败
  • 一致性:事务执行完成之前的时间点,读到的一定是更新前的数据,之后读到的一定是更新后的数据
  • 隔离性:一个事务的执行不能被其他事务干扰(一个事务内部的操作及使用的数据对正在进行的其他事务是隔离的,并发执行的各个事务之间不能互相干扰)
  • 持久性:事务一旦提交,后续的其他操作和故障都不会对事务的结果有任何影响

在分布式系统中,光是要实现数据一致性就已经非常困难了,所以一般只保证达到最终一致性。比较常见的分布式事务实现有

  1. 2PC(Two-phase Commit)二阶段提交
  2. TCC(Try-Confirm-Cancel)
  3. 事务消息

消息队列分布式事务实现

Kafka和RocketMQ都提供了事务相关功能,下面以订单为例看下如何如何实现的

Kafka和RocketMQ都提供了事务相关功能,核心:半消息 ”半消息“:这个半消息不是指消息内容不完整,而是指在事务提交前,对于消费者来说,这个消息是不可见的(sendMessageInTransaction)

如果数据库事务提交失败怎么办

  1. 业务代码中反复重试提交,直到提交成功
  2. 删除之前创建的订单进行补偿
  3. 提供一个反查本地事务状态接口给MQ,告知成功或失败(RocketMQ支持)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • node.js的Promise对象的使用

    我们看到chenqionghe虽然是第一个执行,却是最后输出内容,因为设置了3秒后执行

    雪山飞猪
  • node.js如何批量赋值

    雪山飞猪
  • 大数据架构的简单概括

    Doug Cutting启动了一个赫赫有名的项目Hadoop,主要包括Hadoop分布式文件系统HDFS和大数据计算引擎MapReduce,分别实现了GFS和M...

    雪山飞猪
  • 流处理与消息队列------《Designing Data-Intensive Applications》读书笔记16

    在流处理之中,当输入是文件时,第一个处理步骤通常是将其解析为一连串的记录。在流处理之中,记录通常被称为事件,每个事件都是一个小的、独立的、不可变的对象,通常每个...

    HappenLee
  • 如何从0到1设计一个消息队列(Message Queue)

    说起消息队列,早期有“上古”的 ActiveMQ,如今有应用广泛的 RocketMQ、Kafka,到最近推出的 Pulsar,伴随着技术的持续发展,一代又一代的...

    用户1564362
  • 使用消息队列的 10 个理由

    过去几年中,我们一直在使用、构建和宣传消息队列,我们认为它们是很令人敬畏的,这也不是什么秘密。我们相信对任何架构或应用来说,消息队列都是一个至关重要的组件,下面...

    Java_老男孩
  • 分布式之消息队列复习精讲

    庆幸的是两位朋友都很有上进心,于是博主写这篇文章,帮助他们复习一下关于消息队列中间件这块的要点

    java思维导图
  • 让分布式消息队列不再难懂

    小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑。再不然就是和运营聊聊天,写几个SQL,生成下报表。又或者接到客...

    java思维导图
  • 分布式之消息队列复习精讲

    庆幸的是两位朋友都很有上进心,于是博主写这篇文章,帮助他们复习一下关于消息队列中间件这块的要点

    Java团长
  • 什么是消息系统?

    首先来看什么是消息系统?简单来讲就是生产者发送包含事件的消息给消息系统,然后将消息推送给消费者。消息系统有很多种,最简单的就是TCP连接这种的直接信道,之后出现...

    哒呵呵

扫码关注云+社区

领取腾讯云代金券