RabbitMQ模式总结

RabbitMQ工作模式
一、Work queues工作队列模式

针对一个生产者,对应多个消费者,同时多个消费者是竞争关系,消息只能被一个消费者消费。生产者将消息发送到对列,由消费者进行处理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eTnHV9yo-1598877228675)(C:\Users\CRnnn\AppData\Roaming\Typora\typora-user-images\1598492973818.png)]

生产者:

//创建连接
Connection connection = ConnectionUtil.getConnection();
//创建频道
Channel channel = connection.createChannel();
//声明对列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//消息推送
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

消费者(多)

//创建连接
Connection connection = ConnectionUtil.getConnection();
//创建频道
Channel channel = connection.createChannel();
//声明对列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//创建消费者;并设置消息处理
DefaultConsumer consumer = new DefaultConsumer(channel){
    @Override handleDelivery 
    -- 消息处理
    //确认消息
    channel.basicAck(envelope.getDeliveryTag(), false);
}
//监听消息
channel.basicConsume(Producer.QUEUE_NAME, false, consumer);

结果:多个消费者消费的消息不会重复

二、订阅模式类型

生产者将消息发送到交换机,交换机将消息传递给某个对列或者递交给所有对列或者丢弃消息(取决于交换机类型Direct、Fanout、Topic、Headers)。交换机只做转发,不做消息处理。

Direct Exchange:将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行比较,如果相等,则发送到该Binding对应的Queue中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kcBhPBj1-1598877228678)(C:\Users\CRnnn\AppData\Roaming\Typora\typora-user-images\1598494141591.png)]

Topic Exchange:将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行对比,如果匹配上了,则发送到该Binding对应的Queue中。 符号“#”匹配一个或多个词,符号“*”只能匹配一个词。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QFSc8ghR-1598877228681)(C:\Users\CRnnn\AppData\Roaming\Typora\typora-user-images\1598494205984.png)]

Fanout Exchange:直接将消息转发到所有binding的对应queue中,这种exchange在路由转发的时候,忽略Routing key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jzYGlrl-1598877228691)(C:\Users\CRnnn\AppData\Roaming\Typora\typora-user-images\1598494422132.png)]

Headers Exchange:将消息中的headers与该Exchange相关联的所有Binging中的参数进行匹配,如果匹配上了,则发送到该Binding对应的Queue中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b8rYZyYi-1598877228692)(C:\Users\CRnnn\AppData\Roaming\Typora\typora-user-images\1598494548103.png)]

生产者:

//创建连接
Connection connection = ConnectionUtil.getConnection();

// 创建频道
Channel channel = connection.createChannel();

/**
* 声明交换机
* 参数1:交换机名称
* 参数2:交换机类型,fanout、topic、direct、headers
*/
channel.exchangeDeclare(FANOUT_EXCHAGE, BuiltinExchangeType.FANOUT);

// 声明(创建)队列
/**
* 参数1:队列名称
* 参数2:是否定义持久化队列
* 参数3:是否独占本次连接
* 参数4:是否在不使用的时候自动删除队列
* 参数5:队列其它参数
*/
channel.queueDeclare(FANOUT_QUEUE_1, true, false, false, null);
channel.queueDeclare(FANOUT_QUEUE_2, true, false, false, null);

//队列绑定交换机
channel.queueBind(FANOUT_QUEUE_1, FANOUT_EXCHAGE, "");
channel.queueBind(FANOUT_QUEUE_2, FANOUT_EXCHAGE, "");

//发送消息
channel.basicPublish(FANOUT_EXCHAGE, "", null, message.getBytes());

消费者:

//创建连接
Connection connection = ConnectionUtil.getConnection();
// 创建频道
Channel channel = connection.createChannel();
//声明交换机
channel.exchangeDeclare(Producer.FANOUT_EXCHAGE, BuiltinExchangeType.FANOUT);
// 声明(创建)队列
/**
* 参数1:队列名称
* 参数2:是否定义持久化队列
* 参数3:是否独占本次连接
* 参数4:是否在不使用的时候自动删除队列
* 参数5:队列其它参数
*/
channel.queueDeclare(Producer.FANOUT_QUEUE_1, true, false, false, null);
//队列绑定交换机
channel.queueBind(Producer.FANOUT_QUEUE_1, Producer.FANOUT_EXCHAGE, "");
//创建消费者;并设置消息处理
DefaultConsumer consumer = new DefaultConsumer(channel){
	@Override handleDelivery
	-- 消息处理
}
//监听消息
channel.basicConsume(Producer.FANOUT_QUEUE_1, true, consumer);
三、Publish/Subscribe发布与订阅模式

每个消费者都监听自己的队列,生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。如果多个消费者同时绑定到同一个队列,起到订阅的效果。

四、Routing路由模式 Direct Exchange

路由模式的特点:

1、队列与交换机的绑定需要制定RoutingKey

2、消息的发送方在向Exchange发送消息时,也必须指定消息的RoutingKey

五、topic主题模式(路由模式的一种)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值