消息队列高手课
李玥
京东零售技术架构部资深架构师
立即订阅
8426 人已学习
课程目录
已完结 41 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | 优秀的程序员,你的技术栈中不能只有“增删改查”
免费
预习 | 怎样更好地学习这门课?
基础篇 (8讲)
01 | 为什么需要消息队列?
02 | 该如何选择消息队列?
03 | 消息模型:主题和队列有什么区别?
04 | 如何利用事务消息实现分布式事务?
05 | 如何确保消息不会丢失?
06 | 如何处理消费过程中的重复消息?
07 | 消息积压了该如何处理?
08 | 答疑解惑(一) : 网关如何接收服务端的秒杀结果?
进阶篇 (21讲)
09 | 学习开源代码该如何入手?
10 | 如何使用异步设计提升系统性能?
11 | 如何实现高性能的异步网络传输?
12 | 序列化与反序列化:如何通过网络传输结构化的数据?
13 | 传输协议:应用程序之间对话的语言
14 | 内存管理:如何避免内存溢出和频繁的垃圾回收?
加餐 | JMQ的Broker是如何异步处理消息的?
15 | Kafka如何实现高性能IO?
16 | 缓存策略:如何使用缓存来减少磁盘IO?
17 | 如何正确使用锁保护共享数据,协调异步线程?
18 | 如何用硬件同步原语(CAS)替代锁?
19 | 数据压缩:时间换空间的游戏
20 | RocketMQ Producer源码分析:消息生产的实现过程
21 | Kafka Consumer源码分析:消息消费的实现过程
22 | Kafka和RocketMQ的消息复制实现的差异点在哪?
23 | RocketMQ客户端如何在集群中找到正确的节点?
24 | Kafka的协调服务ZooKeeper:实现分布式系统的“瑞士军刀”
25 | RocketMQ与Kafka中如何实现事务?
26 | MQTT协议:如何支持海量的在线IoT设备?
27 | Pulsar的存储计算分离设计:全新的消息队列设计思路
28 | 答疑解惑(二):我的100元哪儿去了?
案例篇 (7讲)
29 | 流计算与消息(一):通过Flink理解流计算的原理
30 | 流计算与消息(二):在流计算中使用Kafka链接计算任务
31 | 动手实现一个简单的RPC框架(一):原理和程序的结构
32 | 动手实现一个简单的RPC框架(二):通信与序列化
33 | 动手实现一个简单的RPC框架(三):客户端
34 | 动手实现一个简单的RPC框架(四):服务端
35 | 答疑解惑(三):主流消息队列都是如何存储消息的?
测试篇 (2讲)
期中测试丨10个消息队列热点问题自测
免费
期末测试 | 消息队列100分试卷等你来挑战!
结束语 (1讲)
结束语 | 程序员如何构建知识体系?
消息队列高手课
登录|注册

02 | 该如何选择消息队列?

李玥 2019-07-25
你好,我是李玥。这节课我们来聊一下几个比较常见的开源的消息队列中间件。如果你正在做消息队列技术选型,不知道该选择哪款消息队列,你一定要先听一下这节课的内容。
作为一个程序员,相信你一定听过“没有银弹”这个说法,这里面的银弹是指能轻松杀死狼人、用白银做的子弹,什么意思呢?我对这句话的理解是说,在软件工程中,不存在像“银弹”这样可以解决一切问题的设计、架构或软件,每一个软件系统,它都是独一无二的,你不可能用一套方法去解决所有的问题。
在消息队列的技术选型这个问题上,也是同样的道理。并不存在说,哪个消息队列就是“最好的”。常用的这几个消息队列,每一个产品都有自己的优势和劣势,你需要根据现有系统的情况,选择最适合你的那款产品。

选择消息队列产品的基本标准

虽然这些消息队列产品在功能和特性方面各有优劣,但我们在选择的时候要有一个最低标准,保证入选的产品至少是及格的。
接下来我们先说一下这及格的标准是什么样的。
首先,必须是开源的产品,这个非常重要。开源意味着,如果有一天你使用的消息队列遇到了一个影响你系统业务的 Bug,你至少还有机会通过修改源代码来迅速修复或规避这个 Bug,解决你的系统火烧眉毛的问题,而不是束手无策地等待开发者不一定什么时候发布的下一个版本来解决。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《消息队列高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(107)

  • null
    仔细阅读了三遍,每一字都是精华
    选择中间件的考量维度:可靠性,性能,功能,可运维行,可拓展性,是否开源及社区活跃度
    rabbitmq:
    优点:轻量,迅捷,容易部署和使用,拥有灵活的路由配置
    缺点:性能和吞吐量较差,不易进行二次开发
    rocketmq:
    优点:性能好,稳定可靠,有活跃的中文社区,特点响应快
    缺点:兼容性较差,但随意影响力的扩大,该问题会有改善
    kafka:
    优点:拥有强大的性能及吞吐量,兼容性很好
    缺点:由于“攒一波再处理”导致延迟比较高
    pulsar:
    采用存储和计算分离的设计,是消息队里产品中黑马,值得持续关注
    2019-07-25
    4
    85
  • WL
    请问一下老师rocketMQ是怎么做到低延时的?

    作者回复: 主要是设计上的选择问题,Kafka中到处都是“批量和异步”设计,它更关注的是整体的吞吐量,而RocketMQ的设计选择更多的是尽量及时处理请求。

    比如发消息,同样是用户调用了send()方法,RockMQ它会直接把这个消息发出去,而Kafka会把这个消息放到本地缓存里面,然后择机异步批量发送。

    所以,RocketMQ它的时延更小一些,而Kafka的吞吐量更高。

    2019-07-25
    2
    22
  • leslie
    一套架构中是否可能存在多套中间件?在线的生产业务使用rockmq,运维/监控方面使用kafka。

    作者回复: 当然可以,架构无所谓好坏,关键是适合。用多套MQ好处是发挥各自的长处,代价是维护成本比较高。具体是不是适合,还是要架构师根据各种实际情况来权衡。

    2019-07-25
    3
    18
  • 悟空
    听得我激动的喊了一句:“湖人总冠军”

    作者回复: 你咋知道我是詹密呢?

    2019-07-30
    1
    11
  • 猿人谷
    我所在公司用rabbitmq也遇到消息的有序性无法保证的问题,通过在业务层面去弥补,终究不是种好方案。
    请问老师在保证有序性消费上有什么好的方案?

    作者回复: 正确的使用RabbitMQ是可以保证严格有序的,你在学习完“03 消息模型:主题和队列有什么区别?”之后,再看一下RabbitMQ的配置应该就会知道该如何解决你的问题了。

    2019-07-25
    1
    11
  • Mark Yao
    我们就是那种对消息队列功能和性能都没有很高的要求,所以选择RabbitMQ。不管选择哪种消息队列其中还有个很关键的因素,团队里面有人能hold它,最起码熟悉掌握其详细配置。选择不熟悉的MQ会变成不定时炸弹,在生产遇到问题无法快速解决。
    2019-07-27
    9
  • 摘星星种星星
    期待ing,没用过消息队列,没玩过多线程。但我不想成为一个只会CRUD的
    2019-08-07
    5
  • 吴青
    老师 exchange是rabbitmq独有的么?exchange好像属于amqp协议,看了看amqp似乎说到了。

    作者回复: exchange确实是AMQP协议中定义的,RabbitMQ是AMQP的一个实现。

    2019-07-28
    4
  • wmg
    “因为当客户端发送一条消息的时候,Kafka 并不会立即发送出去,而是要等一会儿攒一批再发送,在它的 Broker 中,很多地方都会使用这种“先攒一波再一起处理”的设计。当你的业务场景中,每秒钟消息数量没有那么多的时候,Kafka 的时延反而会比较高。所以,Kafka 不太适合在线业务场景。”,老师,批次的大小是可配置的,在我们的使用场景中,如果消息没有积压的情况下,延迟基本上小于10ms,我想问一下rocketmq的延迟一般是多少?

    作者回复: 配置得当的情况下,可以做到2-3ms。

    2019-07-26
    4
  • 业余草
    rockmq + kafka。业务 + 日志,都需要!
    2019-07-25
    4
  • 👻 小二
    老师, 能稍微讲下emq跟nsq 的优缺点跟性能吗?

    作者回复: emq是专注于MQTT场景的一个消息队列,如果你的使用场景是连接海量的IoT设备,可以考虑。

    nsq使用Go语言开发,如果团队的技术栈是基于Go语言搭建的,nsq是一个很好的选择。

    这两个消息队列我都没有深入的使用和测试过,所以没办法跟你分享它们的优缺点和性能。

    2019-08-17
    3
  • zwh
    正如老师所说,性能优秀rocketmq在国外的知名度真的挺低的。国外除了rabbitmq kafka还有还多公司使用Amazon的simple queue service
    2019-07-28
    3
  • 我已经设置了昵称
    一直不明白一个问题,每秒处理几万~几十万数据,这不应该是按照下游业务的消费能力来讲的吗,比如我们现在的服务tps就只能打到几百。还是说老师和网上讲的都是发送到消息队列的能力?又或是几万几十万只针下游业务只打个日志专门用来做性能测试的情况?希望解答下

    作者回复: 我们提到的都是消息队列本身的性能,不包括生产者和消费者处理各自业务逻辑的时间。一般测试消息队列性能的时候,生产者和消费者是没有任何业务逻辑的。

    2019-07-27
    2
    3
  • David Mao
    我们的云平台有多个项目,每个项目用的消息中间件不同,有的用RabbitMQ, 有的用Kafka, 请教老师,这些消息中间件可以建设成一个统一的,集中式的架构吗?也就是建设成一个消息中间件平台,所有的项目来共用。

    作者回复: 当然可以,在京东就是这样的集中式大集群,为所有业务提供消息服务。

    2019-07-25
    1
    3
  • yan
    kafka如果凑不够一批,那等什么时候发送?

    作者回复: 建议看一下batch.size和linger.ms这两个参数的含义

    2019-09-25
    2
  • angel😇txy🤓
    老师好,rocket mq为何号称金融级的稳定性呢

    作者回复: 金融级只是一种说法,并没有什么标准。但确实有很多涉及金融类的系统选择使用RocketMQ。

    2019-08-20
    2
  • 青舟
    老师您好,
    请问是否有消息队列支持延时消息,并可以撤回延时消息的?

    需求:物联网平台要对设备离线事件做监控,我想在每次设备上报数据时,发送一个延时判断离线的延时消息到MQ,如果设备正常再次上报数据,就取消上次的延时消息,并发送一个新的延时消息。
    目的是不希望每次上报数据都会导致消费端做一次离线判断,只需要对最后一次上报做判断即可。

    作者回复: 但我个人的意见:这个需求不太适合用MQ来实现。

    另外,是不是可以换个思路来考虑这个问题,你一定需要一个设备离线的通知来触发什么业务逻辑吗?还是只是需要查询设备的时候,能正确的给出设备是否在线就可以了?

    如果是后者,实现代价要低很多。

    2019-07-26
    2
    2
  • QQ怪
    哔,打卡,文章听一般就懂
    2019-07-25
    2
  • InfoQ_686548eeb0d8
    流处理中消息延迟不能避免回溯处理,kafka如果消息已经不在内存里,访问性能会有影响,pulsar 可以很好解决这个问题吗?

    作者回复: 挖坟的问题,受内存大小的限制,不太好解决。这和采用那种消息队列关系不太大。有条件的话,可以使用SSD结合Raid,消费速度基本上是可以打满万兆网卡的。

    2019-07-25
    2
  • 古夜
    我们用zeromq,奈何国内资料太少,想深入了解都不行

    作者回复: 所以需要好好学英语哦。

    2019-07-25
    2
    2
收起评论
99+
返回
顶部