工作队列: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术语的更多相关文章

  1. RabbitMQ原理与相关操作(一)

    小编是菜鸟一枚,最近想试试MQ相关的技术,所以自己看了下RabbitMQ官网,试着写下自己的理解与操作的过程. 刚开始的第一篇,原理只介绍 生产者.消费者.队列,至于其他的内容,会在后续中陆续补齐. ...

  2. RabbitMQ 和 Kafka

    ============================RabbitMQ 术语============================RabbitMQ 有很多术语和Kafka不一样, 理解这些术语十分 ...

  3. RabbitMQ引入

    引入MQ话题 可能很多人有疑惑:MQ到底是什么?哪些场景下要使用MQ? 前段时间安装了RabbitMQ,现在就记录下自己的学习心得吧.首先看段程序: class Program { static vo ...

  4. 基于RabbitMQ的Rpc框架

    参考文档:https://www.cnblogs.com/ericli-ericli/p/5917018.html 参考文档:RabbitMQ 实现RPC MQ的使用场景大概包括解耦,提高峰值处理能力 ...

  5. 学习RabbitMQ(四)

      I. 消息中间件特点: 1,异步处理模式 消息发送者可以发送一个消息而无需等待响应,消息发送者将消息发送到一条虚拟的通道或队列上,消息接收者则订阅或监听该通道,一条消息可能最终转发给一个或多个消息 ...

  6. 学习RabbitMQ(一)

    消息中间件 一.简介 消息中间件就是在消息的传输过程中保存消息的容器.消息中间件再将消息从它的源中继到它的目标时充当中间人的作用.队列的主要目的是提供路由并保证消息的传递:如果发送消息时接收者不可用, ...

  7. RabbitMQ~一些术语和最消息的生产

    学习一种技术需要先了解它,而想要学好一种技术,需要更多的了解它的组成,原理和实现机制! RabbitMQ安装介绍 RabbitMQ是由erlang语言开发的,所以必须先有安装erlang,类似java ...

  8. RabbitMq核心概念和术语

    简介 越来越多的消息中间件很容易让人产生混淆,在学习一种消息中间件的时候,最好先了解他的几种抽象概念,方便你理解,明白了这些概念,你学习起来的时候也就得心应手,同时也是使用好RabbitMQ的基础. ...

  9. Day11-协程/异步IO/RabbitMQ

    协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候 ...

随机推荐

  1. spring day02-go3

    1.复制xml到container/basic包下2.ExampleBean中设置属性,包括基本类型(String和age)和集合类型(List,Set,Map),Properties类型3.添加无参 ...

  2. Dreamweaver 时间轴如何打开

    因为下午要辅导几个调皮捣蛋的小孩HTML, 什么能让他们感觉又简单又好玩而起又能提高他们的兴趣呢?DW中设置浮动广告吧!       想好了,动手去做.DwearmWeaver里面居然没了时间轴, 度 ...

  3. PHP生成二维码【谷歌API+qrcode+圆角Logo】

    方法一:谷歌二维码API 接口地址:https://chart.googleapis.com/chart 官方文档:https://developers.google.com/chart/infogr ...

  4. 天气预报接口api(中国天气网)

    中国天气weather.comhttp://m.weather.com.cn/data/101110101.html(六天预报) http://www.weather.com.cn/data/sk/1 ...

  5. vsftpd匿名用户只能上传不能下载

    目的 搭建一台FTP服务器,供学生上传作业使用. 要求 1.学生可以直接访问FTP服务器,无需登录: 2.只能上传文件,不能创建文件夹.重命名.删除等: 3.不能下载文件(防抄袭): 4.不能在线查看 ...

  6. hadoop之Spark强有力竞争者Flink,Spark与Flink:对比与分析

    hadoop之Spark强有力竞争者Flink,Spark与Flink:对比与分析 Spark是一种快速.通用的计算集群系统,Spark提出的最主要抽象概念是弹性分布式数据集(RDD),它是一个元素集 ...

  7. Google Map: JavaScript API RefererNotAllowedMapError

    visite https://console.developers.google.com/apis/credentials and select the project you use. http:/ ...

  8. dom4j读写XML文件

    XML文件格式: <?xml version="1.0" encoding="UTF-8"?> <company> <employ ...

  9. 有关对字符串的处理,需要用到List时的简化写法

    这是项目中的需要根据ComputerName来获取IP的一个方法,如果出现多个ComputerName,需要将多个ComputerName的字符串以“:”分开,传进方法中,然后再处理不同的Name,然 ...

  10. C#:向控件添加信息类

    using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; names ...