============================
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系统视图sys.master_files不能正确显示数据库脱机状态

    最近发现在SQL Server数据库(目前测试过SQL Server 2008, 2012,2014,2016各个版本)中,即使数据库处于脱机(OFFLINE)状态,但是sys.master_file ...

  2. FPGA设计千兆以太网MAC(3)——数据缓存及位宽转换模块设计与验证

    本文设计思想采用明德扬至简设计法.上一篇博文中定制了自定义MAC IP的结构,在用户侧需要位宽转换及数据缓存.本文以TX方向为例,设计并验证发送缓存模块.这里定义该模块可缓存4个最大长度数据包,用户根 ...

  3. Git 简单粗暴使用

    1.现在总结一下今天学的两点内容: 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file>,注意,可反复多次使用,添 ...

  4. casbin-权限管理

    概要 权限管理几乎是每个系统或者服务都会直接或者间接涉及的部分. 权限管理保障了资源(大部分时候就是数据)的安全, 权限管理一般都是和业务强关联, 每当有新的业务或者业务变化时, 不能将精力完全放在业 ...

  5. ASP.NET基础知识汇总之WebConfig自定义节点详细介绍

    之前介绍过Webconfig的具体知识ASP.NET基础知识汇总之WebConfig各节点介绍.今天准备封装一个ConfigHelper类,涉及到了自定义节点的东东,平时虽然一直用,但也没有系统的总结 ...

  6. 使用ranger对kafka进行鉴权

    使用ranger对kafka进行鉴权测试环境:ranger-kafka-plugin为0.6.3版本,kafka版本为kafka_2.10-0.10.1.1,且kafka broker为一个节点.一. ...

  7. php之微信公众号发送模板消息

    讲一下开发项目中微信公众号发送模板消息的实现过程(我用的还是Thinkphp5.0). 先看一下效果,如图: 就是类似于这样的,下面讲一下实现过程: 第一步:微信公众号申请模板消息权限: 立即申请: ...

  8. Vue—组件传值及vuex的使用

    一.父子组件之间的传值 1.父组件向子组件传值: 子组件在props中创建一个属性,用以接收父组件传来的值 父组件中注册子组件 在子组件标签中添加子组件props中创建的属性 把需要传给子组件的值赋给 ...

  9. nodejs搭建web服务器

    一.代码结构 //1.引入相关模块 var http=require("http") var url=require("url") var fs=require ...

  10. 获取SQL数据库中的数据库名、所有表名、所有字段名、列描述

    1.获取所有数据库名:    (1).Select Name FROM Master.dbo.SysDatabases orDER BY Name 2.获取所有表名:    (1).Select Na ...