redis&rabbitMq&kafka
1、消息订阅模式比较
- Redis
- redis是内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,消息都存放在内存中,写入读取速度快,但是受内存容量的限制,容易造成内存充爆。
- Kakfa
- kafka是一个分布式的流式处理平台,它的设计初衷就是一个日志系统,消息内容是可以持久化一段时间的,消息的订阅消费位置的确定是通过消费者offset来定位的,也可以定位到之前消息再次消费。
- Rabbitmq
- rabbitmq的一个特殊之处是,生产者并不是直接将消息发送到队列中,而是通过exchange中继,exchange转发到队列。所以rabbitmq在消息的路由方面比之前两者都好很多。
2、队列机制比较
- Redis
- redis的消息数据就存放在内存中,因为redis数据的原子性,数据只能被消费一次,不能重复。
- Kafka
- kafka通过consumer group的方式实现了work queue。·同一个组的消费者能够协调完成任务。另外它是一个分布式的文件系统,他的队列可以理解为topic,我们都知道topic是可以划分为多个partition的,多个partiton是可以分布在不同的node节点上的。这样当一个consumer来消费的时候,就可以到不同的节点上去获取消息,也就达到了负载均衡的作用,避免单点压力。于此同时,就会产生另外的一个问题,当有消费者在进行消费的时候,如何保证这个队列同时不背其他的消费者消费,这就需要zookeeper的分布式锁来解决了。
- Rabbitmq
- rabbitmq也是有自己的一个机制来实现队列的负载均衡,通过轮询机制给worker发布消息,以此来实现。当有大量的消费者去消费同一个队列的时候,这个队列的性能就会成为一个瓶颈
各自特点
- Rabbitmq
- 因为它的一个核心exchanger。它可以将消息路由到不同的队列去,比如我既要打印输出,还要持久化,那我就可以直接路由到两个queue中去。
- 持久化
- redis
- redis的多种类型的数据结构,方便我们对队列的插队,删除,置顶的操作
- 是一个高性能的key-value数据库,它的出现很大程度补偿了memcached这类key-value存储的不足。虽然它是一个数据库系统,但本身支持MQ功能,完全可以当做一个轻量级的队列服务器使用。
- Kafka
- 以时间复杂度为O(1)的方式提供消息持久化能力
- 高吞吐率
- 支持Kafka Server间的消息分区,及分布式消费,同时保证消息顺序传输
- 支持离线数据处理和实时数据处理
- 支持在线水平扩展
可用性,
- rabbitMQ支持miror的queue,主queue失效,miror queue接管。
- kafka的broker支持主备模式。
集群负载均衡方面,
- Kafka
- Kafka:天然的‘Leader-Slave’无状态集群,每台服务器既是Master也是Slave
- kafka的集群依赖于zookeeper,zookeeper支持热扩展
- rabbitmq
- rabbitmq:支持简单集群,'复制'模式,对高级集群模式支持不好。