Dropbox:SMR技术驱动成本与性能双赢

全文概览

随着全球数据量以指数级增长,云存储巨头Dropbox通过其核心存储系统”Magic Pocket”持续突破存储规模边界。本文聚焦Dropbox如何通过SMR硬盘技术、硬件架构演进及软件优化,实现EB级存储系统的成本控制与性能提升。从2013年144TB的初代系统到2024年单平台2.7PB的第七代架构,Dropbox通过SMR技术将存储密度提升20%,同时通过移除SSD缓存等创新设计,意外实现写入吞吐量翻倍。

本文将解密其技术路径中的关键决策:如何平衡SMR硬盘的写入性能限制?如何通过硬件堆叠优化降低能耗?以及未来存储技术如HAMR如何重塑存储密度天花板。这些实践不仅为云存储行业提供宝贵经验,更揭示了存储介质与系统架构协同演进的底层逻辑。

阅读收获

掌握SMR硬盘在云存储场景中的成本优化策略与性能调优方法理解存储系统硬件演进的量化指标(容量/功耗/密度)及其商业价值获取从架构设计到介质选择的全栈存储系统优化思维框架预判未来5-10年存储技术发展路径(HAMR/3D记录等)SMR 优化创新

Dropbox:SMR技术驱动成本与性能双赢Storage @Dropbox Scaling Magic Pocket An Exabyte Scale Object Storage System-Fig-14.png

积极采用SMR硬盘

图片介绍了存储系统采用叠瓦式磁记录 (Shingled Magnetic Recording, SMR) 技术的第一个版本 (V.0)。关键信息包括:

提高密度和成本节约: 采用 SMR 技术的主要目的是为了在相同的物理空间内存储更多的数据,从而降低存储成本。Go -> Rust (OSD & 卷管理器): 存储系统中的 OSD(对象存储设备)和卷管理器这两个关键组件已经从 Go 语言迁移到了 Rust 语言。这通常是为了获得更好的性能、可靠性或者两者兼有。Rust 语言以其内存安全和并发性而闻名。Libzbc + 自定义磁盘格式: 系统使用了 libzbc 库以及自定义的磁盘格式。libzbc 是一个用于管理 Zoned Block Commands (ZBC) 的库,ZBC 与 SMR 硬盘的管理密切相关。自定义磁盘格式则可能是为了更好地适应 SMR 硬盘的特性。SSD 缓存用于暂存写入: 系统使用了固态硬盘 (SSD) 作为缓存来暂存写入操作。这是因为 SMR 硬盘在写入时有特殊的限制,通常顺序写入性能较好,而随机写入性能较差。SSD 缓存可以帮助将随机写入转化为顺序写入,从而提高整体写入性能。元数据在传统区域: 硬盘上的元数据存储在传统的非 SMR 区域。这可能是为了确保对元数据的快速随机访问,因为 SMR 区域的写入方式可能不适合频繁的元数据更新。14TB 硬盘: 系统使用的是 14TB 容量的硬盘。https://github.com/dropbox/pb-jelly – Rust protobuf 代码生成框架: 提到了一个 GitHub 上的链接,指向一个用 Rust 编写的 protobuf 代码生成框架。这表明系统内部可能使用了 Protocol Buffers 进行数据序列化和通信,并且 Dropbox 团队自己开发了一个 Rust 版本的代码生成工具

图片中还展示了一个“SMR 磁道布局”的示意图,说明了 SMR 硬盘通过重叠磁道来提高存储密度的方式。

这张图片描述了该存储系统为了提高存储密度和降低成本而采用 SMR 技术的初步尝试,并介绍了相关的技术选型和优化策略,例如核心组件的 Rust 语言迁移、使用 libzbc 和自定义磁盘格式来管理 SMR 硬盘,以及利用 SSD 缓存来提升写入性能。

SMR 技术在 HDD 领域的应用前景展望

积极方面:

持续增长的容量需求: 随着数据量的爆炸式增长,对存储容量的需求也在不断攀升。SMR 技术能够显著提高 HDD 的存储密度,在相同的物理空间内存储更多数据,这对于满足日益增长的容量需求至关重要。成本效益: 相较于传统的 CMR (Conventional Magnetic Recording) 硬盘,SMR 硬盘通常具有更高的容量和更低的单位存储成本。这对于对成本非常敏感的应用场景,如云存储、大数据归档、监控存储等,具有很强的吸引力。特定应用场景的契合: SMR 硬盘的特性使其非常适合于写入次数较少、读取次数较多的应用场景,例如数据归档、备份、冷存储等。在这些场景下,SMR 硬盘的写入性能限制并不构成主要瓶颈。行业领导者的推动: 像 Dropbox 这样的行业领导者积极采用并优化 SMR 技术,表明该技术在实际应用中是可行的,并且能够带来明显的成本和容量优势。他们的经验和实践也会推动整个行业对 SMR 技术的接受和应用。技术进步: 随着技术的不断发展,未来可能会出现新的方法来克服 SMR 硬盘的写入性能限制,例如更智能的缓存管理、更优化的磁盘格式等。

需要考虑的方面:

写入性能限制: SMR 硬盘的写入方式决定了其在随机写入性能方面不如传统的 CMR 硬盘。这使得 SMR 硬盘不太适合需要频繁进行随机写入的应用场景,例如作为操作系统的主硬盘或高负载的事务型数据库存储。软件和系统适配: 为了充分利用 SMR 硬盘的容量优势并克服其性能限制,需要在操作系统、文件系统、存储管理软件等层面进行相应的适配和优化。例如,Dropbox 采用了 libzbc 库和自定义磁盘格式,并利用 SSD 缓存来缓解写入性能问题。用户接受度: 对于一些对性能要求较高的用户来说,SMR 硬盘的写入性能可能会成为一个顾虑。厂商需要在产品宣传和技术支持方面做好工作,帮助用户理解 SMR 硬盘的适用场景。

Dropbox:SMR技术驱动成本与性能双赢Storage @Dropbox Scaling Magic Pocket An Exabyte Scale Object Storage System-Fig-15.png

SSD 缓存容量瓶颈

图片展示了一个关于存储系统 SSD 缓存瓶颈的趋势。图表横轴是时间,从 2020 年初到 2022 年底,纵轴是存储服务器数量和磁盘容量。

图表显示,随着时间的推移,存储服务器的数量呈现下降趋势,而磁盘容量则呈现上升趋势。这表明每个服务器的存储密度在不断增加,可能得益于采用了更高容量的硬盘,例如之前提到的 14TB 的 SMR 硬盘。

关键信息是,“聚合磁盘的吞吐量开始高于每个服务器一到两个 SSD 的吞吐量”。这意味着,随着单个服务器上聚合的硬盘数量和总吞吐量的增加,服务器上配置的一到两个 SSD 作为缓存可能已经无法满足性能需求,成为了系统的瓶颈。

图片揭示了随着存储密度的提高,原有的 SSD 缓存策略可能已经无法有效提升整体性能,反而成为了限制系统吞吐量的瓶颈。这可能需要对 SSD 缓存的大小、数量或使用策略进行重新评估和调整。

Dropbox:SMR技术驱动成本与性能双赢Storage @Dropbox Scaling Magic Pocket An Exabyte Scale Object Storage System-Fig-16.png

OSD 当前版本

图片介绍了当前版本的 OSD(对象存储设备),其中一个显著的变化是移除了 SSD 缓存。这一改动带来了以下影响和原因:

爱派AiPy 爱派AiPy

融合LLM与Python生态的开源AI智能体

爱派AiPy 1 查看详情 爱派AiPy 移除 SSD 缓存: 之前版本中用于加速写入操作的 SSD 缓存已被移除。更简单的软件栈: 移除 SSD 缓存简化了存储系统的软件架构。更少的硬件组件: 每个存储服务器减少了一个硬件组件(SSD 缓存盘),降低了硬件成本和复杂性。性能提升: 令人意外的是,移除 SSD 缓存后,系统的性能反而得到了提升。图片下方的图表显示,在移除 SSD 缓存后,写入吞吐量(每秒写入操作数)从约 588 提升到了约 1300 以上,同时写入操作的延迟也从 1-1.5 秒降低到了约 0.5 秒。高比例的 SMR 硬盘: 当前集群中超过 95% 的硬盘是 SMR 硬盘,这表明系统已经大规模采用了这种高密度的存储技术。

图片中还对比了带有 SSD 缓存和不带 SSD 缓存的存储引擎架构,以及它们在写入吞吐量和延迟方面的表现。数据清晰地表明,在当前的 OSD 版本中,直接使用 SMR 硬盘的性能要优于使用 SSD 缓存的方案。

图片揭示了一个重要的架构演进,即通过移除 SSD 缓存,该存储系统在简化设计、降低成本的同时,还实现了写入性能的显著提升。这可能归功于软件栈的优化以及对 SMR 硬盘特性的更深入理解和利用。

存储硬件演化

Dropbox:SMR技术驱动成本与性能双赢Storage @Dropbox Scaling Magic Pocket An Exabyte Scale Object Storage System-Fig-17.png

图片展示了存储系统硬件的演进历程,从第一代到第七代(及更新),时间跨度从 2013 年到 2024 年。可以看出,存储硬件经历了显著的容量增长:

第一代 (2013) – Big Show: 总容量为 144 TB,使用 36 块 4TB 的硬盘。第二代 (2014) – Andre: 总容量提升至 192-240 TB,硬盘数量增加到 48-60 块,单块容量仍为 4TB。第三代 (2016) – Atlas: 总容量达到 270 TB,硬盘数量略有减少(35-45 块),但单块容量提升至 6-8TB。第四代 (2017) – Axel: 总容量大幅提升至 624-720 TB,硬盘数量显著增加到 78-90 块,单块容量为 8TB。第五代 (2018) – Stimpy: 总容量达到 1.4-1.6 PB(拍字节),硬盘数量增加到 100-102 块,单块容量提升至 14-16TB。第六代 (2023) – Scooby: 总容量进一步提升至 1.8-2.6 PB,硬盘数量保持在 100-102 块,单块容量提升至 18-25TB。第七代及更新 (2024) – Sonic: 总容量达到 2.7 PB 以上,硬盘数量略微减少至 96 块,但单块容量大幅提升至 28TB 以上。

Dropbox:SMR技术驱动成本与性能双赢Storage @Dropbox Scaling Magic Pocket An Exabyte Scale Object Storage System-Fig-18.png

存储平台的挑战

图片列出了存储平台面临的一些挑战:

振动余量: 硬盘对振动比较敏感,过大的振动可能导致 I/O 性能下降,甚至出现写入或读取失败的情况。因此,需要确保存储平台具有足够的振动余量,以保证系统的稳定运行。温控: 存储设备在运行过程中会产生热量,过高的温度会影响硬盘的年故障率 (Annualized Failure Rate, AFR),降低其寿命。良好的散热和温度控制对于保证硬件的可靠性至关重要。重量和功耗: 大规模存储平台通常重量较大,功耗也较高。在部署和运维过程中需要特别注意这些因素,例如机房的承重能力、电力供应以及能耗成本等。服务等级协议 (SLAs): 为了满足服务等级协议的要求,存储平台需要保证较低的年故障率 (AFR),这意味着需要采取各种措施来提高硬件的可靠性。此外,还需要有效地管理数据的“填充和排空”过程,这可能涉及到数据迁移、容量扩展或退役等操作。

Dropbox:SMR技术驱动成本与性能双赢Storage @Dropbox Scaling Magic Pocket An Exabyte Scale Object Storage System-Fig-20.png

平台硬盘演进历程

图片概述了存储平台中硬盘的演进历程。关键信息如下:

2018 年在 14TB 容量的硬盘上启用 SMR 技术: 这标志着叠瓦式磁记录 (SMR) 技术开始被应用到该存储平台中。当时,该平台已经积累了 7 年的运行经验。SMR 技术带来额外的 10-20% 容量提升: 采用 SMR 技术后,在相同的物理尺寸下,硬盘的存储容量能够额外增加 10% 到 20%。超过 95% 的集群使用 SMR 硬盘: 目前,该存储平台超过 95% 的硬盘都采用了 SMR 技术,这表明 SMR 已经成为其主要的存储介质。磁盘技术发展趋势:盘片数量增加: 硬盘内部的盘片数量持续增加,这是提高总容量的常见方法。面密度: 硬盘盘片上的磁记录密度(单位面积存储的数据量)也在不断提高,这也是容量增长的关键因素。SMR: 叠瓦式磁记录技术是提高硬盘容量的重要驱动力。

Dropbox:SMR技术驱动成本与性能双赢Storage @Dropbox Scaling Magic Pocket An Exabyte Scale Object Storage System-Fig-21.png

平台能效研究

图片展示了存储硬件在不同代数之间,存储 1 Exabyte 数据所需的功耗变化情况。可以看出,随着硬件的演进,存储效率和功耗控制都得到了显著提升:

第四代: 存储 1 Exabyte 数据需要 1456 个机架,每个机架的 p90 功耗为 6.46 kW,总功耗高达 9408 kW。第五代: 存储 1 Exabyte 数据所需的机架数量大幅减少到 642 个,每个机架的 p90 功耗略微上升到 7.6 kW,总功耗降至 4883 kW。第六代: 机架数量进一步减少到 411 个,每个机架的 p90 功耗继续上升到 8.2 kW,总功耗进一步降低到 3371 kW。第七代: 存储 1 Exabyte 数据所需的机架数量最少,为 360 个,但每个机架的 p90 功耗上升到 10 kW,总功耗为 4000 kW。虽然第七代的总功耗比第六代略有上升,但仍然远低于第四代和第五代。

图片下方着重对比了第四代和第七代存储硬件在存储 1 Exabyte 数据时的差异:第七代相比第四代,功耗降低了一半 (½ the Power),并且占用的空间减少了 75% (75 % less space)。

未来方向

Dropbox:SMR技术驱动成本与性能双赢Storage @Dropbox Scaling Magic Pocket An Exabyte Scale Object Storage System-Fig-22.png

存储密度不断攀升

图表上绘制了不同硬盘记录技术的演进趋势,包括:

PMR: 垂直磁记录 (Perpendicular Magnetic Recording),包括带有或不带有叠瓦式磁记录 (SMR) 的二维磁记录 (TDMR)。该技术在 2018 年至 2022 年间占据主要地位,面密度约为 1 Tb/in²。E-PMR / MAMR: 增强型 PMR,带有或不带有能量辅助,包括微波辅助磁记录 (MAMR)。该技术从 2022 年开始发展,预计在 2026 年左右面密度将超过 1 Tb/in²。HAMR: 热辅助磁记录 (Heat-Assisted Magnetic Recording)。该技术预计在 2030 年左右面密度将达到 10 Tb/in²。HAMR + HAMR with ordered granular media: 带有有序颗粒介质的 HAMR。HAMR + HDMR / 3D: 带有热点磁记录 (HDMR) 的 HAMR 和三维记录 (3D)。HDMR / 3D: 热点磁记录和三维记录。

Dropbox:SMR技术驱动成本与性能双赢Storage @Dropbox Scaling Magic Pocket An Exabyte Scale Object Storage System-Fig-23.png

复杂系统IO管理

图片描述了一个存储系统面临的复杂工作负载场景。图表形象地展示了在存储设备的不同区域同时发生的多种类型的操作,包括实时的写入(Live Writes)和读取(Live Read)、数据擦洗(Scrub)、全条带写入(Full Stripe Writes)以及行区域更新(Row Zone Updates)。

右侧的文字进一步说明了这种工作负载的特点是“非常混合”,包含“主要是随机的 IOPS”(每秒输入/输出操作数),并且“平均负载为 1MiB”。这暗示了该存储系统需要处理各种各样且无规律的读写请求,这对于系统的性能和效率可能带来挑战。

延伸思考

这次分享的内容就到这里了,或许以下几个问题,能够启发你更多的思考,欢迎留言,说说你的想法~

当SMR硬盘占比超过95%时,如何设计容错机制应对其写入性能波动?在SSD缓存被移除后,系统性能反而提升的现象,是否暗示存储架构设计的范式转变?HAMR技术需要激光加热磁头,这对存储系统的散热设计会产生哪些颠覆性挑战?

原文标题:Storage @Dropbox Scaling Magic Pocket An Exabyte Scale Object Storage System

以上就是Dropbox:SMR技术驱动成本与性能双赢的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/790855.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月26日 14:05:18
下一篇 2025年11月26日 14:11:17

相关推荐

  • Uniapp 中如何不拉伸不裁剪地展示图片?

    灵活展示图片:如何不拉伸不裁剪 在界面设计中,常常需要以原尺寸展示用户上传的图片。本文将介绍一种在 uniapp 框架中实现该功能的简单方法。 对于不同尺寸的图片,可以采用以下处理方式: 极端宽高比:撑满屏幕宽度或高度,再等比缩放居中。非极端宽高比:居中显示,若能撑满则撑满。 然而,如果需要不拉伸不…

    2025年12月24日
    400
  • 如何让小说网站控制台显示乱码,同时网页内容正常显示?

    如何在不影响用户界面的情况下实现控制台乱码? 当在小说网站上下载小说时,大家可能会遇到一个问题:网站上的文本在网页内正常显示,但是在控制台中却是乱码。如何实现此类操作,从而在不影响用户界面(UI)的情况下保持控制台乱码呢? 答案在于使用自定义字体。网站可以通过在服务器端配置自定义字体,并通过在客户端…

    2025年12月24日
    800
  • 如何在地图上轻松创建气泡信息框?

    地图上气泡信息框的巧妙生成 地图上气泡信息框是一种常用的交互功能,它简便易用,能够为用户提供额外信息。本文将探讨如何借助地图库的功能轻松创建这一功能。 利用地图库的原生功能 大多数地图库,如高德地图,都提供了现成的信息窗体和右键菜单功能。这些功能可以通过以下途径实现: 高德地图 JS API 参考文…

    2025年12月24日
    400
  • 如何使用 scroll-behavior 属性实现元素scrollLeft变化时的平滑动画?

    如何实现元素scrollleft变化时的平滑动画效果? 在许多网页应用中,滚动容器的水平滚动条(scrollleft)需要频繁使用。为了让滚动动作更加自然,你希望给scrollleft的变化添加动画效果。 解决方案:scroll-behavior 属性 要实现scrollleft变化时的平滑动画效果…

    2025年12月24日
    000
  • 如何为滚动元素添加平滑过渡,使滚动条滑动时更自然流畅?

    给滚动元素平滑过渡 如何在滚动条属性(scrollleft)发生改变时为元素添加平滑的过渡效果? 解决方案:scroll-behavior 属性 为滚动容器设置 scroll-behavior 属性可以实现平滑滚动。 html 代码: click the button to slide right!…

    2025年12月24日
    500
  • 如何选择元素个数不固定的指定类名子元素?

    灵活选择元素个数不固定的指定类名子元素 在网页布局中,有时需要选择特定类名的子元素,但这些元素的数量并不固定。例如,下面这段 html 代码中,activebar 和 item 元素的数量均不固定: *n *n 如果需要选择第一个 item元素,可以使用 css 选择器 :nth-child()。该…

    2025年12月24日
    200
  • 使用 SVG 如何实现自定义宽度、间距和半径的虚线边框?

    使用 svg 实现自定义虚线边框 如何实现一个具有自定义宽度、间距和半径的虚线边框是一个常见的前端开发问题。传统的解决方案通常涉及使用 border-image 引入切片图片,但是这种方法存在引入外部资源、性能低下的缺点。 为了避免上述问题,可以使用 svg(可缩放矢量图形)来创建纯代码实现。一种方…

    2025年12月24日
    100
  • 如何让“元素跟随文本高度,而不是撑高父容器?

    如何让 元素跟随文本高度,而不是撑高父容器 在页面布局中,经常遇到父容器高度被子元素撑开的问题。在图例所示的案例中,父容器被较高的图片撑开,而文本的高度没有被考虑。本问答将提供纯css解决方案,让图片跟随文本高度,确保父容器的高度不会被图片影响。 解决方法 为了解决这个问题,需要将图片从文档流中脱离…

    2025年12月24日
    000
  • 为什么 CSS mask 属性未请求指定图片?

    解决 css mask 属性未请求图片的问题 在使用 css mask 属性时,指定了图片地址,但网络面板显示未请求获取该图片,这可能是由于浏览器兼容性问题造成的。 问题 如下代码所示: 立即学习“前端免费学习笔记(深入)”; icon [data-icon=”cloud”] { –icon-cl…

    2025年12月24日
    200
  • 如何利用 CSS 选中激活标签并影响相邻元素的样式?

    如何利用 css 选中激活标签并影响相邻元素? 为了实现激活标签影响相邻元素的样式需求,可以通过 :has 选择器来实现。以下是如何具体操作: 对于激活标签相邻后的元素,可以在 css 中使用以下代码进行设置: li:has(+li.active) { border-radius: 0 0 10px…

    2025年12月24日
    100
  • 如何模拟Windows 10 设置界面中的鼠标悬浮放大效果?

    win10设置界面的鼠标移动显示周边的样式(探照灯效果)的实现方式 在windows设置界面的鼠标悬浮效果中,光标周围会显示一个放大区域。在前端开发中,可以通过多种方式实现类似的效果。 使用css 使用css的transform和box-shadow属性。通过将transform: scale(1.…

    2025年12月24日
    200
  • 为什么我的 Safari 自定义样式表在百度页面上失效了?

    为什么在 Safari 中自定义样式表未能正常工作? 在 Safari 的偏好设置中设置自定义样式表后,您对其进行测试却发现效果不同。在您自己的网页中,样式有效,而在百度页面中却失效。 造成这种情况的原因是,第一个访问的项目使用了文件协议,可以访问本地目录中的图片文件。而第二个访问的百度使用了 ht…

    2025年12月24日
    000
  • 如何用前端实现 Windows 10 设置界面的鼠标移动探照灯效果?

    如何在前端实现 Windows 10 设置界面中的鼠标移动探照灯效果 想要在前端开发中实现 Windows 10 设置界面中类似的鼠标移动探照灯效果,可以通过以下途径: CSS 解决方案 DEMO 1: Windows 10 网格悬停效果:https://codepen.io/tr4553r7/pe…

    2025年12月24日
    000
  • 使用CSS mask属性指定图片URL时,为什么浏览器无法加载图片?

    css mask属性未能加载图片的解决方法 使用css mask属性指定图片url时,如示例中所示: mask: url(“https://api.iconify.design/mdi:apple-icloud.svg”) center / contain no-repeat; 但是,在网络面板中却…

    2025年12月24日
    000
  • 如何用CSS Paint API为网页元素添加时尚的斑马线边框?

    为元素添加时尚的斑马线边框 在网页设计中,有时我们需要添加时尚的边框来提升元素的视觉效果。其中,斑马线边框是一种既醒目又别致的设计元素。 实现斜向斑马线边框 要实现斜向斑马线间隔圆环,我们可以使用css paint api。该api提供了强大的功能,可以让我们在元素上绘制复杂的图形。 立即学习“前端…

    2025年12月24日
    000
  • 图片如何不撑高父容器?

    如何让图片不撑高父容器? 当父容器包含不同高度的子元素时,父容器的高度通常会被最高元素撑开。如果你希望父容器的高度由文本内容撑开,避免图片对其产生影响,可以通过以下 css 解决方法: 绝对定位元素: .child-image { position: absolute; top: 0; left: …

    2025年12月24日
    000
  • CSS 帮助

    我正在尝试将文本附加到棕色框的左侧。我不能。我不知道代码有什么问题。请帮助我。 css .hero { position: relative; bottom: 80px; display: flex; justify-content: left; align-items: start; color:…

    2025年12月24日 好文分享
    200
  • HTML、CSS 和 JavaScript 中的简单侧边栏菜单

    构建一个简单的侧边栏菜单是一个很好的主意,它可以为您的网站添加有价值的功能和令人惊叹的外观。 侧边栏菜单对于客户找到不同项目的方式很有用,而不会让他们觉得自己有太多选择,从而创造了简单性和秩序。 今天,我将分享一个简单的 HTML、CSS 和 JavaScript 源代码来创建一个简单的侧边栏菜单。…

    2025年12月24日
    200
  • 前端代码辅助工具:如何选择最可靠的AI工具?

    前端代码辅助工具:可靠性探讨 对于前端工程师来说,在HTML、CSS和JavaScript开发中借助AI工具是司空见惯的事情。然而,并非所有工具都能提供同等的可靠性。 个性化需求 关于哪个AI工具最可靠,这个问题没有一刀切的答案。每个人的使用习惯和项目需求各不相同。以下是一些影响选择的重要因素: 立…

    2025年12月24日
    000
  • 带有 HTML、CSS 和 JavaScript 工具提示的响应式侧边导航栏

    响应式侧边导航栏不仅有助于改善网站的导航,还可以解决整齐放置链接的问题,从而增强用户体验。通过使用工具提示,可以让用户了解每个链接的功能,包括设计紧凑的情况。 在本教程中,我将解释使用 html、css、javascript 创建带有工具提示的响应式侧栏导航的完整代码。 对于那些一直想要一个干净、简…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信