kafka与其他消息队列对比

  • RabbitMQ:分布式,支持多种MQ协议,重量级
  • ActiveMQ:与RabbitMQ类似
  • ZeroMQ:以库的形式提供,使用复杂,无持久化
  • Redis:单机、纯内存性好,持久化较差
  • Kafka:分布式,消息不是使用完就丢失【较长时间持久化】,吞吐量高【高性能】,轻量灵活
  • -------------------------------------------------------------------
  • RabbitMQ 也是常见的消息对列,它支持多种MQ的协议,JMS,等多种协议等等,它的缺点比较重
  • ActiveMQ 也和 RabbitMQ 类似,支持的协议比较多
  • ZeroMQ 是一个socket的通信库,它是以库的形式提供的,所以说你需要写程序来实现消息系统,它只管内存和通信那一块,持久化也得自己写,还是那句话它是用来实现消息队列的一个库,其实在storm里面呢,storm0.9之前,那些spout和bolt,bolt和bolt之间那些底层的通信就是由ZeroMQ来通信的,它并不是一个消息队列,就是一个通信库,在0.9之后呢,因为license的原因,ZeroMQ就由Netty取代了,Netty本身就是一个网络通信库嘛,所以说更合适是在通信库这一层,不应该是MessageQueue这一层
  • Redis 本身是一个内存的KV系统,但是它也有队列的一些数据结构,能够实现一些消息队列的功能,当然它在单机纯内存的情况下,性能会比较好,持久化做的稍差,当持久化的时候性能下降的会比较厉害
  • Kafka 的亮点,天生是分布式的,不需要你在上层做分布式的工作,另外有较长时间持久化,前面的几个MQ基本消费就干掉了,另外在长时间持久化下性能还比较高,顺序读和顺序写,另外还通过sendFile这样0拷贝的技术直接从文件拷贝到网络,减少内存的拷贝,还有批量读批量写来提高网络读取文件的性能

为什么支持高吞吐量

  • 理解NIO中的零拷贝

    • 从WIKI的定义中,我们看到“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。
  • 我们一般copy数据、write数据和read数据:从磁盘拿数据,先copy到当前用户的内存中,再经过内存转成一个Socket Buffer,在写到网卡Buffer,然后在传送出去
  • 零拷贝:用户向内核去发送一个命令,我要操作那些数据,然后直接从磁盘转成Socket Buffer,再从Socket Buffer到网卡Buffer,再传出去【少了两次的copy

猜你喜欢

转载自blog.csdn.net/Future_LL/article/details/87940268