RabbitMQ

    1.RabbitMQ 简介
            AMQP 即Advanced Message Queuing Protocol ,高级消息队列协议,是应用层协议的一个标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道使用者的存在,反之亦然。
       ConnectionFactory 、Connection 、 Channel
            ConnectionFactory 是Connection的制造工厂。Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。
            Channel 是我们与RabbitMQ 打交道的最重要的一个借口,我们大部分的业务操作是在Cahnnel 中完成的,包括Queue 、定义Exchange 、绑定Queue与Exchange、发布消息等。
  ====
     参考博客:http://rabbitmq.mr-ping.com/description.html
    RabbitMQ 是一个消息代理,一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。
    技术亮点
        1.可靠性
                RabbitMQ 提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制。
        2.灵活的路由
                消息在到达队列前是通过交换机进行路由的。RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。如果你有更复杂的路由需求,可以将这些交换机组合起来使用。甚至可以实现自己的交换机类型,并且当做RabbitMQ 的插件来使用。
        3.集群
            在相同局域网中的多个RabbitMQ服务可以聚合在一起,作为一个独立的逻辑代理来使用。
        4. 联合
            对于服务器来说,它比集群需要更多的松散和非可靠链接。为此,RabbitMQ 提供了联合模型。
        5.高可用的队列
            在同一个集群里,队列可以被镜像到多个机器中,以确保当其中某些硬件出现故障之后,你的消息仍然安全。
        6.多协议
            RabbitMQ 支持多种消息协议的消息传递。
        7.广泛的客户端
            只要是你能想到的编程语言几乎都有与其相适配的RabbitMQ 客户端。
        8.可视化管理工具
            RabbitMQ 附带了一个易于使用的可视化管理工具,可以帮助你监控消息代理的每一个环节。
        9.追踪
            如果你的消息系统有异常行为,RabbitMQ 还提供了追踪的支持,让你能够发现问题所在。
参考博客:https://www.cnblogs.com/ityouknow/p/6120544.html
    RabbitMQ 介绍
        RabbitMQ 是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层,保存这个数据。
        AMQP,即Advanced MEssage Queuing Protocol ,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由、可靠性、安全。
    RabbitMQ 是一个开源的AMQP实现,服务端用Erlang语言编写,支持多种客户端:Python、Ruby、C、PHP 等等。
    
    ==
    虚拟主机:一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机?在RabbitMQ 当中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止A组访问B组的交换机/队列、绑定,必须为A和B分别创建一个虚拟主机。每一个RabbitMQ 服务器都有一个默认的虚拟主机。
    交换机:Exchange 用于转发消息,但是它不会做存储,如果没有Queue bind 到Exchange 的话,它会直接丢弃调Producer 发送过来的消息。
    路由键:消息到交换机的时候,交互及会转发到对应的队列中,究竟转发到哪个队列,就要根据该路由键。
    绑定:就是交换机需要和队列相绑定。是多对多的关系。
参考博客:  https://blog.csdn.net/qq_37169817/article/details/78734246
消息通信:
            常见的Web服务之间的通信机制有两种,同步和异步。
            同步方法有:RMI、Hession、Burlap、HTTP invoker ,
            异步消息中间件:kafaka、RabbitMQ、ZeroMQ、ActiveMQ。
AMQP 模型
            1.Server : 接受客户端连接,实现AMQP消息队列和路由功能的进程,
    AMQP协议定义了两种角色和三个功能模块
            Publisher角色: 只负责发布
            Consumer角色: 负责接收和处理消息
            Exchange ;接收生产者发布的消息,并根据规则转发给Queue
            Queue: 存储消息,并等待消费者过来接收处理。
            Binding:定义Exchange和Queue 之间的关联,以及消息转发规则RoutingKey.
    正确使用RabbitMQ 的方式,是要进行如下五个步骤:
            1.创建一个Exchange
            2.创建一个Queue
            3.创建一个Binding,把Exchange和Queue关联起来。
            4.应用程序A给Exchange发布消息
            5.应用程序B从Queue监听消息并处理
        Exchange 类型:
                Exchange 有4种类型:fanout 、direct、topic、headers 。
                fanout :广播类型,该Exchange收到的所有消息,会转发给绑定到它的所有Queue,即使设置了转发规则,RoutingKey 也不生效,因此该种类型的性能是最高的。
                direct :该Exchange 会根据转发规则RoutingKey 进行精确匹配,把消息转发给完全匹配RoutingKey 的Queue .
                topic : 该Exchange 会根据转发规则RoutingKey进行模糊匹配,把消息转发给匹配RoutingKey的Queue.模糊匹配支持#,其中匹配一个词,#匹配一个或者多个词。
    Exchange 常用参数:
                durable :是否持久化,如果设置为false ,在RabbitMQ 重启后,该Exchange 会消失,需要重新创建。
                autoDelete :是否自动删除,如果设置为true,并且绑定了Queue或者其他Exchange ,那么在最后一个取消绑定事件后,该Exchange会自动删除自己。
                internal :如果设置为true ,该Exchange 将不能用于接收生产者消息,只能用于绑定到其它Exchange。
                alternate-exchange :配置值为另一个Exchange,当该Exchange 收到的消息,无法转发,没有匹配的route时,会转发到配置的这个Exchange 。
        
===

    
    1.     参考博客:https://www.cnblogs.com/longlongogo/p/6489574.html

        3.3 工作队列                工作队列(work queues,又称任务队列Task Queues)的主要思想是为了避免立即执行并等待占用大量资源、时间的操作完成。而是把任务(Task)当作消息发送到队列中,稍后处理。一个运行在后台的工作者(worker ) 进程就会取出任务然后处理。当运行多个工作者(workers)时,任务会在它们之间共享。        3.4 消息响应                    为了防止消息丢失,RabbitMQ 提供了消息响应( acknowledgments ) 机制。消费者会通过一个ack 响应,告诉 RabbitMQ 已经收到了并处理了某条消息,然后RabbitMQ 才会释放并删除这条消息。         3.6 公平分发                    消息的分发的公平分配。                    使用basicQos  方法,设置perfetchCount = 1,这样就告诉RabbitMQ 不要在同一时间给一个工作者发送多于1个的消息。                    channel.BasicQos (0,1,false);项目搭建,参考博客:   https://blog.csdn.net/wang_kill/article/details/71083389?utm_source=itdadao&utm_medium=referralchannel.basicPublish()    routingKey : 路由键 : # 匹配0个或者多个单词,在topic exchange 做消息转发用。    mandatory: true, 如果exchange 根据自身类型和消息routeKey 无法找到一个符合条件的queue, 那么会调用basic return 的方法将消息返还给生产者。                        false: 出现上述情形broker会直接将消息扔掉    immediate : true : 如果exchange 在将消息route 到queue(s) 时发现对应的queue 上没有消费者,那么这条消息不会放入队列中。当与消息rouKey 关联的所有queue(一个或者多个)都没有消费者时,该消息会通过basic.return 方法返还给生产者。    BasicProperties : 需要注意的是BasicProperties.deliveryMode . 0 : 不持久化,1:持久化            这里指的是消息的持久化,配合channel (durable = true),queue (durable) 可以实现,即使服务器宕机,消息仍然保留。            简单来说: mandatory 标志告诉服务器至少将该消息route 到一个队列中,否则将消息返还给生产者,immediate 标志告诉服务器如果该消息关联的queue上有消费者,则马上将消息传递给它,如果所有queue 都没有消费者,直接把消息返还给生产者,不用消息入队列等待消费者了。            void basicPublish ( string exchange , String routingKey, boolean mandatory, bool immediate, BasicProperties props ,byte[] body )            exchange: 交换区 ,生产者将消息发送到交换区,交换区是一个非常简单的东西,一端接收生产者的消息,另一端将他们推送到队列中。            channel. basicPublish ("","hello",null,message.getBytes());            第一个参数就是交换区的名字,空字符串表示这是默认的或者没有命名的交换区。消息通过指定的路由名routingKey 被路由到队列中。

















































































































posted on 2019-05-17 16:40  萧橘子  阅读(135)  评论(0编辑  收藏  举报

导航