消息队列面试解析 - 传输协议(上)

简介: 消息队列面试解析 - 传输协议

0 前言

应用程序之间要想互相通信,一起配合来实现业务功能,还需传输协议支持。

传输协议就是应用程序之间对话的语言。设计传输协议,并无太多规范和要求,只需通信双方的应用程序都能正确处理该协议&&无歧义。


1 断句

1.1 分隔符

传输协议也是种语言,传输数据时,首要解决的就是断句。


对传输层,收到的数据是怎样的?


就是一段段的字节,但因网络不确定性,你收到的分段并不一定是生产者发出去的分段。


那在协议中也加上“标点符号”不就行?


而且,并不需要像自然语言中那么多种的标点符号,而只需定义一个分隔符即可。


这办法的确可行,很多传输协议就采用这种方法,比如HTTP 1.0协议,它的分隔符是换行(\r\n)。但这有个问题:自然语言中,标点符号是专用的,它没有别的含义,和文字天然区分。

但在数据传输过程,无论你定义什么字符作为分隔符,理论上都有可能会在传输的数据中出现。



那如何区分“数据内的分隔符”和真正的分隔符?


得在发送数据阶段,加上分隔符前,把数据内的分隔符转义,收到数据后再转义回来。

这的确是个麻烦过程,损失了一些性能。


1.2 预置长度

更加实用的方法。


给每句话前面加一个表示这句话长度的数字,收到数据时,按长度读。


如:03下雨天03留客天02天留03我不留

这里固定使用2位数字存放长度,每句话最长可支持99个字。接收后的处理就简单了,先读取2位数字03,知道接下来3个字是第一句话,那就等这3个字都收到,即可作为第一句话,同理读第二句话、第三句话。


这很好解决断句问题,实现比分隔符方法更简单,性能也更好,是普遍采用的分隔数据的方法。



redis 的 aof 文件好像就是前置长度哦,经典方案无处不在~    


前置长度是不是也有类似问题呢,03也可能是正常文字里的内容,也是要转义

吧?


你可以想一下,最好自己实现一下接收数据进行解析的代码,你就会明白,前置长度无需转义。因为解析时,可明确知道当前读到的这个位置应该是长度还是真正数据,它不需要根据数据流中的内容来确定。

目录
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
22天前
|
Java 程序员
面试官的加分题:super关键字全解析,轻松应对!
小米,29岁程序员,通过一个关于Animal和Dog类的故事,详细解析了Java中super关键字的多种用法,包括调用父类构造方法、访问父类成员变量及调用父类方法,帮助读者更好地理解和应用super,应对面试挑战。
37 3
|
1月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
87 2
|
1月前
|
存储 NoSQL MongoDB
MongoDB面试专题33道解析
大家好,我是 V 哥。今天为大家整理了 MongoDB 面试题,涵盖 NoSQL 数据库基础、MongoDB 的核心概念、集群与分片、备份恢复、性能优化等内容。这些题目和解答不仅适合面试准备,也是日常工作中深入理解 MongoDB 的宝贵资料。希望对大家有所帮助!
|
1月前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
66 1
|
3月前
|
缓存 Android开发 开发者
Android RecycleView 深度解析与面试题梳理
本文详细介绍了Android开发中高效且功能强大的`RecyclerView`,包括其架构概览、工作流程及滑动优化机制,并解析了常见的面试题。通过理解`RecyclerView`的核心组件及其优化技巧,帮助开发者提升应用性能并应对技术面试。
109 8
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
62 4

推荐镜像

更多