在这篇博客中,简单记录一下 rabbitmq 服务器中一些基本的概念。

Connection: connection 为 TCP连接,是我们的应用程序和RabbitMQ服务器真正发送和接收数据的地方。

Channel: channel为connection创建的“信道”,具体的AMQP命令都是通过信道发送出去的。每一条信道都有一个唯一的id,channel是线程不安全的。

bindingKey和routingKey的区分:

    bindingkey: 在使用绑定的时候,需要用到的路由键是 bindingkey。涉及到的客户端方法: channel.exchangeBind 和 channel.queueBind等

    routingkey: 在发送消息的时候,需要用到的路由键是 routingkey。涉及到的客户端方法: channel.basicPublish

exchange:交换器,存在四种类型

  1. fanout:fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchage的消息路由到所有与它绑定的Queue中。
  2. direct:direct类型的Exchange路由规则也是非常简单,它会把消息路由到哪些 binding key 与 routing key 完全匹配的Queue中。

         每个队列在新建时,默认会绑定到  默认交换器(名字为空字符串),绑定的路由键名称和路由键名称一致。
  3. topic: 根据 routingKey 和 bindingKey 进行匹配。bindingKey
  4. headers:此种交换器不常用,它是使用headers来匹配的,不依赖routingKey和bindingKey可以存在两种特殊字符*#,用于做模糊匹配,其中 “*” 用于匹配一个单词,“#”用于匹配多个参数(可以是零个)。注意:“*” 以 . 作为分隔符 、  “#” 以任何字符作为匹配关键字的部分。

vhost:虚拟主机

    每一个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,它拥有自己的队列、交换器、绑定等,同时它也有自己的权限控制。它提供了逻辑上的隔离,保证了数据的安全性。

Connection和Channel有什么关系?

我们知道操作系统创建和销毁一条tcp连接是非常消耗性能的,如果系统高峰期时,大量的创建和销毁TCP连接,这会造成大量的性能损耗,并且系统很有可能达到瓶颈,如果我们所有的线程都使用一条TCP连接,并且保证每个线程的私密性,那么就可以大大提高系统的性能,因此 Channel 就应运而生了。

即:我们可以简单的理解,channel 就是一个虚拟的 connection,channel是通过connection创建得来的,channel是线程不安全的。

设置消息的过期时间:

   1、设置队列中消息的过期时间

通过队列设置的过期时间,那么队列中的每条消息的过期时间都是一致的。

channel.queueDeclare 时,设置x-message-ttl 参数,这个参数的单位是毫秒

** 不进行设置,表示此消息永不过期

** 设置为0表示,除非此时可以将消息投递给消费者,否则该消息会被立即丢弃

    2、为单条消息设置过期时间

channel.basicPublish 方法中加入expiretion 的属性参数,单位是毫秒

    注意:

          1、如果同时设置了队列的过期时间和消息的过期时间,那么以过期时间小的为准

          2、对于第一种方法设置的过期时间,在消息过期时就会从队列中进行移除,对于第二种方法,即使消息过期也不会马上从队列中移除,因为每条消息的过期时间是在即将投递给消费者之前进行判断的。

消费者消费消息时与rabbitmq断开连接:

如果消费者就收到一条消息,然后确认之前与RabbitMQ断开连接或从队列上取消订阅,RabbitMQ会认为这条消息没有进行分发,会重新分发给下一个消费者进行处理。

消费者忘记确认消息时RabbitMQ服务器的处理:

如果应用程序有bug导致没有确认消息,那么RabbitMQ将不会给该消费者发送更多的消息了。这是因为RabbitMQ服务器认为该消费者没有准备好接受下一条消息。

如果消息要想从RabbitMQ崩溃中恢复,必须满足一下几点:

  1. 将消息的投递模式(delivery mode)设置成 2(持久
  2. 发送到持久化的交换器中
  3. 到达持久化的队列中

 生产者如果知道消息到达了RabbitMQ服务器上

1、使用事务模式。(不推荐,严重影响性能

2、使用 confirm 一步确认。(推荐

向多个节点中广播消息

假设我们一个 web 服务,同时部署在了节点A,B,C上,如果此时向队列中发送一条消息,需要这3个节点都可以收到。

我们可以使用fanout类型的交换机,队列的名字在程序启动时动态改变,这样就可以实现了。

RabbitMQ的一些理解和笔记的更多相关文章

  1. python采用pika库使用rabbitmq总结,多篇笔记和示例

    这一段时间学习了下rabbitmq,在学习的过程中,发现国内关于python采用pika库使用rabbitmq的资料很少,官网有这方面的资料,不过是都英文的.于是笔者结合自己的理解,就这方面内容写了一 ...

  2. python采用pika库使用rabbitmq总结,多篇笔记和示例(转)

    add by zhj:作者的几篇文章参考了Rabbitmq的Tutorials中的几篇文章. 原文:http://www.01happy.com/python-pika-rabbitmq-summar ...

  3. 19.fastDFS集群理解+搭建笔记

    软件架构理解 1FastDFS介绍 1.1什么是FastDFS FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并 ...

  4. RabbitMQ实战:理解消息通信

    RabbitMQ是一个开源的消息代理和队列服务器,可以通过基本协议在完全不同的应用之间共享数据,可以将作业排队以便让分布式服务进行处理. 本篇介绍下消息通信,首先介绍基础概念,将这些概念映射到AMQP ...

  5. RabbitMq基本概念理解

    RabbitMQ的基本概念 RabbitMQ github项目地址 RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的 消息中间件 ...

  6. 关于RabbitMQ的简单理解

    说明:想要理解RabbitMQ,需要先理解MQ是什么?能做什么?然后根据基础知识去理解RabbitMQ是什么.提供了什么功能. 一.MQ的简单理解 1. 什么是MQ? 消息队列(Message Que ...

  7. CSS深入理解学习笔记之absolute

    1.absolute和float 拥有相同的特性表现: ①包裹性(容器应用之后,可以包裹里面的内容): <!doctype html> <html> <head> ...

  8. CSS深入理解学习笔记之vertical-align

    1.vertical-align基本认识 支持的属性值: ①线类:baseline(默认),top,middle,bottom ②文本类:text-top,text-bottom ③上标下标类:sub ...

  9. CSS深入理解学习笔记之margin

    1.margin与容器尺寸 元素尺寸:①可视尺寸 clientWidth(标准):②占据尺寸 margin与可视尺寸:①适用于没有设定width/height的普通block元素:②只适用于水平方向尺 ...

随机推荐

  1. ubuntu安装glusterFS

    以2台服务器为例: node1: 172.18.1.10 node2: 172.18.1.20 1) 修改主机名,修改hosts文件添加IP地址映射 hostname node1/node2vim / ...

  2. ABP VNext发布遇到的坑

    本地调试没有问题,发布后通过Token调用其他API时,出现返回JSON中提示:Authorization failed! Given policy has not granted. 需要修改apps ...

  3. Orchar Core 创建一个模块化的ASP.NET Core应用程序

    您将构建什么?您将构建一个模块化的ASP.NET Core MVC Web应用程序,类似于Orchard Core附带的示例"Hello World"应用程序.它包括一个Web应用 ...

  4. Jmeter系列(27)- 常用逻辑控制器(6) | 如果(if)控制器If Controller

    如果(if)控制器(If Controller) 在实际工作中,当使用JMeter做性能脚本或者接口脚本时,当遇到需要对不同的条件做不同的操作时,我们可以使用JMeter中if控制器来实现 if控制器 ...

  5. FreeRTOS-06-信号量

    说明 本文仅作为学习FreeRTOS的记录文档,作为初学者肯定很多理解不对甚至错误的地方,望网友指正. FreeRTOS是一个RTOS(实时操作系统)系统,支持抢占式.合作式和时间片调度.适用于微处理 ...

  6. javascript 字符串 数字反转 字母大小写互换

    // 符串abcd123ABCD456 怎么转换为 ABCD321abcd654 // 数字要倒序 小写转大写, 大写转小写 Array.prototype.reverse = function() ...

  7. 常用的jquery 中一些js

    目录: 1.验证用户登录信息 2. 获取下拉框所选中的元素 3.  动态获取 id 和对应文本框的值  4. table 中 tr  的隐藏 5 . 更换图片  6. ajax  进行提交 7. 判断 ...

  8. maven项目环境变量配置及创建(一)

    Maven是基于JAVA平台的一款编译.测试.打包部署及运行的构建工具 1:首先需要下载安装JDK 2:安装Eclipse 3:下载maven包(https://maven.apache.org/do ...

  9. P5644-[PKUWC2018]猎人杀【NTT,分治】

    正题 题目链接:https://www.luogu.com.cn/problem/P5644 题目大意 \(n\)个人,每个人被选中的权重是\(a_i\).每次按照权重选择一个没有死掉的人杀死,求第\ ...

  10. SVN服务器的环境搭建(图文并茂)

    SVN服务器的搭建与使用 本章读完,就可以创建代码版本库,传送门 https://www.cnblogs.com/zzpython/p/13348009.html TortoiseSVN 是 Subv ...