MyBlog


Rabbit入门

<p>[TOC]</p> <h1>MQ介绍</h1> <p>什么是MQ 消息队列(Message Queue,简称MQ):存放消息的FIFO的队列,是一种跨进程的通信机制,用于上下游传递消息</p> <h1>为什么要用MQ</h1> <ul> <li> <p>解耦:将消息写入消息队列,需要消息的系统自己从消息队列中订阅,上游系统不需要做任何修改</p> </li> <li> <p>异步:将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度</p> </li> <li> <p>缓冲:并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常。系统按照数据库能处理的并发量,从消息队列中慢慢拉取消息</p> </li> <li> <p>最终一致性:通过消息保证最终数据一致性</p> </li> <li>流处理:分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等</li> </ul> <h1>MQ选型对比</h1> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/a9b0ebb1863d637274483c4136c6c2cf?showdoc=.jpg" alt="" /></p> <h1>RabbitMQ是什么</h1> <p>RabbitMQ是一款基于AMQP(消息队列协议),由Erlang开发的开源消息队列组件。</p> <h1>AMQP</h1> <p>即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。</p> <h1>RabbitMQ中的概念模型</h1> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/d95d8f7b75c73cfc19e0ae4341a35eaa?showdoc=.jpg" alt="" /></p> <h2>Publisher</h2> <p>消息生产者:是一个向交换器发送消息的应用程序</p> <h2>Broker</h2> <p>接收和分发消息的应用</p> <h2>Virtual Host</h2> <p>出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。</p> <h2>Connection</h2> <p>publisher/consumer和broker之间的TCP连接。断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题。</p> <h2>Channel</h2> <p>如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。</p> <h2>Exchange</h2> <p>message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。</p> <h2>Queue</h2> <p>消息最终被送到这里等待consumer取走。一个message可以被同时拷贝到多个queue中。</p> <h2>Binding</h2> <p>exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据</p> <h2>Consumer</h2> <p>消息消费者,从消息队列取出消息的应用程序</p> <h1>消息模型</h1> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/35f8ce98f8dc03d883279cce9a769104?showdoc=.jpg" alt="" /></p> <h2>生产/消费模型</h2> <p>生产者发送消息到broker server(RabbitMQ)。在Broker内部,用户创建Exchange/Queue,通过Binding规则将两者联系在一起。Exchange分发消息,根据类型/binding的不同分发策略有区别。消息最后来到Queue中,等待消费者取走</p> <h2>Exchange类型</h2> <p>Exchange有多种类型,最常用的是Direct/Fanout/Topic三种类型</p> <h3>Direct</h3> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/1f327f8714e12aab4fe9d766773aab74?showdoc=.jpg" alt="" /></p> <p>Message中的“routing key”如果和Binding中的“binding key”一致, Direct exchange则将message发到对应的queue中</p> <h3>Fanout</h3> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/55396d9a3df77f824bd2747bbe233b64?showdoc=.jpg" alt="" /></p> <p>每个发到Fanout类型Exchange的message都会分到所有绑定的queue上去</p> <h3>Topic</h3> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/12bddbeed17e324c894cdc375122e1e6?showdoc=.jpg" alt="" /></p> <p>根据routing key,及通配规则,Topic exchange将分发到目标queue中 Routing key中可以包含两种通配符,类似于正则表达式:#通配任何零个或多个word,*通配任何单个word(不推荐使用)</p> <h3>Delayed</h3> <p>rabbittmq延时插件:rabbitmq_delayed_message_exchange-3.6.x</p>

页面列表

ITEM_HTML