Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >我与Apache Storm和Kafka合作的经验

我与Apache Storm和Kafka合作的经验

作者头像
佛壁灯
发布于 2018-05-29 10:03:16
发布于 2018-05-29 10:03:16
1.6K0
举报

几天前,我不得不设计一个基于海量写入的扇出架构。

对于这个学派的新手来说,我会尝试用非常简单的方式去解释。基于海量写入的扇出架构尝试在写入时使用所有业务逻辑。初衷是为了给每个用户及用例准备好视图;当有人想要读取数据时,他们不必应用复杂的逻辑。于是读取就会变得轻松简单且通常可以保证恒定的读取时间。Twitter就基于海量写入的扇出架构。

不必深入了解这些要求的细节,我在此处列出了简单的摘要:

  • 高写入容量
  • 读取时间几乎恒定
  • 必须具有容错能力并可以在商品硬件上扩展
  • 同样需要自由文本搜索和社交图遍历
  • 实时分析

我们设计的架构涉及三个数据库MongoDB用于存储传入数据、Redis用于存储专为每个用户设计的数据集、ElasticSearch用于存储需要自由文本或部分文本搜索的文本结果。

对于每个传入的数据集都有业务逻辑决定在Redis中填充哪些数据集(基于社交图连接)以及决定在ElasticSearch中提取和存储哪些东西进行自由文本搜索。

听起来很简单!

鉴于此,我决定使用快速可靠的Apache Kafka作为消息代理,然后使用Storm处理数据并实现基于海量写入的扇出架构。

细节决定成败。这就是我打算在这里分享的内容。在使用Kafka和Storm之前,您应该了解一些关于每个应用的知识。

Kafka - 消息队列

卡夫卡是一个优雅的消息队列。您可以将其用作发布 - 订阅或广播。它是如何完成它的工作的?

下面是解释相同信息的官方文档:

“消息传统上有两种模式:队列发布 - 订阅。在一个队列中,消费者池可以从服务器中读取消息且每条消息都发送到其中一个服务器上;在发布 - 订阅模型中,消息被广播给所有消费者。Kafka提供了概括了这两个模型的单一消费者抽象——消费群体

消费者用消费者组名称标记自己,并且发布到主题的每条消息都被传递至在每个订阅消费者组内的一个消费者实例。消费者实例可以在单一进程中或单一机器上。

若所有消费者实例具有相同的消费者组,那么这就像传统的消费者队列负载均衡一样工作。

若所有消费者实例具有不同的消费者群体,那么它就像发布 - 订阅一样工作,并且将所有消息广播给所有消费者。“

快速总结Kafka的显着特点

  • 消息被分为多个分区
  • 仅在分区内保证消息顺序
  • 生产者可以决定将数据发送给哪个分区

了解了这么多信息,我们就可以根据分类来创建主题。对于每种新型数据,我们都将新建主题。例如,如果我们使用Twitter,我们可以创建一个名为“推文”的主题。我们会将所有推文创建数据推送到这个主题中。但是跟随用户是完全不同的用例。根据分类理论,我们将为此创造一个新的主题,称之为“跟随”。所有与用户行为相关的数据都将发送到这个新的“跟随”主题中。

现在让我们看看排序。排序仅在主题的分区内被保证且每个主题可以有多个分区。消息只能转到主题中的一个分区。

鉴于此,我们如何实现持续的排序呢?打个比方,让我们以Twitter为例。如果您有10条推文,而您希望按照相同的时间顺序查看它们。

所以现在给出了两个选项。一个选项是每个主题仅包含一个分区并拥有很多主题。例如,为每个用户提供一个主题。只有这样使用一个分区,您才可以始终保持消息的顺序。但这将产生数以亿计的主题(每个用户一个主题)。

另一种选择是为每个用户分配一个主题和一个分区。通过这种方式您也可以确定顺序,但这意味着一个主题和数亿个分区。

现在我们了解到,这两种方法都不是最佳答案。太多主题或分区导致了性能问题。若您阅读架构的话,很显而易见的是它们都会造成开销进而降低性能。我不会去讨论为什么会发生这种情况,而是告诉您我们是如何解决它的。

每个生产者都可决定使用主题中的哪个分区发送数据。这让我们得以选择固定数量的分区并将用户均匀分配到这些分区上。我们发现平均商品硬件和3节点集群及15000分区是最佳选择。这是经过诸多性能测试和优化的结果。所以我们将用户输入内容均匀分配到15000个分区之中。我们没有为每个用户分配一个分区,而是将固定的一组用户分配到了一个分区。这使我们能确保在没有数百万个分区的情况下进行用户排序。

Storm - 大规模处理引擎

Storm是一个实时处理引擎。它很像映射归纳,只是它一直处于运行状态。因此它是实时的。如果您需要这样的引擎的话,您可以让平行的工作单元处理数据并在批处理结束时累积数据。Storm中使用的术语是“Bolts(螺栓)”和“Spouts(喷口)”。可配置螺栓和喷口在一个的单元中运行的则称为“Topology(拓扑)”。

但真正的问题是确保一次保证处理。意思是,您该如何保证在Kafka队列内只读取一次消息并成功处理。若正在处理的消息抛出异常而您想再次重新处理该消息又会发生什么情况。

Storm中对螺栓和喷口的抽象称为Trident(三叉戟),就像Pig for Hadoop一样。其具体实现称为“OpaqueTrident(不透明三叉戟)”。不透明三叉戟喷口保证仅处理一次且Storm的最新官方版带来了“OpaqueTridentKafkaSpout(不透明三叉戟Kafka喷口)”特性。我们使用它且只保证一次处理来自Kafka的信息。

另一个重要的问题是解决如何应对失败处理。警告将抛出一个“new FailedException()”。失败异常将不会标记信息为已处理,故信息将会被重新处理。这可以确保当由于网络问题或类似用例而导致与数据库的临时连接丢失时不会丢失消息。但请要小心处理并确保在信息正在被处理的情况下不写入重复数据。

这些是从我们的系统中所学习到的。虽然它是一只野兽,但是若明智地使用将效验如神。

希望能帮助到您。

谢谢,

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
kafka是什么牌子_kafka为什么叫kafka
Apache Kafka 是一款开源的消息系统。可以在系统中起到“肖峰填谷”的作用,也可以用于异构、分布式系统中海量数据的异步化处理。 系统包括四个主要API:
全栈程序员站长
2022/11/04
1K0
[Kafka ]全面介绍Apache Kafka™
Kafka是一个现在听到很多的话......许多领先的数字公司似乎也在使用它。但究竟是什么呢?
架构师研究会
2019/05/06
1.4K0
[Kafka ]全面介绍Apache Kafka™
Kafka权威指南 —— 1.2 初识Kafka
什么是Kafka Apache Kafka是一个基于分布式日志提交机制设计的发布订阅系统。数据在kafka中持久化,用户可以随时按需读取。另外数据以分布式的方式存储,提高容错性,易于扩展。 Message和Batches Kafka中最基本的数据单元是消息message,如果使用过数据库,那么可以把Kafka中的消息理解成数据库里的一条行或者一条记录。消息是由字符数组组成的,kafka并不关系它内部是什么,索引消息的具体格式与Kafka无关。消息可以有一个可选的key,这个key也是个字符数组,与消息
用户1410343
2018/03/26
1.5K2
Kafka权威指南 —— 1.2 初识Kafka
教程|运输IoT中的Kafka
本教程介绍了Apache Kafka的核心概念及其在可靠性、可伸缩性、持久性和性能至关重要的环境中所扮演的角色。
大数据杂货铺
2021/04/30
1.7K0
Apache Kafka学习
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理。
chimchim
2023/10/17
3390
Apache Kafka学习
「企业事件枢纽」Apache Kafka中的事务
在之前的一篇博客文章中,我们介绍了Apache Kafka®的一次语义。这篇文章介绍了各种消息传递语义,介绍了幂等生成器、事务和Kafka流的一次处理语义。现在,我们将继续上一节的内容,深入探讨Apache Kafka中的事务。该文档的目标是让读者熟悉有效使用Apache Kafka中的事务API所需的主要概念。
架构师研究会
2019/11/26
6040
Kafka快速入门系列(1) | Kafka的简单介绍(一文令你快速了解Kafka)
  自Flume快速入门系列结束后,博主决定后面几篇博客为大家带来关于Kafka的知识分享作为快速入门Kafka系列的第一篇博客,本篇为大家带来的是Kafka的简单介绍。
不温卜火
2020/10/28
5650
Kafka快速入门系列(1) | Kafka的简单介绍(一文令你快速了解Kafka)
Kafka 在分布式系统中的 7 大应用场景
Kafka 是一个开源的分布式流式平台,它可以处理大量的实时数据,并提供高吞吐量,低延迟,高可靠性和高可扩展性。Kafka 的核心组件包括生产者(Producer),消费者(Consumer),主题(Topic),分区(Partition),副本(Replica),日志(Log),偏移量(Offset)和代理(Broker)。Kafka 的主要特点有:
wayn
2023/10/25
1.9K0
Kafka 在分布式系统中的 7 大应用场景
Kafka 工作机制
Kafka 是 Apache 的子项目,是一个高性能跨语言的分布式发布/订阅消息队列系统(没有严格实现 JMS 规范的点对点模型,但可以实现其效果),在企业开发中有广泛的应用。高性能是其最大优势,劣势是消息的可靠性(丢失或重复),这个劣势是为了换取高性能,开发者可以以稍降低性能,来换取消息的可靠性。
IT技术小咖
2019/06/26
1.2K0
Kafka 工作机制
Kafka基本架构介绍
该文介绍了如何使用Kafka进行分布式消息处理系统。文章首先介绍了Kafka的基本概念,然后详细描述了Kafka的架构和组件。接着,文章深入探讨了Kafka的复制和分布式协调功能,以及如何使用Kafka进行消息处理。最后,文章介绍了Kafka的性能优化和常见问题解决方案。
程裕强
2018/01/02
3.5K0
Kafka基本架构介绍
快速认识Kafka阶段(1)——最详细的Kafka介绍
上一阶段给大家讲的是Redis,接下来这一阶段,我给你大家更新Kafka的知识分享哦!!!
刘浩的BigDataPath
2021/04/13
6.5K0
快速认识Kafka阶段(1)——最详细的Kafka介绍
消息队列与kafka
在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算。
超蛋lhy
2019/05/05
1.6K0
DBA老挂在嘴边的kafka到底是啥?今天终于能讲清楚了。
| 作者 马艺超,腾讯课堂开发工程师,主要负责腾讯课堂的后台相关业务开发。 ---- 消息队列是分布式系统中重要的组件,在很多生产环境中需要控制并发量的场景下都需要用到。最近在做需求的时候遇到一些高并发的场景需要用到消息队列来完成,这里关于对kafka的简单了解和使用,给大家做一个简单的分享。 Part1 什么是Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统
腾讯云数据库 TencentDB
2020/09/16
7770
一网打尽Kafka入门基础概念
最近需要做的项目里用到了kafka消息队列,对于一个主要面向大数据实时计算的日志消息系统,在大公司里面用的是非常多的,也是Java程序员通往高级开发必须要掌握的一门中间件技术。
用户3587585
2022/04/14
3150
一网打尽Kafka入门基础概念
深入理解Apache Kafka
Kafka由LinkedIn公司于2011年推出,自那时起功能逐步迭代,目前演变成一个完整的平台级产品,它允许您冗余地存储巨大的数据量,拥有一个具有巨大吞吐量(数百万/秒)的消息总线,并且支持实时流任务处理。总的来说,Kafka是一个分布式,可水平扩展,容错的日志提交系统
公众号_松华说
2019/07/16
5230
深入理解Apache Kafka
kafka架构原理最全解释
答:Kafka是一个发布 - 订阅的消息队列中间件。这个消息传递应用程序是用“scala”编码的。 kafka 支持的协议是防AMQP协议,支持集群,负载均衡和动态扩容(zk), 不支持事务;
Tim在路上
2020/08/04
2.9K0
Kafka基本原理详解(超详细!)
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。
全栈程序员站长
2022/08/31
22.9K3
程序员必须了解的消息队列之王-Kafka
Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
架构狂人
2023/08/16
4030
程序员必须了解的消息队列之王-Kafka
kafka应用场景包括_不是kafka适合的应用场景
Kafka 是 linkedin 使用 Scala 编写具有高水平扩展和高吞吐量的分布式消息系统。
全栈程序员站长
2022/11/04
1.4K0
RabbitMQ与Kafka之间的差异
被概括为“开源分布式消息代理”,用Erlang编写,有助于在复杂的路由方案中有效地传递消息,可以通过服务器上启用的插件进行扩展,高可用(队列可以在集群中的机器上进行镜像)
ruochen
2021/11/25
4.3K0
相关推荐
kafka是什么牌子_kafka为什么叫kafka
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档