zoukankan      html  css  js  c++  java
  • RabbitMq学习笔记——概念

    1、RabbitMQ简介
      MQ全称为Message Queue(消息队列),是一种“应用程序”<—>“应用程序”的通信方法。MQ是一个典型的“消费”<—>“生产者”模型的代表,生成者往消息队列中写入消息,消费者从消息队列中读取消息。
    2、MQ的应用场景
      对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or Component or submodule)。那么这些模块的如何通信,mq就是用来实现各模块间通信的软件,开发人员只需关心自己相关的业务,不需要花费太多精力去处理模块间的通信。
    3、MQ的几个重要的概念
    1)RabbitMQ Server
      RabbitMQ is not a food truck, it’s a delivery service. 他的角色就是维护一条从Producer到Consumer的路线,保证数据能够按照指定的方式进行传输。

    2)Producer
      数据的发送方。create messages and publish (send) them to a broker server (RabbitMQ).一个Message有两个部分:payload(发送的数据)和label(信息自带的标签,用来告诉RabbitMQ把这个信息发送到哪个Consumer)。
    3)Consumer
      数据的接收方。Consumers attach to a broker server (RabbitMQ) and subscribe to a queue,把queue比作是一个有名字的邮箱。当有Message到达某个邮箱后,RabbitMQ把它发送给它的某个订阅者即Consumer,在这个Message中,只有payload,label已经被删掉了。
    4)Exchanges
      Producer 发送消息到exchange。
    5)Queues
       消息最终被送到这里等待consumer取走。一个message可以被同时拷贝到多个queue中。
    6)Bindings
      exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。
    7)Connection
      一个TCP的连接。Producer和Consumer都是通过TCP连接到RabbitMQ Server的,程序的起始处就是建立这个TCP连接。
    8)Channels
      虚拟连接,它建立在上述的TCP连接中,数据流动都是在Channel中进行的,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。
    4、ack机制
      如果一个queue没被任何的Consumer Subscribe(订阅),当这个queue有数据到达时,这些数据会被cache而不会被丢弃。当有Consumer订阅时,这些数据会被立即发送到这个Consumer,这些数据被Consumer正确收到后就被从queue中删除。
      什么是正确收到呢?通过ack。每个Message都要被acknowledged(确认,ack)。我们可以显示的在程序中去ack,也可以自动的ack。如果有数据没有被ack,那么RabbitMQ Server会把这个信息发送到下一个Consumer。
           如果这个app有bug,忘记了ack,那么RabbitMQ Server不会再发送数据给它,因为Server认为这个Consumer处理能力有限。
      ack的机制还可以起到限流的作用(Benefitto throttling):在Consumer处理完成数据后发送ack,甚至在额外的延时后发送ack,将有效的balance Consumer的load。
      比如我们可能会对某些数据进行merge,比如merge 4s内的数据,然后sleep 4s后再获取数据。特别是在监听系统的state,我们不希望所有的state实时的传递上去,而是希望有一定的延时。这样可以减少某些IO,而且终端用户也不会感觉到。
    5、谁应该负责创建queue
      如果queue不存在,Consumer不会得到任何的Message。Producer Publish的Message也会被丢弃。所以,为了数据不丢失,Consumer和Producer都应try to create the queue。
      queue对load balance的处理是完美的。对于多个Consumer来说,RabbitMQ 使用循环的方式(round-robin)的方式均衡的发送给不同的Consumer。
    6、Exchanges
      Procuder Publish的Message进入了Exchange。接着通过“routing keys”(路由键), RabbitMQ会找到应该把这个Message放到哪个queue里。queue也是通过这个routing keys来做的绑定,有三种类型的Exchanges:direct, fanout,topic。
    7、Virtual hosts
          每个virtual host本质上都是一个RabbitMQ Server,拥有它自己的queue,exchagne,和bings rule等等。这保证了你可以在多个不同的application中使用RabbitMQ。

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

  • 相关阅读:
    BEM(Block–Element-Modifier)
    http://element.eleme.io/#/zh-CN/component/quickstart
    Commit message 的写法规范。本文介绍Angular 规范(
    好的commit应该长啥样 https://github.com/torvalds/linux/pull/17#issuecomment-5654674
    代码管理
    if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary
    Martin Fowler’s Active Record design pattern.
    The Zen of Python
    Introspection in Python How to spy on your Python objects Guide to Python introspection
    Object-Oriented Metrics: LCOM 内聚性的度量
  • 原文地址:https://www.cnblogs.com/zhangnianyong/p/11306846.html
Copyright © 2011-2022 走看看