What MQ??? 关于MQ的前世今生,咱们细谈
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法(官方语言)。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。(相当于n年前的信差吧!哦还有邮递员啦!)
在下之前用过IBMmq,可是今天偏偏不说这个,毕竟似乎没有多少人在用这个啦!咱们今天的主角是:RabbitMQ是MQ的一种(大型互联网公司必玩的那种呀!)。下面详细介绍一下RabbitMQ的基本概念。
1、队列、生产者、消费者(专业词汇,勿记错啦)
队列是RabbitMQ的内部对象,用于存储消息。生产者(下图中的P)生产消息并投递到队列中,消费者(下图中的C)可以从队列中获取消息并消费。
有图有真相哦!!!(不好意思图是网上拷的)
资源是共享的嘛!(漂亮的美女大家都可以看呀)多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。(不患寡而患不均)如下:
哈哈哈!看到这些是不觉得原来这么骚easy,实际上我说错啦!
2、Exchange、Binding
刚才我们看到生产者将消息投递到队列中,实际上这在RabbitMQ中这种事情永远都不会发生。实际的情况是,生产者将消息发送到Exchange(交换器,下图中的X),再通过Binding将Exchange与Queue关联起来。见下图:
这才是我的庐山真面目呢!我可复杂着呢!!!
3、Exchange Type、Bingding key、routing key(有点枯燥啦!看完别晕圈圈,哈哈哈)
看我娓娓道来!!!
在绑定(Binding)Exchange与Queue的同时,一般会指定一个binding key。在绑定多个Queue到同一个Exchange的时候,这些Binding允许使用相同的binding key。生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则,生产者就可以在发送消息给Exchange时,通过指定routing key来决定消息流向哪里。
RabbitMQ常用的Exchange Type有三种:fanout、direct、topic。
fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中。
direct:把消息投递到那些binding key与routing key完全匹配的队列中。
topic:将消息路由到binding key与routing key模式匹配的队列中。
(大同小异啦!总之就这么回事,不懂的读上三十遍即可啦!!!)
附上一张RabbitMQ的结构图:
如此清晰,一目了然的图看起来好难理解的!!!
在下还是不放心大家,最后来具体解析一下几个问题:
1、可以自动创建队列,也可以手动创建队列,如果自动创建队列,那么是谁负责创建队列呢?是生产者?还是消费者?
答案:如果队列不存在,当然消费者不会收到任何的消息。但是如果队列不存在,那么生产者发送的消息就会丢失。所以,为了数据不丢失,消费者和生产者都可以创建队列。那么如果创建一个已经存在的队列呢?那么不会有任何的影响。需要注意的是没有任何的影响,也就是说第二次创建如果参数和第一次不一样,那么该操作虽然成功,但是队列属性并不会改变。队列对于负载均衡的处理是完美的。对于多个消费者来说,RabbitMQ使用轮询的方式均衡的发送给不同的消费者。
2.RabbitMQ的消息确认机制
默认情况下(特殊情况暂不考虑),如果消息已经被某个消费者正确的接收到了,那么该消息就会被从队列中移除。当然也可以让同一个消息发送到很多的消费者。如果一个队列没有消费者,那么,如果这个队列有数据到达,那么这个数据会被缓存,不会被丢弃。当有消费者时,这个数据会被立即发送到这个消费者,这个数据被消费者正确收到时,这个数据就被从队列中删除, 那么什么是正确收到呢?通过ack。每个消息都要被acknowledged(确认,ack)。我们可以显示的在程序中去ack,也可以自动的ack。如果有数据没有被ack,那么RabbitMQ Server会把这个信息发送到下一个消费者。如果这个app有bug,忘记了ack,那么RabbitMQServer不会再发送数据给它,因为Server认为这个消费者处理能力有限。而且ack的机制可以起到限流的作用(Benefitto throttling):在消费者处理完成数据后发送ack,甚至在额外的延时后发送ack,将有效的均衡消费者的负载。
欲知RabbitMQ应用场景请各位大佬关注在下,在下后期不断更新,谢谢大佬的支持关注,小弟不胜感激!!!分享技术知识,快乐你我他!!!
于公元2019年7月11日下午三点在西安软件新城阿里巴巴丝路总部创作
牧码人——柯大师
接着上一回继续为你说!!!
rabbitmq官方的六种工作模式:
概念模式:RabbitMQ是一个消息代理:它接受并转发消息。你可以把它当成一个邮局:当你想邮寄信件的时候,你会把信件放在投递箱中,并确信邮递员最终会将信件送到收件人的手里。在这个例子中,RabbitMQ就相当与投递箱、邮局和邮递员。
AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储。同理,消费者也是如此。Exchange 就类似于一个交换机,转发各个消息分发到相应的队列中。
六种工作模式:
简单模式:一个生产者,一个消费者(一对一)
work模式:一个生产者,多个消费者,每个消费者获取到的消息唯一。(一对多)
订阅模式:一个生产者发送的消息会被多个消费者获取。(一对多)
路由模式:发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key
topic模式:将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词。
今天暂且说到这里......