============================
RabbitMQ 术语
============================
RabbitMQ 有很多术语和Kafka不一样, 理解这些术语十分重要.
1. Broker: 一个RabbitMQ实例就是一个 Broker.
2. VHost(Virtual Host): 一个RabbitMQ实例可包含多个VHost, 每个VHost都有自己的身份验证机制. 在一个VHost中包含多个exchange和队列和binding. 每个RabbitMQ服务器都有一个默认的vhost 是 "/".
3. Exchange, 不要翻译为信箱, 它不具有存储功能, 应该翻译为交换机, 它就是一个路由规则表. 消息是经过 exchange 处理转到 queue 中的, 它本身不存储消息.
4. Binding, 绑定, 可以理解为一个路由规则, 通过Binding的桥接, Exchange和Queue之间形成了一个多对多的关系.
5. Queue, 消息队列, 用来保存消息直到发送给消费者, 它是消息的容器, 也是消息的终点, 一个消息可以投递到一个或多个队列.
6. Connection, 网络连接, 比如一个TCP连接
7. Channel, 信道, 它是一个建立在TCP connection之上多路复用的虚拟连接, 因为建立和销毁一个TCP连接的代价都很高, 所以引入了Channel概念, 以复用一个TCP连接. 所有的命令和消息都是通过信道传递的.

Exchange类型:
1. direct : [默认类型]如果消息中的路由键(routing key)和Binding规则的 binding key完全一致, 则消息会被转到名为routing key的队列中.
2. fanhout: 对于 fanout 类型的exchange, 它可以直接绑定多个队列, 如果一个消息发到了 fanhout 类型的exchange, 则该消息会被广播到它下面的所有队列中.
3. topic: 这是比direct更灵活的一种路由规则, 它是按照模式匹配来做路由, 消息的路由键和binding的key键都使用点号分隔, 比如写成 usa.news.student样子, binding的key键可以使用通配符#号和*号, *号匹配一个单词, #号匹配0个或多个单词. 比如: 消息routing key为 usa.news.student, 能和 usa.# 的binding匹配, 但不能和usa.* 的binding匹配.
4. headers, 匹配消息的header, 而不是路由键, 性能较差, 完全可以使用 direct 类型代替.

============================
RabbitMQ 和 Kafka 的对比:
============================
1. 队列的数据分布和吞吐能力对比:
RabbitMQ 队列容量不能超过单机存储.
RabbitMQ 队列的最大的吞吐能力不会超过单机的网络吞吐能力.

RabbitMQ 集群可以包含多个节点, 每个节点都有一个 broker 负责本机上的管理工作, 并且broker之间可以相互通信. 一个队列可在多个broker上分布, 但仅在一个broker上是 master queue, 其他broker 都是mirror, 注意是mirror. 不管是消息生产者还是消息消费者, 都是从master queue中读写的, mirror 队列不承担负载平衡, 仅仅是起到消息备份作用, 所以 rabbitmq 队列容量不能超过单机存储, 每个队列的最大的吞吐能力不会超过单机的网络吞吐能力.

2. 消费模式
RabbitMQ 支持 由Broker 主动 push 消息到消费端, 可以由消费端主动pull 消费.
kafka 仅仅支持消费端的pull模式.

3. 消息回溯
使用 MQ 做接口, 经常有人会说"消息丢失", Kafka 验证这个问题方法很简单, 换个consumer group 就可以从新消费 topic 中的消息.
但RabbitMQ中的消息, 一旦被消费了就会被标记删除, 没法儿回溯. 有一个不完美的的解决方法, 我们的消息经由 topic exchange 存储到两个队列中, 一个作为主要消费队列, 另一个队列专门用于验证(队列设置TTL).

4. 消息的顺序性
Kafka: 只有单 partition 的 topic 能保证时序性
RabbitMQ: 将消息使用同步的方式打到一个queue中, 并采用一个消费者去消费, 能保证顺序.

5. 使用场景
吞吐量超过单机处理能力, 只能选 Kafka, 队列容量超过单机存储, 只能选 Kafka.
对可靠性非常关注, 最好选 RabbitMQ.
其他场景理论上两者都适合, 需要认真评估选型.

============================
参考
============================

如何保证消息队列的高可用和幂等性以及数据丢失,顺序一致性
https://www.jianshu.com/p/7a6deaba34d2
再谈消息队列技术
https://www.cnblogs.com/tianqing/p/7110468.html

消息队列
https://www.jianshu.com/p/69bf7d8beec5
开源软件成熟度评测报告-分布式消息中间件
https://blog.csdn.net/yssycz/article/details/80133084

消息队列之 RabbitMQ
https://www.jianshu.com/p/79ca08116d57
springboot(八):RabbitMQ详解
https://www.cnblogs.com/ityouknow/p/6120544.html
RabbitMQ和Kafka到底怎么选?
https://www.cnblogs.com/haolujun/p/9632835.html
(译)RabbitMQ VS Apache Kafka (四)—— 应用场景如何选择?
https://blog.csdn.net/kangkanglou/article/details/83064489

RabbitMQ 和 Kafka的更多相关文章

  1. RabbitMQ和Kafka

    转自通九大神的博客 起因 最近公司RabbitMQ的集群出了点问题,然后有些亲就说RabbitMQ慢且不好用,是一个瓶颈,不如换成Kafka.而我本人,使用RabbitMQ有一点久了,认为这个事情应当 ...

  2. RabbitMQ和Kafka到底怎么选(二)?

    前言 前一篇文章<RabbitMQ和Kafka到底怎么选?>,我们在吞吐量方面比较了Kafka和RabbitMQ,知道了Kafka的吞吐量要高于RabbitMQ.本文从可靠性方面继续探讨两 ...

  3. RabbitMQ和Kafka到底怎么选?

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

  4. 关于ActiveMQ、RocketMQ、RabbitMQ、Kafka一些总结和区别

    这是一篇分享文 转自:http://www.cnblogs.com/williamjie/p/9481780.html  尊重原作,谢谢 消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: ...

  5. RabbitMQ和Kafka对比以及场景使用说明

    我目前的项目最后使用的是RabbitMQ,这里依然是结合网上大神们的优秀博客,对kafka和rabbitmq进行简单的比对.最后附上参考博客. 1.架构模型 rabbitmq RabbitMQ遵循AM ...

  6. RabbitMQ和Kafka,更加便捷高效的消息队列使用方式,请放心食用

    一.RabbitMQ实例介绍RabbitMQ实例由华为云分布式消息服务(DMS)团队打造,实例采用物理隔离的方式部署,租户独占RabbitMQ实例.一键式部署,完全兼容开源RabbitMQ的使用方式, ...

  7. rabbitmq和kafka怎么选?【转】

    MQ框架非常之多,今天简单说一下有代表性的两个MQ(rabbitmq和kafka).经常会有人问rabbitmq和kafka到底哪个好呢?其实没有好与不好之分,只有哪个更合适,首先要根据自己项目的业务 ...

  8. RabbitMQ和Kafka可靠性

    RabbitMQ和Kafka可靠性 https://www.cnblogs.com/haolujun/p/9641840.html 我们通过前文知道,RabbitMQ的队列分为master queue ...

  9. 消息队列 ActiveMQ 、RocketMQ 、RabbitMQ 和 Kafka 如何选择?

    「 预计阅读 6 分钟 」 旁白:这是一篇拖更了N久的文章...0.0(看不见我~) 往期回顾 前端框架 jQuery 和 Vue 如何选择? 安全框架 Shiro 和 Spring Security ...

随机推荐

  1. 自学MongoDB(1)

    MongoDB是nosql(非关系型数据库)中的一种,面向文档的数据库,介于传统的结构化数据库(关系型数据库)与非关系型数据库(文件储存)之间的一种,具有数据结构非常松散和非常灵活的特点;常用于存储分 ...

  2. oracle相关函数

    (大写的PS:oracle存储过程测试进不去解决方案:重新编译:) TRUNC(sysdate, 'd') + 1   ////表示今天所在周的周一的年月日,如今天是2016.04.21周四,则TRU ...

  3. js 秒数格式化

    function formatSeconds(value) { var theTime = parseInt(value);// 秒 var theTime1 = 0;// 分 var theTime ...

  4. 这可能是最简单的Page Object库

    做过web自动化测试的同学,对Page object设计模式应该不陌生. Page object库应该根据以下目标开发: Page object应该易于使用 清晰的结构 PageObjects 对于页 ...

  5. 03-MySQL表操作

    MySQL表操作 1.介绍 表就相当于文件,表中的一条记录就相当与文件的一行内容,不同的是,表中的一条记录有对应的标题,成为表的字段. 2.创建表 2.1语法 create table 表名( 字段名 ...

  6. ios之库Protobuf的使用

    https://blog.csdn.net/dangbai01_/article/details/81099001 (1)Protobuf是什么? Protobuf 即 google protocol ...

  7. c++ _pFirstBlock == pHead

    今天写程序时碰到了这个异常,导致调试的程序卡死.在网上找了很久答案,都没解决.大致判定是对象被多次析构,但又确认程序逻辑没有问题. 后来参考了 http://www.cnblogs.com/qinta ...

  8. qsort.c源码

    /* 版权所有(C) 1991-2019 自由软件资金会. 该文件属于是GUN C语言函数库,由Douglas C. Schmidt(schmidt@ics.uci.edu)所写. GUN C语言函数 ...

  9. win 执行puppet

    C:\scripts\win_exec_proxy.bat  \\adsoft.base-fx.com\puppet\puppet\files\Windows_10_x64\C\user\logon\ ...

  10. Spring Boot 2.x 编写 RESTful API (三) 程序层次 & 数据传输

    用Spring Boot编写RESTful API 学习笔记 程序的层次结构 相邻层级的数据传输 JavaBean 有一个 public 的无参构造方法 属性 private,且可以通过 get.se ...