美文网首页
RabbitMQ学习(一)--介绍及安装

RabbitMQ学习(一)--介绍及安装

作者: 右左君 | 来源:发表于2018-05-07 19:58 被阅读0次

    RabbitMQ学习(一)--介绍及安装

    学习之前,先提问题。

    • RabbitMQ是什么?
    • RabbitMQ用来做什么,与同类型相比有什么优势?
    • RabbitMQ如何实现,内部原理是什么?
    • 如何安装,怎么使用?

    再来学习网站

    官网

    Tutorials

    RabbitMQ 中文文档

    rabbitmq-quick

    RabbitMQ与AMQP协议详解

    What?

    官方说是open source message broker--开源消息中间件。

    MQ: 在计算机科学中,消息队列(Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。

    MQ优势:异步,解耦消息发送和消息接收,减少响应时间

    MQ应用场景:不同系统通信、服务器内部模块缓冲异步处理(临时保存数据,减少压力)

    RabbitMQ功能:

    • 支持多种消息传递协议,消息队列,传送确认,灵活的路由,多种交换类型。
    • 支持BOSH, Chef, Docker and Puppet部署,支持Java, .NET, PHP, Python, JavaScript, Ruby, Go等多种语言
    • 支持分布式部署,可部署为高可用性和吞吐量的集群,联合跨多个可用zone和region。
    • 可插拔的认证、授权,支持TLS and LDAP.
    • 工具多,支持持续集成
    • 监控管理:HTTP-API, 命令行工具、UI

    support multiple message protocols

    • AMQP 0-9-1, 0-9 and 0-8, and extensions

    RabbitMQ为支持AMQP协议而实现,推荐使用AMQP 0-9-1。AMQP多版本都相似,后期的版本只是更新了并完善了之前不清楚的地方。

    AMQP 0-9-1是二进制协议,全称 Advanced Message Queuing Protocol 0-9-1 高级消息队列协议,是在应用程序或组织之间传递业务消息的开放标准。

    解决问题:降低不同平台或系统之间的连接成本, 简化连接,使系统之间传递有价值的消息更快,更方便。
    通过遵守AMQP标准,为不同平台和不同语言编写的中间件产品可以相互发送消息。其实现了消息中间件的完整互操作性,定义了网络协议和中间件服务的语义。

    STOMP:The Simple Text Oriented Messaging Protocol,是基于文本的消息协议。RabbitMQ通过插件实现。

    MQIT: 轻量级发布/订阅消息的二进制协议,适用于低功率传感器,RabbitMQ通过插件实现AMQP1.0MQTT 3.1。

    • AMQP 1.0

    AMQP 1.0比AMQP 0-9-1等更复杂,差异性也大,基本很少客户端实现该协议。RabbitMQ通过插件实现AMQP1.0

    • HTTP

    Http非信息协议,但RabbitMQ可以通过HTTP传输信息:Management Plugin\eb-STOMP plugin \ JSON-RPC channel plugin

    AMQP

    • Broker:接收和分发消息的应用,RabbitMQ Server就是Message Broker。

    • Virtual host:为了使单个broker可以托管多个隔离的“环境”(用户组,交换机,队列等),一个RabbitMQ server可以划分出多个vhost,每个vhost可以创建exchange/queue,并且完全隔离。

    • Connection:publisher/consumer和broker之间的TCP连接。断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题。

    • Channel:如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。

    • Exchange:message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。

    • Queue: 消息最终被送到这里等待consumer取走。一个message可以被同时拷贝到多个queue中。

    • Binding: Exchange和Queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到Exchange中的查询表中,用于message的分发依据。

    • 生产者/消费者模型:生产者发送消息到broker server(RabbitMQ)。在Broker内部,用户创建Exchange、Queue,通过Binding规则将两者联系在一起。Exchange分发消息,根据类型binding的不同分发策略有区别。消息最后来到Queue中,等待消费者取走。

    • Exchange类型:有多种,最常用的是Direct/Fanout/Topic/Headers。

      • Direct:Message中的“routing key”如果和Binding中的“binding key”一致, Direct exchange则将message发到对应的queue中。
      • Fanout:每个发到Fanout类型Exchange的message都会分到所有绑定的queue上去。
      • Topic:根据routing key,及通配规则,Topic exchange将分发到目标queue中。
      • Headers:忽略routingKey,使用Headers来匹配的。Headers是一个键值对,可以定义成Hashtable。发送者在发送的时候定义一些键值对,接收者也可以再绑定时候传入一些键值对,两者匹配的话,则对应的队列就可以收到消息。匹配有两种方式all和any。这两种方式是在接收端必须要用键值"x-mactch"来定义。all代表定义的多个键值对都要满足,而any则代码只要满足一个就可以了

    Topic 类型中Routing key中可以包含两种通配符,类似于正则表达式:
    “#”通配任何零个或多个word
    “*”通配任何单个word

    安装

    • 系统CentOS 7
    • 环境 Erlang语言包,RabbitMQ安装包
    • 此处基于yum安装(not latest)

    安装步骤

    # Install Erlang
    yum install erlang
    
    # Install rabbitmq-server
    yum install rabbitmq-server
    
    # Run RabbitMQ Server
    
    ## To start the daemon by default when the system boots
    chkconfig rabbitmq-server on
    
    ## start and stop the server as usual using
    /sbin/service rabbitmq-server stop/start/etc.
    
    # enable rabbitmq_management  & restart  
    rabbitmq-plugins enable rabbitmq_management 
    /sbin/service  rabbitmq-server restart
    
    # open ui management http://localhost:15672/ & default user:guest & default password:guest
    

    总结

    RabbitMQ是什么?

    是消息队列中间件,基于AMQP协议实现。说白了就是可以打破不同系统/不同语言之间的差异,实现消息互通,RabbitMQ为存储消息的中间件,而消息存储的数据结构多半以队列实现。

    AMQP 0.9.1协议模型

    Message Brokers 从 procedures 接受 message,并将message 发送给 Exchange, Exchange根据路由规则(Binding)发送给 Queue,最后Brokers将消息投递给customers。

    RabbitMQ Server 就是一个 Message Brokers。

    AMQP中的概念除了这些概念之外,还有Connection、Channal、Virtual host。

    AMQP基于TCP链接,因TCP链接每次创建和销毁耗费资源较大,故而引出了Channal,针对每个线程创建单独的Channal,Channal之间隔离无交集。

    RabbitMQ用来做什么,与同类型相比有什么优势?

    RabbitMQ用于系统/软件之间的连接通信--传递消息,将消息发送和消息接收分离,解耦程序,实现异步处理。

    例如多个模块间的通信、缓解消息处理压力。

    优势:

    • 可靠性。消息可持久化,防止宕机数据丢失;投递确认,避免因投递失败丢失数据;发布者证实,消息无法被路由返回给发布者;高可用性:同一集群中,队列可以被镜像到多个机器中,以确保当其中某些硬件出现故障后,你的消息仍然安全。
    • 灵活的路由。RabbitMQ支持四种类型的Exchange,分别是Direct直接连接,Fanout全部连接, Topic基于正则匹配连接, Headers基于头信息连接无路由key键。
    • 集群。配置方式:地局域网Cluster,federation,shovel。高可用集群,支持mirror。
    • 支持多协议:AMQP\STOMP\MQIT\HTTP
    • 支持多种系统/编程语言
    • 可视化管理工具、插件等扩展

    关于缺点则需要比较其他消息队列,ActiveMq、ZeroMq、kafka等比较,往后再做整理。看了几篇前辈的博客,RabbitMQ稳定,可靠,可用性强,适合企业级开发,吞吐量较低。

    Cluster

    A RabbitMQ broker is a logical grouping of one or several Erlang nodes, each running the RabbitMQ application and sharing users, virtual hosts, queues, exchanges, bindings, and runtime parameters. Sometimes we refer to the collection of nodes as a cluster.

    相关文章

      网友评论

          本文标题:RabbitMQ学习(一)--介绍及安装

          本文链接:https://www.haomeiwen.com/subject/uaavrftx.html