RabbitMQ是MQ

什么是MQ?

       MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。

      RabbitMQ是MQ的一种。下面详细介绍一下RabbitMQ的基本概念。

1、队列、生产者、消费者

      队列是RabbitMQ的内部对象,用于存储消息。生产者(下图中的P)生产消息并投递到队列中,消费者(下图中的C)可以从队列中获取消息并消费。

      

      多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。

      

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,将有效的均衡消费者的负载。

     本文部分转载自http://blog.csdn.net/anzhsoft/article/details/19563091

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ和NetMQ都是消息队列(Message Queue)的实现,但它们有不同的设计目标和实现方式。 RabbitMQ是一个开源的AMQP(Advanced Message Queuing Protocol)消息代理,它使用Erlang语言编写,具有高可用性、可扩展性和可靠性。RabbitMQ支持多种消息协议,包括AMQP、STOMP、MQTT等,可以在多种编程语言中使用,如Java、Python、Ruby等。RabbitMQ的核心概念是Exchange、Queue和Binding,它们共同构成了消息路由的基础。Exchange用于接收消息并将其路由到一个或多个Queue中,Binding则定义了Exchange和Queue之间的关系。 NetMQ是一个轻量级的消息队列库,它使用C#语言编写,基于ZeroMQ协议实现。NetMQ的设计目标是提供高性能、低延迟的消息传递,支持多种消息模式,如Request-Reply、Publish-Subscribe、Push-Pull等。NetMQ的核心概念是Socket,它是消息传递的基本单元,可以通过不同的Socket类型实现不同的消息模式。 下面是一个使用RabbitMQ的例子,演示如何启动一个集群并添加新的节点: 1.首先,在三台服务器上分别安装RabbitMQ,并将rabbitmq.conf和cookie文件拷贝到相应的目录中。 2.在mq1上启动RabbitMQ节点: ```shell rabbitmq-server -detached ``` 3.在mq2和mq3上启动RabbitMQ节点,并将它们加入到mq1的集群中: ```shell rabbitmq-server -detached rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@mq1 rabbitmqctl start_app ``` 4.现在,我们让mq4也加入进来: ```shell rabbitmq-queues add_member "quorum.queue" "rabbit@mq4" ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值