============================
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. 关于SQL Server 数据库归档的一些思考和改进

    一.需求背景 SQL Server开源的归档工具不多,DBA一般都是通过计划任务来触发执行,执行的脚本多是SP或者是SSIS包.SSIS包的性能稍好一些,但是维护更新成本高些.所以更常见的是通过SP脚 ...

  2. linux 命令基础大全

    pwd:显示当前路径 cd :切换目录 用法:cd cd ../ 切换到上级目录 cd /   切换到根目录 cd ~  (或只有cd )切换到当前用户主目录(home底下以用户名命名的文件夹) /r ...

  3. js坚持不懈之13:JavaScript查找HTML元素的方法

    1. 通过 id 查找 HTML 元素 <!DOCTYPE html> <html> <body> <p id = "intro"> ...

  4. web安全—sql注入漏洞

    SQL注入-mysql注入 一.普通的mysql注入 MySQL注入不像注入access数据库那样,不需要猜.从mysql5.0以上的版本,出现一个虚拟的数据库,即:information_schem ...

  5. 随机排序std::vector,扑克牌,麻将类尤其合用

    有些需要重新对std::vector对象重新排序,特别是游戏,例如说:扑克牌,麻将,抽奖等,C++标准已经为std::vector写好了随机排序的方式,这里做个笔记: #include <alg ...

  6. shader高级纹理学习总结

    最近看了shader的高级纹理 做个总结 复习! shader迟早是要拿下的

  7. 不停服务,动态加载properties资源文件

    系统运行过程中,我们用注解@Value("${****}")可以获取资源文件中的内 容,获取的内容会被存储在spring缓存中,因此如果我们修改了资源文件,要 想读取到修改后的内容 ...

  8. Node.js如何执行cmd

    最近正好因业务的一个需求需要研究如何根据vscode的插件名来下载对应的插件以解决之前将插件打包上传到服务器上面导致的延迟问题(插件体积小还好说,如果体积过大,即便是压缩打成zip包,如果同一时刻很多 ...

  9. elementUi、iview、ant Design源码button结构篇

    在看elementUI的button组件的时候,一起和iview.ant Design的button组件比 较功能.样式.代码结构,看他们的一些不同点,不同的写法哪种会好些,button的对外开放的功 ...

  10. 02-Django框架介绍

    02-Django框架介绍 1.MVC框架介绍 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式 具有耦合性低.重用性高.生 ...