消息队列的目的:解决消息的分布式消费,完成项目与服务的解耦。采取异步模式完成消息队列提供者和消费者的通信,提高了系统的响应能力和信息吞吐量。提高系统的可伸缩性。
rabbitmq适合对可靠性要求比较高的消息传递上,适合企业级的消息发送订阅。
kafka用于处理活跃的流式数据,适合高吞吐量。常用在日志采集,数据采集上。
Kafka针对rabbitmq的改进:把一个队列的单一master变成多个master,把一个队列的流量均匀分散在多台机器上。
1、架构
rabbitmq
- Producer:消息生产者
- Consumer:消息消费者
- Exchange:消息交换机,指定消息按什么规则传递到具体哪个队列中
- 点对点转发:根据routingkey采取点对点的信息转发,每个队列根据routingkey获取不同类的数据。
- 广播:不论RoutingKey是什么,这条消息都会被投递到所有与此Exchange绑定的队列中。
- 主题交换器(topic exchange):根据Binding指定的RoutingKey,Exchange对key进行模式匹配(正则表达式)后投递到相应的队列。消息可能被投入一个或多个队列。
- Queue:消息队列,消息的载体
- Routingkey:路由关键字,Exchange根据Routingkey来投递消息给队列
- Binding:绑定。作用就是将Exchange和Queue按照某种路由规则绑定起来。
- Channel:消息通道,也称信道。在客户端的每个连接里可以建立多个Channel,每个Channel代表一个会话任务
消费 | 生产 |
集群中有两个节点,每个节点上有一个broker,每个broker负责本机上队列的维护,并且borker之间可以互相通信。集群中有两个队列A和B,每个队列都分为master queue和mirror queue。在master queue所在节点挂掉之后,系统把mirror queue提升为master queue,负责处理客户端队列操作请求。注意,mirror queue只做镜像,设计目的不是为了承担客户端读写压力
RabbitMQ集群中的任何一个节点都拥有集群上所有队列的元信息。consumer连在master queue所在节点或mirror queue所在节点没有影响,因为所有的读写操作都必须都操作在master queue上,然后由master节点同步操作到mirror queue所在的节点。因此即使consumer连接到mirror queue所在节点,该consumer的操作也会被路由到master queue所在的节点上。
生产者同理,连接到mirror queue所在节点的生产者的操作也会被路由到master queue。
kafka
和rmq相比,kafka相当于把一个队列的单一master queue变成多个master,分布在不同节点上,不同master间数据没有交集,即 一条消息要么发送到这个master queue,要么发送到另外一个master queue。 这里面的每个master queue 在Kafka中叫