深入拆解消息队列 47 讲
许文强
前腾讯云 Kafka 技术负责人
5385 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
深入拆解消息队列 47 讲
15
15
1.0x
00:00/00:00
登录|注册

04|网络:如何设计高性能的网络模块?

你好,我是文强。
今天我们讲消息队列的第二个基础知识点——网络模块。对消息队列来说,网络模块是核心组件之一,网络模块的性能很大程度上决定了消息传输的能力和整体性能。
如果你是 Java 技术栈的开发人员,讲到网络模块的开发,大概率第一反应就是 Netty。Netty 作为 Java 网络编程中最出名的类库,几乎主宰了 Java 的网络编程。那消息队列网络模块的选型,是不是直接用 Netty 就可以了呢?
带着你的思考,我们开始今天的课程。
选型之前,我们得先知道要解决什么问题。消息队列是需要满足高吞吐、高可靠、低延时,并支持多语言访问的基础软件,网络模块最需要解决的是性能稳定性、开发成本三个问题。接下来我们就围绕这三点来思考消息队列网络模块应该怎样设计。首先我们先来分析一下网络模块的性能瓶颈可能在哪里。

网络模块的性能瓶颈分析

我们基于最基础的消息队列访问链路图分析。
对于单个请求来说,请求流程是:客户端(生产者 / 消费者)构建请求后,向服务端发送请求包 -> 服务端接收包后,将包交给业务线程处理 -> 业务线程处理完成后,将结果返回给客户端。其中可能消耗性能的有三个点。
编解码的速度。上节课我们详细讲过。
网络延迟。也就是客户端到服务端的网络延迟,这一点在软件层面几乎无法优化,取决于网络链路的性能,跟网络模块无关。
服务端 / 客户端网络模块的处理速度。发送 / 接收请求包后,包是否能及时被处理,比如当逻辑线程处理完成后,网络模块是否及时回包。这一点属于性能优化,是网络模块设计的核心工作,我们后续会细讲。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了设计高性能网络模块的关键技术,以满足消息队列的高吞吐、高可靠、低延时等需求。首先分析了网络模块的性能瓶颈,包括编解码速度、网络延迟和服务端/客户端网络模块的处理速度。针对这些瓶颈,提出了设计高性能网络模块的实现方法,包括基于多路复用技术管理TCP连接、快速处理高并发请求等方面。文章重点介绍了IO多路复用技术,以及在处理高并发请求时的挑战和解决方法。此外,还探讨了基于成熟网络框架提高稳定性并降低开发成本的方法。文章以Kafka和RocketMQ的网络模型为例,分析了它们的具体实现形式,展示了网络模块的设计和实现过程。整体而言,本文深入浅出地介绍了网络模块设计的关键技术点,对于开发人员了解网络模块设计具有重要参考价值。文章还提到了RPC框架作为消息队列中的网络模块的优缺点,以及对消息队列网络模块的性能、稳定性和成本三个方面的解决方法。文章最后提出了思考题,引导读者思考如何选择网络模块的设计和开发路径。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解消息队列 47 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • 杨逸林
    我反复看了老师的目录,还是感觉有点空中楼阁的感觉,只有概念,没有实际代码编写。当然,具备这些概念也是很有必要的,但是如果我看完了胡夕大佬的一篇 Kafka 实战和看过了 Kafka 源码解读大概了解第五章第六章,应该就是讲 .index、 .log、 . timeindex 这些文件还有些其他的什么优化的二分查找 offset 什么的。感觉好没劲,老师能加餐使用 Netty 或者直接用 Java 的 NIO 写个极简的 MQ 参考一下吗?

    作者回复: 老哥你好,作为研发我完全理解你的想法。 我出这门课的初衷思路跟你的想法是一样的:我想的是做了这么久消息队列了,我能自己写出来一个消息队列吗? 带着这个问题,我就开始想。如果我要写一个MQ,那么我需要做什么呢? 我的答案是: 第一步:要先设计MQ的架构 第二步:开始写代码实现 如果直接开始第二步,我理解就是空中楼阁,写到最后都不知道在写什么。那要完成第一步的话,就需要知道: 1. MQ由哪些模块构成 2. 每个模块有哪些技术方案 3. 这些方案的优劣 4. 根据自己的需求选择合适自己的方案 5. 设计出自己的方案 而在我看来,这门课就是上面这五步的一个理论指导。 在我心里,我其实很想在课程完结的时候,我能看着我的课设计出一个MQ出来。 我为什么还要看着我的课设计MQ呢? 因为人的脑容量实在优先,凭空想容易漏东西。如果有经过系统梳理各个模块的设计方案,选型思路等等。就很容易设计出一个相对理想的方案。

    2023-06-28归属地:浙江
    4
    13
  • takumi
    还有一个比较好奇的地方,像消息队列这种高性能组件,为什么Java这种带有GC的编程语言用的比较多呢

    作者回复: 我也一直在思考这个问题,我个人认为GC应该不是考虑的重点。这就像C++和Java这种不带GC和自带GC的语言的争论。就不展开讲这个。 在我看来,语言的选择主要考虑语言成熟度、性能和功能要求、开发成本三方面的因素。 从性能上看,在开发存储系统方面语言本身的特性对于性能确实有一定的影响。但是对于性能影响更大的是架构设计和编码质量。如果语言性能比较高(比如C++、Rust等),但是编码质量很差的时候,语言本身的特性就无法发挥。 所以我认为用Java 主要有下面三方面的原因: 1. Java 本身语言的性能不断的在提升,导致各个语言之间的性能差异不是那么的明显。 2. Java的生态丰富、类库稳定、功能齐全。 3. 最重要的是会的人多,深入研究Java的人也多。这也就导致了能写出高质量Java代码的人多,社区能参与项目的开发者也多。这就非常有助于社区生态的发展。

    2023-07-13归属地:上海
    2
    1
  • 新生\
    老师这些图都是用什么工具画的,真好看一图胜千言

    作者回复: 我一般用这个,蛮好用的 https://excalidraw.com/

    2023-06-28归属地:江苏
    1
  • 张申傲
    思考路径:消息队列的应用场景(业务消息/流处理/all)-> 并发量、吞吐量、可用性、稳定性等非功能需求 -> 研发团队规模与研发周期 -> 自研/选择已有的开源组件 -> 最终决定:基于Java NIO自研/基于Netty二次开发/直接上gRPC。

    作者回复: 是的,核心考虑是:是否可以满足自己的业务需求。比如考虑功能、性能、可扩展性、开发成本等等

    2023-06-28归属地:北京
    1
  • 翡翠虎
    老师有没有了解过 quic 协议,如果基于 quick 来进行通信,稳定性和效率会不会更好一点?

    作者回复: 目前业界消息队列用Quic的不多。 Quic 在流直播的场景用的比较多。从资料上来看,性能确实会比较好。但是从实际效果来看,我也不确定会更好。因为MQ + quic 的实现确实不多。 不过我记一下,我研究一下,再给你回答。

    2023-06-28归属地:广西
    7
    1
  • 特修斯之船
    这个Reactor模型听的有点一头雾水,有没有相关的补充资料可以看看

    编辑回复: 具体是哪块开始觉得很难理解,方便描述一下吗?小编和讲师一起看下。

    2023-07-18
    2
  • takumi
    老师,这门课是不是可以理解成动手写一个消息队列?

    作者回复: 是的,希望有这个机会跟大家一起手动写一个MQ。欢迎进群讨论,群里大家在讨论这个~

    2023-07-13归属地:上海
    2
  • Mr.J
    老师,文章的目录结构可以按层级加个数字嘛,比如1、2、2.1、2.1.1、这种层级的标题

    作者回复: 我得咨询一下编辑,编辑小姐姐的建议好像不太行

    2023-07-04归属地:北京
  • aoe
    1. 调研需求:需要解决什么问题、用在什么场景、预期每秒处理多少条数据 2. 确定需求:使用 DDD 的方式先确定核心需求 3. 划分 Domin、Service、Adapter 各层的职责 4. 设计出相关功能接口 5. 使用主流 MQ 系统作为底层实现:虽然许老师讲了这么多,但我依然不具备开发 MQ 系统的能力。不过套一层接口封装一下还是有希望的 6. 编码实现:使用 TDD 保障代码可以即时重构,保持实现与模型致性

    作者回复: 思路路径很清晰。 “开发一个MQ系统的能力”:这是一个非常大的工程,除了原理、还得有很多编码方面的积累,我之前做过这个事情。最近也想用rust 写一个消息队列。 最近对rust很有兴趣,想试试,毕竟实战才能成长,可以来交流交流。说不定是一个good idea。

    2023-06-28归属地:浙江
    2
  • Geek_567f64
    工作了很多年,在实际开发中只是简单的应用,当然对于消息队列的内幕也是一知半解的程度。面试的时候就怕面试官问消息队列的问题。看了网络通信这两节课,迷雾已经渐渐在拨开了,继续加油!
    2023-12-18归属地:安徽
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部