优化Flink应用的4种方式

大数据—— Flink 的优化 一、Flink内存优化 大多数大数据框架都是基于JVM运行,如Hadoop、Spark、Storm,但是基于JVM的内存管理机制往往存在着类似于内存溢出等问题,主要是因为创建的对象过多超过了JVM最大堆内存限制,却没有被有效的回收掉。基于此,Flink自身实现了自己的内存管理。 Flink 内存配置 Flink JVM 进程的进程总内存(Total Process Memory)包含了由 Flink 应用使用的内存(Flink 总内存)以及由运行 Flink 的 JVM... 阅读详情

原文:4 Ways to Optimize Your Flink Applications
作者:Ivan Mushketyk
翻译:Diwei

译者注:Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台。作者在本文介绍了一些如何优化Flink应用速度的方式。以下为译文。

Flink框架非常复杂,并提供了许多方法来调整其执行方式。本文我将介绍提高Flink应用程序性能的四种不同方法。

如果不熟悉Flink,你可以阅读一些介绍性的文章,比如这篇,这篇,还有这篇。但是如果已经非常熟悉Apache Flink了,本文描述的内容可以帮助你如何提高应用程序的运行速度。

当使用类似于groupBy、join或keyBy这些操作时,Flink提供了多种方式以便用户在数据集中选择主键。用户可以使用主键选择函数:

// Join movies and ratings datasets
movies.join(ratings)
        // Use movie id as a key in both cases
        .where(new KeySelector<Movie, String>() {
            @Override
            public String getKey(Movie m) throws Exception {
                return m.getId();
            }
        })
        .equalTo(new KeySelector<Rating, String>() {
            @Override
            public String getKey(Rating r) throws Exception {
                return r.getMovieId();
            }
        })

也可以在POJO类型中指定字段名称:

movies.join(ratings)
// Use same fields as in the previous example
.where("id")
.equalTo("movieId")

但是如果现在使用的是Flink tuple类型,那么只要简单地指定字段元组的位置,就可以被用作主键了:

DataSet<Tuple2<String, String>> movies = ...
DataSet<Tuple3<String, String, Double>> ratings = ...

movies.join(ratings)
    // Specify fields positions in tuples
    .where(0)
    .equalTo(1)

可见最后一种方式的性能是最好的,但是可读性怎么样呢?代码现在看起来是不是就像下面这样?

DataSet<Tuple3<Integer, String, Double>> result = movies.join(ratings)
    .where(0)
    .equalTo(0)
    .with(new JoinFunction<Tuple2<Integer,String>, Tuple2<Integer,Double>, Tuple3<Integer, String, Double>>() {
        // What is happening here?
        @Override
        public Tuple3<Integer, String, Double> join(Tuple2<Integer, String> first, Tuple2<Integer, Double> second) throws Exception {
            // Some tuples are joined with some other tuples and some fields are returned???
            return new Tuple3<>(first.f0, first.f1, second.f1);
        }
    });

在本例中,想要提高可读性,最常见的做法就是创建一个类,该类需要继承TupleX类,并为类里面的这些字段实现getter和setter。下面是Flink Gelly库的Edge类,继承了Tuple3类:

public class Edge<K, V> extends Tuple3<K, K, V> {
    public Edge(K source, K target, V value) {
        this.f0 = source;
        this.f1 = target;
        this.f2 = value;
    }

    // Getters and setters for readability
    public void setSource(K source) {
        this.f0 = source;
    }
    public K getSource() {
        return this.f0;
    }

    // Also has getters and setters for other fields
    ...
}

复用Flink对象

另一个可以用来提高Flink应用程序性能的选项是,当从用户定义的函数返回数据时,最好使用可变对象。看看下面这个例子:

stream
    .apply(new WindowFunction<WikipediaEditEvent, Tuple2<String, Long>, String, TimeWindow>() {
        @Override
        public void apply(String userName, TimeWindow timeWindow, Iterable<WikipediaEditEvent> iterable, Collector<Tuple2<String, Long>> collector) throws Exception {
            long changesCount = ...
            // A new Tuple instance is created on every execution
            collector.collect(new Tuple2<>(userName, changesCount));
        }
    }

可以看出,apply函数每执行一次,都会新建一个Tuple2类的实例,因此增加了对垃圾收集器的压力。解决这个问题的一种方法是反复使用相同的实例:

stream
    .apply(new WindowFunction<WikipediaEditEvent, Tuple2<String, Long>, String, TimeWindow>() {
        // Create an instance that we will reuse on every call
        private Tuple2<String, Long> result = new Tuple<>();

        @Override
        public void apply(String userName, TimeWindow timeWindow, Iterable<WikipediaEditEvent> iterable, Collector<Tuple2<String, Long>> collector) throws Exception {
            long changesCount = ...

            // Set fields on an existing object instead of creating a new one
            result.f0 = userName;
            // Auto-boxing!! A new Long value may be created
            result.f1 = changesCount;

            // Reuse the same Tuple2 object
            collector.collect(result);
        }
    }

这种做法更好一点。虽然每次调用时都新建一个Tuple2的实例,但是其实还间接创建了Long类的实例。为了解决这个问题,Flink有许多所谓的value class:IntValue、LongValue、StringValue、FloatValue等。下面介绍一下如何使用它们:

stream
    .apply(new WindowFunction<WikipediaEditEvent, Tuple2<String, Long>, String, TimeWindow>() {
        // Create a mutable count instance
        private LongValue count = new IntValue();
        // Assign mutable count to the tuple
        private Tuple2<String, LongValue> result = new Tuple<>("", count);

        @Override
        // Notice that now we have a different return type
        public void apply(String userName, TimeWindow timeWindow, Iterable<WikipediaEditEvent> iterable, Collector<Tuple2<String, LongValue>> collector) throws Exception {
            long changesCount = ...

            // Set fields on an existing object instead of creating a new one
            result.f0 = userName;
            // Update mutable count value
            count.setValue(changesCount);

            // Reuse the same tuple and the same LongValue instance
            collector.collect(result);
        }
    }

这种做法经常用在Flink库里面,如Flink Gelly。

使用注解功能

优化Flink应用程序的另一种方法是提供一些关于用户自定义的函数会对输入数据做哪些操作的信息。由于Flink无法解析和理解代码,所以可以提供一些有利于构建更有效执行计划的重要信息。可以使用以下三个注解:

  1. @ForwardedFields:指定输入值中哪些字段保持不变,哪些字段是用于输出的。

  2. @NotForwardedFields:指定在输出中未保留相同位置的字段。

  3. @ReadFields:指定用来计算结果值的字段。指定的字段应该只在计算中使用,而不仅仅是复制到输出参数中。

看一下如何使用ForwardedFields注释:

// Specify that the first element is copied without any changes
@ForwardedFields("0")
class MyFunction implements MapFunction<Tuple2<Long, Double>, Tuple2<Long, Double>> {
    @Override
    public Tuple2<Long, Double> map(Tuple2<Long, Double> value) {
       // Copy first field without change
        return new Tuple2<>(value.f0, value.f1 + 123);
    }
}

这意味着输入元组中的第一个元素没有被更改,它将返回到相同的位置。

如果不更改字段,但只需将其移动到另一个位置,那么也可以使用ForwardedFields。在下一个示例中,我们在输入tuple中互换一下字段,并通知Flink:

// 1st element goes into the 2nd position, and 2nd element goes into the 1st position
@ForwardedFields("0->1; 1->0")
class SwapArguments implements MapFunction<Tuple2<Long, Double>, Tuple2<Double, Long>> {
    @Override
    public Tuple2<Double, Long> map(Tuple2<Long, Double> value) {
       // Swap elements in a tuple
        return new Tuple2<>(value.f1, value.f0);
    }
}

上面提到的注解只能应用于只有一个输入参数的函数,例如map或flatMap。如果函数有两个输入参数,则可以使用ForwardedFieldsFirst和ForwardedFieldsSecond,分别提供关于第一个参数和第二个参数的信息。

下面是如何在JoinFunction接口的实现中使用这些注释:

// Two fields from the input tuple are copied to the first and second positions of the output tuple
@ForwardedFieldsFirst("0; 1")
// The third field from the input tuple is copied to the third position of the output tuple
@ForwardedFieldsSecond("2")
class MyJoin implements JoinFunction<Tuple2<Integer,String>, Tuple2<Integer,Double>, Tuple3<Integer, String, Double>>() {
    @Override
    public Tuple3<Integer, String, Double> join(Tuple2<Integer, String> first, Tuple2<Integer, Double> second) throws Exception {
        return new Tuple3<>(first.f0, first.f1, second.f1);
    }
})

Flink还提供NotForwardedFieldsFirst、NotForwardedFieldsSecond、ReadFieldsFirst ReadFirldsSecond注释,这些注释都可以达到类似目的。

Select Join Type

如果给Flink另一个提示,那么就可以让joins速度更快,但是在讨论它的工作原理之前,先讨论一下Flink是如何执行joins的。

当Flink处理批量数据时,集群中的每台机器都存储了部分数据。要执行join,Apache Flink需要找到满足连接条件的两个数据集。为了做到这一点,Flink首先必须将两个数据集的项目放在同一台机器上。这里有两种策略:

  1. Repartition-分配策略:在这种情况下,两个数据集都被各自的主键分离了,并通过网络发送。这意味着如果数据集很大,可能需要大量的时间才能通过网络完成复制。

  2. 广播转发策略:在这种情况下,一个数据集不受影响,但是第二个数据集被复制到集群中的每台机器上,它们都有第一个数据集的一部分。

如果是将某个小数据集join到更大的数据集,那么可以使用广播转发策略,这样也可以避免第一个数据集的分区付出的昂贵代价。这很容易做到:

ds1.join(ds2, JoinHint.BROADCAST_HASH_FIRST)

这就表示第一个数据集比第二个数据集小得多。

你也可以使用其他连接提示:

  • BROADCAST_HASH_SECOND:第二个数据集要小得多
  • REPARTITION_HASH_FIRST:第一个数据集稍微小一些
  • REPARTITION_HASH_SECOND:第二个数据集要小一点
  • REPARTITION_SORT_MERGE:使用排序和合并策略对数据集进行重新分配
  • **OPTIMIZER_CHOOSES:**Flink优化器将决定如何join数据集

阅读这篇文章可以更加了解Flink是如何在本文中执行join的。

更多信息

我衷心希望每个读者都能喜欢这篇文章,并且确实能帮助你解决一些问题。

后面我会陆陆续续写更多关于Flink的文章,敬请关注!你可以在这里阅读其他文章,或还可以看一下Pluralsight课程,在这里我将详细介绍Apache Flink:Understanding Apache Flink。以下是本课程的简短预览。

Flink------优化 1、Flink 内存优化 1.1Flink 的内存管理 开源的大数据框架基本上大多数都是基于 JVM 运行的,如 Hadoop、Spark、 Storm,但是基于 JVM 的内存管理机制往往存在着类似于内存溢出等问题,主要 是因为创建的对象过多而超过 JVM 的最大堆内存限制,却没有被有效的回收掉, 仅仅靠 JVM 所提供的各种垃圾回收机制很难解决内存溢出等问题。尤其是几十 甚至上百 G 的内存应用时会生成大量对象,Java GC 可能会被反复触发,其中 Full GC 或 Major GC 的开销是非常大 阅读详情

相关推荐

9. Flink的性能优化

一般需要注意的是TaskManager的内存,因为job的运行主要是在TM上。如上图所示,barrier对齐机制中快的并行度会等待慢的并行度到达之后才能开始做本地的状态快照,在等待的过程中来的数据就会被缓存起来,如果并行度之间相差很大,就会占用很大的内存资源,可能会导致内存溢出,同时它的等待也会迟缓checkpoint的整体时间,还有当数据流被阻塞住处理来不及时会触发反压机制,进而更加限制数据流的流动,导致barrier在的流速更慢,进一步导致checkpoint时间变长,进入恶性循环。

qq_21451945的博客 1871

Flink-Tuple

怀念二抱三抱

文天大人 900

(六)一文掌握flink性能优化:flinksql调优

系列文章目录 第一章 资源配置调优 第二章 状态及Checkpoint 调优 第三章 反压处理 第四章 数据倾斜 第五章 job优化 第六章 flinksql调优 第七章 常见故障排查 文章目录6.1 设置 空闲状态保留时间6.2 开启 MiniBatch6.3 开启 LocalGlobal6.4 开启 Split Distinct6.5 多维 DISTINCT 使用Filter6.6设置参数总结 FlinkSQL官网配置参数:https://nightlies.apache.org/flink/fli

要记得输出! 6705

Flink程序中Tuple类型使用+ 算子程序Lambda方式正确使用姿势

Tuple元组类型使用以及Lambda编写flink程序正确姿势(方法与避坑)

胖虎儿的博客 1万+

Flink DataStream任务优化为Flink SQL

1、Caused by: java.io.IOException: Unknown "type" value "kafka". The Canal JSON message … ‘format’ = ‘canal-json’ 改为 ‘format’ = ‘json’ ,可参考 链接 ,提到了 canal-json 会调用 deserialize 方法,其会查询 key type 是 哪种 DML (update,delete,insert),其余情况则会Unknown "type" value "kafka

AnlaGodness的博客 3747

Flink性能优化小结

可以通过开启缓冲消胀机制来简化 Flink 网络的内存配置调整。您也可能需要调整它。如果这不起作用,您可以关闭缓冲消胀机制并且人工地配置内存段的大小和缓冲区个数。针对第二种场景,我们推荐:使用默认值以获得最大吞吐减少内存段大小、独占缓冲区的数量来加快 checkpoint 并减少网络栈消耗的内存量。

MDZ_1122333322的博客 2428

flink的四种优化方式

使用flink tuples 当使用groupby,join,后者key这类算子的时候,FLink提供了很多种访问你key的方法。 1. 使用key selector // Join movies and ratings datasets movies.join(ratings) // Use movie id as a key in both cases .w...

SDKLHKJAS的博客 1178

保姆级教程:用高云GW2A开发板搭建RISC-V软核处理器(含DDR3内存优化配置)

本文提供了一份详细的保姆级教程,指导开发者使用高云GW2A-LV18PG256C8 FPGA开发板搭建RISC-V软核处理器系统。教程涵盖了从开发环境搭建、PicoRV32软核集成,到关键的DDR3内存控制器配置与优化,并深入讲解了时序约束与系统调试方法,帮助初学者和爱好者实现从逻辑设计到软硬件协同的深度实践。

2a4s6d8f0g的博客 570

四种优化 Apache Flink 应用程序的方法

如果下面文章格式或图片不清晰,请参见原文:https://www.iteblog.com/archives/2303.html 或直接点击下面 阅读原文 即可进入。Flink 是一种非常复杂的框架,它提供了多种调整其执行的方法。本文将介绍四种不同的方法来提升你的 Flink 应用程序的性能。使用 Flink Tuples当你使用类似于 groupBy, join, 或者 keyBy 算子时,Fli

Hadoop技术博文 2453

深入傅里叶级数与傅里叶变换:从基础到应用

傅里叶分析为我们提供了一种理解信号频率结构的强大工具。从傅里叶级数到傅里叶变换,再到快速傅里叶变换(FFT),其理论与应用紧密结合,对现代科学技术的发展意义非凡。如果你对信号处理、数据分析或工程计算感兴趣,傅里叶分析是必须掌握的基础工具。希望本文能帮助你对傅里叶分析有更深入的理解!如果有问题或想法,欢迎在评论区讨论!

qq_56683019的博客 3535

电力系统实时仿真技术:从硬件在环到主流平台实践

实时仿真是一种基于高性能计算硬件,在严格时间约束下模拟物理系统动态行为的关键技术。其核心原理在于通过硬实时计算,确保仿真步长内的模型求解与输出时间严格同步,从而构建高保真的虚拟测试环境。这项技术的核心价值在于为电力电子、新能源并网等复杂系统的研发提供了无风险的“数字沙盘”,能够安全地验证控制器逻辑、保护装置动作及系统稳定性。在工程实践中,硬件在环测试通过连接虚拟模型与真实硬件,形成了控制器硬件在环和功率硬件在环两大主流应用场景,广泛应用于设备研发、电网安全分析和人员培训。本文聚焦于电力系统领域,深入解析了实

weixin_30952479的博客 421

八种Flink任务监控告警方式

Flink任务告警方式的选择,要从任务的使用情况和期盼来考量;简单的使用,且任务少,可以用监控目标数据库的数据写入情况、per-job和application运行任务探活、Sesion运行方式通过RestApi来告警;特定场景的业务可以靠监控存储中间偏移量来告警;通用大规模应用场景可以通过采集运行时日志、使用调度平台,使用调度平台、引入开源SDK方式、自定义SDK写入通用系统通用系统里方式选择。

weixin_42049123的博客 6839

DCDC系列(一): COT DCDC基本原理

电流环DCDC属于双环控制模式,根据电流检测的位置,分为峰值电流环控制模式、谷值电流环控制模式和平均电流环控制模式,主要由输出电压反馈环和电流环两个环路来实现控制,其瞬态响应比电压环更好,且有自动限流的功能,但仍需要斜坡补偿网络,且对噪声敏感。Stage3: 在下管NMOS打开阶段,由于后级负载此时间段内消耗的电量较少,所以VFB还未低至Vref,所以此阶段中,上管PMOS和下管NMOS均处于关断状态,此时的电感电流为0mA,此阶段测的VSW上的电压就是Cout上的电压VREG;

weixin_40073649的博客 3948

Flink在bilibili的优化与实践

导读:本文主要介绍Flink实时计算在bilibili的优化,将从以下四个方面展开:1、Flink-connector稳定性优化2、Flink sql优化3、Flink-runtime优...

过往记忆大数据 2107

可变形卷积(Deformable Conv)原理解析与torch代码实现

图6为可变形卷积示意图。图1所示为普通卷积在输入特征图上进行卷积计算的过程,卷积核大小为3*3,在输入特征图尺寸为7*7上进行卷积,将卷积核权重与输入特征图对应位置元素相乘并求和得到输出特征图元素,按一定方式滑动窗口就能计算得到整张输出特征图。图6所示,在input feature map上普通卷积操作对应卷积采样区域是一个卷积核大小的正方形(绿框),而可变形卷积对应的卷积采样区域为一些蓝框表示的点,这就是可变形卷积与普通卷积的区别。先来一张图感受一下,图3为标准卷积与可变形卷积的卷积示例。

panghuzhenbang的博客 5万+

ORB-SLAM3代码详解 - 第 18 篇 · Atlas 多地图系统、地图保存与全系统调优

会跑:理解三线程架构与数据流(01/08/10/13),能编译、配参、复现各数据集结果。会改:掌握相机模型抽象(05)、g2o 顶点与边(14)、预积分(15),能接入新传感器、新相机、新约束。会调:理解每个参数背后的物理含义与耦合(03/15/16/18),能针对自己的平台与场景做精度/实时/鲁棒的权衡。ORB-SLAM3 的价值不止于一个可用的 SLAM 系统,更在于它是一套工程化的几何状态估计模板:清晰的模块边界、可替换的相机/传感器抽象、紧耦合优化的标准范式。

PX4-SLAM-PNC 172

重要 : 优化flink的四种方式

flink这个框架在逐步变为流处理的主流。本文,我们将针对flink性能调优讲四种不同的方法。加浪尖微信 158570986,拉入大数据微信交流群。使用flink tup...

大数据星球-浪尖 1739

基于 MATLAB 的精馏塔模拟仿真

基于 MATLAB 的精馏塔模拟仿真精馏塔是一种重要的化工设备,其中乙烯精馏塔和醋酸乙烯精馏塔是常见的两种精馏塔。本文基于 MATLAB 软件,给出了针对这两种精馏塔的模拟仿真代码。

与其临渊羡鱼,不如退而结网 905

Flink-Flink部署方式介绍

这里的 TaskManager,就是真正“干活的人”,数据的处理操作都是它们来做的。打 包 完 成 后 , 在 target 目 录 下 即 可 找 到 所 需 JAR 包 , JAR 包 会 有 两 个 ,FlinkTutorial-1.0-SNAPSHOT.jar 和 FlinkTutorial-1.0-SNAPSHOT-jar-with-dependencies.jar,因为集群中已经具备任务运行所需的所有依赖,所以建议使用 FlinkTutorial-1.0-SNAPSHOT.jar。

迷雾总会解 920

复现Fastjson反序列化漏洞(从dnslog回显到rce再到反弹shell)

Fastjson是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。它还可以用于将JSON字符串转换为等效的Java对象,fastjson爆出多个反序列化远程命令执行漏洞,攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。......

记录并分享学习安全的知识点.. 2701

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Flink job 优化

1.代码层优化 1.没有必要的变量直接使用 2.多个地方用到的配置文件提取到公共的地方 3.用集合处理多个变量 修改为 4.冗余代码换个写法 改为: 5.规范注释的书写 6.对于异常类的处理,如果捕捉到一定要处理,不然任务报错没有查询的地方 7.配置信息从类里抽出来,直接写到配置文件里,方便查找统一修改如下: 2.流程优化: 对于任务算子的并行度单独设置, 2.Hbase落地表分区写入,超过100W数据的加缓存,...

Baron_ND的博客 735

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

flink 任务优化系列

当 Flink 作业正运行在严重的背压下时,Checkpoint 端到端延迟的主要影响因子将会是传递 Checkpoint Barrier 到 所有的算子/子任务的时间。默认情况下,无界聚合算子是逐条处理输入的记录,即:(1)从状态中读取累加器,(2)累加/撤回记录至累加器,(3)将累加器写回状态,(4)下一条记录将再次从(1)开始处理。这是吞吐量和延迟之间的权衡。性能监控:使用 Flink 提供的 Web UI 或其他监控工具实时监控任务的性能指标,如吞吐量、延迟和 Checkpoint 频率等。

a123147abc的博客 892

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Flink优化----FlinkSQL 调优

本章着重探讨 Flink SQL 调优。介绍设置空闲状态保留时间的重要性与方法,避免状态爆炸。阐述 MiniBatch 微批处理的原理、开启方式、适用场景及注意事项,其能提升吞吐、减少数据输出量。LocalGlobal 优化则通过两阶段聚合降低热点,需先开启 MiniBatch 且有相关注意点。Split Distinct 针对 COUNT DISTINCT 热点问题提供自动打散功能,也有特定开启要求与限制。多维 DISTINCT 使用 Filter 可减少状态大小和访问,总结了常用调优参数的设置代码。

天冬忘忧的博客 1964

Flink内存优化

flink 分别提供了通用和细粒度的内存配置,来满足不同用户的需求。 一、Flink内存模型 Total Process Memory: 包括 flink 应用消耗的内存(Total Flink Memory) 和 JVM 消耗的内存 Total Flink Memory: 包括 JVM heap, managed memory 和 direct memory 如果用户只是使用了 local 模式运行 flink(比如通过idea),那么只有部分内存配置是生效的,具体配置后面有讲到。 对于集群上

lixinkuan的博客 2459

Flink如何用窗格来优化窗口

对于处理时间类型的窗口(包含了翻滚窗口和滑动窗口),Flink会使用称之为”pane”的技术来优化这类时间窗口的计算。

VinoYang的专栏 5544

Flink的优化技巧

Flink开发中的优化方案涉及多个方面,包括并行度设置、内存管理、状态管理、网络传输、异步I/O、检查点优化、数据库性能优化、监控与异常处理、算法与数据结构优化以及业务逻辑与数据去重等。通过综合运用这些优化策略,可以显著提升Flink应用的性能和稳定性,满足大数据处理领域日益增长的需求。在实际应用中,需要根据具体场景和需求进行灵活调整和优化,以达到最佳的性能表现。

qq_30009397的博客 1402
上一篇: 如何确保API的安全性
下一篇: 如何调整团队对微服务的统一认识
csdn研发技术
博客等级 码龄9年 1381粉丝 90原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值