在这篇博客中,简单记录一下 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. openswan协商流程之(一):main_outI1()

    主模式第一包:main_outI1() 1. 序言 main_outI1()作为主模式主动发起连接请求的核心处理函数,我们可以通过学习该函数的处理流程来探究openswan中报文封装的基本思想.如果之 ...

  2. ysoserial CommonsColletions1分析

    JAVA安全审计 ysoserial CommonsColletions1分析 前言: 在ysoserial工具中,并没有使用TransformedMap的来触发ChainedTransformer链 ...

  3. Optional容器类

    一.Optional 容器类:用于尽量避免空指针异常 方法 /* * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 O ...

  4. 2.1Java基础

    2.1.9面向对象的三大特性(携程): 封装:把一个对象的属性隐藏在对象内部,外部对象不能直接访问这个对象的内部信息.但是可以提供一些可以被外界访问的方法来操作属性.就比如我们常常创建一个类,把他的属 ...

  5. java web利用jsp完成简单的学生管理系统

    index.jsp <%@ page language="java" import="java.sql.*" pageEncoding="utf ...

  6. 在FLASH中读写结构体

    在FLASH中读写结构体 注意事项 编程(写数据)地址要对齐 写数据时,我们要指定写入的地址,如果写入地址为非对齐,则会出现编程对齐错误. 比如遵循32位(4字节)地址对齐,你的地址只能是4的倍数.0 ...

  7. seo执行步骤

    第一个金字塔策略这个很适用于大型网站,我想做过大型网站,特别是关键词比较多比较杂乱的站长来说,这个图太熟悉不过了,就算是没有见过,但实际操作中早就用到了这些手法.如果能把这个图领会透并实际应用,做一个 ...

  8. 【Azure 应用服务】App Service For Linux 部署PHP Laravel 项目,如何修改首页路径为 wwwroot\public\index.php

    问题描述 参考官方文档部署 PHP Laravel 项目到App Service for Linux环境中,但是访问应用时候遇见了500 Server Error 错误. 从部署的日志中,可以明确看出 ...

  9. 没想到 TCP 协议,还有这样的骚操作。。。

    大家好,我是小林. 昨晚有位读者问了我这么个问题: 大概意思是,一个已经建立的 TCP 连接,客户端中途宕机了,而服务端此时也没有数据要发送,一直处于 establish 状态,客户端恢复后,向服务端 ...

  10. VueCLI3 创建vue项目

    关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm uninstall vu ...