消息队列高手课
李玥
京东零售技术架构部资深架构师
立即订阅
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讲)
结束语 | 程序员如何构建知识体系?
消息队列高手课
登录|注册

30 | 流计算与消息(二):在流计算中使用Kafka链接计算任务

李玥 2019-10-03
你好,我是李玥。
上节课我们一起实现了一个流计算的例子,并通过这个例子学习了流计算的实现原理。我们知道,流计算框架本身是个分布式系统,一般由多个节点组成一个集群。我们的计算任务在计算集群中运行的时候,会被拆分成多个子任务,这些子任务也是分布在集群的多个计算节点上的。
大部分流计算平台都会采用存储计算分离的设计,将计算任务的状态保存在 HDFS 等分布式存储系统中。每个子任务将状态分离出去之后,就变成了无状态的节点,如果某一个计算节点发生宕机,使用集群中任意一个节点都可以替代故障节点。
但是,对流计算来说,这里面还有一个问题没解决,就是在集群中流动的数据并没有被持久化,所以它们就有可能由于节点故障而丢失,怎么解决这个问题呢?办法也比较简单粗暴,就是直接重启整个计算任务,并且从数据源头向前回溯一些数据。计算任务重启之后,会重新分配计算节点,顺便就完成了故障迁移。
回溯数据源,可以保证数据不丢失,这和消息队列中,通过重发未成功的消息来保证数据不丢的方法是类似的。所以,它们面临同样的问题:可能会出现重复的消息。消息队列可以通过在消费端做幂等来克服这个问题,但是对于流计算任务来说,这个问题就很棘手了。
对于接收计算结果的下游系统,它可能会收到重复的计算结果,这还不是最糟糕的。像一些统计类的计算任务,就会有比较大的影响,比如上节课中统计访问次数的例子,本来这个 IP 地址在统计周期内被访问了 5 次,产生了 5 条访问日志,正确的结果应该是 5 次。如果日志被重复统计,那结果就会多于 5 次,重复的数据导致统计结果出现了错误。怎么解决这个问题呢?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《消息队列高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(4)

  • DFighting
    关于思考题,我在infoQ上找了一篇文章https://www.infoq.cn/article/58bzvIbT2fqyW*cXzGlG,不知道是不是这么实现的,请老师帮忙看下。

    作者回复: 是这样的。

    2019-10-28
    1
  • jack
    老师,使用spark streaming 和kafka时,
    1、spark官方文档说,如果保存到checkpoint和把offset 提交到kafka,必须保证输出是幂等的,光使用事务是不行的;
    2、那么如果无法保证输出是幂等的,是否只能把offset 保存在第三方的数据库(比如redis)中,但是这样做是否是不可以设置checkpoints ?否则spark依然会从checkpoint中读取,和从数据库中读取会造成冲突呢?
    3、但不设置checkpoint,spark如何恢复现场呢?在提交命令时加入--supervise,好像yarn的模式不支持?即使使用supervise重启,没有checkpoint,也无法恢复现场吧?

    作者回复: A1:是这样的,所以Kafka的Exactly Once特性中是有事务和生产幂等(相当于流计算输出幂等)二个功能组成的。
    A2:这个方法不太可行,因为你很难做到完美的故障恢复。原因我在课程中也讲到了。

    A3:具体操作细节层面的问题,还是建议你以官方的文档为准。

    2019-10-09
  • 不惑ing
    第25章讲kafka exactly once需要从kafka topicA读取计算再保存到kafka topocB,但从这章讲的流程看,最后不需要保存到kafka topicB,保存到其他hdfs里也可以,

    所以最后一步保存位置有具体要求吗?

    作者回复: 理论上是可以的,但是实际上hdfs没有原生事务支持,实现起来比较困难。

    2019-10-06
    1
  • 张天屹
    老师你好,能介绍下Kafka 配合 Flink,与Kafka Stream 的核心区别吗

    作者回复: Kafka Stream目前来说,相关的生态还不够成熟,可以了解一下,但不建议在生产系统中使用。

    它和flink最大的区别是,它是一个库,运行在你的应用程序进程内,而不是一个流计算框架。

    2019-10-05
收起评论
4
返回
顶部