Redis与Kafka作为消息队列对比

前言

  高可用需要解决的问题主要有单点故障大流量

Redis部署
架构实现备注
单点部署单点启动可能造成单点故障
主从复制Slave主动请求,通过RDB同步流量大导致RDB文件过大,同步慢
Codis代理模式+主从复制分桶1024个,不支持KEYS
Redis Cluster去中心化,客户端分片分桶16384,不支持SELECT,官方出品
Codis架构

在这里插入图片描述
  Codis-HA作为协调者也可能出现单点故障,同样需要主从部署。协调者会观测代理和集群的状态,一旦出现单点故障就会重新选举出主节点。Zookeeper作为分布式协调服务,保存代理和集群的映射关系。

Redis和Kafka作为消息队列对比
Redis

  redis刚好提供了上述的数据结构——list。redis list支持:

  • lpush:从队列左边插入数据;
  • rpop:从队列右边取出数据。

  这正好对应了我们队列抽象的push_front和pop_tail,因此我们可以直接把redis的list当成一个消息队列来使用。而且redis本身对高并发做了很好的优化,内部数据结构经过了精心地设计和优化。所以从某种意义上讲,用redis的list大概率比你自己重新实现一个list强很多。

  但另一方面,使用redis list作为消息队列也有一些不足,比如:

  • 消息持久化:redis是内存数据库,虽然有aof和rdb两种机制进行持久化,但这只是辅助手段,这两种手段都是不可靠的。当redis服务器宕机时一定会丢失一部分数据,这对于很多业务都是没法接受的。
  • 热key性能问题:不论是用codis还是twemproxy这种集群方案,对某个队列的读写请求最终都会落到同一台redis实例上,并且无法通过扩容来解决问题。如果对某个list的并发读写非常高,就产生了无法解决的热key,严重可能导致系统崩溃。
  • 没有确认机制:每当执行rpop消费一条数据,那条消息就被从list中永久删除了。如果消费者消费失败,这条消息也没法找回了。你可能说消费者可以在失败时把这条消息重新投递到进队列,但这太理想了,极端一点万一消费者进程直接崩了呢,比如被kill -9,panic,coredump…
  • 不支持多订阅者:一条消息只能被一个消费者消费,rpop之后就没了。如果队列中存储的是应用的日志,对于同一条消息,监控系统需要消费它来进行可能的报警,BI系统需要消费它来绘制报表,链路追踪需要消费它来绘制调用关系……这种场景redis list就没办法支持了。
  • 不支持二次消费:一条消息rpop之后就没了。如果消费者程序运行到一半发现代码有bug,修复之后想从头再消费一次就不行了。

  对于上述的不足,目前看来第一条(持久化)是可以解决的。很多公司都有团队基于rocksdb leveldb进行二次开发,实现了支持redis协议的kv存储。这些存储已经不是redis了,但是用起来和redis几乎一样。它们能够保证数据的持久化,但对于上述的其他缺陷也无能为力了。

Kafka
特性

  • 顺序存储,写入友好
  • 游标记录,支持多订阅者与二次消费
  • 一个partition同时只支持一个消费者消费,保证同partition的消息的有序性
  • partition主从部署,避免单点故障
  • partition分片存储segment稀疏索引,提高查找效率
    在这里插入图片描述
不足
  • 无法弹性扩容:对partition的读写都在partition leader所在的broker,如果该broker压力过大,也无法通过新增broker来解决问题;
  • 扩容成本高:集群中新增的broker只会处理新topic,如果要分担老topic-partition的压力,需要手动迁移partition,这时会占用大量集群带宽;
  • 消费者新加入和退出会造成整个消费组rebalance:导致数据重复消费,影响消费速度,增加e2e延迟;
  • partition过多会使得性能显著下降:ZK压力大,broker上partition过多让磁盘顺序写几乎退化成随机写。
存算分离

  这其实是目前非常流行的架构也是一种趋势,很多新型的存储都是这种”存算分离“的架构。比如tidb,底层存储其实是tikv这种kv存储。tidb是更上层的计算层,自己实现sql相关的功能。还有的例子就是很多"持久化"redis产品,大部分底层依赖于rocksdb做kv存储,然后基于kv存储关系实现redis的各种数据结构。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: RedisKafka 都可以用作消息队列,但它们在实现上有一些区别。 Redis 可以使用 List 数据结构作为队列,并且支持发布/订阅模式。Redis 的优势在于它是一个非常快速和轻量级的解决方案,适用于需要快速处理少量消息的应用程序。Redis 还支持持久化,以确保即使在服务器重启后也能保存数据。 Kafka 使用分布式消息传递系统,支持高吞吐量,可扩展性和持久性。 Kafka 可以在多个服务器之间分配消息,从而提高了性能和可靠性。 Kafka 还支持分区和复制,以确保高可用性。 总的来说,Redis 适用于需要快速处理少量消息的应用程序,而 Kafka 则适用于需要高吞吐量和可扩展性的应用程序。 ### 回答2: RedisKafka是常用的消息队列系统,它们在一些方面上有一些相似之处,但也存在着一些区别。 首先,Redis是一个内存存储数据库,而Kafka是一个分布式流处理平台。Redis可以用作数据缓存,也可以用作消息队列,但它的消息队列功能相对较简单。Kafka专注于高吞吐量、持久性和可扩展性,适用于处理实时数据流。 其次,在消息发布和订阅方面,Redis采用发布/订阅模式,Kafka使用发布/订阅加上分区和复制机制。Redis的发布/订阅模式适用于较小的规模和低吞吐量的应用,而Kafka的分区和复制机制适用于大规模和高吞吐量的应用。 第三,Redis消息队列功能支持多种数据结构,例如列表、集合和有序集合等,但它在消息持久性和可靠性方面相对较弱。Kafka则提供了可靠的消息传递,并将消息持久化到磁盘上,以保证数据不会丢失。 最后,Kafka具有更强大的水平扩展能力和容错性。它可以通过增加分区和增加副本来提高吞吐量和可用性。Redis在水平扩展方面的性能相对较弱。 总的来说,Redis适用于较小规模和低吞吐量的应用,而Kafka适用于大规模和高吞吐量的应用,特别是对于需要处理实时数据流的场景。选择哪个取决于应用的需求和场景的特点。 ### 回答3: RedisKafka都可以用作消息队列,但在某些方面有所不同。 首先,Redis是一个内存数据库,而Kafka是一个分布式流处理平台。Redis的主要特点是速度快,适合用作缓存和实时数据处理。在将Redis用作消息队列时,可以使用其list数据结构实现消息的发布和订阅。由于Redis的持久化机制可能会影响性能,因此当需要持久化消息时可以选择使用KafkaKafka是一个分布式的、高吞吐量的消息队列系统。Kafka使用多个broker节点来存储和处理消息,具有良好的扩展性和高可用性。Kafka适用于需要处理大量数据的场景,如日志收集、实时数据流处理等。与Redis不同,Kafka的消息是持久化在磁盘上,因此即使出现故障或重启,也不会丢失任何消息。此外,Kafka还支持多个消费者组,使得多个消费者可以并行处理消息。 在使用上,由于Redis的速度较快,适合处理实时性要求较高的场景。而Kafka则更适合处理大量数据和对可靠性要求较高的场景。此外,Kafka还提供了更丰富的功能,如消息分区、消息回溯等。 总的来说,RedisKafka消息队列上有不同的特点和适用场景,具体选择取决于需求和场景的不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值