RabbitMQ术语
工作队列:Working Queue
分配:多个客户端接收同一个Queue,如何做负载均衡(分配)。
Round-robin分配:多个接收端接收同一个Queue时,采用了Round-robin分配算法,即伦叫调度-依次分配给各个接收方。
消息确认:
默认开启了消息确认(接收方接收到消息后,立即向服务器发回确认)。消息接收方处理完消息后,向服务器发送消息确认,服务器在删除该消息。对于耗时的work/task可以先关闭自动消息确认,在work/task完成后,再手动发回确认。
channel.basicConsume("hello", false /*关闭自动消息确认*/, consumer);
/*work/task完成之后*/
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
持久化:
Server端的Queue持久化:
Tip:如果已经声明了同名非持久化的Queue,再次声明无效。
发送方和接收方都需要指定该参数。
boolean durable = true;
channel.queueDeclare("task_queue", durable, false, false, null);
Message持久化:
channel.basicPublish("", "task_queue", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
负载均衡:
为了解决各个接收端工作量相差太大的问题(有的一直busy,有的空闲比较多),突破Round-robin。最多为当前接收方发送一条消息,如果接收方还未处理完这条消息(也即,还没有发回确认),就不要再给他分配消息了,应该把当前消息分配给其他空闲接收方。
int prefetchCount = 1;
channel.basicQos(prefetchCount);
路由(Routing):
固定关键词路由(direct):
使用类型为direct的exchange,发送具有RoutingKey标签的消息给订阅该关键词的Queue。
场景示例:消息发送方发送了类型为[error][info]的两种消息,写磁盘的消息接受者只接受error类型的消息,Console打印两者。
发送方:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
cahannel.exchangeDeclare(EXCHANGE_NAME, "direct" /*exchange类型为direct*/);
channel.basiPublish(EXCHANGE_NAME, "info" /*RouingKey为info*/, null, message.getBytes);
channel.close();
connection.close();
接收方:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "direct" /*exchange类型为direct*/);
//创建匿名Queue
String queueName = channel.queueDeclare().getQueue();
//订阅某个关键词,绑定到匿名Queue中
channel.queueBind(queueName, EXCHANGE_NAME, "error")
channel.queueBind(queueName, EXCHANGE_NAME, "error");
QueueingConsumer consumer = new QueueingCounsumer(channel);
channel.basicConsume(queueName, true, consumer);
Consumer.Delivery delivery = new consumer.nextDelivery();
String message = new String(delivery.getBody());
String routingKey = delivery.getEnvelope();
关键词模式路由(topic):
这种模式可以看做对Routing的扩展。Routing只能使用固定关键词,而Topics模式可以订阅模糊关键词。 关键词必须是一组word,由点号分隔。例 如"xxx.yyy.zzz",限定255 bytes。
*表示一个word;
#表示0个或者多个word;
发送方:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "topic" /*exchange类型*/);
channel.basiPublish(EXCHANGE_NAME, "xxx.yyy" /*RouingKey*/, null, message.getBytes);
channel.close();
connection.close();
接收方:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "topic" /*exchange类型为topic*/);
//创建匿名Queue
String queueName = channel.queueDeclare().getQueue();
//订阅某个关键词,绑定到匿名Queue中
channel.queueBind(queueName, EXCHANGE_NAME, "*.yyy")
QueueingConsumer consumer = new QueueingCounsumer(channel);
channel.basicConsume(queueName, true, consumer);
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
String routingKey = delivery.getEnvelope(); //可获取路由关键词
RabbitMQ术语的更多相关文章
- RabbitMQ原理与相关操作(一)
小编是菜鸟一枚,最近想试试MQ相关的技术,所以自己看了下RabbitMQ官网,试着写下自己的理解与操作的过程. 刚开始的第一篇,原理只介绍 生产者.消费者.队列,至于其他的内容,会在后续中陆续补齐. ...
- RabbitMQ 和 Kafka
============================RabbitMQ 术语============================RabbitMQ 有很多术语和Kafka不一样, 理解这些术语十分 ...
- RabbitMQ引入
引入MQ话题 可能很多人有疑惑:MQ到底是什么?哪些场景下要使用MQ? 前段时间安装了RabbitMQ,现在就记录下自己的学习心得吧.首先看段程序: class Program { static vo ...
- 基于RabbitMQ的Rpc框架
参考文档:https://www.cnblogs.com/ericli-ericli/p/5917018.html 参考文档:RabbitMQ 实现RPC MQ的使用场景大概包括解耦,提高峰值处理能力 ...
- 学习RabbitMQ(四)
I. 消息中间件特点: 1,异步处理模式 消息发送者可以发送一个消息而无需等待响应,消息发送者将消息发送到一条虚拟的通道或队列上,消息接收者则订阅或监听该通道,一条消息可能最终转发给一个或多个消息 ...
- 学习RabbitMQ(一)
消息中间件 一.简介 消息中间件就是在消息的传输过程中保存消息的容器.消息中间件再将消息从它的源中继到它的目标时充当中间人的作用.队列的主要目的是提供路由并保证消息的传递:如果发送消息时接收者不可用, ...
- RabbitMQ~一些术语和最消息的生产
学习一种技术需要先了解它,而想要学好一种技术,需要更多的了解它的组成,原理和实现机制! RabbitMQ安装介绍 RabbitMQ是由erlang语言开发的,所以必须先有安装erlang,类似java ...
- RabbitMq核心概念和术语
简介 越来越多的消息中间件很容易让人产生混淆,在学习一种消息中间件的时候,最好先了解他的几种抽象概念,方便你理解,明白了这些概念,你学习起来的时候也就得心应手,同时也是使用好RabbitMQ的基础. ...
- Day11-协程/异步IO/RabbitMQ
协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候 ...
随机推荐
- 用xml添加动画
在res文件夹下新建anim文件夹 在anim文件夹新建anim.xml anim.xml: <?xml version="1.0" encoding="utf-8 ...
- 夺命雷公狗—angularjs—4—继承和修正继承
angularjs 中也有继承的方法,废话不多说,看代码: <!doctype html> <html lang="en"> <head> &l ...
- 夺命雷公狗ThinkPHP项目之----企业网站25之网站前台面包屑导航URL的完善
如果想取出面包屑导航的url那么就必须在model层里面进行多取一个了: <?php namespace Home\Model; use Think\Model; class CategoryM ...
- 夺命雷公狗---DEDECMS----23dedecms修改内容页面展示的信息
我们在网站上不管点击那个影视作品的A连接都是进入到一个同样的页面,因为他们是一个模版文件: 我们还没有对这个模版进行任何的修改,所以我们要在内容模版增加标签取出对应的影视作品,而且导航条也是按照模版上 ...
- html 输入框验证
JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入)<input onkeyup="this.value=this.value.replace(/\D/g,'') ...
- C# 文件读取(二)
将我的电脑中的文件夹信息显示到TreeView控件上. 方法很多种,下面这种方法添加了我的文档. public partial class Form1 : Form { public Form1() ...
- PHP自动生成后台导航网址的最佳方法
'http://www.jbxue.com'=> '脚本学堂首页', </script>
- onTouch和onTouchEvent
public boolean dispatchTouchEvent(MotionEvent event) { if (mOnTouchListener != null && mOnTo ...
- Mongodb 笔记08 了解应用的动态、数据管理、持久性
了解应用的动态 1. 了解正在进行的操作:db.currentOp() , 可以加过滤条件,从而只显示符合条件的结果. 1). 寻找有问题的操作:db.currentOp() 最常见的操作就是用来寻找 ...
- scrapy学习记录
scrapy是一个用来爬取一个或多个网站的数据,提取数据的应用框架.下载过程非常复杂,而且会遇到各种问题.所以写个博客来记录下. 安装好python2.7之后,就可以开始.安装scrapy前还需要安装 ...