官宣|Apache Flink 1.13.0 正式发布,流处理应用更加简单高效!

简介: Flink 1.13.0 版本让流处理应用的使用像普通应用一样简单和自然,并且让用户可以更好地理解流作业的性能。

​翻译 | 高赟
Review | 朱翥、马国维

Flink 1.13 发布了!Flink 1.13 包括了超过 200 名贡献者所提交的 1000 多项修复和优化。

这一版本中,Flink 的一个主要目标取得了重要进展,即让流处理应用的使用和普通应用一样简单和自然。Flink 1.13 新引入的被动扩缩容使得流作业的扩缩容和其它应用一样简单,用户仅需要修改并发度即可。

这个版本还包括一系列重要改动使用户可以更好的理解流作业的性能。当流作业的性能不及预期的时候,这些改动可以使用户可以更好的分析原因。这些改动包括用于识别瓶颈节点的负载和反压可视化、分析算子热点代码的 CPU 火焰图和分析 State Backend 状态的 State 访问性能指标。

除了这些特性外,Flink 社区还添加了大量的其它优化,我们会在本文后续讨论其中的一些。我们希望用户可以享受新的版本和特性带来的便利,在本文最后,我们还会介绍升级Flink版本需要注意的一些变化。

我们鼓励用户下载试用新版 Flink 并且通过邮件列表和 JIRA 来反馈遇到的问题。

重要特性

被动扩缩容

Flink 项目的一个初始目标,就是希望流处理应用可以像普通应用一样简单和自然,被动扩缩容是 Flink 针对这一目标上的最新进展。

当考虑资源管理和部分的时候,Flink 有两种可能的模式。用户可以将 Flink 应用部署到 k8s、yarn 等资源管理系统之上,并且由 Flink 主动的来管理资源并按需分配和释放资源。这一模式对于经常改变资源需求的作业和应用非常有用,比如批作业和实时 SQL 查询。在这种模式下,Flink 所启动的 Worker 数量是由应用设置的并发度决定的。在 Flink 中我们将这一模式叫做主动扩缩容。

对于长时间运行的流处理应用,一种更适合的模型是用户只需要将作业像其它的长期运行的服务一样启动起来,而不需要考虑是部署在 k8s、yarn 还是其它的资源管理平台上,并且不需要考虑需要申请的资源的数量。相反,它的规模是由所分配的 worker 数量来决定的。当 worker 数量发生变化时,Flink 自动的改动应用的并发度。在 Flink 中我们将这一模式叫做被动扩缩容。

Flink 的 Application 部署模式开启了使 Flink 作业更接近普通应用(即启动 Flink 作业不需要执行两个独立的步骤来启动集群和提交应用)的努力,而被动扩缩容完成了这一目标:用户不再需要使用额外的工具(如脚本、K8s 算子)来让 worker 的数量与应用并发度设置保持一致。

用户现在可以将自动扩缩容的工具应用到 Flink 应用之上,就像普通的应用程序一样,只要用户了解扩缩容的代价:有状态的流应用在扩缩容的时候需要将状态重新分发。

如果想要尝试被动扩缩容,用户可以增加 scheduler-mode: reactive 这一配置项,然后启动一个应用集群(Standalone 或者 K8s)。更多细节见被动扩缩容的文档。

分析应用的性能

对所有应用程序来说,能够简单的分析和理解应用的性能是非常关键的功能。这一功能对 Flink 更加重要,因为 Flink 应用一般是数据密集的(即需要处理大量的数据)并且需要在(近)实时的延迟内给出结果。

当 Flink 应用处理的速度跟不上数据输入的速度时,或者当一个应用占用的资源超过预期,下文介绍的这些工具可以帮你分析原因。

瓶颈检测与反压监控

Flink 性能分析首先要解决的问题经常是:哪个算子是瓶颈?

为了回答这一问题,Flink 引入了描述作业繁忙(即在处理数据)与反压(由于下游算子不能及时处理结果而无法继续输出)程度的指标。应用中可能的瓶颈是那些繁忙并且上游被反压的算子。

Flink 1.13 优化了反压检测的逻辑(使用基于任务 Mailbox 计时,而不在再于堆栈采样),并且重新实现了作业图的 UI 展示:Flink 现在在 UI 上通过颜色和数值来展示繁忙和反压的程度。

img

Web UI 中的 CPU 火焰图

Flink 关于性能另一个经常需要回答的问题:瓶颈算子中的哪部分计算逻辑消耗巨大?

针对这一问题,一个有效的可视化工具是火焰图。它可以帮助回答以下问题:

  • 哪个方法调现在在占用 CPU?
  • 不同方法占用 CPU 的比例如何?
  • 一个方法被调用的栈是什么样子的?

火焰图是通过重复采样线程的堆栈来构建的。在火焰图中,每个方法调用被表示为一个矩形,矩形的长度与这个方法出现在采样中的次数成正比。火焰图在 UI 上的一个例子如下图所示。

img

火焰图的文档包括启用这一功能的更多细节和指令。

State 访问延迟指标

另一个可能的性能瓶颈是 state backend,尤其是当作业的 state 超过内存容量而必须使用 RocksDB state backend 时。

这里并不是想说 RocksDB 性能不够好(我们非常喜欢 RocksDB!),但是它需要满足一些条件才能达到最好的性能。例如,用户可能很容易遇到非故意的在云上由于使用了错误的磁盘资源类型而不能满足 RockDB 的 IO 性能需求的问题。

基于 CPU 火焰图,新的 State Backend 的延迟指标可以帮助用户更好的判断性能不符合预期是否是由 State Backend 导致的。例如,如果用户发现 RocksDB 的单次访问需要几毫秒的时间,那么就需要查看内存和 I/O 的配置。这些指标可以通过设置 state.backend.rocksdb.latency-track-enabled 这一选项来启用。这些指标是通过采样的方式来监控性能的,所以它们对 RocksDB State Backend 的性能影响是微不足道的。

通过 Savepoint 来切换 State Backend

用户现在可以在从一个 Savepoint 重启时切换一个 Flink 应用的 State Backend。这使得 Flink 应用不再被限制只能使用应用首次运行时选择的 State Backend。

基于这一功能,用户现在可以首先使用一个 HashMap State Backend(纯内存的 State Backend),如果后续状态变得过大的话,就切换到 RocksDB State Backend 中。

在实现层,Flink 现在统一了所有 State Backend 的 Savepoint 格式来实现这一功能。

K8s 部署时使用用户指定的 Pod 模式

原生 kubernetes 部署(Flink 主动要求 K8s 来启动 Pod)中,现在可以使用自定义的 Pod 模板。

使用这些模板,用户可以使用一种更符合 K8s 的方式来设置 JM 和 TM 的 Pod,这种方式比 Flink K8s 集成内置的配置项更加灵活。

生产可用的 Unaligned Checkpoint

Unaligned Checkpoint 目前已达到了生产可用的状态,我们鼓励用户在存在反压的情况下试用这一功能。

具体来说,Flink 1.13 中引入的这些功能使 Unaligned Checkpoint 更容易使用:

  • 用户现在使用 Unaligned Checkpoint 时也可以扩缩容应用。如果用户需要因为性能原因不能使用 Savepoint而必须使用 Retained checkpoint 时,这一功能会非常方便。
  • 对于没有反压的应用,启用 Unaligned Checkpoint 现在代价更小。Unaligned Checkpoint 现在可以通过超时来自动触发,即一个应用默认会使用 Aligned Checkpoint(不存储传输中的数据),而只在对齐超过一定时间范围时自动切换到 Unaligned Checkpoint(存储传输中的数据)。

关于如何启用 Unaligned Checkpoint 可以参考相关文档。

机器学习迁移到单独的仓库

为了加速 Flink 机器学习的进展(流批统一的机器学习),现在 Flink 机器学习开启了新的 flink-ml 仓库。我们采用类似于 Stateful Function 项目的管理方式,通过使用一个单独的仓库从而简化代码合并的流程并且可以进行单独的版本发布,从而提高开发的效率。

用户可以关注 Flink 在机器学习方面的进展,比如与 Alink(Flink 常用机器学习算法套件)的互操作以及 Flink 与 Tensorflow 的集成。

SQL / Table API 进展

与之前的版本类似,SQL 和 Table API 仍然在所有开发中占用很大的比例。

通过 Table-valued 函数来定义时间窗口

在流式 SQL 查询中,一个最经常使用的是定义时间窗口。Flink 1.13 中引入了一种新的定义窗口的方式:通过 Table-valued 函数。这一方式不仅有更强的表达能力(允许用户定义新的窗口类型),并且与 SQL 标准更加一致。

Flink 1.13 在新的语法中支持 TUMBLE 和 HOP 窗口,在后续版本中也会支持 SESSION 窗口。我们通过以下两个例子来展示这一方法的表达能力:

  • 例 1:一个新引入的 CUMULATE 窗口函数,它可以支持按特定步长扩展的窗口,直到达到最大窗口大小:
SELECT window_time, window_start, window_end, SUM(price) AS total_price FROM TABLE(CUMULATE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '2' MINUTES, INTERVAL '10' MINUTES))
GROUP BY window_start, window_end, window_time;
  • 例 2:用户在 table-valued 窗口函数中可以访问窗口的起始和终止时间,从而使用户可以实现新的功能。例如,除了常规的基于窗口的聚合和 Join 之外,用户现在也可以实现基于窗口的 Top-K 聚合:
SELECT window_time, ...FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY total_price DESC) as rank FROM t) WHERE rank <= 100; 

提高 DataStream API 与 Table API / SQL 的互操作能力

这一版本极大的简化了 DataStream API 与 Table API 混合的程序。

Table API 是一种非常方便的应用开发接口,因为这经支持表达式的程序编写并提供了大量的内置函数。但是有时候用户也需要切换回 DataStream,例如当用户存在表达能力、灵活性或者 State 访问的需求时。

Flink 新引入的 StreamTableEnvironment.toDataStream()/.fromDataStream() 可以将一个 DataStream API 声明的 Source 或者 Sink 当作 Table 的 Source 或者 Sink 来使用。主要的优化包括:

  • DataStream 与 Table API 类型系统的自动转换。
  • Event Time 配置的无缝集成,Watermark 行为的高度一致性。
  • Row 类型(即 Table API 中数据的表示)有了极大的增强,包括 toString() / hashCode() 和 equals() 方法的优化,按名称访问字段值的支持与稀疏表示的支持。
Table table = tableEnv.fromDataStream(dataStream,Schema.newBuilder().columnByMetadata("rowtime", "TIMESTAMP(3)").watermark("rowtime", "SOURCE_WATERMARK()").build());DataStream<Row> dataStream = tableEnv.toDataStream(table).keyBy(r -> r.getField("user")).window(...);

SQL Client: 初始化脚本和语句集合 (Statement Sets)

SQL Client 是一种直接运行和部署 SQL 流或批作业的简便方式,用户不需要编写代码就可以从命令行调用 SQL,或者作为 CI / CD 流程的一部分。

这个版本极大的提高了 SQL Client 的功能。现在基于所有通过 Java 编程(即通过编程的方式调用 TableEnvironment 来发起查询)可以支持的语法,现在 SQL Client 和 SQL 脚本都可以支持。这意味着 SQL 用户不再需要添加胶水代码来部署他们的SQL作业。

配置简化和代码共享

Flink 后续将不再支持通过 Yaml 的方式来配置 SQL Client(注:目前还在支持,但是已经被标记为废弃)。作为替代,SQL Client 现在支持使用一个初始化脚本在主 SQL 脚本执行前来配置环境。

这些初始化脚本通常可以在不同团队/部署之间共享。它可以用来加载常用的 catalog,应用通用的配置或者定义标准的视图。

./sql-client.sh -i init1.sql init2.sql -f sqljob.sql

更多的配置项

通过增加配置项,优化 SET / RESET 命令,用户可以更方便的在 SQL Client 和 SQL 脚本内部来控制执行的流程。

通过语句集合来支持多查询

多查询允许用户在一个 Flink 作业中执行多个 SQL 查询(或者语句)。这对于长期运行的流式 SQL 查询非常有用。

语句集可以用来将一组查询合并为一组同时执行。

以下是一个可以通过 SQL Client 来执行的 SQL 脚本的例子。它初始化和配置了执行多查询的环境。这一脚本包括了所有的查询和所有的环境初始化和配置的工作,从而使它可以作为一个自包含的部署组件。

-- set up a catalog
CREATE CATALOG hive_catalog WITH ('type' = 'hive');
USE CATALOG hive_catalog;-- or use temporary objects
CREATE TEMPORARY TABLE clicks (user_id BIGINT,page_id BIGINT,viewtime TIMESTAMP
) WITH ('connector' = 'kafka','topic' = 'clicks','properties.bootstrap.servers' = '...','format' = 'avro'
);-- set the execution mode for jobs
SET execution.runtime-mode=streaming;-- set the sync/async mode for INSERT INTOs
SET table.dml-sync=false;-- set the job's parallelism
SET parallism.default=10;-- set the job name
SET pipeline.name = my_flink_job;-- restore state from the specific savepoint path
SET execution.savepoint.path=/tmp/flink-savepoints/savepoint-bb0dab;BEGIN STATEMENT SET;INSERT INTO pageview_pv_sink
SELECT page_id, count(1) FROM clicks GROUP BY page_id;INSERT INTO pageview_uv_sink
SELECT page_id, count(distinct user_id) FROM clicks GROUP BY page_id;END;

Hive 查询语法兼容性

用户现在在 Flink 上也可以使用 Hive SQL 语法。除了 Hive DDL 方言之外,Flink现在也支持常用的 Hive DML 和 DQL 方言。

为了使用 Hive SQL 方言,需要设置 table.sql-dialect 为 hive 并且加载 HiveModule。后者非常重要,因为必须要加载 Hive 的内置函数后才能正确实现对 Hive 语法和语义的兼容性。例子如下:

CREATE CATALOG myhive WITH ('type' = 'hive'); -- setup HiveCatalog
USE CATALOG myhive;
LOAD MODULE hive; -- setup HiveModule
USE MODULES hive,core;
SET table.sql-dialect = hive; -- enable Hive dialect
SELECT key, value FROM src CLUSTER BY key; -- run some Hive queries 

需要注意的是, Hive 方言中不再支持 Flink 语法的 DML 和 DQL 语句。如果要使用 Flink 语法,需要切换回 default 的方言配置。

优化的 SQL 时间函数

在数据处理中时间处理是一个重要的任务。但是与此同时,处理不同的时区、日期和时间是一个日益复杂的任务。

在 Flink 1.13 中,我们投入了大量的精力来简化时间函数的使用。我们调整了时间相关函数的返回类型使其更加精确,例如 PROCTIME(),CURRENT_TIMESTAMP() 和 NOW()。

其次,用户现在还可以基于一个 TIMESTAMP_LTZ 类型的列来定义 Event Time 属性,从而可以优雅的在窗口处理中支持夏令时。

用户可以参考 Release Note 来查看该部分的完整变更。

PyFlink 核心优化

这个版本对 PyFlink 的改进主要是使基于 Python 的 DataStream API 与 Table API 与 Java/scala 版本的对应功能更加一致。

Python DataStream API 中的有状态算子

在 Flink 1.13 中,Python 程序员可以享受到 Flink 状态处理 API 的所有能力。在 Flink 1.12 版本重构过的 Python DataStream API 现在已经拥有完整的状态访问能力,从而使用户可以将数据的信息记录到 state 中并且在后续访问。

带状态的处理能力是许多依赖跨记录状态共享(例如 Window Operator)的复杂数据处理场景的基础。

以下例子展示了一个自定义的计算窗口的实现:

class CountWindowAverage(FlatMapFunction):def __init__(self, window_size):self.window_size = window_sizedef open(self, runtime_context: RuntimeContext):descriptor = ValueStateDescriptor("average", Types.TUPLE([Types.LONG(), Types.LONG()]))self.sum = runtime_context.get_state(descriptor)def flat_map(self, value):current_sum = self.sum.value()if current_sum is None:current_sum = (0, 0)# update the countcurrent_sum = (current_sum[0] + 1, current_sum[1] + value[1])# if the count reaches window_size, emit the average and clear the stateif current_sum[0] >= self.window_size:self.sum.clear()yield value[0], current_sum[1] // current_sum[0]else:self.sum.update(current_sum)ds = ...  # type: DataStream
ds.key_by(lambda row: row[0]) \.flat_map(CountWindowAverage(5))

PyFlink DataStream API 中的用户自定义窗口

Flink 1.13 中 PyFlink DataStream 接口增加了对用户自定义窗口的支持,现在用户可以使用标准窗口之外的窗口定义。

由于窗口是处理无限数据流的核心机制 (通过将流切分为多个有限的『桶』),这一功能极大的提高的 API 的表达能力。

PyFlink Table API 中基于行的操作

Python Table API 现在支持基于行的操作,例如用户对行数据的自定义函数。这一功能使得用户可以使用非内置的数据处理函数。

一个使用 map() 操作的 Python Table API 示例如下:

@udf(result_type=DataTypes.ROW([DataTypes.FIELD("c1", DataTypes.BIGINT()),DataTypes.FIELD("c2", DataTypes.STRING())]))
def increment_column(r: Row) -> Row:return Row(r[0] + 1, r[1])table = ...  # type: Table
mapped_result = table.map(increment_column)

除了 map(),这一 API 还支持 flat_map(),aggregate(),flat_aggregate() 和其它基于行的操作。这使 Python Table API 的功能与 Java Table API 的功能更加接近。

PyFlink DataStream API 支持 Batch 执行模式

对于有限流,PyFlink DataStream API 现在已经支持 Flink 1.12 DataStream API 中引入的 Batch 执行模式。

通过复用数据有限性来跳过 State backend 和 Checkpoint 的处理,Batch 执行模式可以简化运维,并且提高有限流处理的性能。

其它优化

基于 Hugo 的 Flink 文档

Flink 文档从 JekyII 迁移到了 Hugo。如果您发现有问题,请务必通知我们,我们非常期待用户对新的界面的感受。

Web UI 支持历史异常

Flink Web UI 现在可以展示导致作业失败的 n 次历史异常,从而提升在一个异常导致多个后续异常的场景下的调试体验。用户可以在异常历史中找到根异常。

优化失败 Checkpoint 的异常和失败原因的汇报

Flink 现在提供了失败或被取消的 Checkpoint 的统计,从而使用户可以更简单的判断 Checkpoint 失败的原因,而不需要去查看日志。

Flink 之前的版本只有在 Checkpoint 成功的时候才会汇报指标(例如持久化数据的大小、触发时间等)。

提供『恰好一次』一致性的 JDBC Sink

从 1.13 开始,通过使用事务提交数据,JDBC Sink 可以对支持 XA 事务的数据库提供『恰好一次』的一致性支持。这一特性要求目标数据库必须有(或链接到)一个 XA 事务处理器。

这一 Sink 现在只能在 DataStream API 中使用。用户可以通过 JdbcSink.exactlyOnceSink(…) 来创建这一 Sink(或者通过显式初始化一个 JdbcXaSinkFunction)。

PyFlink Table API 在 Group 窗口上支持用户自定义的聚合函数

PyFlink Table API 现在对 Group 窗口同时支持基于 Python 的用户自定义聚合函数(User-defined Aggregate Functions, UDAFs)以及 Pandas UDAFs。这些函数对许多数据分析或机器学习训练的程序非常重要。

在 Flink 1.13 之前,这些函数仅能在无限的 Group-by 聚合场景下使用。Flink 1.13 优化了这一限制。

Batch 执行模式下 Sort-merge Shuffle 优化

Flink 1.13 优化了针对批处理程序的 Sort-merge Blocking Shuffle 的性能和内存占用情况。这一 Shuffle 模式是在Flink 1.12 的 FLIP-148 中引入的。

这一优化避免了大规模作业下不断出现 OutOfMemoryError: Direct Memory 的问题,并且通过 I/O 调度和 broadcast 优化提高了性能(尤其是在机械硬盘上)。

HBase 连接器支持异步维表查询和查询缓存

HBase Lookup Table Source 现在可以支持异步查询模式和查询缓存。这极大的提高了使用这一 Source 的 Table / SQL 维表 Join 的性能,并且在一些典型情况下可以减少对 HBase 的 I/O 请求数量。

在之前的版本中,HBase Lookup Source 仅支持同步通信,从而导致作业吞吐以及资源利用率降低。

升级 Flink 1.13 需要注意的改动

  • FLINK-21709 – 老的 Table & SQL API 计划器已经被标记为废弃,并且将在 Flink 1.14 中被删除。Blink 计划器在若干版本之前已经被设置为默认计划器,并且将成为未来版本中的唯一计划器。这意味着 BatchTableEnvironment 和 DataSet API 互操作后续也将不再支持。用户需要切换到统一的 TableEnvironment 来编写流或者批的作业。
  • FLINK-22352 – Flink 社区决定废弃对 Apache mesos 的支持,未来有可能会进一步删除这部分功能。用户最好能够切换到其它的资源管理系统上。
  • FLINK-21935 – state.backend.async 这一配置已经被禁用了,因为现在 Flink 总是会异步的来保存快照(即之前的配置默认值),并且现在没有实现可以支持同步的快照保存操作。
  • FLINK-17012 – Task 的 RUNNING 状态被细分为两步:INITIALIZING 和 RUNNING。Task 的 INITIALIZING 阶段包括加载 state 和在启用 unaligned checkpoint 时恢复 In-flight 数据的过程。通过显式区分这两种状态,监控系统可以更好的区分任务是否已经在实际工作。
  • FLINK-21698 – NUMERIC 和 TIMESTAMP 类型之间的直接转换存在问题,现在已经被禁用,例如 CAST(numeric AS TIMESTAMP(3))。用户应该使用 TO_TIMESTAMP(FROM_UNIXTIME(numeric)) 来代替。
  • FLINK-22133 – 新的 Source 接口有一个小的不兼容的修改,即 SplitEnumerator.snapshotState() 方法现在多接受一个 checkpoint id 参数来表示正在进行的 snapshot 操作所属的 checkpoint 的 id。
  • FLINK-19463 – 由于老的 Statebackend 接口承载了过多的语义并且容易引起困惑,这一接口被标记为废弃。这是一个纯 API 层的改动,而并不会影响应用运行时。对于如何升级现有作业,请参考作业迁移指引 。

其它资源

二进制和代码可以从 Flink 官网的下载页面获得,最新的 PyFlink 发布可以从 PyPI 获得。

如果想要升级到 Flink 1.13,请参考发布说明。这一版本与之前 1.x 的版本在标记为@Public 的接口上是兼容的。

用户也可以查看新版本修改列表与更新后的文档来获得修改和新功能的详细列表。

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lightning接口_Lightning太赚钱?iPhone永远不会用Type-C

欧盟日前通过了法案&#xff0c;要求在欧洲销售的各手机制造商要统一充电接口&#xff0c;全部采用USB Type-C接口&#xff0c;但这可能让一直使用Lightning(闪电)充电接口的Apple受到很大影响。虽说目前苹果的Mac电脑、iPad平板电脑以及智能音箱等部分产品都开始使用USB Type-…

这个冬天,头秃了,口袋也空了......

秋天里的第一杯奶茶刚喝完&#xff0c;冬天里的第一条秋裤就要安排上&#xff01;不让加班的程序员&#xff0c;从此的生活便不只有脑袋秃秃&#xff0c;还有口袋空空&#xff01;从外包出来&#xff0c;没想到新的面试让我手忙脚乱外包虐我千百遍&#xff0c;只能待她如初恋&a…

云数据仓库的未来趋势:计算存储分离

简介&#xff1a; 随着云时代的到来&#xff0c;数据库也开始拥抱云数据库时代&#xff0c;各类数据库系统在各内外云平台百花齐放&#xff0c;有开源的MySQL、PostgreSQL、MongoDB&#xff0c;传统数据库厂商的SQLServer、Oracle&#xff0c;云厂商自研的Aurora、Redshift、Po…

Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题

写在前面java内存申请和释放均是由jvm在控制。而释放往往会出现各种各样的问题&#xff0c;经常一个引用没处理好就引起内存泄漏&#xff0c;最后引发OOM。如果发生在重要业务系统还可能出现严重的生产事故。 因此内存使用一定要谨慎&#xff0c;特别是引用要及时断链。虽然jvm…

异步编程到底在说啥?

作者 | 码农的荒岛求生来源 | 码农的荒岛求生之前很多同学在微信上问能不能讲讲异步编程是怎么一回事儿&#xff0c;今天就和大家简单聊一聊这个话题。我们以函数调用为例&#xff0c;假设有这样的代码&#xff1a;void B() {lines read(filename);sum(lines); }void A() {...…

如何让评审人爱上我

简介&#xff1a; 今天小编作为一个开发者&#xff0c;放下外部的客观因素&#xff0c;仅从一个代码的实现者&#xff0c;一个被评审人的角度去思考如何让评审变得高效而富有意义。换句话说&#xff1a;如何让评审人爱上我&#xff08;被评审人&#xff09;。 众所周知&#x…

centos8安装mysql_CentOS8+FreeRadius+Mysql8.0+daloRadius建立Radius服务器

Linux发行版&#xff1a;CentOS8-1905数据库&#xff1a;Mysql8.0create WEB软件&#xff1a;httpddaloRadius前端使用PHPyum -y install update yum -y install httpd //web服务器 yum -y install vim // yun -y install wget // yum -y install net-to…

2025年公有云或将服务中国过半数字经济

简介&#xff1a; 2025年公有云或将服务中国过半数字经济阿里云研究院 高级战略总监 麻芃2020年&#xff0c;疫情“黑天鹅”对全球经济社会运行造成剧烈冲击&#xff0c;但数字经济的引擎作用却逆势凸显。去年我国数字经济整体规模达到39.2万亿元&#xff0c;实现9.7%的高速增长…

php mysql 绕过_PHP中md5绕过

一、md5($password,true)的SQL注入问题这里要提到一下MySQL中的数值比较问题。1、当数字和字符串比较时&#xff0c;若字符串的数字部分(需要从头开始)和数字是相同的&#xff0c;那么则返回的是true。select if(1"1abcd","等于","不等于") as t…

重磅发布:微服务引擎 MSE 专业版

简介&#xff1a; 性能提升 10 倍&#xff0c;更高的 SLA 保障&#xff0c;新用户限时抢购 8 折资源包。 微服务引擎 MSE 专业版发布&#xff0c;支持 Nacos 2.0 &#xff0c;相比基础版&#xff0c;专业版具有更高的 SLA 保障&#xff0c;性能提升十倍&#xff0c;99.95%可用…

45分钟,411个中小品牌天猫双11实现新跨越

CSDN从天猫获悉&#xff0c;今年天猫双11&#xff0c;有一批中小品牌实现跨越式增长。截至11月11日0点45分&#xff0c;已有411个去年成交额过百万的中小品牌&#xff0c;今年销售额突破千万&#xff1b;更有40个去年双11成交额千万级的品牌&#xff0c;在今年双11成交额突破了…

组装台式电脑配置清单_攒机必备!各种价位的台式电脑配置清单!

点击上方「软件分享云」关注我们台式机&#xff0c;是一种独立相分离的计算机&#xff0c;完完全全跟其它部件无联系&#xff0c;相对于笔记本和上网本体积较大&#xff0c;主机、显示器等设备一般都是相对独立的&#xff0c;一般需要放置在电脑桌或者专门的工作台上。因此命名…

达摩院重要科技突破!空天数据库引擎Ganos解读

简介&#xff1a; Ganos空天数据库引擎是李飞飞带领的达摩院数据库与存储实验室研发的新一代位置智能引擎&#xff0c;采用了平台即服务、多模融合、计算下推和云原生全新处理架构&#xff0c;为政府、企事业单位、泛互联网客户提供移动对象、空间/时空、遥感多模态数据混合存储…

brainfuck 在线_酒店在线声誉持久战 重视社媒舆论 保持品牌一致性

维护品牌或酒店声誉是一场持久战&#xff0c;这对塑造积极的品牌认知和提升客户满意度至关重要。声誉管理包括两个关键部分&#xff1a;引导客人评价和公众舆论&#xff0c;并以适当的方式进行反馈。就在线声誉管理而言&#xff0c;品牌还需要注意另外一点&#xff0c;公众会在…

2021天猫双11:阿里巴巴业务已全部跑在阿里云上

“今年天猫双11是首个100%的云上双11&#xff0c;成功扛住了全球规模最大的流量洪峰。”11月11日&#xff0c;阿里巴巴首席技术官程立表示&#xff0c;阿里巴巴业务已全部跑在阿里云上&#xff0c;体验如丝般顺滑。经过历年双11的“大考”&#xff0c;阿里技术实现了多级跳跃。…

从“嵌入式”到“物联网”有哪些变化?

简介&#xff1a; 经过几十年发展&#xff0c;嵌入式技术已经用在了我们生活中的方方面面&#xff0c;但是嵌入式始终都带有小众&#xff0c;专业性强的属性&#xff0c;让很多非嵌入式领域的同学望而却步。近十几年的发展&#xff0c;物联网覆盖了越来越多领域&#xff0c;包括…

Serverless Devs 的官网是如何通过 Serverless Devs 部署的

简介&#xff1a; 只有自己吃自己的狗粮&#xff0c;自己做的东西才不“&#x1f436;”。Serverless Devs 自发展之处到现在&#xff0c;已经经历了几个月的时间&#xff0c;在这几个月&#xff0c;Serverless Devs 的成长是迅速的&#xff0c;这很大一部分的原因是“我们在吃…

crontab 改成只读模式_以“三合一”模式推动提质增效 助力公司高质量发展

近日&#xff0c;模块制造厂圆满完成位于原化机西部院内的吉林制造基地新老厂区的资源整合、机械设备修理以及厂区内设备土建基础施工、功能配套设备购置等工作&#xff0c;积极推进新厂区环评、厂区注册地址变更&#xff0c;使制造基地继承了老厂区所拥有的压力容器、超限设备…

5G 落地进入爆发期,是时候让毫米波登场了

作者 | 小枣君来源 | 鲜枣课堂2021年&#xff0c;全球5G网络建设和发展取得了不俗的成绩。根据GSA于8月发布的数据&#xff0c;已有70多个国家及地区的超过175家运营商&#xff0c;推出了5G商用服务。还有285家运营商&#xff0c;正在投资部署5G。中国的5G建设步伐&#xff0c;…

新型DDoS来袭 | 基于STUN协议的DDoS反射攻击分析

简介&#xff1a; 作为新型反射类型&#xff0c;目前仍存绕过防御可能性。 阿里云安全近期发现利用STUN&#xff08;Session Traversal Utilities for NAT&#xff0c;NAT会话穿越应用程序&#xff09;服务发起的DDoS反射攻击。阿里云DDoS防护系统在秒级识别到攻击&#xff0c…