rabitmq,redis以及kafuka作为消息队列的区别

kafuka

kafuka涉及到的名词词意解释:

Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲、异步通信、汇集日志、系统解耦等方面。相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的读写性能。

针对Kafka性能方面进行简单分析,相关数据请参考:https://segmentfault.com/a/1190000003985468,下面介绍一下Kafka的架构和涉及到的名词:

Topic:用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上。

Partition:是Kafka中横向扩展和一切并行化的基础,每个Topic都至少被切分为1个Partition。

Offset:消息在Partition中的编号,编号顺序不跨Partition。

Consumer:用于从Broker中取出/消费Message。

Producer:用于往Broker中发送/生产Message。

Replication:Kafka支持以Partition为单位对Message进行冗余备份,每个Partition都可以配置至少1个Replication(当仅1个Replication时即仅该Partition本身)。

Leader:每个Replication集合中的Partition都会选出一个唯一的Leader,所有的读写请求都由Leader处理。其他Replicas从Leader处把数据更新同步到本地,过程类似大家熟悉的MySQL中的Binlog同步。

Broker:Kafka中使用Broker来接受Producer和Consumer的请求,并把Message持久化到本地磁盘。每个Cluster当中会选举出一个Broker来担任Controller,负责处理Partition的Leader选举,协调Partition迁移等工作。

ISR(In-Sync Replica):是Replicas的一个子集,表示目前Alive且与Leader能够“Catch-up”的Replicas集合。由于读写都是首先落到Leader上,所以一般来说通过同步机制从Leader上拉取数据的Replica都会和Leader有一些延迟(包括了延迟时间和延迟条数两个维度),任意一个超过阈值都会把该Replica踢出ISR。每个Partition都有它自己独立的ISR。

  1. 负载均衡:kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。
  2. Scale out:支持在线水平扩展。
  3. kafka的broker支持主备模式。
  4. 性能:kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。
  5. 支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输。
  6. 同时支持离线数据处理和实时数据处理。

更多关于Kafka的数据,参考:https://segmentfault.com/a/1190000003985468

RabbitMQ

 

  1. RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。
  2. RabbitMQ实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。
  3. RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。
  4. rabbitMQ以broker为中心;有消息的确认机制,可靠性比较高。
  5. 可用性方面,rabbitMQ支持miror的queue,主queue失效,miror queue接管。

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

redis

redis是一个基于Key-Value对的NoSQL数据库,开发维护很活跃。虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用

  1. redis的list数据结构可以实现轻量级的消息队列,处理少量消息时读写性能很高,当写入消息数量较大时(单机本地测试10k左右)写入性能会大大降低,读取性能受影响不大,依然很优秀。
  2. 比较适合在Web场景下作为队列服务使用
  3. redis作为消息队列不能实现消息的分类,还有没有确认机制,知道接收消息的消费者执行成功与否

你可能感兴趣的:(工具)