阅读 3845

RabbitMQ的六种工作模式

好久没来更新博客了,来到杭州之后,加班真的是家常便饭,公司有个项目本来说9月完成上线的,结果硬是被提前到了8月中旬。从8月开始,几乎天天晚上11点。其实加点班也到没什么,程序员大家都懂得,写会代码,摸会鱼,强度上来说也还好。可加班导致每天学习的时间就少了,本来想每天能学习时间一小时的,但似乎有点难,于是学习也变得断断续续了,上周又回家了一趟。之前接触了rabbitmq,这段时间也一直有在接触,有在学习,上一篇博客分享了php如何去收发消息队列,当然这只是简单的应用,这段时间我深层次的学习了一下,当然说不上精通,但其中的一些原理还是进行了一些了解的。下面我就记录下自己这段时间学到的一些。这篇文章主要介绍rabbitmq的六种工作模式,以及一些工作的原理。

一、概念解释

一、 channel 信道:

概念:信道是生产消费者与rabbit通信的渠道,生产者publish或是消费者subscribe一个队列都是通过信道来通信的。信道是建立在TCP连接上的虚拟连接,什么意思呢?就是说rabbitmq在一条TCP上建立成百上千个信道来达到多个线程处理,这个TCP被多个线程共享,每个线程对应一个信道,信道在rabbit都有唯一的ID ,保证了信道私有性,对应上唯一的线程使用。

疑问:为什么不建立多个TCP连接呢?原因是rabbit保证性能,系统为每个线程开辟一个TCP是非常消耗性能,
每秒成百上千的建立销毁TCP会严重消耗系统。所以rabbitmq选择建立多个信道(建立在tcp的虚拟连接)
连接到rabbit上。

类似概念:TCP是电缆,信道就是里面的光纤,每个光纤都是独立的,互不影响。
复制代码

二、exchange 交换机和绑定routing key(这和后面的工作模式有关)

exchange的作用就是类似路由器,routing key 就是路由键,服务器会根据路由键将消息从交换器路由到队列上去。

exchange有多个种类,常用的有direct,fanout,topic。前三种类似集合对应关系那样,(direct)1:1,(fanout)1:N,(topic)N:1

direct: 1:1类似完全匹配

fanout:1:N 可以把一个消息并行发布到多个队列上去,简单的说就是,当多个队列绑定到fanout的交换器,那么交换器一次性拷贝多个消息分别发送到绑定的队列上,每个队列有这个消息的副本。

ps:这个可以在业务上实现并行处理多个任务,比如,用户上传图片功能,当消息到达交换器上,它可以同时路由到积分
增加队列和其它队列上,达到并行处理的目的,并且易扩展,以后有什么并行任务的时候,直接绑定到fanout交换器
不需求改动之前的代码。
复制代码

topic N:1 ,多个交换器可以路由消息到同一个队列。根据模糊匹配,比如一个队列的routing key 为*.test ,那么凡是到达交换器的消息中的routing key 后缀.test都被路由到这个队列上。

三、队列(queue)

1、推模式:通过AMQP的basic.consume命令订阅,有消息会自动接收,吞吐量高

2、拉模式:通过AMQP的bsaic.get命令

注:当队列拥有多个消费者时,队列收到的消息将以循环的方式发送给消费者。每条消息只会发送给一个订阅的消费者

四、持久化(duration)

开启持久化功能,需同时满足:消息投递模式选择持久化、交换器开启持久化、队列开启持久化

五、确认机制(ack)

1、发送方确认模式:消息发送到交换器–发送完毕–>消息投递到队列或持久化到磁盘异步回调通知生产者

2、消费者确认机制:消息投递消费者-ack-删除该条消息-投递下一条

注:收到ACK前,不会把消息再次发送给该消费者,但是会把下一条消息发送给其他消费者

二、工作模式

一.simple模式(即最简单的收发模式)

1.消息产生消息,将消息放入队列

2.消息的消费者(consumer) 监听 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失,这里可以设置成手动的ack,但如果设置成手动ack,处理完后要及时发送ack消息给队列,否则会造成内存溢出)。

二.work工作模式(资源的竞争)

1.消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2同时监听同一个队列,消息被消费。C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患:高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize) 保证一条消息只能被一个消费者使用)。

三.publish/subscribe发布订阅(共享资源)

1、每个消费者监听自己的队列;

2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。

四.routing路由模式

1.消息生产者将消息发送给交换机按照路由判断,路由是字符串(info) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;

2.根据业务功能定义路由字符串

3.从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列中。

4.业务场景:error 通知;EXCEPTION;错误通知的功能;传统意义的错误通知;客户通知;利用key路由,可以将程序中的错误封装成消息传入到消息队列中,开发者可以自定义消费者,实时接收错误;

五.topic 主题模式(路由模式的一种)

1.星号井号代表通配符

2.星号代表多个单词,井号代表一个单词

3.路由功能添加模糊匹配

4.消息产生者产生消息,把消息交给交换机

5.交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费

(在我的理解看来就是routing查询的一种模糊匹配,就类似sql的模糊查询方式)

六.RPC模式

暂时还不是很理解,下次更新。。。