zoukankan      html  css  js  c++  java
  • RabbitMQ的应用场景以及基本原理介绍

    异步处理

    应用解耦

    流量削峰

          

                            系统架构

    Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输, 
    Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。 
    Queue:消息的载体,每个消息都会被投到一个或多个队列。 
    Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来. 
    Routing Key:路由关键字,exchange根据这个关键字进行消息投递。 
    vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。 
    Producer:消息生产者,就是投递消息的程序. 
    Consumer:消息消费者,就是接受消息的程序. 
    Channel:消息通道,在客户端的每个连接里,可建立多个channel.

    Fair dispath 公平分发

    RabbitMQ就会使得每个Consumer在同一个时间点最多处理一个Message,换句话说,在接收到该Consumer的ack前,它不会将新的Message分发给它

    分发到多个Consumer

    Direct exchange

    Exchange和两个队列绑定在一起,Q1的bindingkey是orange,Q2的binding key是black和green. 
    当Producer publish key是orange时,exchange会把它放到Q1上,如果是black或green就会到Q2上,其余的Message被丢弃.

    Multiple bindings

     多个queue绑定同一个key也是可以的,对于下图的例子,Q1和Q2都绑定了black,对于routing key是black的Message,会被deliver到Q1和Q2,其余的Message都会被丢弃. 

    Topic exchange

    Producer发送消息时需要设置routing_key,routing_key包含三个单词和连个点号o,第一个key描述了celerity(灵巧),第二个是color(色彩),第三个是物种: 
    在这里我们创建了两个绑定: Q1 的binding key 是”.orange.“; Q2 是 “..rabbit” 和 “lazy.#”:

      • Q1感兴趣所有orange颜色的动物
      • Q2感兴趣所有rabbits和所有的lazy的. 
        例子:rounting_key 为 “quick.orange.rabbit”将会发送到Q1和Q2中 
        rounting_key 为”lazy.orange.rabbit.hujj.ddd”会被投递到Q2中,#匹配0个或多个单词。

    消息序列化

    RabbitMQ使用ProtoBuf序列化消息,它可作为RabbitMQ的Message的数据格式进行传输,由于是结构化的数据,这样就极大的方便了Consumer的数据高效处理,当然也可以使用XML,与XML相比,ProtoBuf有以下优势: 
    1.简单 
    2.size小了3-10倍 
    3.速度快了20-100倍 
    4.易于编程 
    6.减少了语义的歧义. 
    ,ProtoBuf具有速度和空间的优势,使得它现在应用非常广泛

    参考:http://blog.csdn.net/whoamiyang/article/details/54954780

    https://www.cnblogs.com/jun-ma/p/4840869.html

    rabbitMQ中consumer通过建立到queue的连接,创建channel对象,通过channel通道获取message,
    Consumer可以声明式的以API轮询poll的方式主动从queue的获取消息,也可以通过订阅的方式被动的从Queue中消费消息,

    1、订阅方式其实是向queue注册consumer,通过rpc向queue server发送注册consumer的消息,rabbitMQ Server在收到消息后,根据消息的内容类型判断这是一个订阅消息,这样当MQ 中queue有消息时,会自动把消息通过该socket(长连接)通道发送出去。创建Connection后,会启动MainLoop后台线程,循环从socket(FrameHandler)中获取数据包(Frame) 每个Consumer都有一个BlockQueue,用于缓存从socket中获取的消息。接下来,Consumer对象就可以调用api来从客户端缓存的_queue中依次获取消息,进行消费,参见QueueingConsumer.nextDelivery()

    2、poll API方式
    ChannelN:
    GetResponse basicGet(String queue, boolean autoAck)
    这种方式比较简单,直接通过RPC从MQ Server端获取队列中的消息

    Kafka、RabbitMQ、RocketMQ比较

    Kafka:追求高吞吐量,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。

    RabbitMQ:对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

    RocketMQ:具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。

  • 相关阅读:
    Jmeter跨线程组传参
    HTTP2 Sampler for JMeter
    全功能Python测试框架:pytest
    pytest + allure + jenkins 生成漂亮的测试报告
    C/C++ 多线程注意事项
    ASIO
    cocos2D-X 线程注意事项
    C/C++ C++ 11 兰姆达
    Android Studio 打包生成正式apk(XXX-release.apk)的两种方式
    C/C++ C++ 11 std::move()
  • 原文地址:https://www.cnblogs.com/stanljj/p/8493850.html
Copyright © 2011-2022 走看看