作者:haolujunhttp://cnblogs.com/haolujun/p/9632835.html

前言

开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措。对于RabbitMQ和Kafka,到底应该选哪个?

RabbitMQ架构

RabbitMQ是一个分布式系统,这里面有几个抽象概念。

  • broker:每个节点运行的服务程序,功能为维护该节点的队列的增删以及转发队列操作请求。
  • master queue:每个队列都分为一个主队列和若干个镜像队列。
  • mirror queue:镜像队列,作为master queue的备份。在master queue所在节点挂掉之后,系统把mirror queue提升为master queue,负责处理客户端队列操作请求。注意,mirror queue只做镜像,设计目的不是为了承担客户端读写压力。

如上图所示,集群中有两个节点,每个节点上有一个broker,每个broker负责本机上队列的维护,并且borker之间可以互相通信。集群中有两个队列A和B,每个队列都分为master queue和mirror queue(备份)。那么队列上的生产消费怎么实现的呢?

队列消费

如上图有两个consumer消费队列A,这两个consumer连在了集群的不同机器上。RabbitMQ集群中的任何一个节点都拥有集群上所有队列的元信息,所以连接到集群中的任何一个节点都可以,主要区别在于有的consumer连在master queue所在节点,有的连在非master queue节点上。

因为mirror queue要和master queue保持一致,故需要同步机制,正因为一致性的限制,导致所有的读写操作都必须都操作在master queue上(想想,为啥读也要从master queue中读?和数据库读写分离是不一样的。),然后由master节点同步操作到mirror queue所在的节点。即使consumer连接到了非master queue节点,该consumer的操作也会被路由到master queue所在的节点上,这样才能进行消费。

队列生产

原理和消费一样,如果连接到非 master queue 节点,则路由过去。

所以,到这里小伙伴们就可以看到 RabbitMQ的不足:由于master queue单节点,导致性能瓶颈,吞吐量受限。虽然为了提高性能,内部使用了Erlang这个语言实现,但是终究摆脱不了架构设计上的致命缺陷。

Kafka

说实话,Kafka我觉得就是看到了RabbitMQ这个缺陷才设计出的一个改进版,改进的点就是:把一个队列的单一master变成多个master,即一台机器扛不住qps,那么我就用多台机器扛qps,把一个队列的流量均匀分散在多台机器上不就可以了么?注意,多个master之间的数据没有交集,即一条消息要么发送到这个master queue,要么发送到另外一个master queue。

这里面的每个master queue 在Kafka中叫做Partition,即一个分片。一个队列有多个主分片,每个主分片又有若干副分片做备份,同步机制类似于RabbitMQ。

如上图,我们省略了不同的queue,假设集群上只有一个queue(Kafka中叫Topic)。每个生产者随机把消息发送到主分片上,之后主分片再同步给副分片。

队列读取的时候虚拟出一个Group的概念,一个Topic内部的消息,只会路由到同Group内的一个consumer上,同一个Group中的consumer消费的消息是不一样的;Group之间共享一个Topic,看起来就是一个队列的多个拷贝。

所以,为了达到多个Group共享一个Topic数据,Kafka并不会像RabbitMQ那样消息消费完毕立马删除,而是必须在后台配置保存日期,即只保存最近一段时间的消息,超过这个时间的消息就会从磁盘删除,这样就保证了在一个时间段内,Topic数据对所有Group可见(这个特性使得Kafka非常适合做一个公司的数据总线)。

队列读同样是读主分片,并且为了优化性能,消费者与主分片有一一的对应关系,如果消费者数目大于分片数,则存在某些消费者得不到消息。

由此可见,Kafka绝对是为了高吞吐量设计的,比如设置分片数为100,那么就有100台机器去扛一个Topic的流量,当然比RabbitMQ的单机性能好。

总结

本文只做了Kafka和RabbitMQ的对比,但是开源队列岂止这两个,ZeroMQ,RocketMQ,JMQ等等,时间有限也就没有细看,故不在本文比较范围之内。

所以,别再被这些五花八门的队列迷惑了,从架构上找出关键差别,并结合自己的实际需求(比如本文就只单单从吞吐量一个需求来考察)轻轻松松搞定选型。最后总结如下:

  • 吞吐量较低:Kafka和RabbitMQ都可以。
  • 吞吐量高:Kafka。

本文内容参考自RabbitMQ和KafKa官方文档,所以真要搞懂一个中间件的原理最好去看官方文档,文档里面有详细的设计方案,我们可以自己进行设计方案的对比,从而找出符合自己实际情况的中间件。

推荐阅读(点击即可跳转阅读)

1.SpringBoot内容聚合

2.面试题内容聚合

3.设计模式内容聚合

4.Mybatis内容聚合

5.多线程内容聚合

rabbitmq topic 收不到数据_RabbitMQ和Kafka到底怎么选?相关推荐

  1. rabbitmq中默认unack超时时间_RabbitMQ 与 Kafka 的技术差异以及使用注意点

    导言 作为一个有丰富经验的微服务系统架构师,经常有人问我,"应该选择RabbitMQ还是Kafka?".基于某些原因, 许多开发者会把这两种技术当做等价的来看待.的确,在一些案例场 ...

  2. RabbitMQ和Kafka到底怎么选?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:haolujun cnblogs.com/haolujun/ ...

  3. RabbitMQ 和 Kafka 到底怎么选?

    前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? Rabbi ...

  4. 大数据Hadoop之——Kafka Streams原理介绍与简单应用示例

    文章目录 一.Kafka Streams概述 1)Kafka Streams是什么 2)流式计算与批量计算区别 3)Kafka Streams特点 二.Kafka Streams流处理拓扑 1)相关概 ...

  5. C# Socket Server 收不到数据

    #/usr/bin/env python # -*- coding: utf-8 -*-# C# Socket Server 收不到数据 # 说明: # 最近在调Python通过Socket Clie ...

  6. 表单及数据提交、表单的作用、服务端接收提交的数据、php处理数据流程、文件域及文件域中数据处理、php展示数据(响应)

    表单及数据提交: 表单的作用: 用于收集相关信息:html中有专门提交数据的标签,可以很容易的收集用户输入的信息,这个标签有两个重要的属性:action表单提交的地址和method以什么方式提交表单, ...

  7. 速来了解头条号的推荐机制,让你的自媒体内容收下更多数据量!

    选择在头条号自媒体平台上扎根的自媒体人,现在对头条号的推荐机制有做过什么了解吗?如果不太了解也没关系,看完这篇内容就会明白了. 头条号的推荐算法是很不错的,接下来我们一起来了解下头条的推荐机制,一起把 ...

  8. nodejs form post 到java 服务器端一直收不到数据,通过更改 headers 的 content-type; post 只能接收 application/x-www-form-url

    'use strict'; var router = require('express').Router(); var http = require('http'); // 声明类型 var host ...

  9. RabbitMQ实现ElasticSearch和MySQL数据同步

    RabbitMQ实现ElasticSearch和MySQL数据同步 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 RabbitMQ实现ElasticSearch和MySQ ...

最新文章

  1. 当 Redis 发生高延迟时,到底发生了什么
  2. 2017年11月01日普及组 I Got a Matrix!
  3. percona-xtrabackup-8.0.7简单快捷使用
  4. 排队机叫号系统服务器安装设置,易达办事大厅排队叫号系统
  5. php react-native,React-Native+Mobx实现商城APP
  6. [linux]【编译】【高级01】 - 动态库的设定和依赖性的检查 20160921更新 文章没有最终结案
  7. 博客园复用别人的博客模板
  8. 面试题心得--spring注解的原理
  9. IntelliJ IDEA配置Groovy教程
  10. XAMPP升级PHP版本的步骤
  11. 数仓(五):数据建模--ER模型/维度建模,概念模型/逻辑模型/ 物理模型
  12. 002-CentOS7 固定IP
  13. FCW前车碰撞预警的两个重要指标——THW、TTC
  14. DEM数据获取、数据镶嵌、掩膜提取
  15. 苹果Swift语言入门教程
  16. JavaScript中的表格:文本域
  17. 如何自动生成参考文献格式
  18. Bert入门:使用Bert运行MRPC的demo成功案例
  19. Visual Studio 2010的Productivity Power Tool扩展
  20. 单一职责原则(SIngel Responsibility Principle  SRP)

热门文章

  1. android从一个活动到另一个活动,Android应用程序在将一个活动打开到另一个活动时崩溃...
  2. java(线程特性,Volatile作用,java内存模型)
  3. NanoPC-T3 64位裸机编程 —— 启动和运行状态切换
  4. 剑指offer 二叉树的深度
  5. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver
  6. js中return、return false 、return true各自代表什么含义
  7. cogs 167. [USACO Mar07] 月度花费
  8. 优盘提示插入多卷集的最后一卷解决办法(5)
  9. Objective-C语法快速参考
  10. Unity3D与VS2008结合,加快Unity3D C#开发!