当前位置: 首页 > news >正文

【队列】Kafka和Rabbitmq的最大区别

redis:

     主要场景是内存数据库,作为消息队列来说可靠性太差,而且速度太依赖网络IO,在服务器本机上的速度较快,且容易出现数据堆积的问题,在比较轻量的场合下能够适用。

RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上。

kafka是Linkedin于2010年12月份开源的消息发布订阅系统,它主要用于处理活跃的流式数据,大数据量的数据处理上。

2)在吞吐量,

rabbitMQ在吞吐量方面稍逊于kafka,他们的出发点不一样,rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。

kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。

3)在可用性方面,

rabbitMQ支持miror的queue,主queue失效,miror queue接管。

kafka的broker支持主备模式。

4)在集群负载均衡方面,

rabbitMQ的负载均衡需要单独的loadbalancer进行支持。

kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。

//______________________________________________________________

功能上,两者都是实现了AMQP协议。那么在使用上的最大区别是什么呢?如何根据自己的需求进行选型?

kafka是严格顺序保证的消息队列。即使在分布式环境下,也保证在同一分区内消息的顺序性。既然是顺序的,那么在同一个Topic下面,如果前面的消息没有消费完毕(收到回应),则不能读取下一条消息。那么在消费端,就变成了一个单线程操作,无法并发。虽然kafka可以通过分区实现并发,不过这个需要用多台kafka实现。

还有个办法是在消费kafka消息的时候,消费完立即交给线程池处理,这样可以极大提高并发性。不过这样带来的问题是,如果线程没有处理完机器挂了,就会出现消息丢失的情况,需要在设计上考虑到。

Rabbitmq不承诺消息的顺序性,因此可以并发多线程处理。在队列中不必排队。如果你对顺序处理没有要求,可以用Rabbitmq实现较大的并发。

关于消息顺序问题
1.生产者生产消息,broker相当于一个内存队列,是可以保证顺序的
2.只有在多消费者或者多线程的消费的时候,才会出现顺序问题。
3.而对于解决顺序问题,又有相应的策略,
kafka是使用partition来指定某个消费者消费,
Rabbitmq是使用不同的队列绑定到消费者

原文:https://www.cnblogs.com/bobdeng/p/8431829.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Linux】Linux的五个查找命令:find,locate,whereis,which,type 及其区别
  • 【工具】开发工具红黑榜 (TCP测试/HTTP测试/SHELL工具/串口工具……)
  • 【QT】QT学习-Qt第一个小程序(使用vs2017开发)-研读
  • Qt5.7 + VS2015 环境搭建
  • 【Modbus 】Modbus 协议
  • 【QT】QT学习:Qt和其它GUI库的对比
  • 【代码格式化】linux代码格式化(Astyle)+wind格式转unix格式(Doc2Unix)----git提交代码前的处理...
  • gitlab-ci 持续集成完整实践---待学习
  • 【服务器】身份认证系统(三)什么是OAuth2 + oauth的权限系统(鉴权系统)
  • 【Vue.js】Vue 学习笔记
  • 【粘包和拆包】数据帧粘包和拆包处理方式
  • 【网关】什么是网关、网桥和交换机(集线器、网桥、交换机、路由器、网关大解析)...
  • 【软件设计】架构设计 分析组件化与模块化之间的区别
  • 【word】word 笔记
  • 【前端】webpack、npm、node、nodejs之间的关系
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • github指令
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue数据传递--我有特殊的实现技巧
  • Vue--数据传输
  • XForms - 更强大的Form
  • 闭包,sync使用细节
  • 大主子表关联的性能优化方法
  • 反思总结然后整装待发
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端之Sass/Scss实战笔记
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用parted解决大于2T的磁盘分区
  • 小程序开发中的那些坑
  • 原生js练习题---第五课
  • mysql面试题分组并合并列
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • # linux 中使用 visudo 命令,怎么保存退出?
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #include<初见C语言之指针(5)>
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (Charles)如何抓取手机http的报文
  • (vue)页面文件上传获取:action地址
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (七)Java对象在Hibernate持久化层的状态
  • (四)事件系统
  • (算法)Travel Information Center
  • (一)u-boot-nand.bin的下载
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)Scala的“=”符号简介
  • .jks文件(JAVA KeyStore)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .net后端程序发布到nignx上,通过nginx访问
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)