当前位置: 首页 > news >正文

RabbitMQ(八)消息的序列化

目录

    • 一、为什么需要消息序列化?
    • 二、常用的消息序列化方式
      • 1)Java原生序列化(默认)
      • 2)JSON格式
      • 3)Protobuf 格式
      • 4)Avro 格式
      • 5)MessagePack 格式
    • 三、总结

在这里插入图片描述

RabbitMQ 是一个强大的消息中间件,广泛应用于 分布式系统 中。在使用 RabbitMQ 时,选择 合适的方式来序列化 消息可以提高:性能可靠性扩展性

一、为什么需要消息序列化?

在使用 RabbitMQ 时,消息需要在生产者和消费者之间进行传递。由于网络通信只能传输二进制数据,因此需要对消息进行 序列化将对象转换为二进制数据)和反序列化将二进制数据转换回对象)。这样才能实现生产者与消费者之间的无缝通信。

消息序列化的目标是:将对象转换为字节流。以便于在网络上进行传输。在选择序列化方式时,我们 需要考虑以下因素

  1. 性能: 序列化和反序列化的效率直接 影响消息传输的速度和延迟
  2. 空间开销: 序列化后的字节流大小会 影响网络带宽的利用存储空间的占用
  3. 可读性: 序列化后的字节流是否 易于解析和理解方便调试和维护
  4. 兼容性: 序列化方式是否 支持不同的编程语言版本之间的交互

二、常用的消息序列化方式

RabbitMQ 本身不直接处理消息内容的序列化,它主要负责消息的路由、存储和传递。当发送或接收消息时,客户端库(如:Java 中的 RabbitTemplateSpring AMQP 框架)会根据内部配置或默认设置来决定如何对消息体进行序列和反序列化。

1)Java原生序列化(默认)

  • Java 自带的 Serializable 接口和 ObjectOutputStream/ObjectInputStream 可以将对象转换为字节数组进行传输。在 Java Spring AMQP 中,默认的消息序列化方式就是 Java 原生序列化。

优点:

  • 简单易用: Java 内置支持,只需让需要序列化的类实现 Serializable 接口即可。

缺点:

  • 效率低: 生成的数据流可能比 JSON、Protocol Buffers 等二进制格式更大,导致存储和传输效率低。
  • 安全风险: 由于序列化机制中包含了类的信息,存在安全风险,如:恶意攻击者可以构造特殊序列化数据以执行任意代码(例如通过 readObject 方法的重写)。
  • 语言独立性差: Java 原生序列化只适用于 Java 环境,不便于与其他编程语言间的通信。

为了克服这些限制并提供更好的性能和互操作性,开发者通常会选择更现代和灵活的方式,如 JSONProtobuf 等。

2)JSON格式

JSON(JavaScript Object Notation):是一种轻量级的数据交换格式,易于阅读和编写。它以键值对的形式表示数据,并且在不同的编程语言中都有广泛的支持。

优点:

  • 易于使用和调试。
  • 兼容性好,支持不同编程语言和版本之间的交互。

缺点:

  • 性能较差,相比其他序列化方式,JSON 的序列化和反序列化速度较慢。
  • 字节流相对较大,占用网络带宽较多。

在 Spring AMQP 中,可以配置 MessageConverter 来替换默认的序列化器,例如使用 Jackson 库提供的 Jackson2JsonMessageConverter 将消息转换为 JSON 格式。

Spring Boot 可以通过以下方式更改默认的消息序列化策略:

spring:rabbitmq:message-converter: org.springframework.amqp.support.converter.Jackson2JsonMessageConverter

或者在 Java 配置类中定义:

@Bean
public MessageConverter jsonMessageConverter() {return new Jackson2JsonMessageConverter();
}@Autowired
public void configureRabbitTemplate(RabbitTemplate rabbitTemplate) {rabbitTemplate.setMessageConverter(jsonMessageConverter());
}

这样,消息体就会被自动转换成 JSON 字符串发送到 RabbitMQ,并在接收端反序列化回对应的 Java 对象。

补充:

如果对象中使用了 LocalDateTime,在反序列化的时候会报错:InvalidDefinitionException: Cannot construct instance of java.time.LocalDateTime (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

在这里插入图片描述

解决方式:

  • 首先,需要引入 jackson-datatype 依赖,如果之前已经引入了 spring-boot-starter-web 依赖则不需要手动添加。

在这里插入图片描述

<!-- LocalDateTime反序列化 -->
<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId><version>2.4.0</version>
</dependency>
  • 需要在 LocalDateTime 类型的字段上面添加 @JsonDeserialize 注解和 @JsonSerialize 注解来指定如何序列化和反序列化java.time.LocalDateTime类型的数据,如下所示:
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;

补充: 上述代码中,@JsonFormat 注解是完善显示形式。

使用 @JsonFormat 注解前:

在这里插入图片描述

使用 @JsonFormat 注解后:

在这里插入图片描述

3)Protobuf 格式

Protobuf(Protocol Buffers)是 Google 开发的一种高效的数据序列化格式。它以 二进制格式 存储数据,可以通过定义消息结构和 IDL(Interface Description Language)文件来实现消息的序列化和反序列化。

优点:

  • 高性能,比 JSON 和 XML 等方式更快速和高效。
  • 字节流较小,占用网络带宽和存储空间较小。

缺点:

  • 由于二进制格式存储,不易读和调试。

4)Avro 格式

Avro 是一种基于 Schema 的数据序列化系统,由 Apache 开发。Avro 使用简单的动态 Schema 来定义消息格式,并支持多种编程语言。它具有高效的压缩和快速的序列化/反序列化性能。

优点:

  • 高性能,支持快速的序列化和反序列化。
  • 字节流小,占用网络带宽和存储空间较小。

缺点:

  • Schema 管理较为复杂,需要定义并维护 Schema。

5)MessagePack 格式

MessagePack 是一种快速、紧凑且可读写的二进制序列化格式。它以键值对的形式表示数据,并支持多种编程语言。MessagePack的主要目标是提供高性能的序列化和反序列化。

优点:

  • 高性能,比 JSON 和 XML 等方式更快速和高效。
  • 字节流较小,占用网络带宽和存储空间较小。

缺点:

  • 不易读和调试。

三、总结

RabbitMQ消息序列化 是构建 分布式系统 的关键环节之一。在选择序列化方式时,需要综合考虑性能、空间开销、可读性和兼容性等因素。根据具体需求 选择合适的序列化方式,并遵循最佳时间,可以提高系统的性能、可靠性和扩展性。通过测试、优化和监控,不断改进序列化方案,使其更好地 适应实际应用场景

整理完毕,完结撒花~ 🌻





参考地址:

1.Spring boot使用Rabbitmq注解及消息序列化,https://blog.csdn.net/cristianoxm/article/details/114883340

2.RabbitMQ消息序列化的终极指南,https://baijiahao.baidu.com/s?id=1773630009654004953&wfr=spider&for=pc

相关文章:

RabbitMQ(八)消息的序列化

目录 一、为什么需要消息序列化&#xff1f;二、常用的消息序列化方式1&#xff09;Java原生序列化&#xff08;默认&#xff09;2&#xff09;JSON格式3&#xff09;Protobuf 格式4&#xff09;Avro 格式5&#xff09;MessagePack 格式 三、总结 RabbitMQ 是一个强大的消息中间…...

23款奔驰GLC260L升级原厂540全景影像 安装效果分享

嗨 今天给大家介绍一台奔驰GLC260L升级原厂360全景影像 新款GLC升级原厂360全景影像 也只需要安装前面 左右三个摄像头 后面的那个还是正常用的&#xff0c;不过不一样的是 升级完成之后会有多了个功能 那就是新款透明底盘&#xff0c;星骏汇小许Xjh15863 左右两边只需要更换后…...

【CSS】文字描边的三种实现方式

目录 1. 可行的几种方式1.1. text-shadow 描边代码优缺点 1.2. text-stroke 描边实现优缺点 1.3. svg 描边实现优缺点 总结 1. 可行的几种方式 text-shadow–webkit-text-strokesvg 1.1. text-shadow 描边 MDN text-shadow 代码 <div class"text stroke">…...

【事务】事务传播级别

Spring事务定义了7种传播机制&#xff1a; PROPAGATION_REQUIRED&#xff1a;默认的Spring事物传播级别&#xff0c;若当前存在事务&#xff0c;则加入该事务&#xff0c;若不存在事务&#xff0c;则新建一个事务。 PAOPAGATION_REQUIRE_NEW&#xff1a;若当前没有事务&#x…...

Android WiFi 连接

Android WiFi 连接 1、设置中WiFi显示2、WiFi 连接流程2.1 获取PrimaryClientModeManager2.2 ClientModeImpl状态机ConnectableState2.3 ISupplicantStaNetworkCallback 回调监听 3、 简要时序图4、原生低层驱动5、关键日志 1、设置中WiFi显示 Android WiFi基础概览 packages/a…...

PLC与上位机PN通讯时,如何防止连接失败?

连接西门子PLC时失败&#xff0c;或者连接不上PLC&#xff0c;你可能需要做以下几点设置才可以。 一般来说每个PLC都有自己的IP地址&#xff0c;如果你的地址与PLC的地址冲突也就是地址重复是连接不上PLC的&#xff0c;如果地址没有冲突&#xff0c;但是不是在一个网段上也会导…...

LDD学习笔记 -- Linux错误码

LDD学习笔记 -- Linux错误码 EACCES(Permission Denied) 13EEXIST(File Exits) 17EINVAL(Invalid Argument) 22ENOENT(No Such File or Directory)ENOMEM(Out of Memory)EIO(Input/Output Error) 5ENOSPC(No space Left on Device)ENOTTY(Not a Typewrite)EPIPE(Broken Pipe)EI…...

华为交换机入门(六):VLAN的配置

VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信&#xff0c;而VLAN间不能直接互通&#xff0c;从而将广播报文限制在一个VLAN内。 VLAN 主要用来解决如何…...

登录验证

目录 会话技术 Cookie Session JWT JWT生成 JWT校验 会话技术 会话 打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求与响应 会话跟踪 一种维护浏览器的方法 服务器需要…...

利用Podman构建基于Fission env/builder的镜像

镜像准备 构建Dockerfile fission的基础环境包括两种&#xff1a;env 以及 builder。如果仅基于code构建function&#xff08;i.e., 只创建deployachive&#xff09;&#xff0c;仅构建env即可&#xff1b;但如果需要构建sourcearchive&#xff0c;则需要同时创建env和builde…...

php加减乘除函数

目录 第一部分&#xff1a;简单示例 1、加法 2、减法 3、乘法 4、除法 第二部分&#xff1a;官方文档 1、加法 2、减法 3、乘法 4、除法 第一部分&#xff1a;简单示例 1、加法 $result bcadd(1.2, 1.4, 2); echo $result;//2.60 2、减法 $result bcsub(1.6, 1.…...

Go语言学习记录——用正则表达式(regexp包)来校验参数

前言 最近坐毕设ing&#xff0c;简单的一个管理系统。 其中对于用户注册、登录功能&#xff0c;需要进行一些参数校验。 因为之前使用过&#xff0c;因此这里计划使用正则表达式进行校验。但是之前的使用也仅限于使用&#xff0c;因此这次专门进行一次学习&#xff0c;并做此记…...

公司办公电脑文件防泄密系统

电脑文件防泄密系统是一种用于保护企业机密文件的软件系统&#xff0c;它采用一系列的安全技术手段&#xff0c;如数据加密、访问控制、审计跟踪等&#xff0c;来确保企业机密文件不被非法获取、窃取或泄漏。这种系统通常适用于企业、政府机构等需要对重要文件进行保密的机构。…...

手把手带你死磕ORBSLAM3源代码(三十四)Tracking.cc MonocularInitialization编辑

目录 一.前言 二.代码 2.1完整代码 2.2 单目视觉跟踪初始化 一.前言 这段代码是一个名为MonocularInitialization的函数,它属于Tracking类。从函数名称和代码内容来看,这个函数主要用于单目视觉跟踪的初始化过程。以下是代码的详细解读: 首先,函数检查一个名为m...

STL标准库与泛型编程(侯捷)笔记3

STL标准库与泛型编程&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…...

Iceberg: 列式读取Parquet数据

通过Spark读取Parquet文件的基本流程 SQL > Spark解析SQL生成逻辑计划树 LogicalPlan > Spark创建扫描表/读取数据的逻辑计划结点 DataSourceV2ScanRelation > Spark优化逻辑计划树&#xff0c;生成物理计划树 SparkPlan > Spark根据不同的属性&#xff0c;将逻辑…...

Ansible、Saltstack、Puppet自动化运维工具介绍

本文主要是分享介绍三款主流批量操控工具Ansible、Saltstack、Puppet主要对比区别&#xff0c;以及Ansible和saltstack的基础安装和使用示例&#xff0c;如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; There are many things that can not be broken&am…...

python线程池提交任务

1. 线程池参数设置 CPU数量&#xff1a;N线程池的核心线程数量 IO密集型的话&#xff0c;一般设置为 2 * N 1&#xff1b; CPU密集型的话&#xff0c;一般设置为 N 1 或者 使用进程池。线程池的最大任务队列长度 &#xff08;线程池的核心线程数 / 单个任务的执行时间&#…...

跨境电商企业客户服务优化指南:关键步骤与实用建议

随着全球经济一体化的加强&#xff0c;跨境电子商务产业在过去几年蓬勃发展。但是&#xff0c;为应对激烈竞争&#xff0c;提供全方面的客户服务成为了跨境电子商务卖家在市场中获得优势的关键因素之一。本文将介绍跨境电商企业优化客户服务有哪些步骤&#xff1f;以助力企业提…...

Visual Studio Code 常用快捷键

Visual Studio Code 常用快捷键 文章目录 Visual Studio Code 常用快捷键1. 主命令框2. 常用快捷键2.1 编辑器与窗口管理2.2 代码编辑格式调整光标相关重构代码查找替换显示相关其他 1. 主命令框 F1 或 CtrlShiftP : 打开命令面板。在打开的输入框内&#xff0c;可以输入任何命…...

FPGA仿真入门:手把手教你配置Quartus Prime 21.1里的Questa Starter版(附12个月免费许可攻略)

FPGA仿真工具链实战&#xff1a;从Questa Starter许可申请到Quartus Prime深度集成 当数字逻辑设计从纸上谈兵进入硬件实现阶段&#xff0c;仿真验证便成为FPGA开发流程中不可逾越的质量关卡。作为Intel FPGA生态中的黄金搭档&#xff0c;Quartus Prime与Questa的协同工作能帮助…...

Agent 工程化系列 · 第 05 篇_FunctionCall底层到底怎么实现

Agent 工程化系列 第 05 篇 Function Call 底层到底怎么实现&#xff1f;模型不是在调用函数&#xff0c;而是在生成调用意图。开篇定位 前面第 04 篇&#xff0c;我们讲清楚了 Function Call 是什么&#xff1a; 它不是让大模型“真的去执行函数”&#xff0c;而是让模型在合…...

STATA CLI:我把 Stata 接进了命令行,也接进了 AI 工作流

为什么要做这个工具 我写 stata-cli&#xff0c;不是因为想再造一个 Stata&#xff0c;也不是因为命令行天然高级&#xff0c;而是因为 Stata 明明是很多实证研究者最熟悉的工具&#xff0c;却一直很难进入现代自动化工作流。 做计量、做实证、做政策评估的人都知道&#xff0c…...

Avogadro 2:开源分子可视化库的终极技术解析

Avogadro 2&#xff1a;开源分子可视化库的终极技术解析 【免费下载链接】avogadrolibs Avogadro libraries provide 3D rendering, visualization, analysis and data processing useful in computational chemistry, molecular modeling, bioinformatics, materials science,…...

卸载软件后右键菜单残留?用PowerShell精准清理注册表(附一键备份脚本)

彻底告别右键菜单残留&#xff1a;PowerShell注册表清理实战指南 刚卸载完某款压缩软件&#xff0c;却发现右键菜单里依然顽固地留着它的选项——这种经历恐怕不少Windows用户都遇到过。上周帮同事处理电脑时&#xff0c;就遇到了一个典型案例&#xff1a;卸载"可牛压缩&q…...

5分钟快速上手JD-GUI:免费Java反编译工具的完整实战指南

5分钟快速上手JD-GUI&#xff1a;免费Java反编译工具的完整实战指南 【免费下载链接】jd-gui A standalone Java Decompiler GUI 项目地址: https://gitcode.com/gh_mirrors/jd/jd-gui 你是否曾面对一个只有.class文件的Java项目&#xff0c;却急于想了解它的内部实现&a…...

Windows XP图标主题完整指南:如何为现代Linux系统注入经典怀旧风格

Windows XP图标主题完整指南&#xff1a;如何为现代Linux系统注入经典怀旧风格 【免费下载链接】Windows-XP Remake of classic YlmfOS theme with some mods for icons to scale right 项目地址: https://gitcode.com/gh_mirrors/win/Windows-XP 还在为现代Linux桌面环…...

mmdetection环境搭建避坑指南:从CUDA版本、pip源到Gitee镜像的全流程优化

MMDetection环境搭建全流程优化&#xff1a;从版本匹配到镜像加速的实战指南 在计算机视觉领域&#xff0c;OpenMMLab系列工具包已经成为许多研究者和开发者的首选。作为其中的核心检测库&#xff0c;MMDetection凭借其模块化设计和丰富的预训练模型&#xff0c;极大地简化了目…...

告别卡顿!在Qt/C++中手动绑定线程到指定CPU核心(附性能对比测试)

告别卡顿&#xff01;在Qt/C中手动绑定线程到指定CPU核心&#xff08;附性能对比测试&#xff09; 在开发高性能桌面应用时&#xff0c;卡顿问题往往让开发者头疼不已。无论是音视频处理软件还是大型游戏客户端&#xff0c;流畅的用户体验都离不开高效的线程调度。现代操作系统…...

AI产品技能库:将顶尖产品智慧注入Claude Code的实战指南

1. 项目概述&#xff1a;当AI助手遇上产品大师的智慧如果你是一名产品经理、创业者&#xff0c;或者任何需要与产品打交道的人&#xff0c;最近可能已经感受到了AI助手带来的效率革命。无论是用Claude Code写代码&#xff0c;还是用ChatGPT梳理思路&#xff0c;这些工具正在成为…...