得物新一代可观测性架构:海量数据下的存算分离设计与实践

一、引言

得物作为全球领先的潮流网购社区,日益增长的用户和数据带来了巨大的技术挑战。当前,得物的可观测性平台每天生成数PB级Trace数据和数万亿条Span记录,要求平台具备高效的实时处理能力和低成本的数据存储解决方案。

传统的存算一体架构将计算与存储资源绑定,随着数据规模的扩大,暴露出了以下问题:

  • 扩展性受限:存算资源无法独立扩展,导致计算和存储的扩容必须同步,进而提升了成本。
  • 资源利用率低:计算与存储资源无法按需动态调整,造成闲置资源浪费。
  • 运维复杂性高:集群扩展和缩容涉及复杂的资源迁移,增加了运维难度。

为了有效解决这些问题,得物可观测性平台采用了存算分离架构,结合AutoMQ和Kafka以及ClickHouse存储技术,实现了高效的资源管理和性能优化。

二、Kafka的演进:AutoMQ存算分离的创新与实现

2.1 Apache Kafka在大规模数据下的挑战

图片
Apache Kafka处于得物观测业务的核心数据链路中

在得物的可观测性平台中,Apache Kafka被广泛用于数据收集、加工和分发。然而,随着业务数据量的不断增长,Kafka的架构暴露出以下问题:

  • 存储成本高:Kafka的存储部分占据了大部分(计算与存储成本比例为1:3)云资源开销,为了控制成本,得物调整了Kafka的数据TTL和副本配置,但存储成本仍居高不下。
  • 冷读效率低:冷读场景下,磁盘吞吐量常达到上限,导致性能瓶颈。

得物 Kafka 磁盘高危报警

  • 运维复杂性高:随着集群规模的扩大,Kafka集群的扩缩容操作变得更加复杂,面临较高的运维风险。

这些问题源于Kafka原生架构的局限性,特别是其面向IDC环境的Shared-Nothing架构,难以充分发挥云计算时代对弹性和扩展性的要求。

2.2 为什么选择AutoMQ

AutoMQ云原生架构

为了解决Kafka在大规模数据处理中的问题,得物可观测性平台选择了AutoMQ作为替代方案。AutoMQ的优势包括:

  • 100%兼容Kafka协议:AutoMQ完全兼容Kafka客户端和生态工具,迁移过程顺畅,避免了大规模改造。
  • 存算分离架构:存储与计算解耦,AutoMQ基于对象存储和EBS存储研发了共享流存储库S3Stream[1],并通过S3Stream替换了Apache Kafka的整个存储层,大幅降低存储成本,同时支持存储与计算的独立扩展。
  • 弹性扩缩容能力:支持动态资源调整,无需数据迁移或停机,提升资源利用率。
  • 未来扩展性:支持大规模数据量增长,能够与现代存储和计算工具无缝集成,满足长期需求。

AutoMQ面向冷读场景的性能优化

在冷读场景下,Apache Kafka的性能问题十分明显。KAFKA-7504[2]问题导致冷读操作影响实时写入,严重时会降低整个集群的吞吐量。AutoMQ通过以下方式优化了这一问题:

  • 对象存储与计算分离:存储与计算的彻底分离避免了冷读对写入性能的影响。
  • 高效查询性能:AutoMQ对查询操作进行了优化,即使在高并发场景下,冷读性能保持稳定。

Apache Kafka的读写 IO链路
Apache Kafka的读写 IO链路

Apache Kafka的读写链路引入了两个关键的技术:Page Cache[3]和零拷贝SendFile[4]系统调用。

  • Page Cache极大地简化了Kafka内存管理的负担,完全由内核来负责。但存在冷热无法分离的问题,如果有业务持续在冷读,会跟热数据互相争抢内存资源,导致追尾读能力持续下降。
  • SendFile是Kafka零拷贝的关键技术,但该调用行为发生在Kafka的网络线程池,如果执行SendFile时需要从磁盘上拷贝数据(冷读场景),会在一定程度上阻塞该线程池。又因为该线程池是处理Kafka请求的入口,包括写请求,SendFile的阻塞行为将导致Kafka的写入受到巨大的影响。

在相同负载和机型下相比Kafka,AutoMQ冷读时可以保证不影响写入吞吐和延迟的情况下,拥有和Kafka相同水准的冷读性能[5]。

图片

在冷读场景下,AutoMQ显著提升了性能,与Kafka相比,冷读效率提升了约5倍,且对实时写入没有任何影响。

AutoMQ基于共享存储架构的快速弹性能力

得物可观测性平台的业务流量呈现明显的峰谷波动,AutoMQ通过存算分离架构实现了卓越的弹性扩缩容能力:

  • 快速扩容:在业务高峰期,能够迅速扩展存储或计算资源,保障系统性能。
  • 智能缩容:高峰过后,快速回收闲置资源,避免浪费并降低运维负担。

AutoMQ的扩缩容依赖秒级分区迁移技术[6]。在扩容时,借助弹性伸缩组(ASG)[7]或Kubernetes HPA,分区可以批量迁移到新节点,确保流量快速平衡,通常在十秒内完成。缩容时,待下线节点的分区会迅速迁移至其他节点,完成秒级下线。与Apache Kafka需要通过复制数据进行扩缩容不同,AutoMQ利用共享存储架构避免了数据复制,显著提高了扩缩容效率,避免了数据重平衡[9],跟Apache Kafka的实现有巨大的区别。

图片
AutoMQ自动流量重平衡 vs. Apache Kafka手动迁移

案例

AutoMQ通过监控集群流量和CPU等指标,自动进行扩缩容。当流量达到扩容阈值时,系统会自动增加Broker节点;当流量下降至缩容阈值时,系统会优雅地将即将下线的Broker上的分区以Round-Robin方式秒级迁移至其他Broker,完成流量平衡。


集群节点数跟随流量上涨

在这里插入图片描述集群节点数跟随流量下跌

2.3 AutoMQ落地效果:千核资源替换,成本下降50%

AutoMQ在得物可观测性平台上线半年以来,逐步替换了整个可观测性架构对Apache Kafka的依赖,基于AutoMQ的整体可观测架构如下图所示,AutoMQ集群承担了所有微服务业务的产生的观测数据,并基于ClickHouse进一步提供点查和观测数据分析的能力。

图片
得物基于AutoMQ的可观测架构

AutoMQ也为得物可观测性平台带来了以下显著的成效:

  • 云账单成本同比下降50%以上,同时运维效率大幅度提升。
  • 完成近千核计算资源替换,总体吞吐高达数十GiB/s。

AutoMQ落地效果:平稳支撑得物双十一期间100%流量

除了成本大幅度降低之外,今年通过AutoMQ的架构支撑得物双十一,避免了过往双十一前繁重的容量评估工作,以及提前扩容的运维成本。AutoMQ集群上线以来,以及双十一期间全程保持高可用,零宕机,支撑了双十一期间100%的流量,且高峰期负载平稳,无性能抖动。如下图是得物可观测性平台AutoMQ集群中其中一个GiB级吞吐的集群。

图片
得物其中的一个AutoMQ GiB级集群

三、ClickHouse的进化:存算分离架构的实践与应用

3.1 背景

得物可观测性平台在分布式链路追踪中,采用ClickHouse作为Trace索引数据的存储引擎,每天管理着数十万亿行追踪数据。随着数据量的持续增长,平台不仅需要保障实时查询的高效性能,还面临着存储成本优化和集群维护复杂度提升的双重挑战。

图片

面临的挑战

ClickHouse凭借卓越的性能,在面对大规模数据时依然能够提供极快的查询响应,为可观测性平台的实时分析和监控提供了坚实保障。然而,随着业务扩展和数据量激增,原有的基于云盘自建的开源分布式架构逐渐暴露出了一些问题:

  • 成本高:得物的Trace平台从2022年至今,数据量从日增百TB级增长到数PB,膨胀了30倍。数据冷热存储的成本压力增加。
  • 可扩展性差:作为一个电商平台,每年的双11和618等购物节,Trace平台都会迎来数倍的流量上涨,为了保证业务的稳定运行,每逢业务高峰都要进行集群的扩容,分布式架构下集群扩容麻烦、需要停写影响业务,再加上集群扩容中的协调难题都为平台的维护带来了额外的工作量和稳定性压力。
  • 容灾能力较低:在实际应用中,考虑到海量数据产生的成本问题,得物并未采用多副本策略,而是通过单副本存储来优化资源利用率和降低存储开销,在更加追求系统稳定性和数据安全保障的今天,如何提高系统的容灾能力也成为了一个重要的课题。
  • 集群写入负载平衡难:为了平衡集群节点的写入负载,每次扩容时需与上游服务协同进行rebalance,以合理分配数据至新节点。这一过程虽确保了扩展后的集群性能,但对运维效率提出了更高的要求,涉及数据分布调整和写入负载平衡的精细化管理。

因此,如何在保持ClickHouse性能优势的同时,优化扩容过程中的运维流程,解决集群写入负载平衡问题,进一步提升系统的稳定性,是得物平台在持续扩展中亟需解决的核心问题。

3.2 ClickHouse企业版介绍

ClickHouse企业版是专为云环境下的存算分离架构设计,支持更高效的计算与存储资源管理。企业版与社区版的最大区别在于,它引入了更先进的存算分离架构和更多功能,能够在大规模数据处理、实时查询和存储管理方面提供更优的性能。

图片

存算分离架构是ClickHouse企业版的核心创新,它通过将计算资源和存储资源分开,极大地提高了系统的弹性和扩展性。在这种架构下,计算节点和存储节点独立扩展,存储资源可以通过共享存储(如OSS、S3等)进行集中管理,而计算节点则能够根据负载情况进行自动伸缩,从而更好地应对流量高峰期的挑战。

企业版还引入了Serverless计算模型,允许平台根据实际负载自动调整计算资源的大小。相比于传统的基于固定资源分配的计算模式,Serverless架构能帮助平台实现弹性伸缩,只在需要时自动分配计算资源,极大地节省了资源开销,同时也能更好的应对业务流量的非预期增长,提高了系统的稳定性。

SharedMergeTree表引擎

在ClickHouse企业版中,SharedMergeTree表引擎是实现存算分离架构的关键组件。SharedMergeTree优化了对共享存储(如Amazon S3、Google Cloud Storage、MinIO、阿里云OSS等)的支持,100%兼容社区版的MergeTree引擎的同时,内核还可以自动将社区版的建表语句转化为企业版专属引擎的建表语句(如下图所示),业务迁移无需DDL改造。

图片

与传统的ClickHouse集群架构相比,SharedMergeTree引擎通过以下方式提升了数据存储和查询性能:

  • 共享存储支持:所有数据都存储在共享存储中,而计算节点通过访问共享存储来执行查询和分析。这种设计使得数据的存储和计算完全分离,计算节点无需持有数据副本,从而降低了存储和计算资源的冗余。
  • 无状态计算节点:计算节点不再存储数据副本,而是通过访问共享存储中的数据进行计算。这使得每个计算节点都是“无状态”的,具有更好的扩展性和容错能力。在面对流量高峰时,新的计算节点可以快速加入并开始工作,而不需要重新分配或迁移数据。
  • 简化集群管理:用户无需管理传统的Shard或Distributed Table,SharedMergeTree引擎只需创建一张表即可,简化了集群管理流程,降低了维护复杂度。

水平扩展

在大规模电商平台的场景下,面对节假日等流量高峰时,系统需要具备快速扩展和高可用性的能力。ClickHouse企业版通过SharedMergeTree引擎,实现了分钟级水平扩展,并且在扩展过程中集群可正常执行读写任务,稳定性不受影响。

图片

扩容流程:

  1. 新节点(Server-3)加入:当需要增加计算节点时,新节点首先注册至集群的元数据管理服务(如Keeper),并开始监听数据元数据变化。
  2. 元数据同步:新节点从Keeper同步当前有效的元数据,无需锁定集群,不会影响集群其他节点的操作。
  3. 立即参与工作:新节点完成元数据同步后,立即可以处理查询请求,并按需访问共享存储中的数据。

通过这种方式,ClickHouse企业版能够在高负载下实现弹性扩展,确保集群的稳定性和业务的连续性。

3.3 落地实践与优化

最终,得物可观测性平台基于ClickHouse企业版的功能,在写入、查询、容灾能力及弹性能力方面进行了全面优化,实现了高性能和高效率的分布式链路追踪系统。
在这里插入图片描述

从自建ClickHouse社区版升级为企业版,因为企业版的存算分离架构不再有分片的概念,不再需要通过直连本地表进行写入的方式对不同分片间的数据和写入流量进行均衡,所以和原先直连节点做写入的方式不同,切换为企业版后业务写入操作的对象变为了集群本身,写入逻辑得到了简化,原有的写入流量和分片间数据不均衡带来的运维和管理的问题也从架构上得到了解决。

写入优化

图片

以下是具体的实践总结:

  • 负载均衡:借助负载均衡(LB),将写入请求均匀分配到多个计算节点,避免单节点过载,提高系统稳定性。lb采用rr模式,当集群版本升级进行节点的分批重启、以及集群中某一节点进行故障重建时,会自动调整为wrr模式来保障集群的整体无感。
  • 性能提升:利用ClickHouse企业版的Serverless架构,成功支持了分布式链路追踪场景下集群每秒高达2000万行的写入操作,单次请求40万行数据写入耗时优化至1s左右。

查询优化
图片

  • 并行查询:通过Parallel Replica特性,将查询分发至多个节点并行处理,显著提高效率。在特定场景下,查询速度提升可达2.5倍。整体查询效率与自建ClickHouse不相上下。
select trace_id,span_id, durationfrom span_indexwhere service = 'order-xxx'and startTime between '2024-11-23 16:00:00' and '2024-11-23 17:00:00'order by duration desclimit 0,30settings max_threads = 16, allow_experimental_parallel_reading_from_replicas = 1;
  • 索引优化:调整ORDER BY字段与查询顺序,最大化利用索引过滤及数据块优化,显著减少不必要的数据扫描,从而提升查询响应速度。

容灾能力

  • 单节点故障容忍:集群默认3Keeper+至少双节点架构,每个计算节点都保存着一份完整的元数据,且计算节点仅管理元数据,核心业务数据存储于共享存储中。因此,单节点故障不会影响数据访问,其余节点可继续提供服务,确保业务稳定性。
  • 高可用存储:通过采用如OSS等分布式对象存储,平台实现了高冗余的数据存储,进一步增强了系统在硬件故障情况下的恢复能力。

弹性能力
图片

  • 秒级弹性扩容:平台能够根据业务负载的实时变化,自动调整计算资源。通过监控CPU和内存使用,系统动态决策并热修改Pod配置,使扩容资源即时生效,无需重启服务。按需付费:
  • 计算按需付费
    每个节点的弹升和弹降都是独立进行,只和当前节点的实际业务负载有关的,因此无需再担心各节点间流量压力差异带来的成本冗余;同时节点的弹性扩容和缩容的最小单位均为1CCU(约1C4G),扩容事件同步至计费模块后,平台按秒计费,仅需为实际资源使用量付费。这一机制帮助得物大幅降低了资源浪费,同时确保了成本优化。
  • 存储按实际使用量付费:相比存算一体架构下需要预留至少20%的存储空间来保障集群的稳定性的资源预购模式,ClickHouse企业版的共享存储解决了自建社区版各分片数据不均衡、运维麻烦、成本冗余多的问题,同时仅按照实际使用量计费的模式结合对象存储本身价格低廉的特征,降低了得物大数据量场景下的存储成本70%+。

四、总结

通过ClickHouse企业版,得物可观测性平台实现了从写入到查询、从容灾到弹性的全面优化。企业版的存算分离架构提升了系统可靠性,而秒级弹性能力结合秒级按需付费显著降低了计算资源的使用成本约20%和存储资源的采购成本70%+(总成本下降60%)。这种实践模式不仅满足了高并发、高性能的业务需求,同时也为系统的扩展性和运维效率提供了有力支持,成功应对了链路追踪数据管理中的各种挑战。

五、引用

[1]AutoMQ基于S3的共享流存储库:https://docs.automq.com/zh/automq/architecture/s3stream-shared-streaming-storage/overview[2]Kafka冷读性能问题来源:https://issues.apache.org/jira/browse/KAFKA-7504[3]Linux Page Cache: https://en.wikipedia.org/wiki/Page_cache[4]Linux SendFile: https://man7.org/linux/man-pages/man2/sendfile.2.html[5]AutoMQ性能白皮书:https://docs.automq.com/zh/automq/benchmarks/benchmark-automq-vs-apache-kafka[6]AutoMQ秒级分区迁移:https://docs.automq.com/zh/automq/architecture/technical-advantage/partition-reassignment-in-seconds[7]AWS Auto Scaling Groups: https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-groups.html[8]Kubernetes用于扩容的 HPA 组件:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/[9]AutoMQ持续数据自平衡:https://docs.automq.com/zh/automq/architecture/technical-advantage/continuous-self-balancing[10]阿里云云数据库ClickHouse:https://help.aliyun.com/zh/clickhouse/?spm=a2c4g.11174283.0.0.61f5735a0zfJIS

敬请期待本系列的下一篇文章:《得物可观测性平台基于RUST如何在生产环境构建万亿流量》。在这篇文章中,我们将深入探讨如何利用RUST技术在生产环境中高效处理万亿级别的流量,以及我们在这一过程中积累的经验和教训。

往期回顾

1.StarRocks存算分离在得物的降本增效实践
2.盘点这些年搭建器在用户体验优化的实践|得物技术
3.解析Go切片:为何按值传递时会发生改变?|得物技术
4.Java性能测试利器:JMH入门与实践|得物技术
5.彩虹桥架构演进之路-负载均衡篇|得物技术

文 / 南风

关注得物技术,每周更新技术干货要是觉得文章对你有帮助的话,欢迎评论转发点赞~未经得物技术许可严禁转载,否则依法追究法律责任。

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

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

相关文章

​ 基于51单片机的智能公交车报站系统GPS定位语音播报智能安全检测人数统计

功能介绍 以51单片机为控制核心.LCD12864可显示当前年月日,星期,时间, 当前站名,经纬度,是否连接GPS,自动/手动模式,自带GPS定位,可实时显示经纬度;通过DS1302时钟芯片…

Gitee配置SSH公钥

采用SSH协议同步Git仓库代码的好处就是高效。在配置好SSH公钥后,不需要每次操作都要输入用户名和密码(主要针对命令行来说)。 以我个人项目为例。 生成 SSH 公钥 1. 通过命令 ssh-keygen 生成 SSH Key: ssh-keygen -t ed25519…

CV(2)-插值和卷积

前言 仅记录学习过程,有问题欢迎讨论 看看年前可以学到哪。 频率: 灰度值变化程度的指标,是灰度再平面上的梯度幅值: 幅值: 是在一个周期内,交流电瞬时出现的最大绝对值,也是一个正弦波,波…

D362 php+mysql旅游服务网站的设计与实现 源码 配置 文档 全套资料

旅游服务网站的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 近几年,随着我国国民经济和信息技术的迅速发展,旅游项目的开发和建设,已是我国旅游业发展重要经济来源之一,我国旅游业近几年的…

python——列表

目录 一,选择题 二,判断题 三,列表的思维导图 一,选择题 1.已知列表 xlist(range(9)),那么执行之后,x的值为( D ) A. [1,3,5,7,9] B.[1,3,5,7] C.[0,1…

JAVA面试基础(总结了很多)

最近帮整理了一份JAVA的面试基础,不过很基础后面还回继续更新。 java的专业技能 2.1 java的基础部分 2.1.1 简单讲一下java的跨平台原理 由于各操作系统(windows,liunx等)支持的指令集,不是完全一致的。就会让我们的程序在不同的操…

基于SpringBoot的社区医院管理系统(代码+论文)

🎉博主介绍:Java领域优质创作者,阿里云博客专家,计算机毕设实战导师。专注Java项目实战、毕设定制/协助 📢主要服务内容:选题定题、开题报告、任务书、程序开发、项目定制、论文辅导 💖精彩专栏…

linux下使用gdb运行程序,查看程序崩溃原因

1.什么是gdb? gdb 是 GNU Debugger 的缩写,是一个功能强大的用于调试程序的开源调试器工具。它可以帮助开发人员诊断和解决程序中的错误、跟踪程序执行过程、查看变量的值等。gdb 支持多种编程语言,包括 C、C、Objective-C、Fortran 等,并可…

代发考试战报:12月近几日通过,题库已经更新至12月5号

代发考试战报:12月近几日通过,题库已经更新至12月5号,考试大约会遇到几个新题,就算遇到的新题全错,也不影响考试通过,HCIA-PM 12月2号上海通过,售前L3 H19-435 HCSP-Storage 存储 上海通过&…

使用Kubernetes部署MySQL+WordPress

目录 前提条件 部署MySQL和WordPress 编写yaml文件 应用yaml文件 存在问题及解决方案 创建PV(持久化卷) 创建一个PVC(持久化卷声明) 部署添加PVC 查看PV对应的主机存储 删除资源 查看资源 删除deployment和service 查看主机数据 删除PVC和PV 删除主机数据 前提条…

深入解析 Nginx:基础介绍到原理分析及案例实践

引言 Nginx(“Engine-X”)是一个高性能的 HTTP 和反向代理服务器,广泛应用于 Web 服务、负载均衡、API 网关、反向代理、静态资源服务器等多种场景。由于其高效的性能、低资源消耗和灵活的配置,Nginx 成为众多互联网公司、企业以…

Apache HTTPD多后缀解析漏洞

进入靶场 上来就是一个文件上传的功能 经过尝试,发现只有jpg,png,gif文件能上传上去,而题目又说了,这个是Apache的中间件,Apache文件解析漏洞涉及到一个Apache解析文件的特性,Apache默认一个文…

JavaScript(二)

1.JavaScript 操作符 2.JavaScript 流程控制 3.JavaScript 循环 4.JavaScript 字符串方法 5.JavaScript 数组方法 知识点一 操作符 变量声明 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Ti…

单链表---合并两个链表

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 struct ListNode {int val;struct ListNode* next; }; w 方法一---不使用哨兵位 我们创建一个新链表用于合并两个升序链表&#xff0c; 将两个链表中最小的结点依次尾插到…

2024-12月akamai_2.0-sensor-data之cookie反爬分析详细教程(上)

目录 一、网址及目标数据二、分析接口反爬点&#xff08;akamai执行过程&#xff09;三、逆向分析参数sensor_data四、扣js算法代码加密详细步骤 一、网址及目标数据 文章原文 1、网站&#xff1a; https://www.dhl.com/cn-zh/home/tracking/tracking-supply-chain.html?sub…

【Docker】如何在Docker中配置防火墙规则?

Docker本身并不直接管理防火墙规则&#xff1b;它依赖于主机系统的防火墙设置。不过&#xff0c;Docker在启动容器时会自动配置一些iptables规则来管理容器网络流量。如果你需要更细粒度地控制进出容器的流量&#xff0c;你需要在主机系统上配置防火墙规则。以下是如何在Linux主…

煤矿 35kV 变电站 3 套巡检机器人 “上岗”,力破供电瓶颈

近日&#xff0c;杭州旗晟智能科技与甘肃某变电站配电室的三套智能巡检机器人线下测试顺利完成&#xff0c;并成功交付使用&#xff0c;这为电力运维工作注入了全新的活力与强大的技术支撑。 一、项目背景 甘肃某变电站总建筑面积1098平方米的变电站集变电、配电、监控等多功能…

[创业之路-170]:《BLM战略规划》- 领导力 - 战略制定 - 洞察力 (战略能力中最最核心的能力) - 市场洞察 -2- 看客户-B2B客户分析

目录 一、看客户概述 一、看客户的核心意义 二、看客户的具体内容 三、看客户的实践方法 四、看客户的重要性 二、2B客户的研究方法&#xff1a;研究客户的决策流程 2.1 客户的战略&#xff1a;财务、市场、运营组织 1、研究客户的决策流程 2、研究客户的战略 3、研究…

langgraph 多智能体 Multi-agent supervisor

1. 工具定义 1.1网络搜索工具 from typing import Annotated import os from langchain_community.tools.tavily_search import TavilySearchResults from langchain_core.tools import tool from langchain_experimental.utilities import PythonREPLos.environ["TAVIL…

前缀和(七) 连续数组中最长的01个数相等序列

525. 连续数组 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组&#xff0c;并返回该子数组的长度。 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或…