掌握Rabbitmq几个重要概念,从一条消息说起
RabbitMQ 是功能强大的开源消息代理。根据官网称:也是使用量最广泛的消息队列。就像他的口号“Messaging that just works”,开箱即用使用简单,支持多种消息传输协议(AMQP、STOMP、MQTT)。
一个应用程序或者服务如何使用RabbitMq呢?
消息
队列
注意:什么时候消息才会从队列中删除呢?这里涉及到一个消息确认的动作。消费者接收到的每一条消息都必须进行确认。才会从队列中删除。消费者可以通过AMQP的Basic.Ack命令显式地向rabbtmq发送一个确认,或者在订阅到队列的时候就将autoAck属性设置为true;如:autoAck: true,一旦消费者接收消息,rabbitmq会自动视其确认了消息。
只要消费者不进行确认,rabbit将不会给该消费者发送消息,因为在上一条消息被确认之前,rabbit会认为这个消费者并没有准备好接收下一条消息的能力。
在没有办法正常确认消息,不能一直堵塞呀,比如消费者有bug。那就使用AMPQ的Basic.Reject命令;明确的拒绝这条消息,其中一个参数requeue如果设置了ture的话,Rabbit会把消息重新发给下一个订阅的消费者。
如果你检测到一条消息本身有错误而任何一个消费者都无法处理的时候,就可以把requeue设置为false,rabbitmq会把消息从队里中移除,而不会把他发送给新的消费者。
注意:这里你可以使用对拒绝的消息进行特殊处理,比如发送到死信队列或者专门收集的erro队里中。
小结:队列是amqp消息通信的基础模块
1.为消息提供的处所,消息在此等待消费
2.对负载均衡来说,队列是绝佳方案。只需附加一堆消费者,并让rabbitmq以循环的方式均匀地分配发来的消息。
3.队列是rabbit中消息的最后的终点。
交换器、绑定
交换器有四种类型:direct、fanout、topic和headers;每种类型实现了不同的路由算法,前三个比较常用。
channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: body);
2.fanout交换器
2.topic交换器
这类交换器允许不同源头的消息到达同一个队列。路由算法-根据全部或部分路由键匹配将消息路由绑定的队列上。使用场景-根据某些条件广播到特定的队列上。
小结:
本文主要总结了 AMQP几个主要元素:交换器,绑定,队列。以及一个消息创建到消费者读取消费的过程。
评论