0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Redis流与Kafka相比如何?

马哥Linux运维 来源:cnblogs 2024-02-21 16:09 次阅读

Redis流 VS Kafka

Kafka以解决大规模数据处理问题而闻名,并被广泛部署在许多知名公司的基础设施中。早在2015年,LinkedIn有60个集群,总共有1100个Broker,每秒处理1300万条信息

但事实证明,规模并不是Kafka唯一擅长的事情。它所提倡的编程范式--分区、有序、事件处理--对于你可能面临的许多问题都是一个很好的解决方案。例如,如果事件代表的是要被索引到搜索数据库的行,那么最后的修改就是最后的索引,这一点很重要,否则搜索将无限期地返回陈旧的数据。同样,如果事件代表用户行为,处理第二个事件("用户升级账户")可能依赖于第一个("用户创建账户")。这种范式与传统的作业队列系统不同,在传统的作业队列中,事件是由许多工作者同时从队列中弹出的,这很简单,可扩展,但它破坏了任何排序保证。假设你想要有序的处理,但也许你不想使用Kafka,因为它是一个难以操作或昂贵的重型系统的声誉。Redis现在有了5.0版本发布的"流 "数据结构,与之相比如何?它是否解决了同样的问题?

Kafka的架构

我们先来看看Kafka的基本架构。基本的数据结构是主题。它是一个按时间排序的记录序列,只需追加。使用这种数据结构的好处在Jay Kreps的经典博文The Log中得到了很好的描述。

dea01f4e-cfd0-11ee-a297-92fbcf53809c.png

主题Topic被分区,以使它们能够扩展:每个主题可以被托管在单独的Kafka实例上。每个分区中的记录都被分配了连续的ID,称为偏移量,它可以唯一地识别分区中的每个记录。消费者按顺序处理记录,保持跟踪其最后看到的偏移量。由于记录被持久化在一个主题中,多个消费者可以相互独立地处理记录

deaca0a2-cfd0-11ee-a297-92fbcf53809c.png

在实践中,你可能会将你的处理分布在许多机器上。为了实现这一点,Kafka提供了一个 "消费者组 "的抽象,它是一组合作的进程,从一个主题消费数据。一个主题的分区被划分给组内的成员。然后,当成员加入或离开该组时,必须重新分配分区,以便每个成员都能获得公平的分区份额。这就是所谓的再平衡算法

deb99f6e-cfd0-11ee-a297-92fbcf53809c.png

请注意,一个分区只能由消费者组的一个成员来处理。(但一个成员可能负责多个分区)这使得严格有序的处理得到保证。

这套工具是非常有用的。你可以通过添加更多的工作者来轻松地扩展你的处理,而Kafka则负责处理分布式协调问题。

Redis的流数据结构

Redis的 "流 "数据结构是如何比较的?Redis流在概念上等同于上面描述的Kafka主题的一个分区,但有一些小的区别。

它是一个持久的、有序的事件存储(与Kafka中相同)

它有一个可配置的最大长度(与Kafka中的保留期相比)。

事件存储键和值,就像Redis Hash(相对于Kafka中的单个键和值)。

最主要的区别是,Redis中的消费者组与Kafka中的消费者组完全不同。

在Redis中,一个消费者组是一组全部从同一流读取的进程。Redis确保事件只会被传递给组内的一个消费者。例如,在下图中,消费者1不会处理'9',它会跳过它,因为消费者2已经看到它了。消费者1将得到下一个未被任何其他组成员看到的事件。

dec3a3c4-cfd0-11ee-a297-92fbcf53809c.png

组的作用是将单个流的处理并行化。这看起来很像一个传统的作业队列结构。因此,它失去了作为流处理核心的排序保证,这是很不幸的。

流处理作为一个客户端库

那么,如果Redis只提供有效的具有作业队列语义的主题的单一分区,我们怎么能在Redis之上建立一个流处理引擎?好吧,如果你想要Kafka的功能,你需要自己构建它们。这意味着要实现。

1. 事件分区。你需要创建N个流,并将每个流视为一个分区。然后,在发送时,你需要决定哪个分区应该接收它,大概是基于事件的哈希值或其中的一个字段。

2. 一个工人分区分配系统。为了扩展和支持多个工作者,你需要创建一个算法,在他们之间分配分区,确保每个工作者拥有一个相互排斥的子集,也就是相当于Kafka的 "再平衡 "系统。

3. 有确认的顺序处理。每个工作者都需要迭代其每个分区,跟踪其偏移量。尽管Redis消费者组有作业队列语义,但它们在这里可以提供帮助。诀窍是每个组使用一个消费者,然后为每个分区创建一个组。然后每个分区将被按顺序处理,你可以利用内置的消费者组状态跟踪。Redis不仅可以跟踪偏移量,还可以跟踪每个事件的确认,这是很强大的。

这是绝对的最低要求。如果你希望你的解决方案是健壮的,你可能还想考虑错误处理:除了崩溃你的工作者,也许你会想要一个机制,将错误转发到一个 "死信 "流并继续处理。

好消息是--如果你喜欢Python的话--已经解决了这些问题,并且在一个新发布的名为Runnel的库中解决了更多问题。如果你想从Redis上类似Kafka的语义中获益,欢迎你来看看。下面是它的外观,基本上与上面的Kafka图之一相同。

ded12954-cfd0-11ee-a297-92fbcf53809c.png

工作者通过Redis中实现的锁来协调他们对分区的所有权。他们通过一个特殊的 "控制 "流相互沟通。更多信息,包括架构和再平衡算法的详细分解,请参阅Runnel文档。

权衡

Redis是大规模事件处理的好选择吗?有一个基本的权衡:因为一切都在内存中,获得了无与伦比的处理速度,但它不适合存储无限制的数据量。使用Kafka,你可能愿意无限期地保存你的所有事件,但使用Redis,你肯定要存储最近的事件的固定窗口--只够你的处理器有一个舒适的缓冲区,以防止它们变慢或崩溃。这意味着你可能还想使用一个外部的长期事件存储,例如S3,以便能够重放它们,这增加了你的架构的复杂性,但降低了成本。

研究这个问题的主要动机是在部署和操作Redis时涉及的易用性和低成本。这就是为什么它对Kafka有吸引力。它也是一套神奇的工具,经受住了时间的考验,非常了不起。事实证明,经过努力,它也可以支持分布式流处理范式.

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Redis
    +关注

    关注

    0

    文章

    368

    浏览量

    10780
  • kafka
    +关注

    关注

    0

    文章

    49

    浏览量

    5189

原文标题:Redis流对比Kafka

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Redis Stream应用案例

    的基本使用介绍和设计理念可以看我之前的一篇文章(Redis Stream简介)。Redis Stream本质上是在Redis内核上(非Redis Module)实现的一个消息发布订阅功
    发表于 06-26 17:15

    基于发布与订阅的消息系统Kafka

    Kafka权威指南》——初识 Kafka
    发表于 03-05 13:46

    Kafka基础入门文档

    kafka系统入门教程(原理、配置、集群搭建、Java应用、Kafka-manager)
    发表于 03-12 07:22

    Kafka集群环境的搭建

    1、环境版本版本:kafka2.11,zookeeper3.4注意:这里zookeeper3.4也是基于集群模式部署。2、解压重命名tar -zxvf
    发表于 01-05 17:55

    一文读懂什么是分布式处理系统Kafka

    Kafka是一个分布式处理系统,处理系统使它可以像消息队列一样publish或者subscribe消息,分布式提供了容错性,并发处理消息的机制。
    的头像 发表于 12-12 09:14 6616次阅读
    一文读懂什么是分布式<b class='flag-5'>流</b>处理系统<b class='flag-5'>Kafka</b>

    Kafka的概念及Kafka的宕机

    问题要从一次Kafka的宕机开始说起。 笔者所在的是一家金融科技公司,但公司内部并没有采用在金融支付领域更为流行的 RabbitMQ ,而是采用了设计之初就为日志处理而生的 Kafka ,所以我一直
    的头像 发表于 08-27 11:21 1944次阅读
    <b class='flag-5'>Kafka</b>的概念及<b class='flag-5'>Kafka</b>的宕机

    Kafka的核心概念

    Kafka 是主流的消息系统,其中的概念还是比较多的,下面通过图示的方式来梳理一下 Kafka 的核心概念,以便在我们的头脑中有一个清晰的认识。
    的头像 发表于 06-20 14:24 854次阅读

    什么是Redis?各种Redis部署及其权衡取舍

    Redis不是通过迭代或者排序方式处理数据,而是一开始就按照数据结构方式组织。早期,它的使用很像 Memcached,但随着 Redis 的改进,它在许多其他用例中变得可行,包括发布-订阅机制、(streaming)和队列。
    发表于 11-09 21:11 559次阅读

    什么是 Redis

    其他用例中变得可行,包括发布-订阅机制、(streaming)和队列。 主要来说,Redis 是一个内存数据库,用作另一个“真实”数据
    的头像 发表于 05-22 15:32 991次阅读
    什么是 <b class='flag-5'>Redis</b>

    Kafka 的简介

      1 kafka简介 2 为什么要用消息系统 3 kafka基础知识 4 kafka集群架构 5 总结   1 kafka简介 其主要设计目标如下: 以时间复杂度为O(1)的方式提供
    的头像 发表于 07-03 11:10 511次阅读
    <b class='flag-5'>Kafka</b> 的简介

    物通博联5G-kafka工业网关实现kafka协议对接到云平台

    Kafka协议是一种基于TCP层的网络协议,用于在分布式消息传递系统Apache Kafka中发送和接收消息。Kafka协议定义了客户端和服务器之间的通信方式和数据格式,允许客户端发送消息到K
    的头像 发表于 07-11 10:44 411次阅读

    Kafka架构技术:Kafka的架构和客户端API设计

    Kafka 给自己的定位是事件平台(event stream platform)。因此在消息队列中经常使用的 "消息"一词,在 Kafka 中被称为 "事件"。
    的头像 发表于 10-10 15:41 723次阅读
    <b class='flag-5'>Kafka</b>架构技术:<b class='flag-5'>Kafka</b>的架构和客户端API设计

    如何将Kafka使用到我们的后端设计中

    本文介绍了以下内容: 1.什么是Kafka? 2.为什么我们需要使用Kafka这样的消息系统及使用它的好处 3.如何将Kafka使用到我们的后端设计中。 译自timber.io
    的头像 发表于 10-30 14:30 414次阅读
    如何将<b class='flag-5'>Kafka</b>使用到我们的后端设计中

    golang中使用kafka的综合指南

    kafka是一个比较流行的分布式、可拓展、高性能、可靠的处理平台。在处理kafka的数据时,这里有确保处理效率和可靠性的多种最佳实践。本文将介绍这几种实践方式,并通过sarama实现他们。
    的头像 发表于 11-30 11:18 455次阅读

    Java redis锁怎么实现

    的使用 在Java中使用Redis需要使用到相关的客户端库,比如Jedis、Lettuce等 配置Redis连接池的最大连接数、最大空闲连接数、连接超时时间等参数 通过连接池
    的头像 发表于 12-04 10:47 888次阅读