RabbitMQ实战:性能和安全

news2025/1/21 13:59:11

本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。

前两篇介绍了RabbitMQ在可用性、监控方面的考虑,这是基础保障,因为在某些场景下是不容许丢失消息的,但它和性能往往是对立的,需要根据业务场景做取舍。

当处理一些敏感数据时,比如银行卡信息,需要考虑安全性问题,上一篇总结了数据传输安全方面的知识点,这里就比较好理解了。

通过介绍,你会了解到:

  • 对速度的考虑
  • 对内存和进程的考虑
  • 对安全的考虑

对速度的考虑

有很多因素影响RabbitMQ投递消息的速度,包括消息持久化、路由算法、绑定数目、以及消息确认策略等,下面分别来介绍。

消息持久化

当发布消息时,需要决定丢失其中的任何消息是否可以接受,如果可以接受,可以将delivery-model设置为1,消息就不会持久化到硬盘了。

消息确认

当消费消息时,可以在队列订阅时,通过设定no-ack标记加快消息投递,如果设置为true,服务器就会在消息发送给客户端后自动将其出队。

这样,处理完消息之后就无须再发送确认消息回服务器了,能极大地加快消费者消费消息,但由于某些原因连接中断了,或客户端应用程序发生故障了,消息就永远消息了。

路由算法和绑定规则

前面介绍了3种类型的交换器:direct、fanout、topic,每种交换器代表了服务器实现的特定路由算法,会根据消息的路由键以及队列与交换器之间的绑定来选择队列。

在服务器端,交换器和绑定作为记录条目存储在Mnesia数据库中,当匹配消息路由键时,会尝试查找对应路由键的绑定。

fanout交换器在路由消息的时候,会忽略路由键,不需要进行查找。direct只有一个绑定,也会比较快,topic存储的路由信息比较复杂,由于路由键可以包含以点分隔的多个词,所以匹配消息路由键不仅仅是简单字符串的匹配,也会占用更多内存。

RabbitMQ实现了trie树数据结构用来存储绑定路由键模式,以支持快速查询,关于这种数据结构,我之前没接触过,据说比桶状哈希表还快,后面专门写一篇介绍这个数据结构吧。

投递消息

在交换器找到消息需要路由的目的地之后,会将目的地列表返回给rabbit_router,之后会将消息的副本投递到每一个目的地,如果发布的消息中mandatory和immediate标记设置为false,这个过程会以异步方式执行,从客户端角度看,服务器会变得很快,否则会同步投递。

当mandatory标志位设置为true时,如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,那么会调用basic.return方法将消息返还给生产者,当mandatory设为false时,出现上述情形broker会直接将消息扔掉。

当immediate标志位设置为true时,如果exchange在将消息route到queue(s)时发现对应的queue上没有消费者,那么这条消息不会放入队列中。当与消息routeKey关联的所有queue(一个或多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。

假如找到了投递的队列且有消费者准备好接收消息,如果队列为空,消息会直接发送给消费者,不会经过队列这一步,会极大提升速度,所以制定容量规划并计算消息的进出率时,应尽可能让队列保持为空,如果消费滞后导致队列填满的化,服务器会收到内存告警,并将消息刷出磁盘。

还有个参数要注意:auto-ack,消费者接收到消息后,会立刻确认消息,而不用等到逻辑处理好。

以上说的提高速度的方法大部分都会牺牲可用性,要根据不同的业务场景进行平衡。

对内存和进程的考虑

在设计应用程序的时候,会有两个基本限制:选择的技术允许做什么,以及当前硬件设定允许做什么。上面讨论了第一点:不同消息路由和分发算法如何影响设计决策。关于第二点,需要考虑AMQP的元素需要多少内存,以及Erlang VM对可以创建的进程总数的硬件限制。

内存考虑

关于内存占用,书上有详细说明,这里只列出分析结果,供大家在预估容量时参考:(√表示哪些表会为队列声明添加记录)

1.队列元数据

2.交换器元数据

3.绑定元数据

一个持久化队列绑定到一个瞬时交换器会导致在rabbit_semi_durable_router表上创建条目。

Erlang进程计数

可以在节点启动时指定Erlang节点上能运行的最大Erlang进程数,默认设置是每个Erlang节点1048576,即2^20个。

Erlang应用程序在整个生命周期中会多次创建并销毁进程。比如,RabbitMQ接收到AMQP客户端的TCP连接时,会创建一个进程进行管理该连接,同时,会有很多Erlang进程来处理消息存储的逻辑。

主要通过以下事件来增加进程数:到服务器的新连接、创建新的信道以及队列声明。一条新的连接会创建四个新的进程,一个新的通道也会创建四个新的进程,队列的开销最小,每个队列一个进程。

对安全的考虑

有些消息,想以一种安全的方式进行传输,可以使用SSL协议在消息通信终端传输数据,RabbitMQ默认支持SSL,只需要配置相应的证书,使用openssl库进行设置和操作。

关于证书、openssl以及ssl,上一篇文章详细介绍了,现在来看看如何使用。

服务端

只需要修改下rabbitmq的配置即可,在rabbitmq.config中添加ssl_listeners和ssl_options配置项:

[{rabbit,[{ssl_listeners, [5671]},{ssl_options, [{cacertfile,"/path/to/rmqca/cacert.pem"},{certfile,"/path/to/server/cert.pem"},{keyfile,"/path/to/server/key.pem"},{verify,verify},{fail_if_no_peer_cert,false}]}]}

] 

配置中指定了ca的证书,服务端的证书,以及服务端的秘钥。

客户端

require_once(__DIR__ . '/../amqp.inc');

define('HOST', 'localhost');
define('PORT', 5671);
define('USER', 'guest');
define('PASS', 'guest');
define('VHOST', '/');
define('AMQP_DEBUG', true);
define('CERTS_PATH','/path/to/ca/folder/');$ssl_options = array('cafile' => CERTS_PATH . '/rmqca/cacert.pem','local_cert' => CERTS_PATH . '/phpcert.pem','verify_peer' => true);
$conn = new AMQPSSLConnection(HOST, PORT, USER, PASS, VHOST, $ssl_options);

function shutdown($conn){$conn->close();
}
register_shutdown_function('shutdown', $conn);

while(1){} 

客户端代码指定了ca根证书和客户端证书和秘钥,phpcert.pem是客户端证书、秘钥、ca根证书的合并文件。

$ cat client/key.pem > phpcert.pem
$ cat client/cert.pem >> phpcert.pem
$ cat rmqca/cacert.pem >> phpcert.pem 

下一篇会介绍下RabbitMQ的插件,以便自定义插件扩展RabbitMQ功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JSP SSM众包网站系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM众包网站系统 是一套完善的系统源码,对理解JSP java SrpingMVC mybiats 框架 MVC编程开发语言有帮助,系统具有完整的源代码和数据库,以及相应配套的设计文档,系统主要采用B/S模式开发。 研究的基本内容…

JUC并发编程学习笔记——CAS个人理解

1. CAS引出 1.1 悲观锁 顾名思义,就是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只…

什么是 HTTP?

什么是 HTTP? 超文本传输协议 (HTTP) 是万维网的基础,用于通过超文本链接加载网页。HTTP 是应用程序层协议,旨在在联网设备之间传输信息,并在网络协议栈的其他层之上运行。HTTP 上的典型流涉及客户端计算机向服务器发出请求&…

2023CUPT第十四题 射流的折射 思路与解法

文章未完首先声明一点,这个题我还没想好最后的答案,欢迎交流(备注:博主今年不参加CUPT 博主去做电子设计大赛了!有电赛谁还玩CUPT啊)声明2:博主没有学过流体力学所以。。声明3:博主的…

[oeasy]python0045_转化为10进制数_int_integrate_integer_entire_整数

转化为10进制 回忆上次内容 上这次总结了四种进制 函数名对应单词进制类型数字事例前缀bin()binary20b11000010boct()octal80o1410ohex()hexadecimal160x610x?decimal1097无 十进制数 可以转化 为 其他进制 的 字符串状态 那反过来 其他进制形态的字符串 可以转化回 10进制…

Qt 自带标题处理方法思路

目录 需求 相关方法也有两种 1.只需要继承QAbstractNativeEventFilter类,从写放nativeEventFilter,并调用安装函数installNativeEventFilter 2.第二种是Qt提供的继承QWidget 重写bool nativeEvent(const QByteArray &eventType, void *message, …

RocketMQ事务消息原理简析

零、业务场景 在项目中,经常遇到这样一个场景,需要保证数据持久化和消息发送要么同时成功,要么同时失败。比如当用户在交易系统下了一个订单,购物车需要消费订单消息清除加购数据、积分系统需要变更用户积分、短信平台需要给买家…

如何选择显示检波器

之所以介绍频谱仪的显示检波器,是因为在宽带信号功率测试、功率谱密度测试及相噪测试等应用中,对显示检波器的选择有一定的要求。如果选择的检波器不合适,那么将无法准确完成测试。本文的目的也是想让初学者对这一块内容有更多的认识&#xf…

新手运营适合哪个跨境电商平台

很多企业的网站被收录却没有排名,关键词优化不上去,网站也没有什么流量,不断更新文章,即使是原创,也排不上去,这究竟是由于哪些原因造成的呢?米贸搜作为专业的SEO平台,整理了以下几种…

茶叶为啥那么贵?

60000个嫩芽才制作一斤好茶 茶叶采摘成本太高 如何通过机器人采茶? 趣讲大白话:茶叶贵是有道理滴 *********** 浙江理工大学智能采茶机器人 能自主识别茶树芽叶 控制机械臂进行精准采摘 芽叶识别准确率能达到82%左右 平均采摘速度2.5秒/颗 采摘成功率达…

【NI Multisim 14.0原理图的设计——简单电路设计】

目录 🥝🥝序言 🍍1.使用菜单命令 🍍2.右键快捷命令 🍍3. 使用快捷键 🥝🥝一、放置导线 🍍1.自动连线 🍍2. 手动连线 🍍 3.设置导线的属性 &#x1f3…

单目ADAS系列教程-相机基础篇

文章目录前言相机相关的4大坐标系像素坐标系与图像坐标系的转换图像坐标系与相机坐标系的转换相机坐标系与世界坐标系的转换相机畸变标定方法小结前言 PS:本文仅讨论针孔模型相机,其余类型相机并不涉及! 相机基础包括相机内参,相…

(1)WireShark

1.工具简介(1)定义WireShark是一个网络封包分析软件。网络封包分析软件的功能是抓取网络封包,并尽可能显示出最为详细的网络封包资料。使用WinPACA作为接口,直接与网卡进行数据报文交换。(2)嗅探器工作原理收集:从网络线缆上收集原始二进制数…

Redis客户端命令基础操作二

目录 Redis中五种常用的结构: 字符串:String 字符串可以存储三种类型的值:字节串、整数、浮点数 列表:List Redis中五种常用的结构: 字符串(string)、列表(list)、集合(set)、散列(hash)、有序集合(zset)客户端基础命令操作 字…

Java项目:旅游网站管理系统设计和实现(java+springboot+jsp+mysql+spring)

源码获取:博客首页 "资源" 里下载! 运行环境: java jdk 1.8 IDE环境: IDEA tomcat环境: Tomcat 7.x,8.x,9.x版本均可 主要功能说明: 管理员角色包含以下功能:管理员登录,用户管理,旅游路线管…

集装箱号识别率99.98%+实时返回结果高泛化,全球领先飞瞳引擎集装箱识别检测云服务全球三千企业用户,集装箱信息识别铅封识别免费

飞瞳引擎™AI集装箱识别检测云服务全球三千企业使用,顶尖AI科技集装箱号识别率99.98%以上高泛化性高鲁棒性,可二次开发或小程序拍照使用,集装箱号铅封号识别API免费实时返回结果。CIMCAI是全球规模领先应用范围领先,核心技术领先的…

帆软数据决策平台连接SAP RFC实例

一、介绍由于SAP ABAP开发出来的报表很单一,形式很有限,而且调整报表格式和形式都显得特别的鸡肋,所以现在将SAP系统通过RFC接口模式接入到帆软报表数据决策平台下展示。本文将详细介绍如何将数据从SAP传输到帆软平台上。二、准备工作首先得先…

色氨酸代谢与肠内外健康稳态

谷禾健康 色氨酸(Tryptophan,简称 Try)是人体必需氨基酸,也是唯一含有吲哚结构的氨基酸,由食物尤其膳食蛋白质提供,是正常细胞稳态所必需的,是维持细胞生长和协调机体对环境和饮食线索的反应&am…

Java基础06——字符串

Java基础06——字符串一、String1. 字符串特点2. 创建字符串对象的两种方式直接赋值new3. 字符串常用方法a. 比较b. 遍历c. 截取d. 替换二、StringBuilder1. StringBuilder概述2. StringBuilder构造方法3. StringBuilder常用方法三、StringJoiner1. StringJoiner概述2. StringJ…

mysqldump binlog增量恢复会导致数据重复

1. mysqldump时间很长,导出第一个表和导出最后一个表的时间可能过去几个小时,如果期间不锁库,使用binlog增量恢复的时候,如果从备份开始的binlog开始恢复,备份期间别的表的改动通过应用binlog日志会再次被应用一次。导…