RabbitMQ简介

RabbitMQ是开源的消息代理和队列服务器,是由Erlang语言开发的,基于AMQP协议(Advanced Message Queuing Protocol高级消息队列协议)的标准实现。具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用。

为什么使用RabbitMQ:

  1. 安装部署简单,上手门槛低,功能丰富,符合AMQP标准;
  2. 企业级消息队列,经过大量实践考验的高可靠;
  3. 集群易扩展,可以轻松的增减集群节点;
  4. 有强大的WEB管理页面。

RabbitMQ作为消息队列系统优势:

从http://www.doc88.com/p-5826232080382.html 中对于RabbitMQ评价有两个维度:十万米高空看RabbitMQ和显微镜看RabbitMQ:

  • 十万米高空看RabbitMQ:

    1. 有商业化的运营,不会轻易死掉;
    2. 遵循AMQP协议,不会被绑架;
    3. 强大的社区支持,为技术进步提供动力;
    4. 大量成功的应用案例,例如阿里、网易、滴滴、美团等互联网企业都有使用。
  • 显微镜看RabbitMQ:
    1. Erlang开发,AMQP的标准实现,在支持持久化的消息队列中性能算很优秀的;
    2. 支持消息持久化、支持消息确认机制、灵活的任务分发机制等,支持功能非常丰富;
    3. 保证数据不丢失的前提做到高可靠性、可用性;
    4. 集群模式丰富,表达式配置,HA模式,镜像队列模型,集群扩展很容易,并且可以通过增加节点实现成倍的性能提升;
    5. WEB管理和监控, WEB管理为后期运维提供很大的便利。

RabbitMQ劣势:

性能比kafka和zero面前性能差(持久化消息和ACK确认的情况下生产和消费消息单机大约在1-2万左右)

结论:如果希望使用一个可靠性高、功能强大、易于管理的消息队列系统那么就选择RabbitMQ,如果想用一个性能高,但偶尔丢点数据不是很在乎可以使用kafka或者zeroMQ。

AMQP协议

AMQP(Advanced Message Queue):高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制,可以与不同产品、不同语言之间进行消息交互。

AMQP的基本概念

RabbitMQ是AMQP协议的一个开源实现,其内部实际上也是AMQP的基本概念。AMQP的模型架构和RabbitMQ的模型架构是一样的,生产者将消息发送给交换器,交换器和队列绑定。当生产者发送消息时所携带的RoutingKey与绑定时的BindingKey相匹配时,消息即被存入相应的队列之中。消费者可以订阅相应的队列来获取消息。

相关名词概念


  • Publisher
    也称Producer,消息生产者,数据的发送方。消息生产者连接RabbitMQ服务器然后将消息投递到Exchange。

  • Consumer
    消息消费者,数据的接收方。消息消费者订阅队列,RabbitMQ将Queue中的消息发送到消息消费者。
  • Server
    又称为Broker。接收客户端连接,实现AMQP的服务器实体。维护一条从Producer到Consumer的路线,保证数据能够按照指定的方式进行传输。但是这个保证也不是100%的保证,对于普通的应用已经足够了。当然对于商业系统来说,可以再做一层数据一致性的guard,就可以彻底保证系统的一致性了。
  • Connection
    连接,Producer和Consumer都是通过TCP连接到RabbitMQ Server的。程序的起始处就是建立这个TCP连接。Connection可以创建多个Channel,但不能线程间共享。某些情况下可以并发运行,但多线程共享是非线程安全的。
  • Channel
    信道。建立在上述的TCP连接中,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务。
  • Exchange
    交换机。接收消息,根据路由键转发消息到绑定的队列。Exchange将消息路由到一个或多个Queue中(或者丢弃)。Exchange并不存储消息。RabbitMQ中的Exchange有fanout、direct、topic、headers四种类型
  • Binding
    Exchange和Queue之间的虚拟连接,作用是把Exchange和Queue按照路由规则绑定起来。
  • RoutingKey
    生产者在将消息发送给Exchange的时候,一般会指定一个RoutingKey,Exchange根据这个关键字进行消息投递给Queue。这个RoutingKey需要与Exchange Type及Binding的RoutingKey联合使用才能最终生效。
  • Queue
    也称为Message Queue,消息队列,保存消息并将它们转发给消费者。多个消费者可以订阅同一个Queue,会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理
  • Virtual Host
    其实是一个虚拟概念。类似于权限控制组,一个Virtual Host里面可以有若干个Exchange和Queue,可以用来隔离Exchange和Queue。,同一个Virtual Host里面不能有相同名称的Exchange和Queue。默认为"/"

二、RabbitMQ简介及AMQP协议的更多相关文章

  1. RabbitMQ介绍2 - AMQP协议

    这一节介绍RabbitMQ的一些概念,当然也是AMQP协议的概念.官方网站也有详细解释,包括协议的命令: http://www.rabbitmq.com/tutorials/amqp-concepts ...

  2. RabbitMQ核心概念和AMQP协议(二)

    RabbitMQ是什么? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议,在完全不同的应用之间共享数据,RabbirMQ是使用Erlang语言来编写的,并且RabbitMQ是基于A ...

  3. 消息中间件——RabbitMQ(三)理解RabbitMQ核心概念和AMQP协议!

    前言 本章学习,我们可以了解到以下知识点: 互联网大厂为什么选择RabbitMQ? RabbiMQ的高性能之道是如何做到的? 什么是AMQP高级协议? AMQP核心概念是什么? RabbitMQ整体架 ...

  4. RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解

    一.RabbitMQ简介 是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用Erlang(高并发语言)语言来编写的,并且RabbitMQ是基于AMQ ...

  5. RabbitMQ探索之路(一):RabbitMQ简介

    一:何为RabbitMQ? 作为Windows忠实用户,不得不提微软自带的MSMQ,Windows自带的一个服务,message是存放在文件系统的,这是最原始的消息队列了. 然而如今的分布式以及消息处 ...

  6. RabbitMQ简介、安装、基本特性API--Java测试

    新的阅读体验地址:http://www.zhouhong.icu/post/141 本篇文章所有的代码:https://github.com/Tom-shushu/Distributed-system ...

  7. AMQP 协议介绍

    RabbitMQ 是遵从AMQP 协议的, 换句话说, RabbitMQ 就是AMQP 协议的Erlang 的实现(当然RabbitMQ 还支持STOMP2 .MQTT3 等协议) 0 AMQP 的模 ...

  8. RabbitMQ二:AMQP协议

    参考这个:http://kb.cnblogs.com/page/73759/ 参考这个:http://www.cnblogs.com/charlesblc/p/6286875.html 写的挺好 Ra ...

  9. RabbitMQ入门教程(二):简介和基本概念

    原文:RabbitMQ入门教程(二):简介和基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...

随机推荐

  1. 如何向女朋友介绍MySQL索引

    目录 一.前言 二.正文 三.索引的类型 四.动态查找树 五.B-Tree 1.B-Tree特征 2.B-Tree的查找(select) 3.B-Tree的插入(insert) 4.B-Tree的删除 ...

  2. UML-领域模型的精化

    拙劣的分类和错误的概括是混乱生活的祸根.--H.G.Wells的总结 1.is-a原则 子类定义的成员变量.方法与超类必须一致.即:不能多,也不能少. 子类是“一种”超类.CreditPayment是 ...

  3. 基于python的arcgis底图添加(转)

    本文翻译自:Qingkai‘s Blog 当使用python的Basemap库绘制地图时,选择一个漂亮的底图会为图片增色不少,但是使用map.bluemarble().map.etopo()或者map ...

  4. C++对象数组与对象指针

    (一)对象数组 将具有相同类类型的对象有序地集合在一起便构成了对象数组,以一维对象数组为例,其定义形式为: 类名 对象数组名[]; Point points[100]; 关于对象数组的几点说明: (1 ...

  5. CMake命令之export

    CMake中与export()相关的命令 (注:红色字体是标题,粉色是需要特别需要注意的地方) 总的来说,export()命令想要做的事情可以用一句话概括:Export targets from th ...

  6. c语言的各种技巧

    一.参考网址 1.参考网址1:C 语言的奇技淫巧 二.

  7. share团队冲刺3

    团队冲刺第三天 昨天:完成了对输出文字,按钮控件的添加,能够将其在模拟器上运行 今天:学习输入的添加方式 问题:Android resource linking failed 在改变按钮样式的时候,出 ...

  8. mybatis 在自动生成时设置不生成Example类

    只需要在配置要生成的table表中添加几个配置属性就行了. 在generatorConfig.xml文件中修改 <!--指定数据库表--> <table tableName=&quo ...

  9. Pycharm 安装 autopep8 工具

    引言:此处能看到pep8 的详细介绍:https://www.python.org/dev/peps/pep-0008/.是 Style Guide for Python Code,python代码的 ...

  10. 微信小程序-wx.request-路由跳转-数据存储-登录与授权

    wx.request 相当于发送ajax请求 官方文档示例代码 wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '', y: '' ...