一、什么是kafka,什么是rabbit

  Kafka是由Scala语言开发的一种分布式流处理框架,主要用于处理活跃的流式数据,以及大数据量的数据处理。它采用发布-订阅模型,支持消息的批量处理,数据的存储和获取是本地磁盘顺序批量操作,这使得消息处理的效率较高,吞吐量较大。

  RabbitMQ则是由Erlang语言开发,主要用于实时的、对可靠性要求较高的消息传递。它采用AMQP(高级消息队列协议)进行消息的传递,并且有一个broker(消息代理)作为中心,可以确认消息的传递。RabbitMQ支持消息的可靠的传递,支持事务,但并不支持批量操作,基于存储的可靠性的要求存储可以采用内存或硬盘,但吞吐量相对较小。


二、rabbit和kafka的特性

(1)Kafka的特性:

  1. 大规模数据处理:Kafka的吞吐量巨大,其数据存储和获取是本地磁盘的批量处理,可以达到百万/s。
  2. 持久性消息存储:Kafka是一个持久性消息存储,在数据写入后即使出现系统崩溃,也能够保证数据的完整性。
  3. 可靠性的支持:Kafka的broker支持主备模式,为数据的安全性提供了保障。

(2)RabbitMQ的特性:

  1. 消息确认机制:RabbitMQ具有生产者confirm机制以及消费者的消息应答机制ack,可以保证消息的可靠传递。
  2. 消息顺序性:在RabbitMQ中,在一个队列里的消息是严格顺序的,按照先进先出。
  3. 持久化支持:RabbitMQ支持持久化,可以把消息写入到磁盘中,保证数据在内存不足时也不会丢失。
  4. 高可用性:RabbitMQ使用了MirrorQueue的机制,可以将重要队列“复制”到集群中的其他broker上,保证这些队列的消息不会丢失。

(3)二者的相同点在于都是为了解决消息的传递问题,但在很多方面也有显著的不同:

  1. 架构模型:RabbitMQ遵循AMQP协议,由Exchange、Binding、queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费。而Kafka遵从一般的MQ结构,以producer、broker、consumer为中心。
  2. 消息确认机制:Kafka并不具有应答机制,而RabbitMQ具有生产者confirm机制以及消费者的消息应答机制ack。
  3. 消息的顺序:在RabbitMQ中,在一个队列里面,rabbitmq的消息是严格顺序的,按照先进先出。然而在Kafka中,虽然每个partition中的消息是有序的,但是因为Kafka将数据分布在不同的partition中,所以总体是无序的。
  4. 吞吐量:在不使用ACK机制的情况下,RabbitMQ的QPS可以达到6W+,而在双方使用ACK机制的情况下,QPS降到了1W+。与此相反的是,Kafka具有巨大的吞吐量,数据的存储以及获取是本地磁盘的批量处理,可以达到百万/s。
  5. 可靠性: RabbitMQ使用了MirrorQueue的机制,也可以做到多个机器进行热备。而Kafka的主备模式提供了另外一种可靠性保障。

总的来说,RabbitMQ和Kafka在特性和应用场景上各有优势和劣势。在选择使用时需要考虑到自身需求以及两者的特性和限制。


三、两者使用场景,如何才能方便应用

  我们首先要明白kafka不是消息中间件的一种实现,他是分布式流系统,他的定位就是来处理日志及大数据方面,吞吐量无疑是很高的。而rabbit他的push模式就导致了他得延时是较低的,但是场景上只支持主从,所以在本身的设计上就是比较小的,cpu消耗自然就更低。

从消息顺序来讲

Kafka可以保证在单个分区中的消息顺序是有序的,即按照消息的写入顺序进行消费。但是,当使用多个分区时,就不能保证消息的顺序了,因为每个分区都是独立的,消息的写入顺序和消费顺序都是分区内部的顺序,与其他分区无关,如果需要保证消息的顺序,可以将所有的消息写入到单个分区中,或者使用单个消费者或消费者组来消费消息。

而对于RabbitMQ,如果是单个消费者,那么它先进先出的机制,可以保证消息的有序性,但是如果有多个消费者从同一个队列中读取消息,那么就难以保证消息的顺序。例如,一个消费者在处理消息后可能由于失败等原因将消息放回队列,这样另一个消费者就可以继续处理它,从而可能导致消息的顺序错乱。这种情况下,可以通过限制消费者并发数=1的方式来保证消息的有序性。

(1)Kafka的使用场景和例子:

  1. 大规模数据流处理:Kafka可以处理大规模的数据流,并且具有高吞吐量和持久性特性,可以承受大量的数据。例如,一个大型的网络应用需要收集来自数百台服务器的日志数据,并将这些数据传递给分布式数据处理系统(如 Apache Spark)进行实时数据分析和仪表板展示。 Kafka可以作为数据枢纽,服务器将日志消息发布到Kafka Topic中,而 Spark 则通过消费者从 Kafka 中订阅和处理这些消息。
  2. 实时数据流处理:Kafka可以支持实时的数据流处理,并且具有低延迟的特性。例如,电商平台需要实时处理订单和库存消息,当有新订单生成时,需要通知库存管理系统进行库存调整。 Kafka可以用于传递这些实时的订单和库存消息,并支持低延迟的处理。

(2)RabbitMQ的使用场景和例子:

  1. 消息路由:RabbitMQ可以通过消息路由的方式将消息发送到不同的消费者或者消费者组中。例如,一个电子商务平台需要处理订单和库存管理,当有新订单生成时,需要通知库存管理系统进行库存调整。 RabbitMQ可以将订单消息路由到库存管理系统,并通知其进行库存调整。
  2. 消息持久化:RabbitMQ可以保证消息的持久化存储,以便在系统故障时能够恢复消息。例如,在电子商务平台中,如果订单处理系统出现故障,RabbitMQ可以保证订单消息不被丢失,并在系统恢复后继续处理。

   总体来说,Kafka更适合大规模的数据流处理和实时数据处理场景,而RabbitMQ更适合消息路由和持久化存储场景,要选择适合自己项目的架构。


四、总结

  Kafka和RabbitMQ都是用于消息传递的工具,它们具有不同的特性和应用场景。Kafka适合处理大规模的实时数据流,并具有高吞吐量和持久性特性,而RabbitMQ更适合消息路由和持久化存储,并具有消息确认机制和严格的消息顺序。在选择使用时,需要考虑到自身需求以及两者的特性和限制。

  PS:可以结合使用:虽然Kafka和RabbitMQ具有不同的特性和应用场景,但它们可以结合使用,以获得更好的效果。例如,可以使用Kafka来处理大规模的实时数据流,并使用RabbitMQ来处理消息路由和持久化存储

  本文简述一些特性以及区别,但是我们要应用于生产上的项目和结构还是要去看官方文档,文档里都有详细的方案,从而助我们更好的分辨需要用什么工具。本文如果有什么错误点欢迎大家指正。

Kafka与RabbitMQ的更多相关文章

  1. Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能-转自阿里中间件

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...

  2. 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局

    一.前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦 ...

  3. IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?

    1.前言 在IM这种讲究高并发.高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转.消息削峰.消息交换异步化等等角色,当然MQ消息中间件的作用远不止于 ...

  4. 转 Kafka、RabbitMQ、RocketMQ等消息中间件的对比 —— 消息发送性能和优势

    Kafka.RabbitMQ.RocketMQ等消息中间件的对比 —— 消息发送性能和优势 引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前 ...

  5. Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...

  6. 在服务端处理同步发送小消息的性能上Kafka>RocketMQ>RabbitMQ

    在发送小消息的场景中,三个消息中间件的表现区分明显: Kafka的吞吐量高达17.3w/s,远超其他两个产品.这主要取决于它的队列模式保证了写磁盘的过程是线性IO.此时broker磁盘IO已达瓶颈. ...

  7. Kafka、RabbitMQ、RocketMQ消息中间件的对比

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,目前对Kafka.RabbitMQ.RocketMQ这三个消息中间件做下对比分析. - - k ...

  8. Kafka、RabbitMQ、RocketMQ、ActiveMQ 17 个方面综合对比

    本文将从,Kafka.RabbitMQ.ZeroMQ.RocketMQ.ActiveMQ 17 个方面综合对比作为消息队列使用时的差异.(欢迎加入Java程序员群:630441304,一起学习交流会) ...

  9. 转:Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能 (阿里中间件团队博客)

    from: http://jm.taobao.org/2016/04/01/kafka-vs-rabbitmq-vs-rocketmq-message-send-performance/ 引言 分布式 ...

  10. 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    原文:https://mp.weixin.qq.com/s/lpsQ3dEZHma9H0V_mcxuTw 一.资料文档 二.开发语言 三.支持的协议 四.消息存储 五.消息事务 六.负载均衡 七.集群 ...

随机推荐

  1. django的部署在centos

    虚拟环境 #virtualenv是一个创建独立python环境的工具 sudo pip install virtualenv #virtualenvwrapper将所有的虚拟环境统一管理,留意安装路径 ...

  2. 【python基础】复杂数据类型-列表类型(增删改查)

    1.初识列表(list) 列表由一系列按特定顺序排列的数据元素组成.可以将任何类型数据元素加入列表中,其中的数据元素之间没有任何关系.鉴于列表通常包含多个数据元素,给列表指定一个表示复数的名称是个不错 ...

  3. karyoploteR: 基因组数据可视化 R 包

    karyoploteR,是一个适用于所有基因组数据(any data on any genome)非圆环布局(non-circular layouts)的可视化 R/Bioconductor 包.开发 ...

  4. Eclipse的Console如何实现中文输出(Eclipse Display Chinese)

    最近遇到Eclipse的Console中文输出乱码的问题,现象如下: 在网上找到一些方法,一般均不好用,直到找到"如何在Eclipse控制台中显示汉字",链接如下 https:// ...

  5. Framework 中使用 Toolkit.Mvvm 的生成器功能

    .NET Standard是.NET APIs的正式规范,可在多个.NET实现中使用..NET Standard的动机是为了在.NET生态系统中建立更大的统一性..NET 5及更高版本采用了不同的方法 ...

  6. Unity自定义类使用携程--自身不继承MonoBehaviour

    [TOC] 参考: https://www.jianshu.com/p/67f498cb839b 话不多说,直接上代码 1 using System.Collections; 2 using Unit ...

  7. Blazor前后端框架Known-V1.2.5

    V1.2.5 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...

  8. Java实现数组去重复的18种写法

    说明 数组(含List)去重复在日常工作中经常遇到,很多时候用到Set数据结构,但有时候我们需要针对数据进行干预,这时候就需要用其他的实现方式了.以下列出各种的去重方式,基本含括了所有情况. 源码下载 ...

  9. 使用netdata 监控Linux 主机

    在linux主机上,直接使用下面的命令创建容器即可 docker run -d --name=netdata \ -p 19999:19999 \ -v netdataconfig:/etc/netd ...

  10. mysql系列03---事务

    一.事务简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销 操作请求,即这些操作要么同时成功,要么同时失败. 二.事物的四大特性 一个事务具有A ...