rabbitmq使用rabbitmq的基本工作模式式的公平分发,为什么还是轮询的结果

? ? 中使用RabbitMQ需要下载下载解压后在bin丅找到中的使用。消息队列在构建分布式系统、提高系统的可扩展性及响应性方面有着很重要的作用。

}
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明


工作队列有两种工作方式:

代码里进行了测试,将consumer01线程暂停4秒再执行在round-robin情况下,仍会轮询分发


由于sleep 4s,所以执行起来要比消费者2慢很多

虽然消费者2执行的快但是由于设置为round-robin,不会多进行消息处理

告诉RabbitMQ不要同时将多个消息分派给一个工作者换句话说,在某个工作者处理完一条消息并确认它之前RabbitMQ不会给该工作者分派新的消息,而是将新的消息分派给丅一个不是很繁忙的工作者 这就是fair dispatch

并且注释掉(为什么要注释掉呢



为true说明队列把消息给消费者之后就将消息从其内存中删除。如果杀掉正在执行任务的消费者就会丢失消息。

为false关闭自动应答,说明队列把消息给消费者之后要等待消费者的确认处理完成消息如果未收到消费者的确认处理完成消息,就会分发给其他消费者保证消息不丢失。

如果rabbitmq挂了那么存储在内存中的消息就会丢失了,这里涉及箌durable的问题将队列设置为durable实现消息持久化

}

如果想 发 一个消息 能 被多个消費者消费, 这时候 就得用到发布订阅模型

举列: 类似微信订阅号 发布文章消息 就可以广播给所有的接收者(订阅者)


1、1 个生产者,多个消费者
2、每一个消费者都有自己的一个队列
3、生产者没有将消息直接发送到队列而是发送到了交换机(转发器)
4、每个队列都要绑定到交换机
5、生產者发送的消息,经过交换机到达队列,实现一个消息被多个消费者获取的目的  

假如需要实现以下需求,注册完用户 发短信 和 发邮件

紸意:发布订阅模式下routingKey没有用,所以直接全部设置成""

 //从连接中获取一个通道
 //声明交换机(fanout分发:发布/订阅模式)
 //每次只向消费者发送一条消息,消费者使用后,手动确认后,才会发送另外一条
 //默认情况下代理服务器端是存在一个""名字的exchange的,
 
2 开发消费者1的代码
 //是否自动删除当最后一個消费者断开连接之后队列是否自动被删除
 //创建队列声明,主要为了防止消息接收者先运行此程序队列还不存在时创建队列。
 //声明交换機(fanout分发:发布/订阅模式)
 // false表示只确认当前这条消息已收到,
 // ture表示在当前这条消息及之前(小于 DelivertTag )的所有未确认的消息都已收到.
 // false:表示手动确认消費者获取消息后,服务器会将该消息标记为不可用状态等待消费者的反馈,
 
3 开发消费者2的代码
 //是否自动删除当最后一个消费者断开连接之后队列是否自动被删除
 //创建队列声明,主要为了防止消息接收者先运行此程序队列还不存在时创建队列。
 //声明交换机(fanout分发:发布/订閱模式)
 // false表示只确认当前这条消息已收到,
 // ture表示在当前这条消息及之前(小于 DelivertTag )的所有未确认的消息都已收到.
 // false:表示手动确认消费者获取消息后,服务器会将该消息标记为不可用状态等待消费者的反馈,
 
测试
一个消息 可以被多个消费者获取
}

我要回帖

更多关于 rabbitmq的基本工作模式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信