Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

IntelliJ IDEA 2023.2 EAP 6 现已推出,提供了许多更新,例如新的 AI 助手 (AI Assistant)、对 Dev Containers for Gateway 的支持以及 IDE 新 UI 的一些有价值的增强功能。

AI Assistant (Beta)

 EAP 版本为 IntelliJ IDEA 带来了一个重要的补充 —— AI 助手。它由 JetBrains AI 服务提供支持,并结合了 OpenAI 的功能以及 JetBrains 自己的小型模型。IntelliJ IDEA 2023.2 EAP 6 提供了一组初始的 AI 驱动功能,包括集成的 AI 聊天、自动文档生成、名称建议和提交消息生成。

要访问这些 AI 功能,你需要使用 JetBrains 帐户登录 JetBrains AI 服务;JetBrains AI 服务的可用性最初可能会有所不同。有关 AI Assistant 的更多信息以及如何访问它的说明可参阅此博客文章

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

对 Dev Containers 的支持

IntelliJ IDEA 现在支持 Dev Containers,允许你使用容器作为功能齐全的开发环境来编辑、构建和运行你的项目。Dev Containers 可以通过 SSH 连接远程运行,也可以使用 Docker 在本地运行。

要使用此功能,需确保你的计算机上安装了 Docker。在“Welcome”屏幕中,选择“Remote Development”部分中的“Dev Containers”选项,并提供 Git 仓库链接以设置连接。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

此外,你还可以通过打开 devcontainer.json 文件直接在编辑器中配置本地或远程环境。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

初始支持包括数量有限的 devcontainer.json 选项。

新 UI 中的彩色项目标题

IntelliJ IDEA 2023.2 EAP 6 引入了彩色标题来简化多个打开项目之间的导航。现在可以为每个项目分配唯一的颜色和图标,以便更轻松地在工作区中区分它们。标题现在默认带有预定义的颜色,但用户可以自定义。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

在新 UI 中删除了 Linux 上的 title bar

为了方便 Linux 用户,新 UI 中删除了操作系统的 native header ,从而使界面更加干净。默认情况下,用户现在将看到自定义 IDE 的标题,其中提供了一系列自定义选项来定制你的工作区。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

支持 Maven 4.0.0-alpha

IntelliJ IDEA 现在与最新版本的 Maven Maven 4.0.0-alpha 完全兼容。

已弃用的插件

根据对插件使用情况的研究,决定弃用 IntelliJ IDEA 中的多个插件,包括 Struts2、Resin、tc Server、Play 和 Cloud Foundry。从 2023.2 版本开始,将不再构建他们的新版本。

更多详情可查看官方博客。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

据《华尔街日报》报道,美国计划进一步收紧对中国出口 AI 计算显卡的限制。美国商务部最早可能在 7 月初采取行动,在未获得许可证的情况下,英伟达等 AI 芯片厂商将被禁止向中国和其他相关国家的客户销售多种型号的 AI 计算芯片和显卡等产品。

去年秋天,美国出台了 AI 芯片相关的首轮贸易限制措施,对 Nvidia 和 AMD 等公司施加出口许可证要求。当时限制贸易的产品覆盖了 Nvidia A100、H100 等高端 GPU 产品。英伟达方面表示,美国的限制令是在担心先进的 AI 芯片可能会被竞争对手用于训练强大的 AI 应用程序中,继而对美国的 AI 领先地位产生影响。Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

为了在不丢掉中国市场的同时满足限制令,芯片制造商开始生产功能较弱的计算显卡产品,比如 Nvidia 向中国客户提供 A800 GPU,该系列计算卡于 2022 年第三季度投入生产,它既可作为 A100 的替代品,又低于美国政府的禁令门槛。

但美国政府似乎对显卡厂商变相绕过监管的做法相当不满,相关立法者正计划扩大禁令范围,第二轮禁令限制的类型甚至会覆盖到 A800 等性能较差的计算显卡。

(其实 A800 和 A100 的硬件参数并没有差多少,只是 A800 为了过禁令阉割了卡间通信带宽,可以理解为 A100 特供版)

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)  Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

扩大 AI 芯片限制令的消息一经报道便不胫而走,虽然截止目前还没有任何美国政府的官方公告,但消息传出来一天之内,英伟达股价下跌 3.2%,AMD 股价下跌约 3%。

WhatsApp 已正式宣布弃用 Windows 上基于 Electron 的桌面应用程序,促使用户转而使用新推出的原生应用程序以实现不间断访问。此举旨在在桌面设备上提供更加优化、稳定且功能丰富的消息传递体验。

早在一个月前,WhatsApp 就在应用程序的主屏幕上显示了一个弃用倒计时,以提前告知用户。虽然有一些用户表达了对快速过渡、以及原生应用程序中业务工具(如目录管理和快速回复)短缺的不满。但现在所有打开基于 Electron 的 WhatsApp 桌面应用程序的用户,都会看到一个“APP expired”的通知消息,明确通知其该应用程序已不再受支持。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

目前,Electron 应用程序的弃用似乎仅限于 WhatsApp Desktop for Windows。

Electron 框架允许开发人员通过开发可跨 Windows 和 macOS 等不同操作系统运行的单一代码库,使用 Web 技术创建跨平台桌面应用程序。但 WABetaInfo 指出,“由于它们是为了在不同的操作系统上工作而开发的,所以并没有真正优化,且可能会占用大量的资源。原生应用程序肯定可以提供更流畅、更直观的用户界面,更好的响应性和更强的稳定性,提供更强大和可靠的信息服务,这也是 WhatsApp 决定为其用户构建原生解决方案的原因。”

用户需要从 Microsoft Store 下载适用于 Windows 的原生桌面应用程序。对于仍然需要使用商业工具的用户,可以考虑使用 WhatsApp Web 作为临时解决方案。

谷歌基于团队内部使用 Rust 的体验和经历,分享了他们对这门“网红”编程语言的见解,其中包括对常见 Rust 谣传的澄清。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

1. Rust 至少需要学习 6 个月

谷歌驳斥了此说法。

谷歌内部调查显示,超过 2/3 的受访者有信心在学习 Rust 时,用两个月或更短时间内就能为 Rust 代码库做出贡献。此外, 1/3 的受访者在两个月或更短的时间内使用 Rust 变得与其他语言一样高效。四个月内,这一数字增加到 50% 以上。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

2. Rust 编译器速度并没有想象的那么快

谷歌证实了此说法。

他们表示,到目前为止,构建速度慢是开发者在使用 Rust 时遇到的第一大挑战,只有略多于 40% 的受访者认为速度可以接受

3. unsafe 代码和互操作始终是最大的挑战

谷歌驳斥了此说法。

对于当前的谷歌开发者来说,他们在 Rust 领域面临的三大挑战是:

  • Macros(宏)
  • Ownership and borrowing(所有权和借用)
  • Async programming(异步编程)

编写 unsafe 代码和处理 C/C++ 互操作也是谷歌开发者遇到的问题,但并不是最大的挑战。

4. Rust 的编译器错误消息十分有用

谷歌证实了此说法。

谷歌内部只有 9% 的受访者对 Rust 中的诊断和调试信息质量不满意。

综合社区的反馈来看,大家惊叹于编译器消息的出色表现。虽然起初有些惊讶——毕竟大家习惯于忽略大的编译器错误,但习惯之后,大家就喜欢它了。

5. Rust 的代码质量很高

谷歌证实了此说法。

受访者表示 Rust 代码的质量很高——77% 的开发者对 Rust 代码的质量感到满意。事实上,当被要求比较他们是否认为 Rust 代码比他们用其他语言编写的代码更正确时,绝大多数受访者 85% 相信他们的 Rust 代码是正确的。

除了正确,Rust 代码也便于 review,超过一半的受访者表示 Rust 代码非常容易 review。


原文地址

美团于 6 月 29 日在香港联交所发布公告称,已经订立交易协议以收购光年之外境内外主体 100% 股权,收购价约为 20.65 亿人民币。

收购价格包括现金 2.34 亿美、债务承担 3.67 亿人民币以及现金 1 人民币。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

美团在公告中解释称,将通过此收购事项获得领先的 AGI 技术及人才,有机会加强其于快速增长的人工智能行业中的竞争力。

光年之外是一家大模型创业公司,成立于 2018 年;致力于推动实现 AGI(通用人工智能)与普惠人类。由美团联合创始人、前董事及关联人士王慧文创立及控制,光年之外集团的净现金为 2.85 亿美。日前,光年之外联合创始人王慧文曾因身体原因离岗就医及休养,引发外界诸多关注。

美团方面表示,并购完成后,将支持光年团队继续在大模型领域进行探索和研究。

摘要:索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度。

本文分享自华为云社区《数据库开发指南(六)索引和视图的使用技巧、方法与综合应用》,作者: bluetata 。

一、索引

1.1 什么是索引

索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度。它类似于书籍的索引,可以帮助快速定位和检索数据。在数据库中,索引是对一个或多个列的值进行排序和存储的结构,它们包含指向实际数据位置的指针。

1.2 索引分类

数据库中索引主要分为两类:聚集索引和非聚集索引。SQL Server 还提供了唯一索引、索引视图、全文索引、XML 索引等等。聚集索引和非聚集索引是数据库引擎中索引的基本类型,是理解其他类型索引的基础。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

1.2.1 聚集索引

聚集索引是值表中数据行的物理存储顺序和索引的存储顺序完全相同。聚集索引根据索引顺序物理地重新排列了用户插入到表中的数据,因此,每个表只能创建一个聚集索引。聚集索引经常创建在表中经常被搜索到的列或按顺序访问的列上。在默认情况下,主键约束自动创建聚集索引。

1.2.2 非聚集索引

非聚集索引不改变表中数据列的物理存储位置,数据与索引分开存储,通过索引指向的地址与表中的数据发生关系。

非聚集索引没有改变表中物理行的位置,索引可以在以下情况下使用非聚集索引:

  • 如果某个字段的数据唯一性比较高
  • 如果查询所得到的数据量比较少

1.2.3 聚集索引和非聚集索引的区别

这里用一个表格简单的总结一下聚集索引和非聚集索引的区别:

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

1.2.4 其他类型索引

除了以上索引,还有以下类型索引:

  • 唯一索引:如果希望索引键都不同,可以创建唯一索引。聚集索引和非聚集索引都可以是唯一索引。
  • 包含新列索引:索引列的最大数量是16个,索引列的字节总数的最高值是900。如果当多个列的字节总数大于900,切又想在这些劣种都包含索引是,可以使用包含新列索引
  • 视图索引:提供视图查询效率,可以视图的索引物理化,也就是说将结果集永久存储在索引中,可以创建视图索引。
  • XML索引:是与xml数据关联的索引形式,是XML二进制blob的已拆分持久表示形式
  • 全文索引:一种特殊类型的基于标记的功能性功能,用于帮助在字符串中搜索赋值的词

1.3 创建索引

1.3.1 语法


参数解释

unique 唯一索引
clustered 聚集索引
noclustered 非聚集索引
fillfactor 填充因子大小,范围在 0-100 直接,表示索引页填满的空间所占的百分比。

1.3.2 创建索引的命名规则最佳实践

在 MSSQL 中,索引的命名规则的最佳实践可以有一些常见的准则,以提高可读性和维护性。这个潜在的要求不仅试用于 SQL Server 数据库,同样在其他数据库例如 MySQL、Oracle 中都同样值得注意。

下面是个人总结的一些命名规则与建议:

  1. 命名应该具有描述性:索引的名称应该能够清晰地表达其作用和关联的列或表。使用有意义的名称可以使其他开发人员更容易理解索引的用途。
  2. 包含表名和列名:在索引名称中包含相关表名和列名(长表名可适当缩写,但要确保可以定位到表),可以使索引更具可读性,并且可以避免在不同表之间使用相同名称的索引时的冲突。
  3. 使用统一的命名约定:为了提高一致性,可以定义一套命名约定,并在整个数据库中使用。例如,可以使用特定的前缀或后缀来标识索引的类型(如 idx_ 表示非聚集索引)。
  4. 避免过长的名称:索引名称不应该过长,以免在使用索引时引起不便。尽量使用简洁但描述性的名称。
  5. 避免使用保留关键字和特殊字符:确保索引名称不与 MSSQL 的保留关键字或特殊字符冲突,以避免语法错误。

1.3.3 创建索引示例


1.4 适合的创建索引的列

一般情况,可以选择那些对查询性能有积极影响的列进行索引创建,下面进行一定的总结:

列的选择性:选择性是指列中不同值的数量与总行数的比例。如果某列具有较高的选择性,即不同的值较多,那么为该列创建索引可能会有更好的效果。例如,在表示性别的列上创建索引可能没有太大的帮助,因为只有两个可能的值。

查询频率:观察经常用于查询条件的列。如果某个列经常用于搜索、过滤或连接操作,那么为该列创建索引可以提高查询性能。

数据表的大小:对于大型表,创建索引的影响可能更加显著。较小的表可能不需要太多的索引,因为全表扫描的开销相对较小。

数据更新频率:索引的创建和维护也会增加对数据的写操作的开销。如果某个列的数据经常发生变化,那么创建索引可能会带来一定的性能开销。

查询性能优化需求:通过分析查询执行计划,可以确定是否存在潜在的性能瓶颈,并考虑为相关的列创建索引以改善查询性能。

请注意过多的索引也可能会带来维护开销和存储成本,因此需要在权衡索引数量和性能提升之间找到平衡点。定期监控和评估索引的使用情况也是重要的,以确保索引仍然对数据库性能产生积极影响。

1.5 不适合创建索引的列

虽然在某些情况下创建索引可以提高查询性能,但并不是所有列都适合创建索引。以下是一些不适合创建索引的列的情况:

低选择性列:如果某个列的选择性很低,即该列的不同值较少,创建索引可能不会带来明显的性能提升。例如,对于性别这样只有几个可能值的列,创建索引可能不会有太大意义。

经常更新的列:如果某个列的值经常被修改,那么为该列创建索引可能会带来额外的维护成本和性能开销。每次更新操作都需要更新索引,这可能会影响写入性能。在这种情况下,需要仔细评估是否真的需要为该列创建索引。

过于频繁的查询列:某些列可能经常被查询,但它们的选择性较低,即不同的值较少。在这种情况下,尽管查询频率高,但为该列创建索引可能不会带来明显的性能提升,因为索引的使用效果有限。

大文本或大二进制列:对于存储大文本或大二进制数据的列,如长文本字段或图像字段,创建索引的效果通常较差。这是因为索引本身需要占用额外的存储空间,并且对于大型数据的索引操作可能变得非常耗时。

不常用的列:对于很少用于查询的列,创建索引可能没有太大意义。如果一个列很少用于查询条件或连接操作,那么为其创建索引可能只会增加额外的开销而不带来实际的性能提升。

需要注意的是,以上列举的情况只是一般性的指导原则,具体是否适合创建索引还取决于具体的数据库结构、查询模式和性能需求。在设计和创建索引时,应根据具体情况进行评估,并进行性能测试和优化以确保索引的有效性。

二、视图

2.1 什么是视图

视图就是一个虚拟的数据表,该数据表中的数据记录是由一条查询语句的查询结果得到的。

2.2 为什么要使用视图,而不是表(面试可能会被问到)

如果你在面试的时候被问到这个问题,建议从下面这个流程来回答一下面试官。

首先介绍一下表的作用(比如表是直接存储结构化数据,可以扩展增删改之类的),之后在介绍一下视图是什么,之后从两个切入点来讲解视图的好处以及必要性,这两个切入点是:复用性和安全性,这里来简单总结一下:

  1. 简化查询,提高复用性
    想象一下,一个人员宽表,里面有几百个字段,但是你每次只需要用到这个表中的姓名、性别、年龄这三个字段,那么你可以创建一个视图来直接使用,或者你这个人员表经常和另外一个履历表 join 组合在一起,而只取了其中的部分字段,并且频繁使用这几个字段。那么无疑创建视图是一个好做法。当然这种情况也可以说明使用视图能够简化查询。
  2. 提高安全性
  • 通过视图,可以限制用户对敏感数据的直接访问。视图可以控制用户可以看到和操作的数据的范围,提供更好的安全性和隐私保护。这里还拿刚才我讲的姓名、性别、年龄三个字段,假如年龄是一个比较敏感的字段,那么对某些数据库用户只能查询姓名和性别的话,那么就可以设置一个视图分配给这个用户。
  • 另外就是如果你要更新视图的时候,也只能更新视图所见的字段,用户对视图不可以随意的更改和删除,可以一定程度的保证数据的安全性。

讲解完上述的两个大的关键点后,也可以适当自行发挥,比如视图你可以调整表字段的显示顺序,或者字段名字等等。这些也是优点。可以适当进行讲解。

2.3 创建视图

创建视图的时候,对命名视图大家一般也有默认的规则,一般情况可以使用 v_ 或 view_ + 表名(表缩写)的形式。

例如:v_student


2.4 创建视图准则

创建视图需要考虑一下准则:

  1. 视图名称必须遵循标识符的规则,该名称不得与该架构的任何表的名称相同。
  2. 你可以对其他视图创建视图。允许嵌套视图,但嵌套不得超过32层。视图最多可以有1024个字段。
  3. 不能将规则和 default 定义于视图相关联。
  4. 视图的查询不能包含 compute 子句、compute by 子句或 into 关键字。
  5. 定义视图的查询不能包含 order by 子句,除非在 select 语句的选择列表中还有 top 子句。

下列情况必须指定视图中每列的名称:

  • 有列顺序需求(在某些情况下,您可能希望定义视图的结果集中列的顺序,并且这与基础表中的顺序不同。)
  • 视图中的任何列都是从算术表达式、内置函数或常量派生而来
  • 视图中有两列或多列具有相同名称(通常由于视图定义包含联接,因此来自两个或多个不同的列具有相同的名称)
  • 有指定列别名的需求。注意无论是否重命名,视图列都需继承原列的数据类型

2.5 修改视图

修改视图和修改表有点类似,可以直接使用 alter 关键字进行修改,示例如下:


2.6 加密视图

如果你对某一个视图有保护查询逻辑、防止修改或者查询加密的需求的时候,可以使用加密视图操作。

在 SQL Server 中 使用with encryption后,可以在创建视图时对其定义的 SQL 查询进行加密。也就是说 MSSQL 会对该视图的定义中的查询语句进行加密。这意味着其他人无法直接查看或分析该视图的查询逻辑。压根就看不到这个视图内部结构了。


如何解密被加密的视图,或者修改已经被加密的视图:

一般情况一个视图被加密后,你需要修改它,那么大致有3个方法:

  1. 重新创建视图(先删除已加密的视图,然后使用新的查询逻辑重新创建视图。)。
  2. 创建新视图(创建一个新的,视图名称不同,之后调用这个新的)。
  3. 暴力解密之后修改(一般需要借助第三方工具或辅助,该方式个人不推荐)

2.7 视图能否被更新 update (面试可能会被问到)


如果面试官问了这两个问题,那么他还算友好的提醒了你,如果直接问了一句话“视图可以被更新吗?”,那么我感觉有被挖坑的嫌疑。

视图可以被更新,但不是所有的情况都可以。

视图更新必须遵循以下规则:

  1. 当视图的字段是通过字段表达式(Field Expression)或常数(Constant)计算得出的结果时,对该视图执行 INSERT 和 UPDATE 操作是不允许的,但可以执行 DELETE 操作。
  2. 若视图的字段是来自库函数,则此视图不允许更新;
  3. 若视图的定义中有 GROUP BY 子句或聚集函数时,则此视图不允许更新;
  4. 若视图的定义中有 DISTINCT 任选项,则此视图不允许更新;
  5. 若视图的定义中有嵌套查询,并且嵌套查询的 FROM 子句中涉及的表也是导出该视图的基表,则此视图不允许更新;
  6. 若视图是由两个以上的基表导出的,此视图不允许更新(源表单一才可以被更新);
  7. 一个不允许更新的视图上定义的视图也不允许更新;
  8. 由一个基表定义的视图,只含有基表的主键或候补键,并且视图中没有用表达式或函数定义的属性,才允许更新。

 

关注,第一时间了解华为云新鲜技术~

摘要:在本篇文章中,我们将深入探讨Spring框架中的重要组件——BeanPostProcessor。首先,我们将了解其设计理念和目标,然后通过实际的例子学习如何基础使用它,如何通过BeanPostProcessor改变Bean的初始化结果以及如何利用它修改Bean的属性。

本文分享自华为云社区《Spring高手之路6——Bean生命周期的扩展点:BeanPostProcessor》,作者:砖业洋__ 。

1. 探索Spring的后置处理器(BeanPostProcessor)

1.1 BeanPostProcessor的设计理念

BeanPostProcessor的设计目标主要是提供一种扩展机制,让开发者可以在Spring Bean的初始化阶段进行自定义操作。这种设计理念主要体现了Spring的一种重要原则,即“开放封闭原则”。开放封闭原则强调软件实体(类、模块、函数等等)应该对于扩展是开放的,对于修改是封闭的。在这里,Spring容器对于Bean的创建、初始化、销毁等生命周期进行了管理,但同时开放了BeanPostProcessor这种扩展点,让开发者可以在不修改Spring源码的情况下,实现对Spring Bean生命周期的自定义操作,这种设计理念大大提升了Spring的灵活性和可扩展性。

BeanPostProcessor不是Spring Bean生命周期的一部分,但它是在Spring Bean生命周期中起重要作用的组件

1.2 BeanPostProcessor的文档说明

我们来看看这个方法的文档注释,从图中可以看到,BeanPostProcessor 接口定义了两个方法,postProcessBeforeInitialization和postProcessAfterInitialization

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

postProcessBeforeInitialization方法会在任何bean初始化回调(如InitializingBean的afterPropertiesSet方法或者自定义的init-method)之前被调用。也就是说,这个方法会在bean的属性已经设置完毕,但还未进行初始化时被调用。

postProcessAfterInitialization方法在任何bean初始化回调(比如InitializingBean的afterPropertiesSet或者自定义的初始化方法)之后被调用。这个时候,bean的属性值已经被填充完毕。返回的bean实例可能是原始bean的一个包装。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

2. BeanPostProcessor的使用

2.1 BeanPostProcessor的基础使用示例

全部代码如下:

首先定义两个简单的Bean:Lion和Elephant

Lion.java


Elephant.java


然后定义一个简单的BeanPostProcessor,它只是打印出被处理的Bean的名字:


接着我们定义一个配置类,其中包含对Lion、Elephant类和MyBeanPostProcessor类的Bean定义:


最后,我们在主程序中创建ApplicationContext对象:


运行结果:

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

以上代码在执行时,将先创建Lion和Elephant对象,然后在初始化过程中和初始化后调用postProcessBeforeInitialization和postProcessAfterInitialization方法,打印出被处理的Bean的名字。

细心的小伙伴可能观察到这里有红色日志
信息: Bean ‘animalConfig’ of type [com.example.demo.configuration.AnimalConfig$$EnhancerBySpringCGLIB$$ee4adc7e] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

在Spring中,BeanPostProcessor是被特殊处理的,它们会在其他普通Bean之前被实例化和初始化,这样设计的原因是BeanPostProcessor的存在可以影响其他Bean的创建和初始化过程。 Spring应用上下文中可以存在多个BeanPostProcessor,Spring本身就提供了很多内置的BeanPostProcessor。

但是,如果在初始化BeanPostProcessor的过程中需要依赖其他的Bean,那么这些被依赖的Bean会先于后置处理器进行初始化。然而,由于这些被依赖的Bean是在该BeanPostProcessor初始化完成之前就已经进行了初始化,它们就会错过这个BeanPostProcessor的处理。在这个例子中,MyBeanPostProcessor就是这样的一个BeanPostProcessor,而”animalConfig”是它所依赖的Bean。所以这个日志信息就是说,’animalConfig’这个Bean在初始化的时候,没有被所有的BeanPostProcessor处理,这里它无法得到MyBeanPostProcessor的处理。

我们只需要把实例化过程直接交给Spring容器来管理,而不是在配置类中手动进行实例化,就可以消除这个提示信息,也就是在MyBeanPostProcessor上加@Component即可。

在第3节的例子中就使用了@Component处理这个MyBeanPostProcessor,这个提示就消失了。

2.2 利用BeanPostProcessor修改Bean的初始化结果的返回值

还是上面的例子,我们只修改一下MyBeanPostProcessor 类的方法后再次运行


运行结果:

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

BeanPostProcessor的两个方法都可以返回任意的Object,这意味着我们可以在这两个方法中更改返回的bean。例如,如果我们让postProcessBeforeInitialization方法在接收到Lion实例时返回一个新的Elephant实例,那么我们将会看到Lion实例变成了Elephant实例。

那既然BeanPostProcessor的两个方法都可以返回任意的Object,那我搞点破坏返回null会怎么样,会不会因为初始化bean为null而导致异常呢?

答案是不会的,我们来看一下:


我们运行看结果

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

结果发现还是正常初始化的bean类型,不会有任何改变,我们继续调试看看是为什么

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

我们通过堆栈帧看到调用postProcessBeforeInitialization方法的上一个方法是applyBeanPostProcessorsBeforeInitialization,双击点开看一看这个方法

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

从我这个调试图中可以看到,如果postProcessBeforeInitialization返回null,Spring仍然用原始的bean进行后续的处理,同样的逻辑在postProcessAfterInitialization也是一样。这就是为什么我们在BeanPostProcessor类的方法中返回null,原始bean实例还是存在的原因。

2.3 通过BeanPostProcessor实现Bean属性的动态修改

来看看是怎么拦截 bean 的初始化的

全部代码如下:

首先,我们定义一个Lion类:


接下来,我们定义一个BeanPostProcessor,我们称之为MyBeanPostProcessor :


然后我们定义一个配置类,其中包含对Lion类的Bean定义和对MyBeanPostProcessor 类的Bean定义:


最后,我们在主程序中创建ApplicationContext对象,并获取Lion对象:


运行结果:

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

上面代码在执行时,先创建一个Lion对象,然后在初始化过程中和初始化后调用postProcessBeforeInitialization和postProcessAfterInitialization方法,修改Lion的名字为”Simba”,最后在主程序中输出Lion对象,显示其名字为”Simba”。

3. 深度剖析BeanPostProcessor的执行时机

3.1 后置处理器在Bean生命周期中的作用及执行时机

在这个例子中,我们将创建一个名为Lion和Elephant 的Bean,它会展示属性赋值和生命周期的各个步骤的执行顺序。同时,我们还将创建一个BeanPostProcessor来打印消息并显示它的执行时机。

全部代码如下:

首先,我们定义我们的Lion:


创建Lion所依赖的Elephant


然后,我们定义一个简单的BeanPostProcessor:


创建一个配置类AnimalConfig


主程序:


控制台上看到所有的方法调用都按照预期的顺序进行,这可以更好地理解Bean属性赋值和生命周期以及BeanPostProcessor的作用。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

根据打印日志我们可以分析出

  1. 首先,Bean Constructor Method Invoked! 表明 Lion 的构造器被调用,创建了一个新的 Lion 实例。
  2. 接着,Bean Setter Method Invoked! name: my lion 和 Bean Setter Method Invoked! elephant: com.example.demo.bean.Elephant@f 说明 Spring 对 Lion 实例的依赖注入。在这一步,Spring 调用了 Lion 的 setter 方法,为 name 属性设置了值 “my lion”,同时为 elephant 属性注入了一个 Elephant 实例。
  3. 然后,postProcessBeforeInitialization Method Invoked! 说明 MyBeanPostProcessor 的 postProcessBeforeInitialization 方法被调用,这是在初始化 Lion 实例之前。
  4. @PostConstruct Method Invoked! 说明 @PostConstruct 注解的方法被调用,这是在 Bean 初始化之后,但是在 Spring 执行任何进一步初始化之前。
  5. afterPropertiesSet Method Invoked! 说明 Spring 调用了 InitializingBean 的 afterPropertiesSet 方法
  6. customInitMethod Method Invoked! 表示调用了 Lion 实例的 init-method 方法。
  7. postProcessAfterInitialization Method Invoked! 说明 MyBeanPostProcessor 的 postProcessAfterInitialization 方法被调用,这是在初始化 Lion 实例之后。
    然后 Spring 完成了整个初始化过程。
  8. 主程序中手动调用了 Lion 实例的 setter 方法,因此在 Bean Setter Method Invoked! name: oh!!! My Bean set new name 可见,name 属性被设置了新的值 “oh!!! My Bean set new name”。
    当容器准备关闭时:
  9. @PreDestroy Method Invoked! 说明 @PreDestroy 注解的方法被调用,这是在 Bean 销毁之前。
  10. destroy Method Invoked! 表示 Lion 实例开始销毁。在这一步,Spring 调用了 DisposableBean 的 destroy 方法。
  11. customDestroyMethod Method Invoked! 表示 Lion 实例开始销毁,调用了Lion 实例的 destroy-method 方法。

最后,Spring 完成了整个销毁过程,容器关闭。

这个日志提供了 Spring Bean 生命周期的完整视图,显示了从创建到销毁过程中的所有步骤。

注意:DisposableBean 的 destroy 方法和 destroy-method 方法调用,这个销毁过程不意味着bean实例就被立即从内存中删除了,Java的垃圾收集机制决定了对象什么时候被从内存中删除。Spring容器无法强制进行这个操作,比如解除bean之间的关联和清理缓存,这并不是Spring在销毁bean时会做的,而是由Java的垃圾回收器在一个对象不再被引用时做的事情。

BeanPostProcessor 的执行顺序是在 Spring Bean 的生命周期中非常重要的一部分。例如,如果一个 Bean 实现了 InitializingBean 接口,那么 afterPropertiesSet 方法会在所有的 BeanPostProcessor 的 postProcessBeforeInitialization 方法之后调用,以确保所有的前置处理都完成了。同样,BeanPostProcessor 的 postProcessAfterInitialization 方法会在所有的初始化回调方法之后调用,以确保 Bean 已经完全初始化了。

我们可以注册多个 BeanPostProcessor。在这种情况下,Spring 会按照它们的 Ordered 接口或者 @Order 注解指定的顺序来调用这些后置处理器。如果没有指定顺序,那么它们的执行顺序是不确定的。

3.2 图解:Bean生命周期与后置处理器的交互时序

综合上面的执行结果,我们来总结一下,下面是Spring Bean生命周期的时序图,它详细地描绘了Spring Bean从实例化到准备使用的整个过程,包括Bean的实例化、属性赋值、生命周期方法的执行和后置处理器的调用。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

 

关注,第一时间了解华为云新鲜技术~

摘要:随着企业数据空间在内部的成功实践,2022年,华为正式推出云服务产品——华为云交换数据空间EDS(Exchange Data Space),秉持“你的数据你做主”的宗旨,以保护企业数据主权为基础,促进企业数据高效流通,实现数据价值最大化。

本文分享自华为云社区《数据交换不失控——华为云EDS,让你的数据你做主》,作者:开天aPaaS小助手。

数字社会,每时每刻都有海量数据产生,数据也逐渐从生产过程的附属产物,逐渐成为数字经济的关键生产要素。作为生产要素,数据只有流通起来才能产生大规模的经济价值。

数据在企业中的流通模式经历了数据集成数据共享数据交换的三个阶段:

阶段一,数据沿着企业的业务流流通,主要是系统间的集成对接。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

阶段二,企业开始通过跨业务的数据分析来支撑企业经营和日常运营,此时的数据流通就突破业务流的约束,通过数据汇聚实现数据在企业内的安全共享。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

阶段三,随着数据成为生产要素,要素价值分配的特征使数据增值,并激发了数据进一步参与流通的动力。因此,企业数据的流通开始在数据集成和共享这两种模式的基础上,逐步以独立的生产要素的身份参与数据交换,释放要素价值。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

华为的整个数据工作历程与之类似:

第一阶段,做数据清洁,使数据定义在不同系统中保持一致,把主业务打通。

第二阶段,打破数据的部门墙,把数据汇聚到数据底座再分享出去,华为有3000多个系统,这时候把重要的业务数据入到数据湖里,然后再加工做个服务开放出去。

第三阶段,此时数据范围扩大了,不仅是企业内部的共享,还需要和供应商、客户、其他组织进行交换,这就要建立数据空间,使数据能够可控的交换,使数据成为企业高质量发展的核心竞争力。

在这个数据交换的过程中,关键解决了数据的两个特征:

一个是非排他性,其他生产要素都是可以排他的,而数据是你可以用,他也可以用,没有排他性;第二个是数据复制的“零成本”。

不解决非排他性和零成本复制问题,企业不愿意把数据给出去,数据流通就做不起来。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

2017年,华为作为国内第一家正式加入国际数据空间协会(IDSA)(首次提出主权保护的“数据空间”理念)的企业,开始对数据可控交换解决方案进行探索。

2021年,基于多年不断的探索成果和内部实际诉求,正式启动企业数据交换空间的内部试点建设。并成功在鲲鹏/昇腾生态、企业投后管理、财经外审等重点领域取得了一定的效果。

实践一:华为内部高密数据的跨领域安全共享

行政、HR、采购等领域开通数据空间,实现高密数据的安全共享,月均共享数据5000+,在确保数据安全的前提下,充分发挥数据价值。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

实践二:华为生态产业链上下游数据的可控交换

EDS构建鲲鹏、昇腾两个生态数据交换空间,为15个上下游企业开通数据连接器,月均交换研发、供应、服务等领域数据3000+,支撑了质量追溯、产品开发协同等业务场景的可控数据交换。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

随着企业数据空间在内部的成功实践,2022年,华为正式推出云服务产品——华为云交换数据空间EDS(Exchange Data Space),秉持“你的数据你做主”的宗旨,以保护企业数据主权为基础,促进企业数据高效流通,实现数据价值最大化。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

华为云EDS在“可信、可控、可证”的框架基础上进行数据空间的关键设计,打造数据可控交换的全栈能力。

可信:构造多方信任的生态环境

通过资质评估、证书发放等环节,对组织、个人及技术组件进行可信认证,建立统一的信任机制,实现参与方身份与平台环境可信任。

可控:打造可组合的策略控制数据的使用

平台提供21种策略,在数据使用过程中基于策略(比如“有效期限、查看次数、是否下载” 等)做出相应的使用控制,确保在数据主权可控的基础上合规使用数据。

可证:支撑提供方查证追溯、消费方可免证清白

提供全流程可信、可视的审计追溯服务,支持提供方查证追溯,也能让消费方免证清白,同时为第三方监管提供相应的审计信息。

华为云EDS可用在多种数据交换场景中:

在企业内部,EDS可与企业内各部门间的系统对接集成,在现有业务中嵌入使用控制能力,使业务流程自动化,增强数据的管控和追溯能力。

在企业间的数据交换,EDS通过缔造数据合约型的契约管理,保障双方数据可控交换及交易,保证过程的机密性。

在产业上下游间敏感业务的可控交换,EDS可以让产业生态上下游多方参与,支持多种数据格式及多交换模式的双向交换。

华为云交换数据空间EDS自2022年作为一款云服务产品推出后,逐渐在外部医疗、工业等领域积累了一些成功实践。

EDS助力XX医疗集团实现健康医疗数据安全共享

XX医疗集团拥有庞大的健康医疗数据,向公立医院、医疗科研机构、保险公司等组织进行数据共享时,存在数据共享不可控、不可追溯等安全隐患。

XX医疗集团基于华为云EDS构建数据交换空间,为公立医院、医疗科研机构等开通数据连接器,实现医疗数据的安全可控共享。既保护了各机构的医疗数据主权,也增强了行业互信,释放数据价值的同时,也提升了患者的就医体验。

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

华为云EDS“让你的数据你做主”!

了解更多:https://www.huaweicloud.com/product/eds.html

号外

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

7月7日,华为开发者大会2023 ( Cloud )将拉开帷幕,并将在国内30多个城市、海外10多个国家开设分会场,诚邀您参加这场不容错过的年度开发者盛会,让我们一起开启探索之旅!

我们将携手开发者、客户、合作伙伴,为您呈现华为云系列产品服务与丰富的创新实践,并与您探讨AI、大数据、数据库、PaaS、aPaaS、媒体服务、云原生、安全、物联网、区块链、开源等技术话题,展开全面深入的交流。

大会将汇聚全球科学家、行业领袖、技术专家、社区大咖,开设200多场开发者专题活动,为全球开发者提供面对面交流与合作的机会,共同探讨技术创新和业务发展。

大会官网:https://developer.huaweicloud.com/HDC.Cloud2023.html

参会购票:https://www.vmall.com/product/10086352254099.html?cid= 211761

参与开发者社区活动,观赏技术大咖秀、玩转技术梦工厂,有机会赢取4000开发者礼包!

欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。

 

关注,第一时间了解华为云新鲜技术~

摘要:在本文中,我们将介绍如何使用Vue3和Spring Framework进行开发,并创建一个简单的TodoList应用程序。

本文分享自华为云社区《Vue3搭配Spring Framework开发【Vue3应用程序实战】》,作者:黎燃。

一、介绍

Vue3和Spring Framework都是现代Web应用程序开发中最流行的框架之一。

Vue3是一个流行的JavaScript框架,可以帮助我们构建交互式的前端应用程序。Spring Framework是一个流行的Java框架,可以帮助我们构建高性能的后端应用程序。在本文中,我们将介绍如何使用Vue3和Spring Framework进行开发,并创建一个简单的TodoList应用程序。

二、创建Vue3应用程序

首先,我们需要创建一个新的Vue3应用程序。我们可以使用Vue CLI来创建应用程序,具体步骤如下:

  • 在终端中,使用以下命令安装Vue CLI:

  • 创建一个新的Vue3应用程序:

  • 选择默认配置,并等待Vue CLI安装所需的依赖项。
  • 进入新创建的应用程序目录,并启动开发服务器:

现在,我们已经准备好使用Vue3来创建我们的TodoList应用程序了。

三、创建TodoList组件

接下来,我们需要创建一个Vue3组件来显示我们的TodoList。我们可以使用以下命令在src/components目录下创建一个新的组件文件:


然后,我们可以使用以下代码创建我们的TodoList组件:


在这里,我们使用了Vue3的数据绑定功能来将我们的TodoList数据渲染为HTML。我们使用v-for指令来循环渲染每个TodoList项目,并使用key属性来提高性能。

四、创建Spring控制器

现在,我们需要创建一个Spring控制器来处理我们的TodoList数据。我们可以使用以下命令在src/main/java/com/example/demo目录下创建一个新的Java文件:


然后,我们可以使用以下代码创建我们的Spring控制器:


在这里,我们使用了Spring Framework的@RestController注解来标记我们的控制器,并使用@GetMapping注解来指定HTTP GET请求的路径。我们的getTodos方法返回一个包含TodoList项目的字符串数组。

五、创建Vue3服务

接下来,我们需要创建一个Vue3服务来获取我们的TodoList数据。我们可以使用以下命令在src/services目录下创建一个新的JavaScript文件:


然后,我们可以使用以下代码创建我们的Vue3服务:


在这里,我们使用了Axios库来发出HTTP GET请求,并从我们的Spring控制器中获取TodoList数据。我们将baseUrl设置为我们的Spring控制器的路径。

六、将Vue3服务与组件集成

现在,我们已经准备好将我们的Vue3服务与我们的TodoList组件集成。我们可以使用以下代码更新我们的TodoList.vue组件:


在这里,我们将我们的Vue3服务导入我们的TodoList.vue组件,并在created生命周期钩子中使用await关键字来异步获取TodoList数据。

七、启动应用程序

现在,我们已经完成了我们的Vue3和Spring Framework应用程序的开发。我们可以使用以下命令启动我们的应用程序:


然后,我们可以在浏览器中访问http://localhost:8080来查看我们的TodoList应用程序。

八、总结

在本文中,我们介绍了如何使用Vue3和Spring Framework创建一个简单的TodoList应用程序。我们使用Vue CLI创建了一个新的Vue3应用程序,并创建了一个Vue3组件来显示我们的TodoList。然后,我们使用Spring Framework创建了一个控制器来处理我们的TodoList数据,并使用Axios库创建了一个Vue3服务来获取数据。最后,我们将我们的Vue3服务与我们的Vue3组件集成,并启动了我们的应用程序。希望这篇文章对您有所帮助!

 

关注,第一时间了解华为云新鲜技术~

作者:vivo IT 平台团队- An Peng

本文介绍了什么是分布式ID,分布式ID的业务场景以及9种分布式ID的实现方式,同时基于vivo内部IT的业务场景,介绍了自研鲁班分布式ID服务的实践。

一、方案背景

1.1 分布式ID应用的场景

随着系统的业务场景复杂化、架构方案的优化演进,我们在克服问题的过程中,也总会延伸出新的技术诉求。分布式ID也是诞生于这样的IT发展过程中,在不同的关联模块内,我们需要一个全局唯一的ID来让模块既能并行地解耦运转,也能轻松地进行整合处理。以下,首先让我们一起回顾这些典型的分布式ID场景。

1.1.1 系统分库分表

随着系统的持续运作,常规的单库单表在支撑更高规模的数量级时,无论是在性能或稳定性上都已经难以为继,需要我们对目标逻辑数据表进行合理的物理拆分,这些同一业务表数据的拆分,需要有一套完整的 ID生成方案来保证拆分后的各物理表中同一业务ID不相冲突,并能在后续的合并分析中可以方便快捷地计算。

以公司的营销系统的订单为例,当前不但以分销与零售的目标组织区别来进行分库存储,来实现多租户的数据隔离,并且会以订单的业务属性(订货单、退货单、调拔单等等)来进一步分拆订单数据。在订单创建的时候,根据这些规则去构造全局唯一ID,创建订单单据并保存在对应的数据库中;在通过订单号查询时,通过ID的规则,快速路由到对应的库表中查询;在BI数仓的统计业务里,又需要汇总这些订单数据进行报表分析。

1.1.2 系统多活部署

无论是面对着全球化的各国数据合规诉求,还是针对容灾高可用的架构设计,我们都会对同一套系统进行多活部署。多活部署架构的各单化服务,存储的单据(如订单/出入库单/支付单等)均带有部署区域属性的ID结构去构成全局唯一ID,创建单据并保存在对应单的数据库中,在前端根据单据号查询的场景,通过ID的规则,可快速路由到对应的单区域进行查询。对应多活部署架构的中心化服务,同步各单的单据数据时,单据的ID是全局唯一,避免了汇聚数据时的ID冲突。

在公司的系统部署中,公共领域的 BPM 、待办、营销领域的系统都大范围地实施多活部署。

1.1.3 链路跟踪技术

在微服务架构流行的大背景下,此类微服务的应用对比单体应用的调用链路会更长、更复杂,对问题的排查带来了挑战,应对该场景的解决方案,会在流量入口处产生全局唯一的TraceID,并在各微服务之间进行透传,进行流量染色与关联,后续通过该全局唯一的TraceID,可快速地查询与关联全链路的调用关系与状态,快速定位根因问题。

在公司的各式各样的监控系统、灰度管理平台、跨进程链路日志中,都会伴随着这么一个技术组件进行支撑服务。

1.2 分布式ID核心的难点

  • 唯一性: 保持生成的ID全局唯一,在任何情况下也不会出现重复的值(如防止时间回拔,时钟周期问题)。

  • 高性能: ID的需求场景多,中心化生成组件后,需要高并发处理,以接近 0ms的响应大规模并发执行。

  • 高可用: 作为ID的生产源头,需要100%可用,当接入的业务系统多的时候,很难调整出各方都可接受的停机发布窗口,只能接受无损发布。

  • 易接入: 作为逻辑上简单的分布式ID要推广使用,必须强调开箱即用,容易上手。

  • 规律性: 不同业务场景生成的ID有其特征,例如有固定的前后缀,固定的位数,这些都需要配置化管理。

1.3 分布式ID常见的方案

常用系统设计中主要有下图9种ID生成的方式:

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

1.4 分布式ID鲁班的方案

我们的系统跨越了公共、生产制造、营销、供应链、财经等多个领域。在分布式ID诉求下还有如下的特点

  • 在业务场景上除了常规的Long类型ID,也需要支持“String类型”、“MixId类型”(后详述)等多种类型的ID生成,每一种类型也需要支持不同的长度的ID。

  • 在ID的构成规则上需要涵盖如操作类型、区域代理等业务属性的标识;需要集中式的配置管理。

  • 在一些特定的业务上,基于安全的考虑,还需要在尾部加上随机数来保证ID不能被轻易猜测。

综合参考了业界优秀的开源组件与常用方案均不能满足,为了统一管理这类基础技术组件的诉求,我们选择基于公司业务场景自研一套分布式ID服务:鲁班分布式ID服务

二、系统架构

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

2.1 架构说明

Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

三、 设计要点

3.1 支持多种类型的ID规则

目前鲁班分布式ID服务共提供”Long类型“、“String类型”、“MixId类型”等三种主要类型的ID,相关ID构成规则与说明如下:

3.1.2 Long类型

(1)构成规则

静态结构由以下三部分数据组成,组成部分共19位

  • 固定部分(4位)

    由FixPart+ServerPart组成。

    FixPart(4位):由大区zone 1位/代理 agent 1位/项目 project 1位/应用 app 1位,组成的4位数字编码。

    ServerPart(4位):用于定义产生全局ID的服务器标识位,服务节点部署时动态分配。

  • 动态部分DynPart(13位)

    System.currentTimeMillis()-固定配置时间的TimeMillis (可满足使用100年)。

  • 自增部分SelfIncreasePart(2位):用于在全局ID的客户端SDK内部自增部分,由客户端SDK控制,业务接入方无感知。共 2位组成。

(2)降级机制

主要自增部分在服务器获取初始值后,由客户端SDK维护,直到自增99后再次访问服务端获取下一轮新的ID以减少服务端交互频率,提升性能,服务端获取失败后抛出异常,接入业务侧需介入进行处理。

(3)样例说明


Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

3.1.2 String类型

(1)构成规则

静态结构由以下五部分数据组成,组成部分共25~27位

  • 固定部分操作位op+FixPart(9~11位)

    ① 操作位op(2~4位):2~4位由业务方传入的业务类型标识字符。

    ② FixPart(7位):业务接入时申请获取,由大区zone 1位,代理 agent 2位,项目 project 2位,应用 app 2位组成。

  • 服务器标识部分 ServerPart(1位): 用于定义产生全局ID的服务器标识位,服务节点部署时动态分配A~Z编码。

  • 动态部分DynPart(9位)

    System.currentTimeMillis()-固定配置时间的TimeMillis ,再转换为32进制字符串(可满足使用100年)。

  • 自增部分SelfIncreasePart(3位):用于在全局ID的客户端SDK内部自增部分,由客户端SDK控制,业务接入方无感知。

  • 随机部分secureRandomPart(3位):用于在全局ID的客户端SDK的随机部分,由SecureRandom随机生成3位0-9,A-Z字母数字组合的安全随机数,业务接入方无感知。

(2)降级机制

主要自增部分由客户端SDK内部维护,一般情况下只使用001–999 共999个全局ID。也就是每向服务器请求一次,都在客户端内可以自动维护999个唯一的全局ID。特殊情况下在访问服务器连接出问题的时候,可以使用带字符的自增来做服务器降级处理,使用产生00A, 00B… 0A0, 0A1,0A2….ZZZ. 共有36 * 36 * 36 – 1000 (999纯数字,000不用)= 45656个降级使用的全局ID

(3)样例说明


Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

3.1.3 MixId类型

(1)构成规则

静态结构由以下三部分数据组成,组成部分共17位

  • 固定部分FixPart(4~6位)

    ① 操作位op(2~4位):2~4位由业务方传入的业务类型标识字符

    ② FixPart(2位):业务接入时申请获取由代理 agent 2位组成。

  • 动态部分DynPart(6位): 生成ID的时间,年(2位)月(2位)日(2位)。

  • 自增部分SelfIncreasePart(7位):用于在全局ID的客户端SDK内部自增部分,由客户端SDK控制,业务接入方无感知。

(2)降级机制

无,每次ID产生均需到服务端请求获取,服务端获取失败后抛出异常,接入业务侧需介入进行处理。

(3)样例说明


Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

3.2 业务自定义ID规则实现

鲁班分布式ID服务内置“Long类型”,“String类型”,“MixId类型”等三种长度与规则固定的ID生成算法,除以上三种类型的ID生成算法外,业务侧往往有自定义ID长度与规则的场景诉求,在鲁班分布式ID服务内置ID生成算法未能满足业务场景时,为了能在该场景快速支持业务,鲁班分布式ID服务提供了业务自定义接口并通过SPI机制在服务运行时动态加载,以实现业务自定义ID生成算法场景的支持,相关能力的实现设计与接入流程如下:

    (1)ID的构成部分主要分FixPart、DynPart、SelfIncreasePart三个部分。

    (2)鲁班分布式ID服务的客户端SDK提供

    LuBanGlobalIDClient的接口与getGlobalId(…)/setFixPart(…)/setDynPart(…)/setSelfIncreasePart(…)等四个接口方法

    (3)业务侧实现LuBanGlobalIDClient接口内的4个方法,通过SPI机制在业务侧服务进行加载,并向外暴露出HTTP或DUBBO协议的接口。

    (4)用户在鲁班分布式ID服务管理后台对自定义ID生成算法的类型名称与服务地址信息进行配置,并关联需要使用的AK接入信息。

    (5)业务侧使用时调用客户端SDK提供的LuBanGlobalIDClient的接口与getGlobalId方法,并传入ID生成算法类型与IdRequest入参对象,鲁班分布式ID服务接收请求后,动态识别与路由到对应ID生产算法的实现服务,并构建对象的ID返回给客户端,完成整个ID生成与获取的过程。

    3.3 保证ID生成不重复方案

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.4 ID服务无状态无损管理

    服务部署的环境在虚拟机上,ip是固定,常规的做法是在配置表里配置ip与机器码的绑定关系(这样在服务扩缩容的时候就需要人为介入操作,存在一定的遗漏配置风险,也带来了一定的运维成本),但在容器的部署场景,因为每次部署时IP均是动态变化的,以前通过配置表里ip与机器码的映射关系的配置实现方式显然不能满足运行在容器场景的诉求,故在服务端设计了通过心跳上报实现机器码动态分配的机制,实现服务端节点ip与机器码动态分配、绑定的能力,达成部署自动化与无损发布的目的。

    相关流程如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    【注意】

    服务端节点可能因为异常,非正常地退出,对于该场景,这里就需要有一个解绑的过程,当前实现是通过公司平台团队的分布式定时任务服务,检查持续5分钟(可配置)没有上报心跳的机器码分配节点进行数据库绑定信息清理的逻辑,重置相关机器码的位置供后续注册绑定使用。

    3.5 ID使用方接入SDK设计

    SDK设计主要以”接入快捷,使用简单“的原则进行设计。

    (1)接入时:

    鲁班分布式ID服务提供了spring-starter包,应用只需再pom文件依赖该starter,在启动类里添加@EnableGlobalClient,并配置AK/SK等租户参数即可完成接入。


    同时鲁班分布式ID服务提供Dubbo & Http的调用方式,通过在启动注解配置accessTypeHTTP/DUBBO来确定,SDK自动加载相关依赖。

    (2)使用时:

    根据”Long“、”String“、”MixId“等三种id类型分别提供GlobalIdLongClient

    GlobalIdStringClientGlobalIdMixIDClient等三个客户端对象,并封装了统一的入参RequestDTO对象,业务系统使用时只需构建对应Id类型的RequestDTO对象(支持链式构建),并调用对应id类型的客户端对象getGlobalID(GlobalBaseRequestDTO 

    globalBaseRequestDTO)方法,即可完成ID的构建。

    Long类型Id获取代码示例

    
    

    3.6 关键运行性能优化场景

    3.6.1 内存使用优化

    在项目上线初时,经常发生FGC,导致服务停顿,获取ID超时,经过分析,鲁班分布式ID服务的服务端主要为内存敏感的应用,当高并发请求时,过多对象进入老年代从而触发FGC,经过排查主要是JVM内存参数上线时是使用默认的,没有经过优化配置,JVM初始化的内存较少,高并发请求时JVM频繁触发内存重分配,相关的对象也流程老年代导致最终频繁发送FGC。

    对于这个场景的优化思路主要是要相关内存对象在年轻代时就快速经过YGC回收,尽量少的对象进行老年代而引起FGC。

    基于以上的思路主要做了以下的优化:

    • 增大JVM初始化内存(-Xms,容器场景里为-XX:InitialRAMPercentage)

    • 增大年轻代内存(-Xmn)

    • 优化代码,减少代码里临时对象的复制与创建

    3.6.2 锁颗粒度优化

    客户端SDK再自增值使用完或一定时间后会向服务端请求新的id生成,这个时候需要保证该次请求在多线程并发时是只请求一次,当前设计是基于用户申请ID的接入配置,组成为key,去获取对应key的对象锁,以减少同步代码块锁的粒度,避免不同接入配置去在并发去远程获取新的id时,锁粒度过大,造成线程的阻塞,从而提升在高并发场景下的性能。

    四、 业务应用

    当前鲁班分布式ID服务日均ID生成量亿级,平均RT在0~1ms内,单节点可支持 万级QPS,已全面应用在公司IT内部营销订单、支付单据、库存单据、履约单据、资产管理编码等多个领域的业务场景。

    五、未来规划

    在可用性方面,当前鲁班分布式ID服务仍对Redis、Mysql等外部DB组件有一定的依赖(如应用接入配置信息、MixId类型自增部分ID计数器),规划在该依赖极端宕机的场景下,鲁班分布式ID服务仍能有一些降级策略,为业务提供可用的服务。

    同时基于业务场景的诉求,支持标准形式的雪花算法等ID类型。

    六、 回顾总结

    本文通过对分布式ID的3种应用场景,实现难点以及9种分布式ID的实现方式进行介绍,并对结合vivo业务场景特性下自研的鲁班分布式id服务从系统架构,ID生成规则与部分实现源码进行介绍,希望对本文的阅读者在分布式ID的方案选型或自研提供参考。

    END

    猜你喜欢

    • vivo鲁班RocketMQ平台的消息灰度方案

    • vivo 自研Jenkins资源调度系统设计与实践

    • 浅析 Jetty 中的线程优化思路

    • “事后达尔文”—— 游戏业务效果评估方法实践

    作者:vivo 互联网运维团队- Peng Jiahong

    本文介绍了vivo业务运维证书管理从手工到平台化的历程。

    一、背景

    以往,vivo 互联网业务的域名证书运维管理工作,严重依赖经验丰富的高级运维工程师个人专职管理,证书管理存在单点以及过于依赖的人的情况。

    随着业务规模的持续扩大,以及对证书管理质量标准的要求提升,加强全网证书信息准确的收敛把控。

    为此,业务运维团队决定,通过证书管理流程标准化、平台化,完成全生命周期管理证书,来消除因依赖人为管理证书问题导致业务可用性受损的痛点。

    二、能力规划

    全生命周期管理业务证书,我们建设的平台需具备以下特性和能力:

    • 高效的证书申请

      新申请以及续期场景,平台引导用户自动的生成私钥和 CSR 并提交工作申请联络单,用户完成验证后自动存储证书合并私钥。

    • 便捷的证书管理

      支持多种证书格式导入、导出功能,查看完整的证书信息。

    • 安全的私钥存储

      使用 AES256 等 高强度算法加密存储。

    • 证书逾期监控

      支持 30/60 天,可自定义逾期的证书监控告警。

    • 证书变更白屏化

      覆盖 NGINX、 SLB、CDN 以及 VUA 证书变更场景。

    三、设计思路

    3.1 技术选型

    (1)前端框架:

    用基于Vue2的Element构建基础页面

    (2)后端框架:

    以 Go 语言为基础,快速利用gin框架提供restful的api,业务数据存储在MySQL

    3.2 架构设计

    证书管理平台整体架构设计:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.3 模块设计

    证书管理平台包含四个非常重要的子模块:

    • 可视

      是整个平台最基础的模块,除基础的权限功能外,通过收敛汇总所以证书信息,实现证书总览数据分析,证书的操作的追溯以及变更审计和操作可视化。

    • 管理

      是证书信息管理的核心功能之一,实现证书信息的可视化以及信息变更、证书申请、证书续期的能力。

    • 变更

      提供 NGINX、SLB、CDN、VUA 证书的推送能力。

    • 监控

      提供证书的生命周期检测、有效期提醒、线上证书扫描的能力。

    四、技术实现

    4.1 前端

    前端是基于Vue2和Element来组建用户的操作界面,整个详细的设计图如下:

    其中

    • main.j包含整个业务系统落地所需要的各类组件和素,实现组件 的提供以及基础的权限校验;

    • api的方法通过合理的封装后端的接口,提供view中呈现给用户的界面调用方法,来实现整个证书管理的业务流程操作。

    在整个证书管理平台的迭代过程中,只需重点关注view中vcm前缀用户界面的代码实现即可。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4.2 后端

    后端使用Go语言来编写业务逻辑和API接口。其中架构可以参考3.2设计图,管理平台核心逻辑通过代码片段展示如下:

    (1)基于casbin实现的权限管理:通过角色控制权限,并按需赋予用户角色默认访问权限(如下图创建角色时AddMenuAuthority、UpdateCasbin方法)。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    (2)证书相关数据加密处理:获取前端用户选择的相关算法进行加密。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    (3)基于证书管理标准化流程的业务代码实现,覆盖证书的信息管理&变更推送&监控告警&平台的角色权限控制。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    五、平台预览

    经过多个开发迭代,平台相关的核心功能如下:

    5.1 证书信息概览

    概览首页收敛证书管理的功能入口,以及收纳管理证书的全貌,方便管理员了解所管理的证书状态和最近的申请进度。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5.2 证书信息管理

    汇总了目前内销所有证书信息,后续平台上申请的证书信息管理也会收敛于此,并提供证书私钥相关的查看和下载。 

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5.3 证书申请/续期

    通过平台场景化证书申请续期的操作,解决过往碎片化操作以及无经验人员需通过文档阅读或者人员指导完成证书申请问题。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5.4 证书变更管理

    平台覆盖云上、NGINX 集群、CDN 以及 VUA 的证书白屏化、可追溯操作历史更新能力。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5.5 证书监控

    收敛在平台上管理的证书都会有逾期监控提醒,来提醒运维人员及时完成对应的证书更新管理,确保业务不受影响。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    六、总结

    证书管理平台的实践落地,通过流程标准化以及管理平台的建立,规范证书的信息、变更、告警、变更审计相关管理,上线后至今,也无证书管理相关的问题导致的可用性告警,解决了传统域名证书管理场景下人效、可用性隐患的痛点,是业务运维 SRE 可用性保障&运维提效的一个成功案例。

    七、展望

    目前我们获取的证书,依旧依赖于传统的域名证书分发模式(站点管理员需要花费金钱购买数字证书,并且证书的签发和更新需要时间和人力成本)。随着区块链和Web 3.0技术的发展,新增了去中心化身份验证和身份管理技术,在证书的分发上具备以下优势

    1. 不可篡改性

      区块链技术保证证书的安全性和不可篡改性。因为每一个区块链节点都会对交易进行验证和记录,从而保证数据的一致性和完整性,防止伪造和篡改。

    2. 透明性

      区块链技术使得所有参与者都可以获得统一的信息,从而保证证书的透明性,避免信息不对称或不公平的情况发生,同时也可以有效地降低信息传递成本。

    3. 保密性

      区块链技术可以采用加密算法,保证证书的保密性和隐私性。同时,也可以根据需求设定只允许特定的参与者访问相关信息。

    4. 高效性

      传统的证书分发需要进行大量的人力和物力投入,而基于区块链的证书分发可以实现自动化,从而提高证书分发的效率。

    5. 可追溯性

      基于区块链的证书分发可以实现对证书的溯源和追踪,从而可以更好地防止证书的丢失或滥用。

    综上所述,基于区块链的证书分发可以有效降低证书分发的成本和提高证书的安全性。

    未来,基于相关技术的成熟程度,也会合理的应用和替换过往的证书申请分发模式,迭代证书管理平台相关的功能,来配合提高证书的管理效率和安全性。

    END

    猜你喜欢

    • 浅析 Jetty 中的线程优化思路

    • “事后达尔文”—— 游戏业务效果评估方法实践

    • vivo 帐号服务稳定性建设之路-平台产品系列06

    • vivo 游戏黑产反作弊实践

    摘要:大模型是新一轮AI发展的核心,其已在推进产业智能化升级中已表现出巨大潜力,并将在未来三年里形成风起云涌之势。

    本文分享自华为云社区《探秘华为云盘古大模型:AI for industries的身体力行》,作者:华为云头条。

    大模型是新一轮AI发展的核心,其已在推进产业智能化升级中已表现出巨大潜力,并将在未来三年里形成风起云涌之势。

    华为云于2021年正式发布了盘古基础大模型,包括CV计算机视觉大模型、NLP自然语言处理大模型和科学计算大模型。在基础大模型之上,华为云践行AI for industries,陆续推出了矿山、药物分子、电力、气象、海浪等盘古行业大模型,加速各行各业数字化的进程。

    货运列车智慧检测,盘古轨道大模型为铁路物流安全护航

    随着海内外经济复苏,货运铁路的班次及载重均迎来新高潮。

    在传统的货运铁路巡检中,TFDS(货车运行故障动态图像检测)系统作为5T检测技术的重要组成部分,通过高速拍摄的“电子眼”,动态采集列车车底配件、车体侧部等部位图像,实时判别货运列车是否存在故障。

    一列50辆车厢的货车,“电子眼”会拍摄4000张照片,检测员每秒需审阅1张图。动态检车员不仅工作强度大、难度高,而且需对车辆专业理论与实际运用有较高水平,要在短时间内完成整列车的故障分析,确保整列车的运行安全。

    华为云在现有设备和平台架构的基础上,基于盘古轨道行业大模型,推出TFDS故障智能识别方案,实现从图像采集、数据收发、列车拆分,到实时故障判别的全局分析,能够对多工位、多辆车关联等全局故障进行精准预报。

    盘古铁路行业大模型具备五项核心竞争力:

    • 自监督行业预训练模型

    盘古预训练大模型基于语义相似样本、等级化语义聚集的对比表示学习方法,利用百万级无标注铁路行业图像生成轨道行业大模型;

    • 图像质量自动增强&评估

    通过底层视觉特征以及高层视觉特征对增强后的图像进行自动评估,对正常图像做进一步故障识别,非正常图像返回人工审核;

    • 依托车型先验模板匹配

    根据已知的车型信息建立零部件的相对位置模板,具有可解释性地预报部件异常情况,如脱落、丢失、错位等;

    • 小样本故障定位、识别

    基于轨道行业预训练大模型,结合当前最优的目标检测、图像识别框架,进行部件定位、故障识别,具有更强的泛化能力,仅需传统1/3的样本即可完成。

    在实际应用中,盘古轨道大模型单张照片识别仅需4毫秒,可智能过滤95%的正常图片,实现了400多种故障的自动化识别以及严重故障的“零漏报”,比人工识别更准确,大幅度提升TFDS系统作业效率,动态检车员可腾出更多精力处理难度更高的辨图工作,确保列车安全运行。

    ▶AI辅助药物设计,盘古药物分子大模型加速新药研发

    自1987年达托霉素被发现以来,人类已经有近40年没有新的抗生素被研发出来。药物研发专家需要花费超过10年时间、超过10亿美成本,才有可能研发出一款新药。

    为了帮助药物研发专家从海量药物分子中高效挑选出适合成药的小分子,华为云联合中国科学院上海药物研究所推出了盘古药物分子大模型,基于全流程AI辅助药物设计的能力,以靶点预测、分子设计、活性评估、毒性筛选等环节为抓手,帮助医药公司实现快速、精准、低成本的药物发现,开启药物研发的新模式。

    • 在药物虚拟筛选方面

    依靠华为云创新的iFitDock算法以及虚拟筛选服务,盘古药物分子大模型的成药性预测准确率比传统方式高20%,进而让药物筛选效率提升十倍;

    • 在药物优化方面

    基于华为云盘古药物分子大模型的结构优化器,研发专家可对先导药进行定向优化,通过更科学的药物结构设计,减弱对人体正常细胞可能产生的毒副作用。

    盘古药物分子大模型四大核心技术特点:

    • “图-序列不对称条件变分自编码器”

    全新提出“图-序列不对称条件变分自编码器”深度学习架构,更好地提取化合物关键的分子特征指纹,提升下游任务的准确性;

    • 超大规模的化合物表征模型训练

    对17亿个小分子的化学结构进行预训练,结构重构率、唯一性等方面优于现有方法;

    • 生成1亿个创新的类药物小分子库

    其结构新颖性为99.68%,为发现新药创造可能性;

    • 实现了领先的药物发现任务性能

    在化合物-靶标相互作用预测、化合物ADME/T属性评分、化合物分子生成与优化等方面实现性能最优,赋能药物发现全链条任务。

    西安交通大学第一附属医院刘冰教授在盘古药物分子大模型的辅助下,突破性地研发出一款超级抗菌药Drug X,其有望成为全球近40年来首个新靶点、新类别的抗生素。华为云盘古药物分子大模型让先导药的研发周期从数年缩短至几个月,研发成本降低70%。AI技术与基础科学的结合与创新,不仅解决了研发成本高和时间周期长的痛点,更为初创型科研团队提供了施展能力的舞台。

    ▶让风云可测,盘古气象大模型精准呈现台风轨迹

    在气象气候预报任务中,除了短期天气预报,全球中长期预报也是业界最为关注、重要性非常高的预测任务,它以预测未来14天内的大气系统状态为目标,在气象、航海、农业、旅游等多个行业发挥着举足轻重的作用。

    当前人工智能技术虽已广泛应用在气象预测领域,受大气系统中物理过程的复杂性影响,以及求解大气模型所需资源规模巨大,基于传统数值方法进行的中长期天气预报通常会累计误差,导致准确度低,且需在超级计算机上运算数小时。

    基于近40年的全球气象数据,华为云盘古气象大模型在中长期确定性预报上超越当前最强的数值预报方法(欧洲气象中心的IFS系统),是业内首个精度超过传统数值预报方法的全球AI气象预测模型。平均预报误差降低了10%-15%,速度提升10000倍以上,实现秒级全球气象预报。

    盘古气象大模型核心技术特点:

    • 3D高分辨率的神经网络

    首次采用3D高分辨率的神经网络(3D Earth-Specific Transformer):与二维的神经网络和低分辨率的神经网络相比,盘古气象大模型水平空间分辨率达到0.25∘×0.25∘,约28公里x28公里,可以精准地预测细粒度气象特征。在时间维度上,盘古气象大模型将预测频率从6小时/次提升至1小时/次,使气象预测结果更准确;

    • 层次化时域聚合策略

    使用层次化时域聚合策略:训练了4个不同预报间隔的模型(分别为1小时间隔、3小时间隔、6小时间隔、24小时间隔),使得预测特定时间气象状况的迭代次数最小,从而减少迭代误差,也避免了由递归训练带来的训练资源消耗。

    华为云盘古气象大模型在极端天气过程(如台风)的预报中已展现出精准、快速的优势:

    • 2022年8月,盘古气象大模型实现秒级预测台风“马鞍”的轨迹和登陆时间,准确率达90%,远超行业平均水平。
    • 今年5月22日至23日,今年第2号台风“玛娃”在24小时内,中心附近最大风力从38米/秒(台风级)迅速加强到60米/秒(超强台风级)。

    中央气象局指出,华为云盘古大模型在“玛娃”的路径预报中表现优异,提前五天预报出其将在台湾岛东部海域转向路径。

    人工智能触发的产业变革正在改变每一个行业,人工智能也在越来越多的行业场景发挥重要价值。华为云以“AI for industries”为发力点,提升大模型通用能力,贴近客户业务场景的现实需求,让人工智能开发标准化、可复制、批量化生产,加速AI深入千行百业,推动人类社会进入智能世界。华为开发者大会2023 ( Cloud )大会将于7月7日在东莞拉开帷幕,华为云盘古大模型将迎来重大升级,敬请期待!

    号外

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    7月7日,华为开发者大会2023 ( Cloud )将拉开帷幕,并将在国内30多个城市、海外10多个国家开设分会场,诚邀您参加这场不容错过的年度开发者盛会,让我们一起开启探索之旅!

    我们将携手开发者、客户、合作伙伴,为您呈现华为云系列产品服务与丰富的创新实践,并与您探讨AI、大数据、数据库、PaaS、aPaaS、媒体服务、云原生、安全、物联网、区块链、开源等技术话题,展开全面深入的交流。

    大会将汇聚全球科学家、行业领袖、技术专家、社区大咖,开设200多场开发者专题活动,为全球开发者提供面对面交流与合作的机会,共同探讨技术创新和业务发展。

    大会官网:https://developer.huaweicloud.com/HDC.Cloud2023.html

    参会购票:https://www.vmall.com/product/10086352254099.html?cid= 211761

    参与开发者社区活动,观赏技术大咖秀、玩转技术梦工厂,有机会赢取4000开发者礼包!

    欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。

     

    关注,第一时间了解华为云新鲜技术~

    摘要:本期结合示例,详细介绍华为云数字工厂平台的数据分析模型和数据图表视图模型的配置用法。

    本文分享自华为云社区《数字工厂深入浅出系列(六):数据分析与图表视图模型的配置用法》,作者:云起MAE 。

    华为云数字工厂平台基于“数据与业务一体化”理念,提供统一的制造全域数据平台底座,内置轻量级制造数据分析引擎与可视化工具,支持IT/OT全域多模态数据的动态建模、采集、存储、分析和可视化应用,提供图形化的数据分析模型配置器,自动读取数字工厂平台的9类业务信息模型及其数据关联关系,能够让不懂技术的业务人员也可以自助式完成数据分析建模。数据分析模型,可搭配平台提供的视图模型配置器,快速搭建数据图表与看板,实现数据分析结果的可视化呈现。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    华为云数字工厂平台的数据分析模型目前支持两类:

    • 数据集:用于关联聚合多个业务模型的数据,支持多层关联、数据计算和多维度聚合统计;也支持手工创建外部数据集,来存储从外部系统采集的数据,以及进一步实现数据可视化或者与数字工厂平台的业务模型数据进行关联分析;
    • 统计指标:用于实时统计或者周期性统计业务数据,业务数据可来自原始业务模型的实例数据字段值,也可来自分析模型的某个数据集字段;支持复合指标建模,即引用已有的统计指标进行组合计算。

    本期结合示例,详细介绍华为云数字工厂平台的数据分析模型和数据图表视图模型的配置用法。

    (一)示例场景说明

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    本期通过配置实现以下3个数据分析建模示例,来详细介绍分析模型的使用方法:

    (1)“订单执行明细”数据集:以销售订单行为主线,串联后续生产工单、完工入库、销售发货等业务环节数据,透视订单的执行进度明细。通过该分析模型示例,介绍分析数据集模型的“关联分析”节点组件的用法;

    (2)“订单执行汇总”数据集:基于订单行数据串联生产工单、完工入库和销售发货数据,然后以销售订单和订购产品为维度,汇总统计工单排产数量、完工入库数量、销售发货数量,并计算未发货数量。通过该分析模型示例,介绍分析数据集模型的“聚合分析”和“计算分析”节点组件的用法;

    (3)“订单统计分析”指标集:基于订单和生产工单数据,实时统计当月销售额,按周统计每周销售数量、生产数量、产销率。通过该分析模型示例,介绍“实时统计”、“周期性统计”和“复合性”指标模型的配置用法。

    (二)详细步骤说明

    1.“订单执行明细”数据集建模

    使用华为云数字工厂企业平台的“建模工作台>分析模型”系统功能,可创建与配置数据分析模型。

    首先新建分析主题“订单分析”,方便分组管理与使用检索:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    然后在“订单分析”主题下,创建数据集“订单执行明细”:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    接下来需要编排数据集的取数逻辑模型:

    • 配置主业务模型

    “主业务模型”是数据集的数据逻辑起点,用于指定数据集的数据主线维度,即指定以哪个模型的数据为基准来关联分析相关数据,比如我们需要以订单行数据为基准,来串联透视后续业务环节数据,则数据集的“主业务模型”选择“订单”事务模型的子模型“订单行”:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    选择主业务模型后,进一步勾选配置所需的数据字段范围以及数据过滤规则。

    • 增加关联分析节点

    在当前主业务模型节点后面可添加“关联分析”节点,用来串联获取与当前模型存在“关联或者被关联关系”的相关模型数据。“关联分析”节点可配置多个关联模型,实现同时串联到多个相关数据。

    当前示例中,主业务模型“订单行”需要:

    a.关联“订单”模型获取“订单金额”、“客户”、“交货日期”等字段信息;

    b.关联“产品”模型获取“规格”、“库存量”等字段信息;

    c.关联“生产工单”模型获取“生产工单号”、“计划产量”、“实际产量”等字段信息;

    d.关联“销售发货明细”模型获取“发货数量”等字段信息。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    其中配置关联模型时,默认使用“左外连接”的关联类型,即在返回的数据集结果中关联模型数据无论是否存在不影响主业务模型数据,可按需切换为“全连接”,即在返回的数据集结果中如果主业务模型数据的关联模型数据不存在,则相应的主业务模型数据会一并丢弃。

    • 增加二级关联节点

    在某个关联节点之后,可再添加关联节点,实现数据多级关联与追溯。

    当前示例中,主业务模型“订单行”关联“生产工单”模型数据后,需要进一步:

    a.通过“生产工单”关联追溯“完工入库”模型获取“入库数量”、“入库日期”等字段信息;

    b.通过“销售发货明细”关联追溯“销售发货”模型获取“发货日期”等字段信息。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    数据集配置完成后,右上角的“发布”按钮,自动生成相应的数据分析模型:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    其中分析信息模型的“列表视图显示”和“列表过滤字段”两列支持编辑,用来设置分析模型在被报表视图组件使用时,相应字段是否作为报表显示列字段和查询字段。

    2.“订单执行汇总”数据集建模

    在“订单分析”主题下,创建数据集“订单执行汇总”,然后编排数据集的逻辑模型:

    • 准备明细数据

    编排逻辑模型,准备订单执行汇总数据集所需的明细数据,即通过订单行串联生产工单、完工入库和销售发货数据:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)
    • 聚合汇总数据

    通过添加“聚合分析”节点,实现以销售订单和产品为维度,汇总统计工单排产数量、完工入库数量和销售发货数量,配置示例如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)
    • 补充计算字段

    通过添加“计算分析”节点,实现计算未发货数量=订购数量-已发货数量,配置示例如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    “订单执行汇总”数据集的逻辑模型配置结果如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    数据集配置完成后,右上角的“发布”按钮,自动生成相应的数据分析模型。

    3.“订单统计分析”指标集建模

    在“订单分析”主题下,切换到“统计指标”页签,然后创建指标集“订单统计分析指标”:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    “统计指标集”需要指定统计的来源明细数据模型,可选择原始业务模型,也可选择已发布的分析“数据集”模型,示例这里选择前面步骤创建的分析数据集模型“订单执行明细”。

    接下来,在统计指标集下新建与配置所需的指标项:

    • 实时性统计指标:“当月销售额”

    对于“当天”、“当月”等实时性统计指标,在新建指标项时需要取消勾选“启用统计周期”,然后选择“统计类型”和“统计值字段”(即统计对象字段),最后配置“统计过滤规则”的条件:条件字段选择统计依据的日期字段,条件值类型选择“相对日期”,最后选择相应的日期区间,比如当天、昨天、最近1周(当周)、最近1个月(当月)等。

    当前示例“当月销售额”的配置结果如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)
    • 周期性统计指标:“每周销售数量”、“每周生产数量”

    对于“每天”、“每周”、“每月”等周期性统计指标,在新建指标项时默认勾选“启用统计周期”,然后选择“统计类型”、“统计值字段”(即统计对象字段)、“统计时间字段”(即统计周期依据的日期字段)、“统计周期”(每小时/每天/每周/每月/每季度/每年)和“统计起始时间”(即统计指标第一个统计周期的起始时间,通常与“统计周期”有关,比如统计周期是“每周”,则统计起始时间通常选第一个统计周的周一的某个工作起始时间)。

    当前示例“每周销售数量”的配置结果如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    “每周生产数量”统计指标的配置方法同上,不再赘述。

    • 复合性统计指标:“每周产销率”

    在新建指标项时,“统计类型”选择“复合”,即可创建复合性统计指标。复合指标用于引用已发布的统计指标项作为原子指标进行组合计算,计算公式支持四则运算符。

    复合性统计指标也分为两类:

    a.周期性的复合指标:需要勾选“启用统计周期”,然后进一步选择“统计时间字段”(即统计周期依据的日期字段)、“统计周期”(每小时/每天/每周/每月/每季度/每年)和“统计起始时间”(即统计指标第一个统计周期的起始时间,通常与“统计周期”有关,比如统计周期是“每周”,则统计起始时间通常选第一个统计周的周一的某个工作起始时间);

    b.实时性的复合指标:取消勾选“启用统计周期”即可。

    对于比率性的复合指标,支持配置其数据显示样式:百分比或者常规数值。当前示例“每周产销率”的配置结果如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    “订单统计分析”指标集的最终配置结果如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    统计指标集配置完成后,右上角的“发布”按钮,自动生效相应的数据分析模型。

    (三)配置数据图表视图,验证数据分析结果

    1.创建视图模型

    使用华为云数字工厂企业平台的“建模工作台>视图模型”系统功能,可创建与配置数据视图模型。

    首先新建场景分组和业务场景“销售>订单分析”,在可视工作台会根据场景分组和业务场景来动态构建相应的数据应用卡片:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    选中业务场景“销售>订单分析”,然后在“数据看板”页签下,新建视图模型“订单执行分析”:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    其中“终端范围”用来设置视图模型在哪些终端展示,可选项为全部/PC端/移动端,默认选择“全部”。

    2.配置数据报表:展示订单执行明细与汇总数据集

    从左侧“组件库”拖动“报表”组件到中间看板画布区,然后在右侧“属性栏”配置报表组件属性,其中:

    “标题”:用来设置报表卡片的前端展示标题;

    “数据模型”:用来选择报表的数据来源模型,当前示例选择前面步骤创建的数据集“订单执行汇总”或者“订单执行明细”。选定数据模型后,在右侧可进一步配置在数据报表中需要展示的字段列及其顺序;

    “过滤条件”:用来设置所展示数据的过滤条件。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    报表配置完成后,可右上角的“预览”按钮,查看与验证运行效果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.配置指标卡:展示订单统计分析指标集

    从左侧“组件库”拖动“指标”组件到中间看板画布区,然后在右侧“属性栏”配置报表组件属性,其中:

    “标题”:用来设置指标卡片的前端展示标题;

    “数据指标”:用来选择指标卡片的数据来源指标,当前示例选择前面步骤创建的数据集“订单统计分析指标”下的相应指标项;

    “显示统计环比”:针对“数据指标”选择了周期性统计指标项的情况,用来设置指标卡片上是否显示统计指标当期值与上期值的环比。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    拖动指标卡片的边框可以调整其前端显示的宽度和高度,或者手工填写属性栏中的“宽度”、“高度”配置项来调整。

    4.配置数据图表:每周产销率趋势图

    从左侧“组件库”拖动“折线图”组件到中间看板画布区,然后在右侧“属性栏”配置报表组件属性,其中:

    “标题”:用来设置折线图卡片的前端展示标题;

    “数据模型”:用来选择折线图的数据来源模型,当前示例选择前面步骤创建的统计指标集“订单统计分析”;

    “过滤条件”:用来设置所展示数据的过滤条件;

    “维度”:用来选择折线图的X轴维度坐标值字段;

    “指标字段”:用来选择折线图的Y轴指标坐标值字段;

    “显示样式”:支持三种显示样式风格:普通折线、平滑线和梯形阴影折线。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    拖动折线图卡片的边框可以调整其前端显示的宽度和高度,或者手工填写属性栏中的“宽度”、“高度”配置项来调整。

    5.在可视工作台,使用数据图表看板

    数据图表视图模型发布后,业务用户在 “可视工作台”的相应业务场景卡片下,可使用数据视图看板:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    查看并验证前面配置的数据视图的使用效果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    数据视图模型也支持IoT设备时序数据可视化分析,提供时序趋势图和时间状态图两种组件:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    华为云数字工厂平台,内置轻量级制造数据分析引擎与数据可视化工具,能够对制造过程的全域数据进行统一管理和分析,支持业务人员自助式开发数据可视化图表,满足中小型企业制造业务运营分析与洞察需求,实现基于数据持续驱动业务流程优化。

    号外

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    7月7日,华为开发者大会2023 ( Cloud )将拉开帷幕,并将在国内30多个城市、海外10多个国家开设分会场,诚邀您参加这场不容错过的年度开发者盛会,让我们一起开启探索之旅!

    我们将携手开发者、客户、合作伙伴,为您呈现华为云系列产品服务与丰富的创新实践,并与您探讨AI、大数据、数据库、PaaS、aPaaS、媒体服务、云原生、安全、物联网、区块链、开源等技术话题,展开全面深入的交流。

    大会将汇聚全球科学家、行业领袖、技术专家、社区大咖,开设200多场开发者专题活动,为全球开发者提供面对面交流与合作的机会,共同探讨技术创新和业务发展。

    大会官网:https://developer.huaweicloud.com/HDC.Cloud2023.html

    参会购票:https://www.vmall.com/product/10086352254099.html?cid= 211761

    参与开发者社区活动,观赏技术大咖秀、玩转技术梦工厂,有机会赢取4000开发者礼包!

    欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。

     

    关注,第一时间了解华为云新鲜技术~

    摘要:业务应用对数据库的数据请求分写请求(增删改)和读请求(查)。当存在大量读请求时,为避免读请求阻塞写请求,数据库会提供只读实例方案。通过主实例+N只读实例的方式,实现读写分离,满足大量的数据库读取需求,增加应用的吞吐量。

    业务应用对数据库的数据请求分写请求(增删改)和读请求(查)。当存在大量读请求时,为避免读请求阻塞写请求,数据库会提供只读实例方案。通过主实例+N只读实例的方式,实现读写分离,满足大量的数据库读取需求,增加应用的吞吐量。

    对于只读实例,如果采用单机无备节点作备份的方案,当实例出现故障或有重建需求的时候,会出现较长时间的不可用,通常需要客户做业务连接上的调整或是创建新只读实例等繁琐操作。单机只读架构如下所示,一旦单机只读发生故障,则业务中断,直至故障修复实例复位。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    RDS for MySQL只读节点稳定性解决方案

    为了保证业务的连续性及稳定性,RDS for MySQL在原来单机只读的基础上,推出了“高可用只读”。高可用只读在故障的容错能力、异常的应对能力方面具有比较大的优势。相比较单机只读动辄小时级的中断,高可用只读在故障倒换时,仅有秒级中断。

    高可用只读架构图如下,异常发生时(比如数据库异常,虚拟机异常等),HA组件可将主只读节点的VIP(虚拟IP)自动切换到备只读节点上,从而快速恢复业务。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    除高可用只读方案外,多只读实例Proxy轮询的方案也有相同效果。即购买多个只读实例,并开启数据库代理(proxy)的方案,在发生异常情况时,数据库代理自动把流量切换到其他正常只读实例,从而避免出现业务中断发生。Proxy方案架构图如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    单机只读、高可用只读、多只读+ proxy,在应用并发连接数、异常反应、成本方面的对比如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    以上的多方案给用户提供了灵活的可选择性,用户可以基于业务量、成本、业务运行效率等方面综合评估选择适合自己的方案。这篇文章中将重点介绍下高可用只读,未来我们还会基于proxy做一期介绍,敬请期待。

    高可用只读使用办法

    高可用只读在页面上的展示

    如图所示,replica-86e2为单机只读实例,replica-bb17及replica-b947为高可用只读实例。需要注意的是,高可用只读实例是一组(主、备)实例,其底层会自动实现故障机制响应。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)
    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    如何购买高可用只读

    直接购买高可用只读

    1.登录管理控制台。

    2. 单击管理控制台左上角的符号,选择区域和项目。

    3. 单击页面左上角的符号,选择“数据库 > 云数据库 RDS”。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4. 在“实例管理”页面,选择指定的实例,单击操作列的“更多 > 创建只读”,进入“创建只读”页面。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    也可在实例的“基本信息”页面,单击实例拓扑图中,主实例下方的添加按钮,创建只读实例。

    5. 在“创建只读”页面,只读模式选择“只读(高可用)”,填选实例相关信息后,单击“立即创建”。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    6. 在“规格确认”页面,进行信息确认。如果需要重新选择,单击“上一步”,回到服务选型页面修改基本信息。对于按需计费的实例,信息确认无误后,单击“提交”,下发新增只读实例请求。对于包年/包月的实例,订单确认无误后,单击“去支付”,进入“付款”页面。

    7. 高可用只读实例创建成功后,可以对其进行查看和管理。

    只读实例转换为高可用只读

    除了上述新建只读实例时选择高可用只读模式,RDS for MySQL也支持已有的单机只读升级为高可用只读,操作简单,无需进行老实例回收等操作。

    说明:

    非高可用只读可以转换为高可用只读实例,但高可用只读不允许转换为非高可用只读实例。

    1. 登录管理控制台。

    2. 单击控制台左上角的符号,选择区域和项目。

    3. 单击页面左上角的符号,选择“数据库 > 云数据库 RDS”,进入RDS信息页面。

    4. 在实例列表中,单击实例名称前的符号,单击非高可用只读实例的名称,进入实例的基本信息页面,即进入只读实例的管理页面。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5. 在转高可用页面,确认信息无误后,单击“立即申请”,即可将普通只读实例转换为高可用只读实例。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    高可用只读使用注意事项

    • 高可用只读支持的磁盘类型有:SSD云盘、本地盘以及极速型SSD;支持的规格类型有:通用型、独享型、鲲鹏通用增强型、x86通用型以及x86独享型。
    • 不建议修改高可用只读实例的参数,否则会影响高可用只读的可靠性。
    • 高可用只读不允许进行如下操作:修改端口、转换到非高可用只读实例。
    • 创建高可用只读或是变更到高可用只读时,需要保证实例所在子网的IP充足。

     

    关注,第一时间了解华为云新鲜技术~

    在一个工程里,同时使用 Mongodb 和 MySQL, 可以吗?  不但可以,还可以使用一套 Dao 的代码。

    Java ORM Bee 不但支持 JDBC 类型的数据库,还支持 Mongodb, 也支持Android,鸿蒙.

    最新功能介绍:

    V2.1.6 (2023・父亲节版)

    1.添加开关closeDefaultParaResultRegistry,控制是否需要默认加载参数类型转换器和查询结果类型转换器
    2.支持JAP新的API包jakarta.persistence.*
    3.批量插入支持配置是否由框架捕获主键等异常catchModifyDuplicateException,默认不捕获
    4.关闭UtilDotDateTypeConvert因少了 HH🇲🇲ss
    5.fixed bug 更新配置的默认值
    fixed bug NullPointerException for PreparedSql preparedValue
    fixed bug for StringUtils

     

    一行代码,即可完成某个表的分片配置:

     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    上期发布:

    支持 jdbc, android 和 NoSQL 数据库的 ORM Bee 2.1 LTS 版发布 (上传 Maven)

     

    开发微服务更方便:

    实例: https://my.oschina.net/u//blog/

    Spring Cloud 微服务使用数据库更方便:Bee + Spring Boot; 轻松支持多数据源,Sharding, Mongodb.

    更快的开发 Spring Cloud 微服务的新组合,Bee 整合 Spring Boot, 让你瞬间拥有两样快速开发利器!

    Bee,互联网新时代的 Java ORM 工具,更快、更简单、更自动,开发速度快,运行快,更智能

    Spring Boot 是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,
    从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot 可以帮助我们进行快速应用开发

     

    Mongodb ORM (Bee) 详细功能列表

    更多实例,请参考 Bee-exam 实例工程:

    https://gitee.com/automvc/bee-exam

    ———————————————————————

    Bee,互联网新时代的 Java ORM 框架,支持 Sharding;JDBC,Android,HarmonyOS;支持多种关系型数据库,还支持 NoSQL 的 Cassandra,Mongodb 等;更快、更简单、更自动,开发速度快,运行快,更智能!

    支持多种关系型数据库:MySQL,MariaDB,Oracle,H2,SQLite,PostgreSQL,SQL Server,Access 等。

     

    下期功能预告:

    你还想添加什么功能,请到评论区告诉我们

    项目首页:

    https://gitee.com/automvc/bee

    https://github.com/automvc/bee

    https://gitee.com/automvc/bee-springboot

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    GIMP 团队最近结束了为期一周的线下“GIMP 贡献者会议”,会议地点由 Blender 基金会总部提供。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    ▲ GIMP 核心开发者

    虽然 GIMP 3.0 的发布计划仍存在很多变数,但开发团队透露应该会在今年发布 GIMP 3.0 首个 RC——进入候选版本阶段。

    目前他们正在开发 GIMP 2.99.16 版本,如果一切顺利,这个版本发布后就是 GIMP 3.0 的第一个 RC。

    GIMP 3.0 最显著的变化之一是从 GTK2 过渡到 GTK3 工具包,团队在年初宣布 GIMP 的 GTK3 移植已正式完成

    GIMP 即 GNU Image Manipulation Program(GNU 图像处理程序)的首字母组成,是一个自由开源的位图图像编辑器,用于图像照片润饰及编辑、自由绘图、调整大小、裁剪、照片蒙太奇、装换图像格式以及其他专业任务。

    GIMP 几乎拥有所有图象处理所需的功能,号称 Linux 下的 Photoshop。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    延伸阅读

    • GIMP 3.0 计划今年推出

    Vitess 是一个用于部署、扩展和管理大型 MySQL 实例集群的数据库解决方案。Vitess 集 MySQL 数据库的很多重要特性和 NoSQL 数据库的可扩展性于一体。它的架构设计使得用户可以像在物理机上一样在公有云或私有云架构中有效运行。它结合并扩展了许多重要的 MySQL 功能,同时兼具 NoSQL 数据库的可扩展性。

    Vitess 17 近日正式发布,在这个版本中,Vitess 引入了一些重要的改进措施,以提高系统的兼容性、性能和可用性。

    GA 公告

    在 v15 版本中引入的 VTTablet 设置连接池功能,在这个版本中现在默认启用。该功能简化了系统设置的管理和配置,为用户提供了更加精简和便的体验。

    新的基于 Tablet Throttler 的 Topology Service 现在已 GA 并默认启用。

    MySQL 兼容性改进

    Vitess 现在支持额外的语句,例如 、 和 以及许多附加函数,包括比较运算符、数字函数、日期和时间函数、 函数等。

    查询计划器经历了一些改进,带来了更有效的查询计划,特别是复杂的操作,如聚合、分组和排序,从而提高查询性能。执行查询时使用的评估引擎也得到了显著的改进,带来了超过 2 倍的性能改进。新版本还添加了一个基于新虚拟机的引擎,它将最终取代基于 AST 的引擎,并提供更大的性能改进(在 v17 中默认没有启用)。

    在这个版本中,模式跟踪也得到了加强,使 Vitess 查询计划器能够快速检测到数据库模式的任何变化。这确保了查询能够保持最新的模式修改,提高了整体数据的一致性。

    复制增强功能

    Vitess 现在支持在与 Vitess 分片相对应的每个复制集中更有效的 MySQL 复制。

    新版本已经为 类型增加了支持。如果你使用 TEXT、BLOB 或 JSON 列,这可以大大减少你的二进制日志的整体大小,减少磁盘 I/O 和存储以及网络 I/O 和相关 CPU 的开销。

    新版本还为 MySQL 8.0 中新增加的二进制日志事务压缩增加了支持。用于压缩每个 的内容,然后将压缩的事件存储到二进制日志中。这也大大减少了磁盘 I/O 和存储以及网络 I/O,不过代价是读写日志时会有一些额外的 CPU 开销。

    其他

    • 流量限制改进
    • VTorc 改进
    • VTAdmin 改进

    更多详情可查看:https://github.com/vitessio/vitess/releases/tag/v17.0.0

    实时移动和 web 分析报告平台 Countly 23.06.1 发布了。

     

    Countly 是一个创新、实时、开源的移动和 web 分析,推送通知和崩溃报告平台,为超过 2500 个网站和 12000 个移动应用提供支持。 它从手机、平板电脑、Apple Watch 和其他互联网连接的设备收集数据,并可视化此信息以分析应用使用情况和终端用户行为。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    新版更新内容主要有:

    修复:

    • [核心] 在会话分析中添加了缺失的 %
    • [核心] 添加了报表迁移到书签的脚本
    • [核心] 修复了安装时的 mongodb 配置
    • [仪表板] 空仪表板的本地化和样式修复
    • [依赖] xml2js 修复
    • [成员] 编辑成员时设置权限

    企业修复:

    • [cohorts] 修复了仪表板小部件与上一时期相比显示无效百分比的问题。
    • [核心] 修复CE标签版本更新
    • [drill] 修复“细分过滤器未显示群组”的问题
    • [drill] 在书签中存储可视化类型
    • [drill] byVal 查询的默认图表类型为“bar”
    • [flows] 数据请求的权限检查。
    • [push] 通过推送令牌和消息查询用户个人资料
    • [users] 修复空白值格式

    更新公告:https://github.com/Countly/countly-server/releases/tag/23.06.1

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Karafka v2.1.6 现已发布。Krafka 是一个用于简化基于 Apache Kafka 的 Ruby 应用开发的框架,它允许开发者在使用异步 Kafka 消息时使用类似于标准 HTTP 约定(params 和 params_batch)的方法。Karafka 不仅可以处理传入的消息,而且还提供了用于构建接收和发送消息的复杂数据流应用程序的工具。

    此版本更新内容如下:

    • [改进] 为迭代器提供时间支持
    • [改进] 为admin 提供时间支持
    • [改进] 为consumer 提供时间支持。
    • [改进] 删除客户端操作不再需要的锁。
    • [改进]尝试迭代不存在的主题时引发。
    • [改进] 确保 Kafka 多命令操作在 mutex 下一起运行。
    • [更改] 要求 
    • [更改] 要求 
    • [重构] 清理迭代器代码。
    • [修复] 提高 Rails 应用程序开发环境中的性能 (juike)
    • [修复] 重命名为以与其他 errors 的命名保持一致。
    • [修复] 修复不稳定的规范。
    • [修复] 修复运行 LRJ 时自动会覆盖用户手动搜索的情况。
    • [修复] 确保用户直接的和操作优先于系统操作。
    • [修复] 确保和在一个底层连接不会出现 race-condition。

    更新说明:https://github.com/karafka/karafka/releases/tag/v2.1.6

    漏洞描述

    Parse Server 是一个用于构建移动应用程序和Web应用程序开源框架,使用了 MongoDB 进行数据存储,通过 MongoDB BSON 解析器来解析和处理 BSON 数据。

    受影响版本中,由于 DatabaseController#update 方法未对用户可控的参数进行过滤,攻击者可将恶意代码注入到 BSON 数据的 _bsontype 属性中(如:foo: { _bsontype: ‘Code’, code: ‘shell’ }),当 MongoDB BSON 解析器解析恶意 BSON 数据时远程执行恶意代码。

    漏洞名称 Parse Server MongoDB BSON 解析器远程命令执行漏洞 漏洞类型 命令注入 发现时间 2023-06-29 漏洞影响广度 一般 MPS编号 MPS-6zr0-bcsh CVE编号 CVE-2023-36475 CNVD编号 –

    影响范围

    parse-server@[6.0.0, 6.2.1)

    parse-server@[1.0.0, 5.5.2)

    修复方案

    官方已发布 MongoDB BSON 解析器过滤恶意字符的补丁:https://github.com/parse-community/parse-server/commit/3dd99dd80e27e5e1d99bd90c7aa90

    升级parse-server到 5.5.2 或 6.2.1 或更高版本

    参考链接

    https://www.oscs1024.com/hd/MPS-6zr0-bcsh

    https://nvd.nist.gov/vuln/detail/CVE-2023-36475

    https://github.com/parse-community/parse-server/security/advisories/GHSA-462x-c3jw-7vr6

    https://github.com/parse-community/parse-server/commit/3dd99dd80e27e5e1d99bd90c7aa90

    免费情报订阅&代码安全检测

    OSCS是国内首个开源软件供应链安全社区,社区联合开发者帮助全球顶级开源项目解决安全问题,并提供实时的安全漏洞情报,同时提供专业的代码安全检测工具为开发者免费使用。社区开发者可以通过配置飞书、钉钉、企业微信机器人获取一手的情报。

    免费代码安全检测工具: https://www.murphysec.com/?src=osc

    免费情报订阅: https://www.oscs1024.com/cm/?src=osc

    具体订阅方式详见: https://www.oscs1024.com/docs/vuln-warning/intro/?src=osc

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    漏洞描述

    GitLab 是一个开源的代码托管平台。

    GitLab Premium/Ultimate的受影响版本中,如果启用了Merge Request的批准设置(approval settings),当用户在分支中提交Merge Request后的5-10秒内,用户在该支中新的提交仍然会添加到Merge Request中,具有审批权限的用户同意合并后新的提交代码将会合并到受保护分支中,攻击者可利用该漏洞向Gitlab仓库中注入任意代码。

    漏洞名称 GitLab Merge Request 功能权限验证不当 漏洞类型 授权机制不恰当 发现时间 2023-06-29 漏洞影响广度 广 MPS编号 MPS-2022-65252 CVE编号 CVE-2022-4143 CNVD编号 –

    影响范围

    GitLab Premium/Ultimate@[15.9, 15.9.4)

    GitLab Premium/Ultimate@[15.10, 15.10.1)

    GitLab Premium/Ultimate@[15.7, 15.8.5)

    修复方案

    升级GitLab Premium/Ultimate到 15.8.5 或 15.9.4 或 15.10.1 或更高版本

    关闭Merge Request的批准设置(approval settings)功能

    参考链接

    https://www.oscs1024.com/hd/MPS-2022-65252

    https://nvd.nist.gov/vuln/detail/CVE-2022-4143

    https://gitlab.com/gitlab-org/gitlab/-/issues/

    https://hackerone.com/reports/

    免费情报订阅&代码安全检测

    OSCS是国内首个开源软件供应链安全社区,社区联合开发者帮助全球顶级开源项目解决安全问题,并提供实时的安全漏洞情报,同时提供专业的代码安全检测工具为开发者免费使用。社区开发者可以通过配置飞书、钉钉、企业微信机器人获取一手的情报。

    免费代码安全检测工具: https://www.murphysec.com/?src=osc

    免费情报订阅: https://www.oscs1024.com/cm/?src=osc

    具体订阅方式详见: https://www.oscs1024.com/docs/vuln-warning/intro/?src=osc

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等) 作者 | 把酒问青天

    导读 

    经过近几年的技术演进,语义模型在百度搜索场景中被广泛地应用,消耗了大量的GPU资源,模型压缩技术也随之得到大量研究和实践。通过兼顾推理性能、业务效果和迭代效率的优化目标,我们成功地将INT8量化技术大面积地应用到了搜索场景中,极大地提高了资源效能。此外,目前大模型正在被研究和应用,算力资源已经成为瓶颈,如何以更低的成本进行落地是一个非常热点的问题。基于对模型压缩技术的实践和积累,我们能够更好地助力大模型的探索和应用。

    全文6287字,预计阅读时间16分钟。

    01 搜索语义模型现状

    ERNIE: Enhanced Representation through Knowledge Integration是百度在2019年4月的时候,基于BERT模型做的进一步优化,在中文的NLP任务上得到了state-of-the-art的结果。

    近年来,ERNIE 1.0/2.0/3.0等语义模型在搜索各个重点业务场景下得到了广泛应用,包括相关性、排序等多个子方向,消耗了大量GPU资源。每个业务方向一般由多个模型组成链路来完成最终计算,整体搜索业务所涉及的模型数量多、迭代快。目前,线上全流量模型超过几百个,月级迭代近百次。语义模型的大量应用对搜索产生了巨大影响,相关业务指标对模型精度的变化非常敏感。总的来说,在模型压缩技术的工程实践中,推理性能、业务指标和迭代效率三者的优化目标应当统一考虑:

    1、推理性能:采用INT8量化,ERNIE模型的性能加速平均达25%以上。其主要影响因素包含输入数据量大小(batch size、sequence length等)、隐藏节点数、非标准网络结构与算子融合优化。

    2、业务指标:以某相关性场景下的ERNIE模型为例,模型输出在数值上的diff率不超过1%,在离线测试集上的评价指标达到几乎无损。

    3、迭代效率:离线量化达小时级,流水线式快速产出量化模型,不阻塞模型全生命周期的相关环节(如模型多版本迭代、小流量实验、全量化推全等)。

    02 模型量化简述

    简而言之,模型量化就是将高精度存储(运算)转换为低精度存储(运算)的一种模型压缩技术。优势如下:

    • 更少的存储开销与带宽需求:如每层权重量化后,32位比特压缩到8比特甚至更低比特,模型占用空间变小;内存访问带宽的压力自然也会变小。

    • 更快的计算速度:单位时间内执行整型计算指令比浮点计算指令更多;另,英伟达安培架构芯片还有专用INT8 Tensor core。

    如果我们从不同的技术角度来看待它,那么:

    • 从映射函数是否是线性,分为线性和非线性。非线性量化计算较为复杂,一般主要研究线性量化,其公式如下:

      Q = clip(round(R/S) + Z),其中R: high precision float number,Q:quantized integer number,s:scale,z:zero point。

    • 从零点对应位置区分,线性量化又分为对称和非对称。

    图片

    △1:对称与非对称量化

    以矩阵乘为例,计算公式如下:

    𝑹𝟏𝑹𝟐 = 𝒔𝟏𝑸𝟏𝒔𝟐𝑸𝟐 = 𝒔𝟏𝒔𝟐𝑸𝟏𝑸𝟐

    𝑹𝟏𝑹𝟐 = 𝒔𝟏(𝑸𝟏 − 𝒛𝟏) 𝒔𝟐(𝑸𝟐 − 𝒛𝟐) = 𝒔𝟏𝒔𝟐𝑸𝟏𝑸𝟐 − 𝒔𝟏𝒔𝟐𝒛𝟐𝑸𝟏 − 𝒔𝟏𝒔𝟐𝒛𝟏𝑸𝟐 + 𝒔𝟏𝒔𝟐𝒛𝟏𝒛𝟐

    在实际应用中,两者精度差异不大,对称量化在推理上更容易实现、计算更快。

    • 从量化粒度上,分为逐层量化、逐组量化和逐通道量化。第一种在推理上最易实现,性能更好,一般应用在输入矩阵。第二和第三种在推理上难实现,但业务精度好,一般应用在权重矩阵。

    • 从浮点矩阵中统计最大值是否截断上,分为饱和量化和非饱和量化。一般权重采用非饱和量化;输入/输出矩阵数据分布不均匀,采用饱和量化。

    • 从是否参与训练上,分为训练后量化(Post-Traning Quantization,PTQ)和量化感知训练(Quantization Aware Training, QAT)。从实践上看,前者性价比最高,在精度损失可接受范围内能够快速产出量化后模型,并获得不错的性能加速;后者需要结合训练来看,往往是在PTQ造成精度损失过大时采取的进一步手段。

    图片

    △图2:PTQ与QAT流程

    • 从是否在推理中动态生成尺度因子,分为在线(动态)量化和离线(静态)量化。在线量化需要在推理过程中根据实际激活计算量化参数,会影响推理速度。

    03 训练后量化

    结合实际的应用场景,我们率先对训练后INT8量化技术进行了细致研究和大规模实践。本文中涉及到的硬件测试环境为GPU A10,CUDA 11.2,TensorRT8,工具链包括PaddlePaddle、PaddleInference、PaddleSlim等。

    3.1 量化损失的精细化分析

    低精度表示空间远远小于高精度表示空间,无论采用何种校准方法和校准数据,量化一定会带来不同程度上的数值误差。为了尽可能的减小误差、不影响模型业务指标,那么误差的来源和解决方案应当被全面细致地探究与分析。比如,哪些算子适合量化,每个算子量化后带来的端到端误差如何衡量,能否将误差较大的部分算子不作量化等问题。

    3.1.1 量化算子的选择

    通常情况下,应该优先对计算密集型算子(如mul、matmul;conv2d、depthwise_conv2d;pooling(pool2d);concat;elementwise_add等)进行量化,对非线性算子(如softmax,tanh,sigmoid,GeLU等)和非计算密集layer的算子不做量化。

    图片

    △图3:ERNIE模型经过算子融合后的FP16推理耗时占比情况

    在ERNIE模型推理时,利用性能分析工具(nsight等)观察会发现,FC(对应paddle中mul)相关kernel耗时占比超过70%,BGEMM(对应paddle中matmul)相关kernel占比接近10%。因此可以重点从这两类算子入手进行量化,某线上ERNIE模型(输入数据batch size=10,max sequence length=128)的测试情况如下:

    图片

    △图4:ERNIE模型FP16和INT8推理时性能加速与离线指标对比

    对于FC,如果按照在推理时算子融合后网络中所处的位进行划分的话,可以人为地分成4类:

    • QKV FC:推理时Q、K、V位置的3个FC会被融合在1个kernel进行计算,后续将其作为一个整体来看待。

    • multi-head att-FC:经过多头注意力计算后的线性算子。

    • FFN FC:FFN中的2个FC,第1个FC和激活函数(如relu)会融合成1个kernel,第2个FC是独立的kernel。

    • 业务FC(未体现在示意图中):在主体ERNIE结构后增加若干FC进行微调,应用于不同的业务场景。推理时可能也会有算子融合操作。

    之所以按照上述方式进行划分:一是划分粒度更精细,便于观察和判定量化误差来源;二是尽可能与当前的推理实现逻辑保持一致,减少不必要的复杂改动。在算子类别+数量的多重组合下,更细粒度的量化,能更好地平衡性能加速和精度。

    3.1.2 量化算子的敏感性

    某层算子量化不当所带来的损失会在层间逐渐传递累积,模型层数越深、宽度越大,损失可能也会越大。每层内算子的量化误差对端到端指标的影响也是不一样的。在实践中,不同业务场景或者不同模型版本之间,量化后的业务指标损失不同,不一定都能在可接受范围内。这种情况下,最直接的方法是找出造成损失较大的算子,并将其跳过不做量化。被量化的算子减少,损失也会随之降低。一个12层ERNIE模型结构中至少有12*6个FC算子,绝大部分按INT8计算,只有几个仍按FP16计算,其性能加速变化不会大,模型指标损失却能更小。通过遍历每个FC算子对模型指标的敏感性大小,就能判定哪些FC可以不做量化。

    图片

    △图5:量化算子的敏感性分析方法

    其中,打skip quant标记的粒度与上一节中提到的FC划分方法保持一致,比如QKV内3个FC全量化或全不量化。EMD距离是指量化前后在某个小数据集上的输出值之间的分布距离,距离越小则被认为敏感性越强。

    案例1:线上某ERNIE模型经过多次微调迭代后,全FC量化后的离线评价指标下降了约1.4%。利用敏感性分析方法后,跳过前8个敏感FC后,量化模型的离线评价指标损失已经很小,性能加速仍有30%以上。

    图片

    △图6:全FC量化与跳过4个FC不作量化时的推理加速与离线指标对比

    案例2:线上某ERNIE模型,全FC量化后的离线评价指标下降了2%左右。只跳过前1个敏感FC后,就很好地拉回了离线评价指标。

    图片

    △图7:全FC量化与跳过1个FC不做量化时的推理加速与离线指标对比

    通过这个方法,我们能很好地兼顾性能加速和模型精度。经过大量实验后发现,FFN内FC往往更加敏感,对业务指标的影响更大。

    3.1.3 数值统计分析

    量化过程本质上是寻找合适的映射函数,让量化前后的输入/出矩阵或权重矩阵更加拟合。溯源分析,输入/出矩阵和权重矩阵分布情况从根本上决定了量化效果的好坏。对于量化效果极差的模型,一般会对相关矩阵再进行可视化地数值统计分析,这样我们能够发现是否存在大量异常点,校准算法是否适用等,进而倒推出更优的解决方法。

    图片

    △图8:ERNIE模型某FC权重数值分布的直方图统计

    3.2 校准数据增强

    校准数据的优劣是决定量化损失大小的重要因素之一。

    在搜索某资讯业务场景中,使用了多头输出(一个输出打分对应一个子任务)的ERNIE模型,如下:

    图片

    △图9:多头输出的模型结构示意图

    针对这个模型进行量化时,采用了训练时部分数据作为校准集,结果发现子任务二的离线效果变得很差。通过分析模型训练微调的过程后,将子任务一和子任务二的训练数据进行等比例混合随机后再作为校准集,量化后的离线效果均得到了满足。

    图片

    △图10:数据增强前,子任务一和子任务二在测试集上的打分分布情况

    图片

    △图11:数据增强后,子任务一和子任务二在测试集上的打分分布情况

    校准数据是从训练/测试数据中抽取的一个小集合,应当尽可能地保持数据分布的一致性。有些模型的离线测试集并不完善,离线指标不能很好的反应量化损失,也可能会出现离线效果与在线实验评价不一致的情况,此时可以将在线数据混入离线数据共同作为校准数据。另外,模型迭代通常是在解决bad case,校准数据中也应当注意bad case的比例。

    3.3 超参自动寻优

    量化包括不同的校准算法(正在使用avg、abs_max、mse、KL、hist等)、校准数据量大小(batch size/num)、是否开启偏置校准等超参,不同模型采用一组相同的量化参数,其损失变化也不同,因此超参自动寻优是必不可少的。一方面,通过自动化可以提高迭代效率;另一方面,更大的搜索空间能够获得比人工调参更优的量化后模型。

    图片

    △图12:超参自动寻优方法

    具体实现步骤:

    • 选择初始若干组参数产出量化后模型,推理计算量化前后模型在校准集上的输出值之间的分布距离(earth mover’s distance,EMD)

    • 根据超参和分布距离,构建随机树

    • 随机采样若干组不同的参数组合,依次插入随机树内进行推理并计算相关距离

    • 按照上一个步骤中分布距离最短的若干组参数进行实际量化

    • 从第一步再循环执行,直到分布距离收敛

    相比于人工调优,这种方法能够更快地搜寻到更优的量化后模型。比如:

    图片

    △图13:超参自动寻优实践案例

    实际上,同类型业务场景下,模型结构不会有很大变动,多次微调迭代后,超参自动寻优的参数往往会被锁定在一个小范围内。因此,我们会以类漏斗形式进行量化模型寻优,即优先在事先圈定的小范围参数内遍历量化,损失不满足要求后再进行大范围的搜索。

    3.4 效果评估

    搜索业务场景多种多样,离线评价方式各异。如果考虑量化方案的通用性和多维度评估能力,建设独立量化损失评价指标是必要的。类似于EMD的距离度量,打分分桶分布等方法可以作为辅助性指标来使用。

    图片

    △图14:一组模型量化前后在测试集上打分/输出的数值diff情况

    04 量化感知训练

    相对于训练后量化,量化感知训练的模型精度更好,但流程较为复杂。一般情况下,量化感知训练作为改善训练后量化损失的进阶技术手段。

    4.1 无侵入式量化训练

    为了降低量化训练难度,实际上我们会采用无侵入式方法,即推理模型+训练数据。首先,对推理模型进行梯度恢复,转换成参数可训练的网络,并插入fake quant op再转换成量化后网络;然后使用量化推理模型对量化后网络进行块量化损失监督,进而降低量化损失。

    4.2 全算子量化

    因为精度问题,训练后量化中一般只对部分算子做量化。进一步提升推理性能,对全算子量化的话,需要和量化感知训练结合起来。全算子量化是除了mul或者matmul算子进行量化外,又增加了layer norm相关算子和中间传参过程。

    图片

    △全算子与部分算子INT8量化的模型网络示意图

    全算子量化在中文场景下表现出一些特异性:

    • 量化后激活分布异常值多,推理端量化累计误差变大。

    • QKV的输出激活scale值较大,推理端中间层输出为0,导致精度错误。

    经过摸索,可行的解决方案如下:

    • 先进行训练后量化,采用直方图校准方式,将激活scale值限制在某个较小范围内。

    • 固定离线量化产出的激活scale值,再进行权重逐通道的量化训练。

    在搜索相关性某ERNIE模型上,输入数据batch size=20,max sequence length=128时,具体实验情况如下:

    图片

    △图16:全算子INT8量化的性能加速与离线评价实验结果

    4.3 SmoothQuant

    SmoothQuant是无训练、保持精度和通用的训练后量化方案,试图解决大模型(>6.7B)量化问题。简单来说,基于权重易量化、激活不易量化的事实,通过离线的数学等价变换将激活的难度迁移到权重上,将激活和权重都变得较容易量化。

    图片

    △17:SmoothQuant核心原理 [1]

    在某些量化损失较大的小模型上,我们采用量化感知训练+SmoothQuant进行了相关实验,也能有不错的表现。比如:

    图片

    △图18:SmoothQuant实验结果

    05 展望

    目前INT8量化技术已经在线上大规模应用,使整体GPU资源利用效率得到了极大提升,也支撑了更多更复杂模型的演进。

    通过总结大量实践经验和技术调研,更低比特量化(如INT4)、INT8量化+Token剪枝多压缩手段融合等正在实验和落地中。

    因为线上业务子方向众多,模型多&迭代快,将实践经验抽象出通用方案势在必行,建设平台化、流水线式管理模型整个生命周期能够大幅度提高效率。同时,也可以将通用方法论应用到其他模型压缩技术的工程应用上。

    近期,大模型相关技术方向的研究相当火热,模型压缩也是热点之一。初步调研后,在小模型上有效的技术手段有一部分是可以直接平迁到大模型上的,有一些则需要改进。比如,大模型训练相当复杂,量化感知训练看起来不是那么经济。根据相关业界动态,PTQ-Weight Only,LLM.int8(),SmoothQuant等技术正在被研究和使用。

    ——END——

    参考资料:

    [1]https://arxiv.org/pdf/2211.10438.pdf

    推荐阅读:

    如何设计一个高效的分布式日志服务平台

    视频与图片检索中的多模态语义匹配模型:原理、启示、应用与展望

    百度离线资源治理

    百度APP iOS端包体积50M优化实践(三) 资源优化

    代码级质量技术之基本框架介绍

    基于openfaas托管脚本的实践

    Xline是一个面向多集群的高性能分布式键值存储引擎。可以为多集群场景提供统一的数据管理,使相互访问、发现、修改变得简单方便。它还提供KV接口、多版本并发控制并兼容etcd和K8S。

    Xline 是第一个基于 CURP(一种 WAN 共识协议,请阅读论文了解更多详细信息)的地理分布式一致性管理服务。它解决了跨云融合和一致性的挑战。

    它提供以下功能:

    • etcd 兼容 API。
    • 地理分布式友好部署。
    • 兼容K8s。

    该项目针对多数据中心场景,旨在实现高性能的多云数据管理解决方案,这对于具有地域分布式、多活部署需求的企业至关重要。

     

    Xline 实例由以下层组成:

    • 客户端层:提供简单易用的API供客户端使用,可以大大降低使用Xline进行业务的复杂度。后续版本将实现不同语言的 Xline 客户端,目前 Xline API 与 etcd 兼容,可以使用 etcdctl 发起请求。
    • 接入层:接入层主要包括客户端到服务器或者服务器到服务器之间的通信协议。Xline API 基于 gRPC 协议。
    • CURP协议层:CURP协议层实现了Leader选举、日志复制、快路径和慢路径等核心算法功能,用于保证Xline多节点之间的数据一致性,提高服务可用性。CURP协议是Xline的基石和亮点。
    • 功能逻辑层:该层实现Xline业务逻辑,包括典型的KV Server、Auth Server、Lease Server和Watch Server等。Client通过接入层向Xline Server发送请求,Xline Server将请求调度到特定服务器执行。
    • 存储层:该层包含两个组件,Index和DB,其中Index基于BTreeMap,DB主要负责数据的持久存储。目前Xline还处于开发初期,所以DB主要是基于内存实现的。我们将在下一版本中引入持久存储。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    主要特点:

    • 一种面向多集群的分布式KV存储引擎。多集群场景的数据统一管理,相互访问、发现、修改简单便捷。
    • 统一的数据管理系统。通过将热点数据缓存在内存中进行跨云数据访问,并提供统一的数据管理,实现数据迁移和备份的自动化。
    • 高性能多数据中心共识协议。它是第一个基于WAN共识协议的地理分布式一致性管理服务。它解决了跨云融合和一致性的挑战。
    • 兼容ETCD接口。提供KV接口,多版本并发控制,兼容K8S。

    近日,开源共识(上海)网络技术有限公司(开源中国/Gitee)完成了 B+ 轮战略融资,此轮融资由天际资本领投,上海科创旗下海望资本联合泰达实业、浦东软件园及张江科投、君联资本、上海国际创投、瑞壹投资、容亿资本、中国移动旗下中移北京基金、中网投、国调科改、联想创投及上海科创共同出资,融资总额达 7.75 亿人民币。

    至此,原股东百度(传课计算机系统〔北京〕有限公司)股比由51.54%降至14.04%,公司创始团队重新成为实际控制人,经此股份重组企业成为完全中立平台。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    开源中国创立于2008年,收录全球知名开源项目近10万款,涉及几百个不同的分类,并于2022年发布了中国开源社区 Landscape,收录200+ 开源社区;同年收购日本老牌开源社区 OSDN,该社区前身为 Sourceforge.jp。

    开源中国于2013年发布代码托管平台 Gitee,是目前国内领先的代码托管服务平台,并于2020年开始牵头建设工信部国家开源托管平台项目。Gitee 于2017年上线发布针对企业级的研发效能平台 Gitee 企业版。

    截至目前,Gitee已经服务1000 万开发者用户、26 万家企业(含1200 家中大型私有化部署企业)以及2000多家高等院校。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    开源中国董事长马越对开源中国十五年来的发展表示:“我们经历了从开源社区,到开源代码托管平台,再到今天 DevOps 研发效能平台的演进,实现了从流量平台,到可闭环商业化平台的转变。这个过程中,不仅为中国开源生态贡献了价值,也为中国企业软件研发效能贡献了商业化力量。”

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    马越还提到,目前海外几家知名开发者工具服务商,其总市值共计可达千亿美以上,开源中国的目标是对标海外上市公司填补国内 A 股空白。

    具体来说,除代码托管服务平台对标的 GitHub 外,其他对标厂商分别为美国Atlassian(市值500亿美,曾一度突破千亿美市值)、美国 GitLab(市值80亿美)、以色列 JFrog(市值30亿美)。其中,Atlassian 是全球最大的项目管理和解决方案提供商,旗下 Jira、Confluence、Trello 几乎已经成为海外互联网公司开发过程中的基础设施,GitLab 是开源代码管理平台,JFrog 是二进制制品管理仓库,三者都被全球开发者所熟知并使用。

    想要同时对标这些产品,不仅单点产品要做好,更是要做好 DevOps 全生命周期 All-in-One 的整套产品,满足开发者的一体化需求。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    为了达成该目标,开源中国自2020年就开始深耕相应产品的国产替代方案,在满足开发者需求的同时,打造出一个自主创新、安全可信的本土开源软件工具与生态,减少开发者对海外开源软件的过度依赖,构建安全可控的中国信息化体系——这也是开源中国最重要的商业化路径。

    目前,Gitee产品矩阵已构建了完整替代解决方案:Gitee Team 替代 Jira,Gitee Code 替代 GitLab,Gitee Pipe 替代 Jenkins,Gitee Repo 替代 JFrog,系列产品覆盖了软件工程的需求管理、代码管理、协作管理、制品管理等流程。尤其是针对私有云部署需求,Gitee 能够给国家大量政府、军工、金融、制造业等大客户提供一站式开发服务。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    在马越看来,Gitee 之所以要做一站式产品,就是因为在服务中国大部分国央企类企业时,他们更希望在同一个平台里使用工具,而并非对接好几个系统和供应商。

    同时,在国产替代浪潮袭来的当下,研发数据也是国家的重要资源,使用国产工具更能保障其安全性。马越表示,在互联网时代,中国1000万开发者都是国家重要的发展力量,而开源中国要做的是中国开发者的“兵工厂”。

    目前,开源中国研发团队规模占总员工的85%以上,在本次战略融资后,团队将把更多资金用于产品及 AI 领域研发和商业化拓展,在软件自主可控的时代背景下,期望用两到三年的时间,成为中国资本市场的软件/AI 工程工具厂商第一股。

    Mozilla 在博客中宣布:以后旗下的 Pocket 应用只能使用 Firefox 帐户登陆。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Pocket是一项免费的商业服务,允许用户保存在网络上找到的文章、对文章进行分类,以及阅读和收听这些文章。高级用户还可以获得无广告的体验、全文搜索选项等等。Pocket 还包括发现和推荐功能。

    自 2017 年被收购以来,Pocket 一直是 Mozilla 产品系列的一部分。

    之前 Pocket 用户有四种注册选项:可以使用 Firefox 帐户或创建一个帐户,或使用 Apple / Google 帐户登录,或使用其他电子邮箱进行注册。但使用第三方帐户登录的选项将在未来几个月内被删除,Firefox 帐户将成为唯一的选择。

    从 2023 年 7 月 11 日开始,系统将提示 Pocket 用户转换到 Firefox 帐户。而在 2023 年 8 月 15 日之后,只有 Firefox 帐户才能登录。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Mozilla 对用户的疑问发布了详细的 QA 文档,里面详细解释了为何要限制仅 Firefox 登陆,以及 Apple / Google 帐户的内容如何迁移到 Firefox 帐户等内容。

    ECMAScript 2023 现已获得 ECMA International 的批准。ECMAScript 是标准化的 JavaScript 语言,于 1997 年发布了第一版,现已发展成为世界上使用最广泛的通用编程语言之一。

    本 Ecma 标准定义了 ECMAScript 2023 Language,是 ECMAScript 语言规范的第 14 版。

    ECMAScript 2023,第 14 版,在和上引入了、、、和方法,以及上的方法;在文件开头增加了对注释的支持,以更好地促进 ECMAScript 文件的可执行;并允许在弱集合中使用大多数 Symbols 作为 keys 。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    最终提案由 ECMA TC39 在 GitHub 上发布,详细阐述了今年将发布的四个功能:

    Array find from last

    提案原型上增加了 方法。这与 Array.prototype.find 和 Array.prototype.findIndex 的行为相同,但会从最后一个迭代到第一个

     const array = [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }]; array.find(n => n.value % 2 === 1); // { value: 1 } array.findIndex(n => n.value % 2 === 1); // 0 // ======== Before the proposal ===========  // find [...array].reverse().find(n => n.value % 2 === 1); // { value: 3 } // findIndex array.length - 1 - [...array].reverse().findIndex(n => n.value % 2 === 1); // 2 array.length - 1 - [...array].reverse().findIndex(n => n.value === 42); // should be -1, but 4 // ======== In the proposal ===========  // find array.findLast(n => n.value % 2 === 1); // { value: 3 } // findIndex array.findLastIndex(n => n.value % 2 === 1); // 2 array.findLastIndex(n => n.value === 42); // -1

    Hashbang Grammar

    Hashbang,也称为 shebang,是可执行脚本开头的字符序列,用于定义要运行的程序的解释器。当 Unix 内核的程序加载器执行 JavaScript 程序时,主机会剥离 hashbang 以生成有效源,然后再将其传递给引擎。Hashbang Grammar 提案标准化了它的完成方式。

     #!/usr/bin/env node // in the Script Goal 'use strict'; console.log(1);
     #!/usr/bin/env node // in the Module Goal export {}; console.log(1);

    Symbols as WeakMap keys

    该提案扩展了 WeakMap API,以允许使用 unique Symbols 作为 keys。

     const weak = new WeakMap(); // Pun not intended: being a symbol makes it become a more symbolic key const key = Symbol('my ref'); const someObject = { /* data data data */ }; weak.set(key, someObject);

    Change Array by Copy

    在和上提供了额外的方法,通过返回一个带有变化的新 copy 来实现对数组的改变。

     const sequence = [1, 2, 3]; sequence.toReversed(); // => [3, 2, 1] sequence; // => [1, 2, 3] const outOfOrder = new Uint8Array([3, 1, 2]); outOfOrder.toSorted(); // => Uint8Array [1, 2, 3] outOfOrder; // => Uint8Array [3, 1, 2] const correctionNeeded = [1, 1, 3]; correctionNeeded.with(1, 2); // => [1, 2, 3] correctionNeeded; // => [1, 1, 3]

    具体可查看:

    • https://262.ecma-international.org/14.0/
    • https://www.ecma-international.org/wp-content/uploads/ECMA-262_14th_edition_june_2023.pdf

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    ECharts 宣布诞生 10 周年。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    ECharts 是一款基于 JavaScript 的开源可视化图表库,提供了开箱即用的 20 多种图表和十几种组件,并且支持各种图表以及组件的任意组合。

    ECharts 最初由百度团队开源,并于 2018 年初捐赠给 Apache 基金会,成为 ASF 孵化级项目。

    2021 年,Apache ECharts 顺利毕业晋升为 ASF 顶级项目。开源中国在 ECharts 从 ASF 毕业成为顶级项目时,对 ECharts 团队进行了专访,点此查看:专访 Apache ECharts 团队:从 ASF 毕业经历了什么?

    华为董事、ICT 产品与解决方案总裁杨超斌在 2023 MWC 上海展 5G Advanced 论坛上宣布:2024 年,华为将会推出面向商用的 5.5G 全套网络设备。这也标志着 ICT 行业即将迈入 5.5G 时代。

    Chaobin Yang

    目前全球已经有超过260张5G商用网络,超过12亿5G用户,1.15亿F5G千兆用户。与此同时,新的业务形态与内容,也在持续地演进升级,包括裸眼3D等在内技术的突破,将个人沉浸式体验带上了新高度,这些新业务也对5G网络的能力提出了更高的要求。

    华为倡导的5.5G时代,包含5.5G、F5.5G、Net5.5G等全面演进升级的端到端解决方案,5.5G时代一方面可以保护运营商的5G投资;另一方面将会带来10倍的网络性能提升。不仅实现下行万兆、上行千兆的峰值能力,以满足丰富多样的业务需求,同时还引入无源物联等全新技术以打开千亿物联新空间,开创新的产业愿景。

    杨超斌表示:“面向5.5G时代的技术和商业验证均已就绪,标准节奏明确,5.5G时代正蓄势待发。2024年,华为将会推出面向商用的5.5G全套网络设备,为5.5G的商用部署做好准备! 华为期待和产业携手,共同开启5.5G时代新征程!”

    2023年6月17日,中国开源软件推进联盟 PostgreSQL 分会在成都举办了数据库技术峰会。此次峰会以“新机遇、新态势、新发展”为主题,结合当下信创热潮、人工智能等产业变革背景,探讨 PostgreSQL 数据库在这些新机遇下的发展前景。峰会邀请众多行业大咖、学术精英、技术专家、技术爱好者等参加本次盛会,分享 PostgreSQL 数据库未来的发展机遇、新技术和新方向,推动 PostgreSQL 在中国的发展。 

    拓数派作为 PG 分会的生态伙伴受邀参与本次峰会。拓数派 PieCloudDB 产品经理陈金豹在活动中发表主题演讲《云原生虚拟数仓 PieCloudDB 的架构和关键模块实现》。 

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    图为 拓数派 PieCloudDB 产品经理陈金豹

    陈金豹认为公有云是未来数据库发展的重要方向之一,而以关系型数据库为基础的数据仓库缺乏弹性,难以利用公有云的优势;NoSQL 和数据湖的解决方案又缺乏对事务 ACID 的支持,且难以胜任复杂的数据分析场景。用户期望一个兼顾关系型数仓和公有云优势的产品,这也是 PieCloudDB Database 的设计目标。 

    PieCloudDB 在计算引擎方面提供了完备的 SQL 支持、ACID 事务支持以及高效的查询优化和执行器,完全胜任各种复杂的数据分析场景;而在公有云特性方面,PieCloudDB 实现存算分离,提供弹性的计算集群,用户可以按需为计算和存储付费,实现降本增效。 

    PieCloudDB 的云原生架构中包含了两条重要特性:弹性伸缩的集群和 Multi-Cluster。PieCloudDB 使用完全无状态的 Segment 节点提供极致的计算集群弹性;而多集群特性则是通过独立的系统表以及分布式锁和事务共同实现。最后,陈金豹介绍了未来 PieCloudDB 即将发布的一些关键特性:Time Travel、Branch、Data Sharing 以及已经发布的性能优化特性聚集下推和预聚集。 

    2023 PostgreSQL 数据库技术峰会成都站圆满结束。PostgreSQL 历经三十多年的发展,越来越受到用户的欢迎和认可,在 DB-Engines 稳定保持在前列。根据 Stack Overflow 2023 年度调查报告,PostgreSQL 取代 MySQL 位居第一,成为年度最受欢迎的数据库。这些无一不表明了 PostgreSQL 的生态优势,拓数派作为PostgreSQL 社区生态伙伴,秉持拥抱开放的企业文化,一直以代码贡献、讲师布道、会议赞助等多种形式参与到 PostgreSQL 的社区贡献中,在未来拓数派将继续为社区贡献一份力量。 

    进入拓数派B站官方账号,观看完整演讲视频。

     


     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     

    2023年7月4日~5日,由中国信息通信研究院、中国通信标准化协会指导,中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)主办的2023可信数据库发展会将于北京国际会议中心隆重召开。

    大会以“自主·创新·引领”为主题,开设金融、电信、互联网、汽车四大行业分论坛以及云原生与开源数据库、搜索与分析型数据库、数据库运维及生态工具、时序时空及图数据库四大分论坛,邀请众多知名院士、行业协会领导、数据库学术大咖、产业链各环节数据库负责人、资深技术专家等共同论道新形势下数据库产业可持续、高质量发展的方法,并针对性解决上述产业发展中的痛点问题。

    杭州拓数派科技发展有限公司(也称“OpenPie”)立足于国内,基础数据计算领域的高科技创新企业,也将参与本次大会。届时,拓数派 CTO 郭罡将于搜索与分析型数据库分论坛中与大家分享《PieCloudDB 云原生数仓虚拟化的演进与发展》。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     


     

     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     

    1 问题现象

    路由计算服务是路由系统的核心服务,负责运单路由计划的计算以及实操与计划的匹配。在运维过程中,发现在长期不重启的情况下,有TP99缓慢爬坡的现象。此外,在每周例行调度的试算过程中,能明显看到内存的上涨。以下截图为这两个异常情况的监控。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    TP99爬坡

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    内存爬坡

    机器配置如下

    CPU: 16C RAM: 32G

    Jvm配置如下:

    -Xms20480m (后面切换到了8GB) -Xmx20480m (后面切换到了8GB) -XX:MaxPermSize=2048m -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled -XX:+PrintReferenceGC -XX:+UseG1GC -Xss256k -XX:ParallelGCThreads=16 -XX:ConcGCThreads=4 -XX:MaxDirectMemorySize=2g -Dsun.net.inetaddr.ttl=600 -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j2.asyncQueueFullPolicy=Discard -XX:MetaspaceSize=1024M -XX:G1NewSizePercent=35 -XX:G1MaxNewSizePercent=35

    例行任务调度情况:

    每周一凌晨2:00触发执行。上面截图,共包含了两个周期的任务。可以看到,在第一次执行时,内存直接从33%爬升至75%。在第二次执行时,爬坡至88%后,OOM异常退出。

    2 问题排查

    由于有两种现象,所以排查有两条主线。第一条是以追踪OOM原因为目的的内存使用情况排查,简称内存问题排查。第二条是TP99缓慢增长原因排查,简称性能下降问题排查。

    2.1 性能下降问题排查

    由于是缓慢爬坡,而且爬坡周期与服务重启有直接关系,所以可以排出外部接口性能问题的可能。优先从自身程序找原因。因此,首先排查GC情况和内存情况。下面是经过长期未重启的GC log。这是一次YGC,总耗时1.16秒。其中Ref Proc环节消耗了1150.3 ms,其中的JNI Weak Reference的回收消耗了1.秒。而在刚重启的机器上,JNI Weak Reference的回收时间为0.0000162秒。所以可以定位到,TP99增加就是JNI Weak Reference回收周期增长导致的。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    JNI Weak Reference顾名思义,应该跟Native memory的使用有关。不过由于Native memory排查难度较大。所以还是先从堆的使用情况开始排查,以碰碰运气的心态,看是否能发现蛛丝马迹。

    2.2 内存问题排查

    回到内存方面,经过建哥提示,应该优先复现问题。并且在每周触发的任务都会稳定复现内存上涨,所以从调度任务这个方向,排查更容易一些。通过@柳岩的帮助,具备了在试算环境随时复现问题的能力。

    内存问题排查,仍然是从堆内内存开始。多次dump后,尽管java进程的总内存使用量持续上涨,但是堆内存使用量并未见明显增长。通过申请root权限,并部署arthas后,通过arthas的dashbord功能,可以明显看到,堆(heap)和非堆(nonheap)都保持平稳。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    arthas dashboard

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    内存使用情况,存在翻倍现象

    由此可以断定,是native memory使用量增长,导致整个java应用的内存使用率增长。分析native的第一步是需要jvm开启-XX:NativeMemoryTracking=detail。

    2.2.1 使用jcmd查看内存整体情况

    jcmd可以打印java进程所有内存分配情况,当开启NativeMemoryTracking=detail参数后,可以看到native方法调用栈信息。在申请root权限后,直接使用yum安装即可。

    
    

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    jcmd结果展示

    上图中,共包含两部分,第一部分是内存总体情况摘要,包括总内存使用量,以及分类使用情况。分类包括:Java Heap、Class、Thread、Code、GC、Compiler、Internal、Symbol、Native Memory Tracking、Arena Chunk、Unknown,每个分类的介绍,可以看这篇文档;第二部分是详情,包括了每段内存分配的起始地址和结束地址,具体大小,和所属的分类。比如截图中的部分,是描述了为Java heap分配了8GB的内存(后面为了快速复现问题,heap size从20GB调整为8GB)。后面缩进的行,代表了内存具体分配的情况。

    间隔2小时,使用jcmd dump两次后,进行对比。可以看到Internal这部分,有明显的增长。Internal是干什么的,为什么会增长?经过Google,发现此方面的介绍非常少,基本就是命令行解析、JVMTI等调用。请教@崔立群后,了解到JVMTI可能与java agent相关,在路由计算中,应该只有pfinder与java agent有关,但是底层中间件出问题的影响面,不应该只有路由一家,所以只是问了一下pfinder研发,就没再继续投入跟进。

    2.2.2 使用pmap和gdb分析内存

    首先给出此方式的结论,这种分析由于包含了比较大的猜测的成分,所以不建议优先尝试。整体的思路是,使用pmap将java进程分配的所有内存进行输出,挑选出可疑的内存区间,使用gdb进行dump,并编码可视化其内容,进行分析。
    网上有很多相关博客,都通过分析存在大量的64MB内存分配块,从而定位到了链接泄漏的案例。所以我也在我们的进程上查看了一下,确实包含很多64MB左右的内存占用。按照博客中介绍,将内存编码后,内容大部分为JSF相关,可以推断是JSF netty 使用的内存池。我们使用的1.7.4版本的JSF并未有内存池泄漏问题,所以应当与此无关。
    pmap:https://docs.oracle.com/cd/E56344_01/html/E54075/pmap-1.html
    gdb:https://segmentfault.com/a/35739

    2.2.3 使用strace分析系统调用情况

    这应该算是碰运气的一种分析方法了。思路就是使用strace将每次分配内存的系统调用输出,然后与jstack中线程进行匹配。从而确定具体是由哪个java线程分配的native memory。这种效率最低,首先系统调用非常频繁,尤其在RPC较多的服务上面。所以除了比较明显的内存泄漏情况,容易用此种方式排查。如本文的缓慢内存泄漏,基本都会被正常调用淹没,难以观察。

    2.3 问题定位

    经过一系列尝试,均没有定位根本原因。所以只能再次从jcmd查出的Internal内存增长这个现象入手。到目前,还有内存分配明细这条线索没有分析,尽管有1.2w行记录,只能顺着捋一遍,希望能发现Internal相关的线索。

    通过下面这段内容,可以看到分配32k Internal内存空间后,有两个JNIHandleBlock相关的内存分配,分别是4GB和2GB,MemberNameTable相关调用,分配了7GB内存。

    
    

    通过对比两个时间段的jcmd的输出,可以看到JNIHandleBlock相关的内存分配,确实存在持续增长的情况。因此可以断定,就是JNIHandles::make_weak_global 这部分内存分配,导致的泄漏。那么这段逻辑在干什么,是什么导致的泄漏?

    通过Google,找到了Jvm大神的文章,为我们解答了整个问题的来龙去脉。问题现象与我们的基本一致。博客:https://blog.csdn.net/weixin_/article/details/

    其中,寒泉子给出了一个复现问题的代码。在我们的代码中有一段几乎一摸一样的,这确实包含了运气成分。

    
    

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    jvm bug:https://bugs.openjdk.org/browse/JDK-

    就是上面这个bug,频繁使用MethodHandles相关反射,会导致过期对象无法被回收,同时会引发YGC扫描时间增长,导致性能下降。

    3 问题解决

    由于jvm 1.8已经明确表示,不会在1.8处理这个问题,会在java 重构。但是我们短时间也没办法升级到java 。所以没办法通过直接升级JVM进行修复。由于问题是频繁使用反射,所以考虑了添加缓存,让频率降低,从而解决性能下降和内存泄漏的问题。又考虑到线程安全的问题,所以将缓存放在ThreadLocal中,并添加LRU的淘汰规则,避免再次泄漏情况发生。

    最终修复效果如下,内存增长控制在正常的堆内存设置范围内(8GB),增涨速度较温和。重启2天后,JNI Weak Reference时间为0.0001583秒,符合预期。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4 总结

    Native memory leak的排查思路与堆内内存排查类似,主要是以分时dump和对比为主。通过观察异常值或异常增长量的方式,确定问题原因。由于工具差异,Native memory的排查过程,难以将内存泄漏直接与线程相关联,可以通过strace方式碰碰运气。此外,根据有限的线索,在搜索引擎上进行搜索,也许会搜到相关的排查过程,收到意外惊喜。毕竟jvm还是非常可靠的软件,所以如果存在比较严重的问题,应该很容易在网上找到相关的解决办法。如果网上的内容较少,那可能还是需要考虑,是不是用了过于小众的软件依赖。

    在开发方面,尽量使用主流的开发设计模式。尽管技术没有好坏之分,但是像反射、AOP等实现方式,需要限制使用范围。因为这些技术,会影响代码的可读性,并且性能也是在不断增加的AOP中,逐步变差的。另外,在新技术尝试方面,尽量从边缘业务开始。在核心应用中,首先需要考虑的就是稳定性问题,这种意识可以避免踩一些别人难以遇到的坑,从而减少不必要的麻烦。

    作者:京东物流 陈昊龙

    来源:京东云开发者社区

    本篇文章中我们将对机器学习做全面的了解与介绍,其中第一章 初识机器学习分为上下两个小章节,对机器学习是什么、机器学习由来以及机器学习的理论等展开说明。目的是能让即便完全没接触过机器学习的人也能在短时间对机器学习有一个全面了解。后续将推出机器学习的进阶内容,包括经典基础篇(线性模型、决策树、集成学习、聚类等),实战进阶篇(特征工程、模型训练与验证、融合与部署等)。本篇为第一章 初识机器学习(上),我们从这里开始,开启一个全新的学习旅程。

    1 机器学习描述

    1.1 机器学习是什么?

    机器学习(Machine Learning,ML)是使用统计(或数学)技术从观察到的数据中构建模型(或系统)的一个计算机科学领域。机器学习用计算机程序模拟人的学习能力,从样本数据中学习得到知识和规律,然后用于实际的推断和决策。

    从广义上来说,机器学习能够赋予“机器”学习的能力,使其实现直接编程无法完成的工作。但从实践意义上来说,机器学习是利用数据训练出模型,并使用模型进行预测的一种方法。“训练”与“预测”是机器学习的两个过程,“模型”则是过程中间的输出结果,“训练”产生“模型”,“模型”指导 “预测”。接下来我们把机器学习的过程与人类对历史经验归纳演绎的过程做个比对。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    机器学习中的“训练”与“预测”过程可以对应到人类的“归纳”和“演绎”过程。通过这样的对应,我们可以发现,机器学习的思想并不复杂,仅仅是对人类在生活中学习成长的一个模拟。由于机器学习不是基于编程形成的结果,因此它的处理过程不是因果的逻辑,而是通过归纳思想得出的相关性结论。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    人类对历史经验归纳过程

    人类在成长、生活过程中积累了很多的历史与经验。人类定期地对这些经验进行“归纳”,获得了生活的“规律”。当人类遇到未知的问题或者需要对未来进行“推测”的时候,人类将使用这些“规律”,对未知问题与未来进行“演绎”,从而指导自己的生活和工作。

    1.2 机器学习的应用范围

    机器学习应用广泛,在各方面都有其施展的空间,包括:数据分析与挖掘、模式识别、虚拟助手和交通预测等。从行业来看,在金融领域(检测信用卡欺诈、证券市场分析等)、互联网领域(自然语言处理、语音识别、搜索引擎等)、医学领域、自动化及机器人领域(无人驾驶、信号处理等)、游戏领域、刑侦领域等也都有所涉及。

    1.2.1 数据分析与挖掘

    “数据挖掘”和”数据分析”通常被相提并论,但无论是数据分析还是数据挖掘,都是在帮助人们收集与分析数据,使之成为信息并做出推测与判断。因此可以将这两项合称为数据分析与挖掘。数据分析与挖掘是机器学习技术和大数据存储技术结合的产物,利用机器学习手段分析海量数据,同时利用数据存储机制实现数据的高效读写。机器学习在数据分析与挖掘领域中拥有无可取代的地位,2012年Hadoop进军机器学习领域就是一个很好的例子。

    1.2.2 模式识别

    模式识别的应用领域广泛,包括计算机视觉、医学图像分析、光学文字识别、自然语言处理、语音识别、手写识别、生物特征识别、文件分类、搜索引擎等,而这些领域也正是机器学习大展身手的舞台,因此模式识别与机器学习的关系越来越密切。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1.2.3 虚拟助手

    Siri,Alexa,Google Now都是虚拟助手。在交互过程中,虚拟助手会协助查找信息,搜索相关历史行为,或向其他资源(如电话应用程序)发送命令收集更多信息,以满足人们提出的需求。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1.2.4 交通预测

    生活中我们经常使用GPS导航服务,机器学习能够帮助我们预测交通堵塞。当前高德地图,腾讯地图等都应用了机器学习技术,识别拥挤路段,规划最优路线。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2 机器学习发展史

    2.1 浅层学习阶段

    1. 1957年,Rosenblatt发明了感知机(Perceptron),是神经网络的雏形,同时也是支持向量机的基础,在当时引起了不小的轰动。
    2. 1959年,IBM的写出了可以学习的西洋棋程序,并在 IBM Journal of Research and Development期刊上发表了一篇名为《Some Studies in Machine Learning Using the Game of Checkers》的论文中,定义并解释了一个新词——机器学习(Machine Learning,ML)。将机器学习非正式定义为“在不直接针对问题进行编程的情况下,赋予计算机学习能力的一个研究领域”。
    3. 1960年,Widrow发明了Delta学习规则,即如今的最小二乘问题,立刻被应用到感知机中,并且得到了一个极好的线性分类器。
    4. 1970年,Seppo Linnainmaa首次完整地叙述了自动链式求导方法(Automatic Differentiation,AD),是著名的反向传播算法(Back Propagation,BP)的雏形,但在当时并没有引起重视。
    5. 1974年,Werbos首次提出把BP算法的思想应用到神经网络,也就是多层感知机(Multilayer Perception,MLP),并在1982年实现,就是现在通用的BP算法,促成了第二次神经网络大发展。
    6. 1985-1986年,Rumelhart,Hinton等许多神经网络学者成功实现了实用的BP算法来训练神经网络,并在很长一段时间内BP都作为神经网络训练的专用算法。
    7. 1986年,J.R.Quinlan提出了另一个同样著名的ML算法—决策树算法(Iterative Dichotomiser 3,ID3),决策树作为一个预测模型,代表的是对象属性与对象值之间的一种映射关系,而且紧随其后涌现出了很多类似或者改进算法,如ID4,回归树,CART等。
    8. 1995年,Yan LeCun提出了卷积神经网络(Convolution Neural Network,CNN),受生物视觉模型的启发,通常有至少两个非线性可训练的卷积层,两个非线性的固定卷积层,模拟视觉皮层中的V1,V2,Simple cell和Complex cell,在手写字识别等小规模问题上,取得了当时世界最好结果,但是在大规模问题上表现不佳。
    9. 1995年,Vapnik和Cortes提出了强大的支持向量机(Support Vector Machine,SVM),主要思想是用一个分类超平面将样本分开从而达到分类效果,具有很强的理论论证和实验结果。至此,ML分为NN和SVM两派。
    10. 1997年,Freund和Schapire提出了另一个坚实的ML模型AdaBoost,该算法最大的特点在于组合弱分类器形成强分类器,可以形象地表述为:“三个臭皮匠赛过诸葛亮”,分类效果比其它强分类器更好。
    11. 2001年,随着核方法的提出,SVM大占上风,它的主要思想就是通过将低维数据映射到高维,从而实现线性可分。至此,SVM在很多领域超过了NN模型。除此之外,SVM还发展了一系列针对NN模型的基础理论,包括凸优化、范化间隔理论和核方法。
    12. 2001年,Breiman提出了一个可以将多个决策树组合起来的模型随机森林(Random Forest,RF),它可以处理大量的输入变量,有很高的准确度,学习过程很快,不会产生过拟合问题,具有很好的鲁棒性。
    13. 2001年,Hochreiter发现使用BP算法时,在NN单饱和之后会发生梯度损失(梯度扩散)。简单来说就是训练NN模型时,超过一定的迭代次数后,容易过拟合。NN的发展一度陷入停滞状态。

    2.2 深度学习阶段

    二十一世纪初,学界掀起了以“深度学习”为名的热潮。所谓深度学习?狭义地说就是“很多层”的神经网络。在若干测试和竞赛上,尤其是涉及语音、图像等复杂对象的应用中,深度学习技术取得了优越性能。以往机器学习技术在应用中要取得好性能,对使用者的要求较高;而深度学习技术涉及的模型复杂度非常高,以至于只要下工夫“调参”,只要把参数调节好,性能往往就好。因此,深度学习虽缺乏严格的理论基础,但它显著降低了机器学习应用者的门槛,为机器学习技术走向工程实践带来了便利。那么它为什么此时才热起来呢?有两个原因,一是数据量增大了,二是计算能力强了。深度学习模型拥有大量参数,若数据样本少,则很容易“过拟合”。如此复杂的模型、如此大的数据样本,若缺乏强力计算设备,根本无法求解。恰恰人类进入了大数据时代,数据储量与计算设备都有了大发展,才使得深度学习技术又焕发一春。

    1. 2006年,Hinton和他的学生在《Nature》上发表了一篇深度置信网络(Deep Belief Network,DBN)的文章,从此开启了深度学习(Deep Learning,DL)阶段,掀起了深度神经网络即深度学习的浪潮。
    2. 2009年,微软研究院和Hinton合作研究基于深度神经网络的语音识别,历时两年取得成果,彻底改变了传统的语音识别技术框架,使得相对误识别率降低25%。
    3. 2012年,Hinton又带领学生在目前最大的图像数据库ImageNet上,基于深度神经网络对图分类问题取得了惊人的结果,将Top5错误率由26%大幅降低至15%。(ImageNet 是一个计算机视觉系统识别项目,是目前世界上图像识别最大的数据库。是美国斯坦福的计算机科学家,模拟人类的识别系统建立的。能够从图片识别物体。)
    4. 2012年,由人工智能和机器学习顶级学者Andrew Ng和分布式系统顶级专家Jeff Dean领衔的梦幻阵容,开始打造Google Brain项目,用包含16000个CPU核的并行计算平台训练超过10亿个神经的深度神经网络,在语音识别和图像识别等领域取得了突破性的进展。该系统通过分析YouTube上选取的视频,采用无监督的方式训练深度神经网络,可将图像自动聚类。在系统中输入“cat”后,结果在没有外界干涉的条件下,识别出了猫脸。
    5. 2012年,微软首席研究官Rick Rashid在21世纪的计算大会上演示了一套自动同声传译系统,将他的英文演讲实时转换成与他音色相近、字正腔圆的中文演讲。同声传译需要经历语音识别、机器翻译、语音合成三个步骤。该系统一气呵成,流畅的效果赢得了一致认可,深度学习则是这一系统中的关键技术。
    6. 2013年,Google收购了一家叫DNN Research的神经网络初创公司,这家公司只有三个人,Geoffrey Hinton和他的两个学生。这次收购并不涉及任何产品和服务,只是希望Hinton可以将深度学习打造为支持Google未来的核心技术。同年,纽约大学教授,深度学习专家Yann LeCun加盟Facebook,出任人工智能实验室主任,负责深度学习的研发工作,利用深度学习探寻用户图片等信息中蕴含的海量信息,希望在未来能给用户提供更智能化的产品使用体验。
    7. 2013年,百度成立了百度研究院及下属的深度学习研究所(Institute of Deep Learning,IDL),将深度学习应用于语音识别和图像识别、检索,以及广告CTR预估(Click-Through-Rate Prediction,CTR),其中图片检索达到了国际领先水平。
    8. 2014年,谷歌宣布其首款成型的无人驾驶原型车制造完毕,将会在2015年正式进行路测。
    9. 2016年,谷歌旗下DeepMind公司开发的人工智能程序AlphaGo击败围棋职业九段选手李世石。
    10. 2017年,DeepMind团队公布了最强版AlphaGo,代号AlphaGo Zero,它能在无任何人类输入的条件下,从空白状态学起,自我训练的时间仅为3天,自我对弈的棋局数量为490万盘,能以100:0的战绩击败前辈。

    3 易混淆领域梳理

    3.1 机器学习与人工智能

    人工智能(Artificial Intelligence,AI)是计算机科学的一个分支,它企图了解智能的本质,生产出一种能比肩人类,并做出智能反应的机器。我们都知道机器学习是人工智能最重要的一种实现方法,但机器学习并不是人工智能一开始就采用的方法。人工智能的发展主要经历了逻辑推理,专家系统,机器学习三个阶段。

    1. 第一阶段的重点是逻辑推理,例如数学定理的证明,这类方法采用符号逻辑来模拟人类智能。
    2. 第二阶段的重点是专家系统,这类方法为各个领域的问题建立专家知识库,利用这些知识来完成推理和决策。比如将医生的诊断经验转化成一个知识库,然后用这些知识对病人进行诊断。
    3. 第三阶段的重点即为机器学习,如今的人工智能主要依赖的不再是逻辑推理和专家系统,而是建立在机器学习的基础上解决复杂问题。无论是基于数学的机器学习模型,还是基于神经网络的深度学习模型,都活跃在如今大多数人工智能应用程序之中。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.2 机器学习与深度学习

    深度学习(Deep Learning,DL)是机器学习的一个重要分支,深度学习和机器学习的关系属于继承和发展的关系。在很多人工智能问题上,深度学习的方法加上大数据的出现以及计算机运行速度的提高,更突出了人工智能的前景。比如,自动驾驶汽车,足以彻底改变我们的出行方式,它的实现就需要深度学习的图像识别技术,需要用到卷积神经网络(Convolutional Neural Networks, CNN)来识别马路上的行人、红绿灯等。
    为了更清晰的认识深度学习,我们首先介绍神经网络(Neural Networks, NN),顾名思义,它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。神经网络有输入层、隐藏层(中间层)以及输出层,其中输入层负责神经网络的输入,输出层负责产生输入的映射。机器学习中的逻辑回归,可以看作是一层的神经网络,即除了输入层、输出层之外只有一个隐藏层。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    而深度学习,就是指神经网络使用了很多隐藏层。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    那么深度学习的每一层都在学什么??

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    当你输入一张脸部的照片时,神经网络的第一中间层,可以看成是一个特征探测器或者边缘探测器,它会去找这张照片的各个边缘(第一张图片);第二中间层又把照片里组成边缘的像素们放在一起看,然后它可以把被探测到的边缘组合成面部的不同部分(第二张图片),有眼睛、鼻子等;最后再把这些部分放在一起,比如鼻子眼睛嘴巴,就可以识别或者探测不同的人脸(第三张图片)。

    3.3 机器学习与数据挖掘

    数据挖掘(Data Mining,DM)是指从大量的数据中搜索隐藏于其中信息的过程。机器学习是数据挖掘的重要工具之一,但数据挖掘不仅仅要研究、拓展、应用一些机器学习方法,还要通过许多非机器学习技术解决大规模数据与数据噪音等实际问题。大体上看,数据挖掘可以视为机器学习和大数据的交叉,它主要利用机器学习提供的技术来分析海量数据,利用大数据技术来管理海量数据。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.4 机器学习与统计学

    1.统计学简述

    统计学(Statistics)是基于数据构建概率统计模型并运用模型对数据进行分析与预测的一门学科。统计学依托背后的数学理论,在远早于机器学习大爆发的几十年,率先从解释因果的角度,努力寻找最优函数(或模型)。统计学里最重要的两个部分是回归分析和假设检验。其他的方法或者技术在统计学这个大框架下,最终也是为了这两者服务的。回归分析提供了解释因果的武器,假设检验则给这项武器装上了弹药。单纯的线性回归用最小二乘法求解逼近事实的真相,再使用显著性检验,检测变量的显著性、模型的显著性、模型的拟合精度。当然是否属于线性,也可以使用假设检验的方法检测。非线性回归的问题,使用极大似然估计或者偏最小二乘回归求解模型,后续的显著性检验仍然是一样的思路。

    2.机器学习与统计学对比

    统计学是个与机器学习高度重叠的学科,统计学近似等于机器学习。但是在某种程度上两者是有分别的,这个分别在于:统计学是理论驱动,对数据分布进行假设,以强大的数学理论解释因果,注重参数推断,侧重统计模型的发展与优化;机器学习是数据驱动,依赖于大数据规模预测未来,弱化了收敛性问题,注重模型预测,侧重解决问题。

    3.5 机器学习算法与“普通”算法的异同

    这里我们以《算法导论》中所诠释的算法作为机器学习算法的比较对象。其相同点,两者的目的都是通过制定目标,增加约束,求得最优的模型。不同点是《算法导论》里的“算法”,本质上是如何更有效率地求解具有精确解的问题。效率,可以是计算时间更短,也可以是计算过程所需要的空间更少。而机器学习算法要解决的问题一般没有精确解,也不能用穷举或遍历这种步骤明确的方法求解。这里需要强调的是“学习”这个属性,即希望算法本身能够根据给定的数据或变化的计算环境而动态地发现新的规律,甚至改变机器学习算法的逻辑和行为。

    作者:京东物流 星火团队

    来源:京东云开发者社区

    2023年5月,由 Stackoverflow 发起的2023年度开发者调查数据显示,PostgreSQL 已经超越 MySQL 位居第一,成为开发人员首选。PostgreSQL 在国内的热度也越来越高。6月17日,PostgreSQL 数据库技术峰会在成都顺利召开。本次大会以“新机遇、新态势、新发展”为主题,邀请众多行业大咖参与本次活动。PieCloudDB 产品总监陈金豹也受邀在大会中发表演讲《云原生虚拟数仓 PieCloudDB 的架构和关键模块实现》。 

    随着云计算时代的到来,云平台提供了近似无限丰富的计算资源,同时也使得计算成本极大的降低,释放出数据计算产生智能的更多机会。早在2019年,Gartner 便做出预测:数据库市场的未来在云上。随着云计算技术的发展,企业也都在向这一趋势靠拢,越来越多的将自己的业务数据往云上迁移。我们相信数据库的未来在云上,这也是我们打造 PieCloudDB 这款云原生数据仓库的原因。

    PieCloudDB 于2022年10月正式问世。它是一款云原生分布式数据仓库,提供完备的 SQL 语言支持,高效的分布式计算能力和完备的事务支持。同时又实现了单一数据集的多集群,秒级的弹性和只为必要的计算和存储付费的能力。 

    1. Why We Need PieCloudDB?

    1.1 NoSQL 和数据湖已不能满足用户的分析需求

    在过去的很长一段时间里,NoSQL + 数据湖解决方案在数据分析领域占据了主流市场,而 Hadoop、HDFS 等 NoSQL 数据库也是主要的数据分析平台。然而,随着 Cloudera 宣布停止对 CDH 技术支持,对 Hadoop 等 NoSQL 平台的质疑声音也越来越大。

    这一现象正是因为 NoSQL + 数据湖体系在复杂查询支持、高并发隔离性和一致性等重要数据分析特性方面存在明显不足,现有基于标准 SQL 的 BI 工具难以集成,且 NoSQL 本身对高级分析(如图形分析、地理信息分析等)的支持较弱。因此,NoSQL 开始被人们贴上“过时”的标签,不再占据数据分析领域的主要市场份额。 

    此外,基于 NoSQL 和数据湖的基础设施所需的分析工具不容易集成和部署。使用数据湖进行数据分析需要整合部署多个组件,而这需要大量的开发工作。由于缺乏对 ANSI SQL 的支持,用户通常需要具备专门的技术技能,并且需要承担较高的技术和成本要求。此外,平台所需的专用引擎/工具(如图形数据库)往往难以与记录系统集成,降低了数据分析的可操纵性和创新性。

    这些限制和挑战推动了对更强大、更易于集成、更易于使用的数据分析平台的需求。企业和组织越来越倾向于采用基于标准 SQL 的分析平台,这些平台能够满足用户广泛的分析功能、易于集成和部署等需求,并且与现有的数据存储和处理技术相兼容,对技术和成本的要求更低。

    1.2 以关系型数据库为基础的数据仓库很难适应云环境

    包括 Teradata、Greenplum 等众多主流传统数据仓库都是以关系模型来组织数据的关系型数据库。这些数据仓库具有许多优点,包括良好的 SQL 兼容性、高效运行复杂查询以及支持事务 ACID 特性。然而,这些传统的 MPP 数据库也存在一些缺陷,例如弹性性能较差、高可用性方面不够满足要求、数据孤岛等问题。

    这些问题导致传统的数据仓库在云环境中无法充分利用公有云的优势。公有云相对于私有环境具有许多优势,其中最显著的两个是:

    • 近乎无限的弹性计算资源:公有云提供了弹性计算资源,用户可以根据实际需求按需分配资源,并根据需要进行弹性扩缩容。用户可以根据业务需求申请所需的计算资源,而不需要维护和管理自己的硬件基础设施。
    • 廉价且无限容量的对象存储:公有云提供廉价且具有几乎无限容量的对象存储。对象存储的价格相对较低,可以为用户提供大规模的存储容量,帮助用户降低成本并提高效率。 

    为了更好地适应云环境并充分利用公有云的优势,新一代的数据仓库逐渐崛起。新一代云原生数据仓库具有云原生的架构设计,能够更好地利用公有云的弹性计算和对象存储能力。它们可以在公有云中快速部署和扩展,并提供高性能的数据处理和分析能力,以满足现代数据分析的需求。 

    1.3 一个兼顾关系型数仓和公有云优势的产品

    用户需要一个能够兼顾关系型数仓和公有云优势的产品,来适应云时代的到来。计算引擎方面,需要具有关系型数仓的众多优势,能够具备支持完备的 SQL 语言,具有高效的分布式计算能力,且能够具有完备的事务 ACID 特性。公有云特性方面,实现存算分离,提供弹性的计算集群,让用户得以只为必要的计算付费,充分利用公有云带来的优势。这就是 PieCloudDB 的设计目标。

    2. PieCloudDB 能给用户带来什么?

    作为新一代的云原生数据仓库,PieCloudDB 实现了云上数仓计算与存储的分离,兼顾了传统关系型数仓的众多优势和公有云带来的众多利好。

    2.1 对 SQL 的完备支持

    PieCloudDB 对 PostgreSQL 进行了重大改进,实现了分布式计算和存算分离的功能。并对锁、事务、日志、系统表和用户表的存储等模块进行了彻底重写,带来了颠覆性的变革。同时,PieCloudDB 也保留了 PostgreSQL 对 SQL 标准的完整支持,包括复杂查询如聚合(Agg)、子计划(Subplan)、子链接(Sublink)、外连接查询(Outer Join)、窗口聚合函数(Window agg)和物化视图(Materialized View)等。这些改进使得 PieCloudDB 能够提供更高效、更强大的查询功能,同时保持与 SQL 标准的兼容性。

    2.2 高效的查询优化和与之匹配的执行器

    PieCloudDB 实现了专为复杂查询设计的优化器和与之匹配的高效执行器。

    • 专为复杂查询设计的优化器

    PieCloudDB 的优化器提供了一系列全面的逻辑优化功能,其中包括谓词下推、子查询子连接提升和外连接消除等。此外,优化器基于纯粹的代价模型进行深度优化,在多阶段聚集过程中对每个节点进行代价估算,并利用动态规划等算法生成多条路径,最终选择代价最低的路径来执行查询。这些功能旨在提高查询性能和效率,从而优化 PieCloudDB 的查询执行过程。

    作为一款分布式数据库,PieCloudDB 需要实现众多分布式运算,包括多次数据重分布(reshuffle)和分布式聚合运算(agg)。为了能够在跨表查询时进行高效的分布式表连接,PieCloudDB 的优化器需要全面描述数据分布特性,以便进行分布式代价估算。

    通过全面的数据分布特性描述,PieCloudDB 的优化器能够考虑到数据在不同节点上的分布情况,从而更准确地估算跨表查询的代价。这使得优化器能够生成高效的查询计划,避免不必要的数据重分布操作,提高查询性能和效率。

    • 分布式环境高效执行器

    为了配合专为复杂查询设计的优化器,PieCloudDB 实现了高效的执行器,以在分布式环境下执行查询操作。通过采用多组别多阶段执行模型,并进行大量的数据交换,PieCloudDB 的执行器能够在分布式环境下高效地执行查询操作。这种执行模型可以充分利用分布式系统的计算资源,并提高查询的并行性和整体性能。同时,通过与优化器的紧密配合,PieCloudDB 可以根据优化器生成的查询计划特性来优化执行器的执行策略,进一步提高查询性能和效率。

    2.3 对事务(ACID)的完备支持

    PieCloudDB 提供了对事务的完备支持,包括事务的 ACID 特性:原子性、一致性、隔离性和持久性。

    • 原子性(Atomicity):PieCloudDB 确保事务中的操作要么全部成功完成,要么全部失败回滚。如果一个事务中的某个操作失败,那么该事务中的所有操作都将被回滚,数据库状态会回到事务开始之前的状态,保持数据的一致性。
    • 一致性(Consistency):PieCloudDB 在事务提交之前,会检查事务的操作是否符合预定义的约束和规则,以确保数据库的一致性。如果事务执行完成后,数据库仍然保持一致性,那么该事务被认为是成功的。
    • 隔离性(Isolation):PieCloudDB 支持两个常用的隔离级别:Read Committed(读提交)和 Repeatable Read(可重复读)。在 Read Committed 级别下,事务只能看到其他事务已经提交的修改,而在 Repeatable Read 级别下,事务在整个事务过程中能够看到一个一致的快照,不受其他并发事务的修改影响。
    • 持久性(Durability):PieCloudDB 确保一旦事务提交成功,其对数据库的修改将永久保存,即使发生系统故障或崩溃。这是通过将事务日志记录在稳定的存储介质上来实现的,以便在恢复过程中可以重放事务日志。

    通过提供对事务 ACID 特性的完备支持,PieCloudDB 提供了可靠和一致的数据管理机制。无论是在并发环境中还是在面临故障的情况下,PieCloudDB 都能确保数据的完整性和可靠性。

    2.4 极致的计算集群弹性

    PieCloudDB 具备极致的计算集群扩缩容能力,能够实现计算集群快速的扩展和收缩操作。PieCloudDB 的 Executor 节点并不持有持久化的数据,扩展和收缩操作不涉及数据的移动。此外,Executor 节点也不直接访问系统表、事务和锁。在进行计算集群的扩展时,PieCloudDB 只需要在新的虚拟机节点上部署二进制并向数据服务注册。这样的设计确保了扩缩容操作的高效性。

    PieCloudDB 为用户提供了一个独立的计算池,该计算池是为了支持快速的扩缩容而准备的。在这个计算池内,PieCloudDB 可以在一定范围内实现秒级的扩容和收缩操作。这意味着当用户需要增加计算资源时,PieCloudDB 可以迅速添加新的计算节点,使得整个集群能够处理更多的并发请求。反之,当用户需要减少计算资源时,PieCloudDB 也能够快速地收缩计算节点,以节省成本和资源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2.5 多集群与高可用

    PieCloudDB 支持多集群。用户可以在同一个数据集上起多个集群。在生产环境中,常常会遇到不同的部门对集群大小的需求不一样。这种情况下,如果只有单集群,就需要根据最大的集群需求来创建集群,造成资源的浪费。在多集群场景下,不同部门可根据自身需求创建不同大小的集群,任务结束时可以关闭集群,多个集群访问同一个数据集,并共享同一个 ACID 特性。

    由于 PieCloudDB Executor 是无状态的,当某个 Executor 出现故障,Coordinator 会执行下个 Query 时,由剩下的 Executor 来执行任务。此过程中,用户无感知,不会对业务产生影响。

    通过这些特性,PieCloudDB 在 OLAP 场景下,可以让用户像使用 PostgreSQL 一样使用 PieCloudDB。用户只需为已经发生的计算和存储付费。用户可以按需启动和关闭多个不同大小的集群,以适应不同类型的任务,从而取得性能和开发效率的平衡。

    3. PieCloudDB 云原生架构的实现

    为了适应云环境,PieCloudDB 实现了弹性伸缩的集群和多集群这两个主要的云原生特性,打造了完全无状态的 Executor 节点、独立的系统表和分布式的锁。

    3.1 虚拟数仓

    PieCloudDB 为了实现在扩缩容过程中无需移动数据,将用户数据分离到对象存储中。此外,Executor 节点上不存储系统表、事务和锁信息,而是依赖 Coordinator 来解决这些问题,从而使 Executor 节点成为无状态的节点,实现秒级扩缩容。

    为了实现 Multi-master 架构,并实现有状态的 Coordinator 节点,PieCloudDB 使用数据服务来完成这些功能。系统表以 Key-Value 的形式存储在 KV 数据库 FoundationDB 中,并通过 FoundationDB 的短时间、小体量的事务特性,实现了分布式锁和分布式事务。这样,PieCloudDB 能够在Coordinator 节点上处理分布式锁和事务,并保证系统的一致性和可靠性。

    通过这一系列的设计和操作,PieCloudDB 实现了完全无状态的虚拟数仓。用户可以根据需要创建和关闭虚拟数仓,而在扩缩容过程中无需移动数据,并且能够快速进行节点的扩展和收缩。这使得 PieCloudDB 能够高效地适应不同规模和负载的需求,并提供灵活的数据存储和计算资源管理。

    • 系统表:mStore

    PieCloudDB 将组以 Key-Value 的形式存储到 FoundationDB 中,并利用FoundationDB Key 的自然排序来实现索引。在 PieCloudDB 中,每个组都被编码为一个 Key-Value 对,其中 Key 表示组的索引信息,而 Value 则包含了组的数据内容。通过利用 FoundationDB Key 的自然排序,可以高效地进行范围查询和索引查找,从而实现快速的数据检索和访问。

    为了实现多版本并发控制,PieCloudDB 使用了 Xmin、Xmax 和 cid 等机制。Xmin 和 Xmax 记录了事务对组的可见性信息,其中 Xmin 表示最早可见的事务,而 Xmax 表示最晚可见的事务。cid(Commit ID)则表示事务的提交标识。通过这些机制,PieCloudDB 可以实现并发事务的隔离性和一致性,并支持多版本的查询和回滚操作。

    通过将组存储为 Key-Value 对,利用 FoundationDB 的自然排序和采用 MVCC 机制,PieCloudDB 能够高效地处理数据的存储、索引和并发访问,从而提供高性能和可靠的数据库服务。

    • 数据表:oStore

    PieCloudDB 通过将数据分离到对象存储(如S3)上,利用 oStore 构建了对象存储上的用户表。由于对象存储本身只支持插入(insert)和删除(delete)操作,而不支持更新(update)和追加(append)操作。PieCloudDB 在 mStore 中创建辅助表来实现 MVCC(多版本并发控制)的特性。

    在 mStore 的辅助表中,每 个 tuple 对应 oStore 的一个 block,oStore 的 block 中存储了一部分的用户数据。这样,辅助表的每个 tuple 的可见性就与对应的 block 的可见性相关联,从而实现了 MVCC 的特性。当执行更新(update)或删除(delete)操作时,PieCloudDB 会生成一个新的 block,将未发生变化的 tuple 放入新的 block 中,并将更新后的用户数据放入新的 block 中(例如,在 block 4 上执行更新操作后,生成一个新的block 5,将更新后的用户数据放入新的 block 5 中)。最后,辅助表将完成更新(update)操作。 

    通过这种设计和操作,PieCloudDB 能够在对象存储上实现 MVCC 特性,并通过辅助表来管理数据的版本和可见性。这使得 PieCloudDB 能够支持更新和删除操作,同时保持数据的一致性和并发控制的正确性。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    • 分布式锁和事务

    PieCloudDB 利用 FoundationDB 的事务提交冲突(commit conflict)机制来实现锁的共享区的正确访问,从而实现了分布式的锁。

    在 PieCloudDB 中,多个事务需要访问共享区时,它们会通过 FoundationDB 的事务机制进行竞争和协调。每个事务尝试获取锁并执行对共享资源的操作。如果多个事务同时请求同一个共享锁,FoundationDB 的事务提交冲突机制会确保只有一个事务能够成功获取锁并进行操作,而其他事务将被阻塞或回滚。

    通过利用 FoundationDB 的事务提交冲突机制,PieCloudDB 能够实现分布式的锁管理,确保对共享区的正确访问和资源的互斥操作。这种机制保证了多个事务之间的隔离性和一致性,避免了数据竞争和冲突的发生,并提供了可靠的分布式锁功能。

    此外,PieCloudDB 还在 FoundationDB 上实现了分布式的事务,并通过 mStore、oStore、分布式锁和事务的实现,构建了一个云原生的分布式架构。这样的架构能够提供高可靠性、高性能的数据库服务,并支持分布式的数据操作和管理。

    优秀的架构设计是一款数据库产品成功的第一步,OpenPie 研发团队将对 PieCloudDB 产品进行不断迭代,针对性能推出了聚集下推、预计算、Block Skipping 等功能,并很快将推出Time Travel、Branch、Data Sharing等系列提高用户的使用体验。PieCloudDB 将继续前进,在 eMPP 分布式专利技术、服务器无感知(Serverless)及 透明数据加密(TDE)等多项核心技术加持下,为企业构建高安全性,高可靠性,高可用性的「坚如磐石」的云原生虚拟数仓,助力企业实现数据价值最大化,欢迎关注! 

     

     


     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     

     

    Rainbond v5.14.2 版本,又称信创版本。从这个版本开始,开源用户也可以利用 Rainbond 管理符合信创要求的硬件计算资源。在这个版本中,产品团队将此前只在企业版产品中存在的信创相关功能拆分出来,融入到了开源产品路线之中。本文围绕如何在信创环境中将应用迁移上云这一主题,结合 Rainbond 信创版本的能力,给出可行的落地方案。

    向信创环境迁移应用的必要性

    信创产业即信息技术应用创新产业,是我国数字化转型的重要组成部分,也是关键基础设施的重要支撑。其核心在于通过行业应用拉动构建国产化信息技术软硬件底层架构体系和全周期生态体系,解决核心技术关键环节卡脖子的问题,为中国发展奠定坚实的数字基础。

    对一般的软件供应商而言,在面向党政军企售卖软件时,符合国产化信创要求已经逐渐成为无法绕过的硬性标准。即使是已经交付完成的软件,在后期的建设计划中,处于信创转型时期的党政军企也会提出向国产化信创环境中迁移的硬性要求。需求的背后总是隐藏着商机,掌握国产化信创背景下的应用迁移能力,将软件产品转化为信创应用是当下所有 ToB/ToG 信创应用供应商必须掌握的能力。Rainbond 信创版本在这样的场景中可以发挥极大的作用。

    信创硬件生态

    信创应用必须运行在国产化硬件和操作系统之上。国产化硬件生态中最重要的是 CPU 芯片,CPU 芯片的架构直接影响信创应用是否可以在国产化硬件上运行。目前主流的国产化 CPU 厂商包括飞腾、华为、龙芯、海光、兆芯等,其指令集集中在 、 以及自主性极高的 (MIPS 指令集的后继者) 之中。而指令集的不同,直接影响到信创应用是否需要重新编译来进行适配。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    不难看出,国产化 CPU 芯片的生态有这么几个特点:

    • 自主程度最强,但是其生态受限严重,短时间内无法很好的面向市场推广。
    • 海光、兆芯手持生态最为繁茂的 指令集授权,然而自主化程度最弱。 过于成熟稳定,前人大厦已成,很难在此基础上做出创新。
    • 华为、飞腾拥有 指令集授权,自主化程度适中,而且 生态正处于蓬勃发展中,可以和 生态掰一掰手腕。

    市场的反馈非常理性,在当前国内的 CPU 芯片市场中,飞腾在党政领域PC市占率领先,海光与鲲鹏占据运营商服务器主要份额。回到信创应用供应商的视角,如何打好 Arm 这张牌,将会是闯入国产化信创赛道的关键点。Rainbond 信创版本通过一云多芯能力,方便的纳管包括 Arm 在内的多架构集群。

    “一云多芯”统管Arm & x86集群

    顾名思义,一云多芯的异构集群,指的是在同一个集群中的计算节点中,其 CPU 芯片架构不唯一。

    一般情况下,CPU 芯片的架构都是基于 Intel 公司推出的 指令集,作为后起之秀的 AMD 也推出完全兼容 的 指令集,二者可以视为等同。而在国产化信创场景中,很多国产 CPU 架构都是基于 指令集开发,常见的鲲鹏920、飞腾芯片等都属于该架构类型。为了能够融入国产化信创 IT 生态,Rainbond 自信创版本开始,全面兼容了 架构。

    国产化信创绝非一朝一夕之事,大量在传统 架构下开发的应用都需要很长时间的调整甚至重构才能完全在国产化芯片上运行,一云多芯主打同时能够运行多种架构应用的能力,在国产化替代的过渡阶段中将发挥重大作用。

    Rainbond 信创版本可以在同个集群中统一管理和调度多种不同 CPU 架构计算节点,同时也可以借助多集群管理能力纳管多个单架构集群。超高的灵活性,可以让决策者自行决定异构计算资源的部署策略。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    除 Arm 架构之外,Rainbond 信创版本也兼容主流国产化软硬件,全面支持信创场景,并且获得了国内各大 CPU 厂商、操作系统厂商的认证。一体化管理信创应用的开发、运维、交付全流程,极大降低国产化信创场景下的应用管理成本。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    信创应用迁移难点

    对于信创应用供应商而言,从头开发一套信创应用并不是难事。我国信创生态已经日趋完整,无论是操作系统、开发工具还是数据库,都不存在空白区域,它们为全新信创应用的开发提供了全面的支持。真正的难点在于如何将已经运行在传统服务器中的遗留业务系统迁移到国产化信创环境中去。从传统的 跨越到 架构基本意味着业务系统中所有服务组件的重新编译,甚至重构。在保障业务连续性的前提下,完成传统应用向信创应用的转化是我们无法回避的课题。

    首先,让我们按照服务的开发语言、运行方式做个分类:

    解释型语言

    以 Python、PHP、Shell 为代表的解释型语言,也称脚本语言,是完全与 CPU 架构无关的。我们只需要提供能在信创环境中可用的语言解释器,即可在不改动一行代码的前提下将这种服务运行起来。

    字节码型的编译文件

    这种类型以 Java 语言编译出的 Jar、War 包为代表。Jar 、War 包是非常常见的软件交付物。由于其打包的是与 CPU 架构无关的字节码,最终运行由跨平台的 JVM 虚拟机负责,故而我们只需要提供能在信创环境中可用的 JDK 、JRE工具,即可在不改动一行代码的前提下将这种服务运行起来。

    编译型语言

    这里的描述是不严格的,因为字节码型的编译文件也产自编译型语言。在这里,我们特指的是以 C、C++、Golang 为代表的编译型语言,它们在编译时与 CPU 架构强相关,编译出的二进制产物只能在指定的 CPU 架构下运行。这一特性也意味着迁移过程必须经过重新编译,才可以在信创环境中运行起来。

    遗留业务系统向国产化信创环境迁移绝非易事,需要甲方与供应商的密切合作。然而由于遗留业务系统的特性,导致供应商能够提供的支持是不一样的。支持力度的不同,直接影响迁移的效果。

    提供支持

    当甲方决意对某个遗留业务系统进行信创迁移时,恰好供应商承诺的支持期限还没有到期,供应商可以对业务系统的迁移提供全面的支持时,问题会简单很多。即使是面对编译型语言,只要能够提供源代码进行重新编译,则可以完成信创迁移,只是耗时费力罢了。

    不提供支持

    当甲方决意对某个遗留业务系统进行信创迁移时,恰好供应商承诺的支持期限已经到期,甚至已经无法联系到供应商时,事情就难办许多。甲方对遗留业务系统的了解不会太深,只能找到软件交付物进行分析,重新基于信创环境搭建编译、运行环境。然而对有些经年日久的业务系统而言,很难找到当年的源代码,如果这个服务恰好是编译型语言编译出的二进制文件,基本意味着信创迁移走入了死路。此时,甲方不得不考虑重新招标另一家供应商来重构这个系统,新的替代系统落地绝非一朝一夕之事,期间不能因为这一个服务阻碍国产化信创的整体落地进程。

    Rainbond “信创” 版本的核心功能是支持传统应用在信创环境中的云迁移。它紧密关注用户所使用的不同语言类型,并自动化完成信创迁移的工作。一旦所有组件成功部署,通过内置的 ServiceMesh 微服务架构,可以实现跨架构的微服务编排,将服务组件连接起来形成完整的业务系统。

    传统应用迁移上云

    Rainbond 信创版本自动屏蔽架构差异,以最低成本将应用迁移到国产化信创环境之中。仅需要提供源代码,即可在指定架构环境中编译运行。开源应用商店提供不同架构的应用模板,上百种开源软件一键部署。信创应用供应商可以以最小的技术成本和时间成本,即可将不同类型的服务重新编译,并部署到信创环境中去。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    异构微服务编排能力

    Rainbond 信创版本凭借一云多芯管理能力, 可以在同个集群中统一调度管理不同 CPU 架构的计算节点。应用中的服务组件也可以按照要求部署到指定的架构中去。但是只有不同架构的微服务组件之间可以相互编排、相互通信,那么它们才能够成为一个有机的整体,形成完整的业务系统。同时也满足信创应用从传统的 向 国产化迁移的过渡期的特殊要求。

    借助于 Service Mesh 亦或是 Kubernetes Service 的能力,Rainbond 天生支持跨架构微服务之间的编排与通信。使用方法与 Rainbond 一直以来的拖拉拽拼积木式的微服务编排方法无异。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    在流程开始执行前,会进行采样判断,但在实际使用中,存在需要分析耗时较长链路的场景。基于此需求,1.1.1版本中新增了采样后置过滤。用户可以根据此功能点决定上报执行耗时较长的链路日志。 更多链路采集上报查看 链路采集上报

    例如,执行时间大于500ms的日志进行上报,否则本次采集日志。

     reporter.setSampleStrategy(new TraceSampleStrategy() { @Override public <T, S> boolean sampled2(EngineContext<T, S> ctx) { return ctx.escaped() > 500; } });

     

    实时视图

    Keka 是一个 macOS/iOS 端的应用程序,可以快速创建具有高压缩率的压缩文件,还支持从多种类型的文件中解压缩文件,其中包括 7z、ISO、DMG、TAR、ZIP 和 Bzip2 等类型的文件格式。

    Keka 1.3 近日正式发布,不过由于该版本在 RAR 提取方面存在严重问题,Keka 已紧急发布了 1.3.1 版本修复该问题。

    从现在起,Keka 将会改变版本号的迭代方式,未来的任何功能发布将增加次要版本,这就是为什么上一个版本还是 Keka v1.2.62,而现在是 v1.3.x 的原因。

    特性

    • 与 macOS 14 Sonoma 完全兼容
    • 新的 Kekafied 文件图标
    • 增加了验证压缩的功能
    • 增加了 DMG 加密支持和格式选择
    • 在 macOS 12+ 上增加了 AAR 加密/解密支持

    格式

    • 增加了 WebArchive 提取支持
    • 在首选项中增加了自动安装更新的检查
    • 增强了 AAR 压缩,以支持 macOS 12+ 上的多个文件/文件夹
    • 增强了 RAR 密码压缩的安全性
    • 增强了对多个扩展名的提取命名
    • 增强的 PDF 照片提取
    • 增强了 LHA/LZH 与旧版本的兼容性
    • 将 UNRAR从6.21-b1 更新到 6.21
    • 将 ZSTD 从 1.5.4 更新到 1.5.5

    更多详情可查看:https://github.com/aonez/Keka/releases/tag/v1.3.1

    Rainbond 信创版本发布,不改代码迁移到信创环境

    信创产业即信息技术应用创新产业,是我国数字化转型的重要组成部分,也是关键基础设施的重要支撑。而 Rainbond 长期深耕国产化 IT 生态,已经与多家国产 CPU 架构完成兼容性认证,能够在不同的架构下快速部署运行。现在为了全面降低应用系统向信创环境中迁移的技术成本,助力信创应用零成本迁移上云。Rainbond 专门针对国产化信创场景推出了 Rainbond “信创”版本。信创应用可以被轻松地发布成为适用于不同架构的应用模板,在国产化信创环境中一键安装。

    “一云多芯”,统一管理异构集群

    顾名思义,“一云多芯”的异构集群,指的是在同一个集群中的计算节点中,其 CPU 芯片架构不唯一。在之前的版本中,大家使用 Rainbond 主要管理的都是 的集群,这种单架构的集群在部署和使用时相对简单。但在信创环境下,就会面临如下问题:

    • 信创场景下,如何快速部署一套基于 的集群?
    • 传统 X86 应用如果未改造完成时,如何在信创场景下使用?

    在面对这类问题时,Rainbond 的解决思路如下:

    img

    首先,Rainbond 支持部署和管理多个单架构集群。你可以通过填写机器的 IP 地址,快速部署出一套 信创集群,你可以通过 Rainbond 单独部署 普通集群和 信创集群。并统一纳管,此时你可以用同一套源码,在两个集群中分别部署业务,用于验证业务在两种架构下的可用性。

    其次,传统 架构下开发的应用都需要很长时间的调整甚至重构才能完全在国产化芯片上运行,可能一套业务系统会同时存在已改造的模块和未改造的模块。如果使用多个单架构集群管理的方式,那么对于整套业务系统的管理和通信也会存在一定的问题。

    在这种情况下,“一云多芯” 就非常重要,业务已改造的模块和未改造的模块同时运行在多架构混合集群上,可以实现整套业务系统的统一管理和集群内通信,可以通过逐步改造,将业务完整迁移到 架构下。

    目前 Rainbond 也支持了 集群、 集群、混合架构集群的一键部署和管理。

    img

    国产化操作系统和芯片适配

    Rainbond 还是一个符合信创要求的一体化应用管理平台,兼容主流国产化 CPU,获得了国内各大 CPU 厂商的认证。同时与多个国产化操作系统进行了适配。目前 Rainbond 已适配的国产化 CPU 主要包含鲲鹏、龙芯、飞腾等;已适配过的国产化操作系统主要有超聚变、中科方德、统信软件、龙蜥操作系统、麒麟软件等。

    img

    img

    传统应用快速迁移到信创环境

    在传统应用迁移到信创环境的过程中,往往可以提供的介质有源代码、镜像、Jar、War包这几类,而对于这几类业务系统的迁移和部署,Rainbond 提供了以下解决方式:

    • 源代码:对于提供了源代码的应用系统,只需要提供代码托管地址,选择 架构,Rainbond 将自动配置合适的构建环境、运行环境,将其运行到对应的计算节点中去,基本可以实现不改业务代码,构建出对应架构的镜像。
    • Jar、War包:对于 Java 类型的业务而言,其 Jar/War 包本身与 CPU 架构无关,只要提供合适的运行环境即可。因此,只需要选择部署架构,Rainbond 将会自动将其打包成对应架构的镜像并运行到指定的计算节点中去。
    • 镜像:对于提供了 架构的容器镜像,通过指定 架构,就可以拉取对应版本的镜像并将其部署到对应的计算节点中去。

    应用市场机制全面支持 arm64 架构

    为了更好的助力信创应用、遗留业务系统零成本完成向国产化信创环境迁移,我们进一步拓展了云原生应用商店的功能,使其支持发布和安装 架构的应用。现在开源应用商店中已上架了 Mysql、Redis、Nacos 等可以在 架构下可以运行的信创应用。可以在 架构下一键部署和运行。

    img

    未来我们还将会逐渐把一些常用的中间件应用上架到开源应用商店,并在开源应用商店设立信创专区。同时也欢迎大家通过 Rainbond 的发布功能,一键制作出适合在 架构下安装的应用模板,并将其发布到开源应用商店,助力国产化信创迁移改造。

    如何安装?

    信创版本的安装和普通安装方式一致,如果你想在 架构下快速安装体验,你可以通过执行以下脚本一键部署和使用。

     

    如果需要搭建多架构混合集群,可以参考基于主机安装,主要流程如下:

    1. 首先运行起来 Rainbond 控制台容器,并注册登录
    2. 登录后,进入 平台管理 > 集群 -> 添加集群 -> 从主机开始安装 进入图形化安装页面
    3. 填写节点信息,此处不需要关注各个节点的 CPU 架构信息,只需要填写各节点 IP 即可
    4. 节点信息填写完毕后,根据页面提示复制节点初始化命令在集群内所有节点上执行
    5. 初始化完成后, 下一步,等待 Kubernetes 集群安装成功即可,待状态为 运行中 状态时进行下一步操作
    6. 勾选 我已阅读并已清楚认识上述注意事项 后, ,等待安装完成即可。

    如何使用?

    平台整体使用流程与体验和之前保持一致,对于信创方面的能力,可以参考官方文档的使用指南,它将详细指引你如何通过 Rainbond 轻松部署异构集群,并实现业务的快速迁移和高效管理。

    wecom-sdk 是开源的企业微信开放 API 的 Java 实现,是目前最完整的Java开源实现。经过近三年的迭代,目前已经实现了企业微信通讯录管理、上下游、客户管理、微信客服、素材管理、消息推送、企微机器人、身份验证、应用管理、OA办公相关接口,开发人员不需要很高的学习成本就能快速优雅地接入企业微信。本次更新的亮点是彻底拥抱Retrofit2这一优秀的网络请求框架,为未来增加更多的可能性;改善了过度依赖Spring Boot的局面,简化了底层依赖,同时也保证了向后的兼容性。

    仓库地址

    gitee: https://gitee.com/felord/wecom-sdk

    github: https://github.com/NotFound403/wecom-sdk

    特性

    • 支持多企业微信同时配置作业

    • 目前实现企业微信接口 200 多个,能满足大部分场景的需求

    • 全参数封装,入参、出参高度语义化封装,再也不担心组织参数、解析参数的问题

    • 实现统一回调,所有回调事件可集中异步处理,开发者只需要关心业务逻辑的处理

    • 由 SDK 接管 AccessToken 生命周期,开发者无需关心 Token 的管理。

    Maven 中央仓库坐标

    • 普通版本

     <dependency>  <groupId>cn.felord</groupId>  <artifactId>wecom-sdk</artifactId>  <version>1.1.0</version> </dependency>
    • 响应式版本

     <dependency>  <groupId>cn.felord</groupId>  <artifactId>rx-wecom-sdk</artifactId>  <version>1.1.0</version> </dependency>

    采用技术栈

    • Retrofit2

    • Rxjava3

    • Okhttp4

    • Jackson2

    • XStream

    🚀1.1.0 更新

    • 移除 Spring Boot 全面使用Retrofit作为Rest引擎

    • 移除无用依赖

    • 实现企业支付中的企业红包、向员工付款、对外收款

    • XML转换优化

    • 🐞 回调请求体参数错误修复 #I7ERVA

    • Okhttp 升级到 4.11.0

    • Jackson 升级到 2.15.2

    • 增加新的samples样例

    更新内容:

    [新增] layer 组件 btn 属性 style 配置,自定义按钮 Style。
    [新增] layer 组件 btn 属性 class 配置,自定义按钮 Class。
    [新增] select 组件 options 属性代替 items 属性。
    [新增] tree 组件 tail-node-icon 属性,用于设置尾节点图标,通过设置 false 关闭。
    [修复] table 组件 childrenColumnName 属性无效的问题。
    [修复] config-provider 组件 locales 属性 build 时的类型检测问题。
    [优化] layer 组件 layui-layer-btn0 素跟随主题色。
    [补充] table 文档 sort-change 事件说明。
    [补充] select 组件 items 属性说明。
    [过时] select 组件 items 属性,但仍生效。

    更多详情:http://www.layui-vue.com/

    SQL 审核工具 SQLE 2.2306.0 于今天发布。以下对新版本的 Release Notes 进行详细解读。

    文章主要分为以下三部分内容:

    一、SQLE 项目介绍

    二、新版本主要功能介绍

    三、完整的 Release 信息

    一、SQLE 项目介绍

    爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。目前支持各种数据库规则 700+。

    SQLE 获取

    类型 地址
    版本库
    https://github.com/actiontech/sqle
    文档
    https://actiontech.github.io/sqle-docs/
    发布信息
    https://github.com/actiontech/sqle/releases
    数据审核插件开发文档
    https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtodev
    在线体验-社区版
    http://demo.sqle.actionsky.com
    超级管理员:admin    密码:admin

    在线体验-企业版
    http://demo.sqle.actionsky.com:8889
    用户:admin    密码:admin

     

    二、新版本主要功能介绍

    【社区版】

    1. 新增 3 条 MySQL 规则

    根据业务需求,本期新增 3 条 MySQL 规则,分别为:

    1. 建表时,自增字段只能设置一个。

    2. 不建议对同一张表连接多次。

    3. 为至少一个索引添加非空约束。

     

    【社区版】

    1. 新增 3 条 MySQL 审核规则

    根据业务需求,本期新增 3 条 MySQL 规则,分别为:

    1. 建表时,自增字段只能设置一个;

    2. 不建议对同一张表连接多次;

    3. 为至少一个索引添加非空约束。

     

    2. 新增百度云 RDS MySQL 慢日志智能扫描

    本期新增百度云 RDS MySQL 慢日志智能扫描任务,配置后,SQLE 可以对百度云 RDS 实例上的慢 SQL 进行监管。通过 SQLE 平台给出的审核结果,用户可以有针对性地优化数据库性能。以下是简单的功能试用: 

    1. 前置操作:用户创建的百度云 RDS 实例需为双机高可用版本,并对实例开通慢日志。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     

     

     

     

     

     

     

     

     

    2. 在扫描任务列表页面,用户创建扫描任务,选择 MySQL 数据库类型,选择任务类型为百度云 RDS MySQL 慢日志,填写相关信息后,提交,完成扫描任务创建。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    • 实例 ID:百度云 RDS 实例的 ID;

    • Access Key为账号安全认证中的 Access Key,用于登录百度云 RDS,需要与 Secret Key 一同使用;

    • Access Secret Key账号安全认证中 Access Key 对应的 Secret Key;

    • 启动任务时拉取慢日志时间范围:扫描任务读取慢日志的时间范围,单位为小时,最大范围为 7 天;

    • 审核过去时间段内抓取的 SQL 审核该时间段内抓取到的慢 SQL,单位分钟;

    • RDS Open API 地址RDS 的地址前缀,用以调用 RDS 服务,需根据实例所在区域进行填写。如当前实例在华东 – 上海范围,则应填写 rds.fsh.baidubce.com

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3. 进入扫描任务详情,可查看扫描任务抓取到的慢 SQL。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    4. 立即审核,可查看对慢 SQL 的审核结果。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3. 在线输入 SQL 时,支持格式化 SQL

    创建工单场景下,在输入 SQL 时,通常会出现一长条的 SQL 语句,难以阅读和理解。为此,本期新增了对在线输入 SQL 进行格式化的功能,以提高 SQL 的可读性。以下是简单的功能体验:

    1. 进入创建工单页面,并输入一条 SQL。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2. SQL 美化,平台将对输入的 SQL 进行格式化。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    【企业版】

    1. 支持对 TDSQL InnoDB 模式数据源的工单审核及上线

    用户现在可以将 TDSQL InnoDB 模式数据源纳入平台的 SQL 审核管理中

    目前,平台已经支持对该数据源进行单审核,并支持 122 条审核规则。以下是简要的使用说明:

    1. 纳 TDSQL InnoDB 模式数据源之前,用户需在 SQLE 环境中配置最新的 TDSQL 插件,插件配置方法可参考数据库审核插件使用(https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse)。 

    2. 用户可以在 项目 -> 数据源管理 页面添加 TDSQL 数据源。在新增数据源时,需要选择数据库类型为 TDSQL For InnoDB,并填写相关信息,然后提交即可完成添加。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    添加数据源

     

     

     

     

     

     

     

     

     

     

     

     

     

    3. 用户可以进入工单列表页面, “ 创建工单 ” 按钮,选择添加 TDSQL for InnoDB 数据源,输入 SQL 并提交审核。最后, “ 创建 ” 按钮即可完成对 TDSQL 数据源的工单创建。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    2. 支持对 Mycat 类型的数据源的工单审核及上线

    用户现在可以将 Mycat 类型数据源纳入平台的 SQL 审核管理中。

    目前,平台已经支持对该数据源进行单审核,并支持 129 条审核规则。以下是简要的使用说明: 

    1. 纳管 Mycat 数据源之前,用户需在 SQLE 环境中配置最新的 Mycat 插件,插件配置方法可参考数据库审核插件使用(https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse)。 

    2. 用户可以在 项目 -> 数据源管理 页面添加 Mycat 数据源。在新增数据源时,需要选择数据库类型为 Mycat,并填写相关信息,然后提交即可完成添加。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3. 用户可以进入工单列表页面, “ 创建工单 “按钮,选择添加的 Mycat 数据源,输入 SQL 并提交审核。最后,” 创建 ” 按钮即可完成对 Mycat 数据源的单创建。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     

     

     

     

     

     

     

     

     

     

     

     

    3. 支持自定义操作记录过期时间

    SQLE 支持记录、展示和导出用户的操作记录,并且定期清理历史操作记录,默认的历史记录过期时间为 90 天。

    为了满足用户的自定义需求,SQLE 新增了配置入口,用户现在可以根据实际需求设置操作记录的过期时间。

    如果需要回收过期 30 天以上的历史操作记录,可以按照以下步骤进行操作:

    1. 平台管理员进入系统设置,查看全局配置,默认情况下,操作记录的过期时间为 2160 小时(90 天)。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     

     

     

     

     

     

     

    4. 支持更多 DB2 规则

    本期完善了对 DB2 规则的支持,目前已支持从 DDL 规范、DML 规范、DQL 规范、使用建议、命名规范及索引规范多个维度对 DB2 数据源上的 SQL 进行审核。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5. DB2 审核支持生成回滚语句

    新增 DB2 回滚语句功能:当用户在 DB2 数据源上进行 SQL 审核时,可查看执行语句对应的回滚语句。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    6. DB2 审核支持 SQL 上下文

    新增 DB2 的 SQL 上下文审核功能。

    用户在 DB2 数据源上进行 SQL 审核时,若同时输入多条 SQL,平台将结合 SQL 上下文,给出相应的审核意见。

    例如,如果用户在工单中输入了两条 SQL:创建一张新表 T11,并向其中插入一个新字段。在审核第二句 SQL 时,平台将模拟执行建表语句,并根据上下文给出相应的审核意见。因此,即使实际数据库中不存在表 T11,第二条 SQL 的审核结果也不会触发表不存在的告警。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    7. DB2 审核支持 SQL 分析

    新增 DB2 数据源上的 SQL 分析功能。

    现在用户可以在 SQL 审核时查看该条 SQL 语句的解析结果,包括执行计划、性能统计、表结构信息等。目前该功能仅支持对 DML 语句进行 SQL 分析。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    三、完整的 Release 信息

    【社区版】

    新特性

    • [#1589] 智能扫描任务支持百度云 RDS MySQL 慢日志

    • [#1584] 新增 3 条 MySQL 审核规则

    • [#1583] 支持 SQL 美化功能

    优化

    • [#1549] 界面优化

    • [#1597] 优化 scannerd 采集慢日志文件后上传 SQL 的流程

    • [#1592] 优化社区版页面上对于企业版功能的提示信息

    • [#1580] 优化规则加载流程

    • [#1563] 系统设置部分功能“开启”/“关闭”交互流程优化

    • [#1536] 界面优化,将成员设为项目管理员后,无需设置数据源及操作权限

    • [#1535] 删除规则模板时增加校验条件,限制被使用的规则模版可以被删除

    • [#1365] SMTP 配置新增配置项可关闭 SSL 安全认证

    Bug 修复

    • [#1614] 解决更新扫描任务时,无法移除数据源和数据库的问题

    • [#1618] 解决当工单为带上线状态时,无法中止上线的问题

    • [#1599] 修复 MySQL update 生成回滚语句有误的问题

    • [#1588] 修复智能扫描任务审核时报错”Error 1046: Data too long”的问题

    • [#1482] 修复慢日志扫描任务 SQL 详情出现空白 SQL,阻碍扫描任务执行的问题

    • [#1576] 修复审核规则”子查询不支持 LIMIT“可能出现 panic 的问题

    • [#1553] 修复 MySQL 审核规则“表中包含有太多的列”,在扫描任务中无效的问题;

    • [#1487] 修复重复安装 SQLE,钉钉无法收到审批的问题

    • [#1556] 修复 MySQL 规则”对条件字段使用负向查询”触发不成功的问题

    • [#1554] 规则“复合索引的列数量不建议超过阈值” 触发存在不成功的问题

    • [#1545] 修复 AuditPlanSQLV2 model 的 GetFingerprintMD5() 方法极小概率出现死循环的问题

    • [#1518] 智能扫描任务中,修复【SQL分析】操作返回的 “database not selected” 错误

    • [#1396] 即时通讯工具的配置加密保存

    【企业版】

    新特性

    • 支持对 Mycat 进行工单审核

    • 支持对 TDSQL MySQL 进行工单审核

    • 支持操作记录的过期时间配置

    • 支持更多 DB2 规则

    • DB2 审核支持 SQL上下文

    • DB2 审核支持生成回滚语句

    • DB2 审核支持 SQL 分析

    • DB2 审核支持基础对象验证

    优化

    • MySQL 智能扫描慢日志表采集优化

    Bug 修复

    • 修复添加白名单时在弹窗中无法输入 SQL 语句的问题

    • 修复 OB for MySQL TopSQL 存在空值导致智能扫描审核失败报错 “the node is empty after parse” 的问题

    • 修复智能扫描 MySQL 慢日志审核中 scanner 扫描慢日志文件时,当 SQL 存在换行则解析不完整的问题

    最新消息,powershell,10多年的癌症被治好了!

    问:癌症是指什么?

    答:
    powershell一直有个特性,它的管道会传递对象,请看:
    ‘abc’ | ForEach-Object {$_.toupper()} #返回ABC
    它管道传递的是【字符串对象】。它会把管道左面的【内容】强行对象化。这导致【二进制数据经管道传输】有问题。
    常见的问题场景是:管道下载图片损坏;压缩程序经管道传递损坏;二进制程序经管道import传递失败等。
    例:
    curl.exe https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png > a:pscodeTEMP_2023 emp152b.png
    输出的图片,和在网页上另存为的图片,大小不一致。内容也坏了。

     

    关于修复的版本:psv7.4-preview4

    上述命令,我在psv7.4-preview4中亲自试验。下载的文件和我用网页另存的文件,完全相同。
    建议去官网,下载安装psv7.4-preview4:
    https://github.com/PowerShell/PowerShell/releases

    问:和哪些管道相关?

    答: 和【|】,【>】相关。

    问:低于psv7.4-preview4的老版本,怎么解决这个癌症的?

    答:低于psv7.4-preview4,没解决这个癌症。
    缓解方法是:在powershell中用cmd /c,或bash -c。如:
    cmd /c “curl.exe https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png > a:pscodeTEMP_2023 emp152c.png”

    关于10年:

    https://github.com/PowerShell/PowerShell/issues/1908
    上述问题提交于7年前,但何止7年。powershell没开源之前一直就有这个问题。甚至超过15年了!

    相关链接:

    https://github.com/PowerShell/PowerShell/issues/1908
    https://github.com/MicrosoftDocs/PowerShell-Docs/issues/10134
    https://github.com/PowerShell/PowerShell/pull/17857

    这证明了,没有做不到,只有想不到。爱.net人,你要多给powershell贡献啊。别总想着白嫖。

    —谢谢观看,完—

    Oracle 开源了一个基于 BPF 的 Linux 参数自动调优工具 “bpftune”,这是一个自动配置器,可以监控 Linux 系统的工作负载并自动设置正确的内核参数值。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Linux 内核包含超过 1,500 个可调参数 ,bpftune 会随着系统的状态不断地自动调整多项参数,一切参数的更改都是轻量级且完全实时,无需重新启动设备即可生效。

    其主要好处是:

    • 使用 BPF(伯克利数据包过滤器)可观测性功能持续监控和调整系统行为。
    • 由于可以使用 BPF 观察系统状态的更多细节,因此可以在细粒度级别调整系统行为。

    目前 bpftune 可以自动调整的参数:

    • Congestion tuner: 自动调节拥塞控制算法的选择。
    • Neighbour table tuner: 在接近满载时通过增长表来自动调整 Neighbour table 的大小。
    • Route table tuner: 在接近满时通过增长表来自动调整路由表大小。
    • sysctl tuner: 监视 sysctl 设置,如果它与自动调整的 sysctl 值冲突,则禁用关联的调谐器。
    • TCP buffer tuner: 自动调整最大和初始缓冲区大小。
    • net buffer tuner: 自动调整与核心网络相关的可调参数。
    • netns tuner: 监控网络命名空间的添加和删除,有助于增强 bpftune 整体的命名空间感知能力。

       

    Oracle Linux 用户可以使用 DNF 包管理器轻松安装 bpftune。bpftune 代码在 GPLv2 许可下开源,可从 GitHub 仓库获取。

    AI 开发框架 BentoML 宣布了完成了 900 万美的种子轮融资,由 DCM 风险投资公司领投、Bow Capital 参投;资金将用于扩充产品体系和提升产品水平。DCM 的普通合伙人林欣禾(Hurst Lin)在此轮融资后加入了 BentoML 的董事会。

    BentoML 是一家成立于 2019 年专注于 AI 应用的开发者平台,总部位于旧金山;其联合创始人兼 CEO 杨超予曾是 Databricks 的早期软件工程师。BentoML 提供了一个高层次的 API,抽象出在云上运行 AI 模型所需的基础设施的细节,旨在使开发 AI 服务更加顺畅。具体来说,BentoML 的目标是训练人工智能模型的数据科学家、管理其生命周期的 DevOp 工程师、以及在模型之上实际构建应用程序的开发人员。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    杨超予在接受 TechCrunch 采访时表示,有了 BentoML,开发人员可以在短短两天内使 Visual ChatGPT 具有可扩展性和成本效益,供生产使用。用户还可以使用该框架在云端运行 Stable Diffusion 和开源的 LLMs。

    他还将 BentoML 与 Next.js 框架背后的开发商 Vercel 进行了比较,称 BentoML 的目标是成为人工智能领域的 Vercel。2021 年 Vercel 宣布完成 1.5 亿美金 D 轮融资,估值达 25 亿美金。

    杨超予预计,未来 AI 应用开发者将占平台用户的 90% 以上。“如果你一年前问我,我会说可能 90% 的公司会训练自己的模型,但最近出现的基础模型非常强大,即使给定一个从未见过的数据集,它们也能表现良好。开发人员现在不需要专注于模型训练,而是只需要进行微调和产品工程;这本身就构成了瓶颈,因为专注于 AI 的开发人员现在很短缺。”

    并袒露,蓬勃发展的 AI 市场对 BentoML 来说是一个福音,但快速变化的行业也让团队很难兼顾短期和长期目标。“你可能必须构建顺应当前趋势的东西,但从长远来看,我们当然希望拥有自己的护城河。问题是我们如何在两者之间平衡时间和人力资源。”

    在上个月的 Build 2023 大会上,微软宣布在 Windows 11 中加入名为 Windows Copilot 的 AI 助手。

    这是一个集成在操作系统中的侧边栏工具,可以帮助用户完成各种任务,如内容摘要、重写、解释等。微软表示,Copilot 可以让每个用户都成为高效能者,提升工作和学习效率。

    Copilot 并不会完全的取代目前 Windows 11 上的搜索功能,而是相对独立的存在,它有一个独立的按钮,用户后就能获得相应的 AI 能力。

    今日,微软通过 Dev Channel 向加入测试的用户 (Windows Insiders) 发布了新的 Windows 11 测试版——内置了 Windows Copilot 预览版。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    要体验 Windows Copilot,用户需要运行 Windows Build 23493 及以上版本, Microsoft Edge 版本需要 115.0.1901.150 及以上。

    用户只需任务栏上的新按钮 (or WIN + C) 即可启动 Windows Copilot。Windows Copilot 将使用 Microsoft 账户或 Azure Active Directory 账户登录。

    首个预览版的重点是集成 UI 体验,未来的版本会逐步加入额外的功能。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    如上图所示,Windows Copilot 作为侧边栏在屏幕右侧显示,不会与桌面内容重叠,并且可以在打开的应用程序窗口旁边正常运行,以便随时与 Windows Copilot 进行交互。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Dante Cloud 一款企业级微服务架构和服务能力开发平台,是采用领域驱动模型(DDD)设计思想的、全面拥抱 Spring Authorization Server 的、基于 OAuth2.1 协议的微服务架构。基于Spring Authorization Server 0.4.3、Spring Boot 2.7.13、Spring Cloud 2021.0.8、Spring Cloud Alibaba 2021.0.5.0、Nacos 2.2.4 等最新版本开发的多租户系统,遵循SpringBoot编程思想,高度模块化和可配置化。具备服务发现、配置、熔断、限流、降级、监控、多级缓存、分布式事务、工作流等功能

    平台定位

    • 构建成熟的、完善的、全面的,基于 OAuth2.1 的、前后端分离的微服务架构解决方案。
    • 面向企业级应用和互联网应用设计开发,既兼顾传统项目的微服务化,又满足互联网应用开发建设、快速迭代的使用需求。
    • 平台架构使用微服务领域及周边相关的各类新兴技术或主流技术进行建设,是帮助快速跨越架构技术选型、研究探索阶段的利器。
    • 代码简洁规范、结构合理清晰,是新技术开发应用的典型的、综合性案例,助力开发人员对新兴技术的学习和掌握。

    [1]、为什么更名为 Dante Cloud

    Dante Cloud (但丁), 原项目名称 Eurynome Cloud,很多朋友都反映名字太长、读起来拗口、不容易记等问题。因此在加入 Dromara 开源社区之际,将名字进行了变更。

    Dante,即但丁·阿利基耶里(公1265年-公1321年),13世纪末意大利诗人,现代意大利语的奠基者,欧洲文艺复兴时代的开拓人物之一,以长诗《神曲》(原名《喜剧》)而闻名,后来一位作家叫薄伽丘将其命名为神圣的喜剧。

    他被认为是中古时期意大利文艺复兴中最伟大的诗人,也是西方最杰出的诗人之一,最伟大的作家之一。恩格斯评价说:“封建的中世纪的终结和现代资本主义纪的开端,是以一位大人物为标志的,这位人物就是意大利人但丁,他是中世纪的最后一位诗人,同时又是新时代的最初一位诗人”

    更名为 Dante Cloud,寓意本项目会像恩格斯对但丁的评价一样,在行业变革的时期,可以成为一款承上启下,助力企业信息化建设变革的产品。

    [2]、版本说明

    自11月24日,Spring Boot 3.0 以及 Spring Cloud 2022.0.0 等全新版本发布,整个Java 社区也步入的 Java 17 和 Spring Boot 3 的新时代。紧跟 Java 技术和 Spring 社区的发展,让更多质量更好、性能更优的新特性服务于实际的开发工作,Dante Cloud 也同步进行升级及适配,开发了基于 Spring Authorization Server 1.1.1、Spring  Boot 3.1.1、Spring Cloud 2022.0.3、Spring Cloud Alibaba 2022.0.0.0-RC2、Spring Cloud Tencent 1.11.7-2022.0.1、Nacos 2.2.4 全新 Dante Cloud 版本。关注请移步 master 分支

    [3]、本次更新内容

    • 主要更新
      • [升级] Spring Boot 版本升级至 2.7.13
      • [升级] Spring Cloud 版本升级至 2021.0.8
      • [升级] spring-security-oauth2-authorization-server 版本升级至 0.4.3
      • [升级] nacos 版本升级至 2.2.4
      • [升级] Debezimu 版本升级至 2.3
    • 依赖更新
      • [升级] guava 版本升级至 32.1.0-jre
      • [升级] bcprov-jdk15to18 版本升级至 1.75
      • [升级] minio 版本升级至 8.5.4
      • [升级] wxjava 版本升级至 4.5.1.B
      • [升级] tencentcloud-sdk-java-sms 版本升级至 3.1.787
      • [升级] alipay-sdk-java 版本升级至 4.35.171.ALL
      • [升级] aliyun-sdk-oss 版本升级至 3.17.0
      • [升级] hutool 版本升级至 5.8.20
      • [升级] docker-maven-plugin 版本升级至 0.43.0
      • [升级] commons-io 版本升级至 2.13.0
      • [升级] guava 版本升级至 32.0.1-jre
      • [升级] redisson 版本升级至 3.22.1
      • [升级] logstash-logback-encoder 版本升级至 7.4
      • [升级] skywalking 版本升级至 8.16.0
      • [升级] minio 版本升级至 8.5.3
      • [升级] fastjson2 版本升级至 2.0.34
      • [升级] qiniu-java-sdk 版本升级至 7.13.1
      • [升级] aliyun-sdk-oss 版本升级至 3.16.3
      • [升级] jackson 版本升级至 2.15.2

    [4]、Dante Cloud 2.7.X 特点

    一、前端

    1. 未使用任何流行开源模版,使用全新技术栈,完全纯”手写”全新前端工程。
    2. 借鉴参考流行开源版本的使用和设计,新版前端界面风格和操作习惯尽量与当前流行方式统一。
    3. 充份使用 Typescript 语言特性,解决大量类型校验问题,尽可能规避 “any” 式的 Typescript 编程语言使用方式。
    4. 充份使用 Composition Api 和 Hooks 等 Vue3 框架新版特性进行代码编写。
    5. 充份利用 Component、Hooks 以及 Typescript 面向对象等特性,抽取通用组件和代码,尽可能降低工程重复代码。
    6. 对较多 Quasar 基础组件和应用功能组件进行封装,以方便代码的统一修改维护和开发使用。
    7. 对生产模式下,对基于 Vite3 的工程打包进行深度性能优化。
    8. 提供以 docker-compose 方式,对工程生产代码进行容器化打包和部署。
    9. 支持密码模式、授权码模式、手机短信模式、第三方社会化等多种登录模式。

    二、后端

    基于 深度定制和扩展:

    • 基于 和 实现多租户系统架构, 支持 Database 和 Schema 两种模式。

    • 基于 ,重新构建 基础数据存储代码,替代原有 JDBC 数据访问方式,破除 原有数据存储局限,扩展为更符合实际应用的方式和设计。

    • 基于 ,在 OAuth 2.1 规范基础之上,增加自定义 (密码)认证模式,以兼容现有基于 OAuth 2 规范的、前后端分离的应用,支持 Refresh Token 的使用。

    • 基于 ,在 OAuth 2.1 规范基础之上,增加自定义 (社会化登录)认证模式,支持手机短信验证码、微信小程序、基于JustAuth的第三方应用登录, 支持 Refresh Token 的使用。

    • 扩展 默认的 模式,实现 模式支持 Refresh Token 的使用。

    • 扩展 默认的 模式,实现真正的使用 Scope 权限对接口进行验证。 增加客户端 Scope 的权限配置功能,并与已有的用户权限体系解耦

    • 支持 认证模式

    • 支持 的标准的 JWT Token 加密校验方式外,新增基于自定义证书的 JWT Token 加密校验方式,可通过配置动态修改。

    • 支持 Opaque Token (不透明令牌) 格式及校验方式,将低 JWT Token 被捕获解析的风险。可通过修改配置参数,设置默认Token 格式是采用 Opaque Token 格式还是 JWT Token 格式。

    • 全面支持 OpenID Connect (OIDC) 协议, 系统使用时可根据使用需求,通过前端开关配置,快速切换 OIDC 模式和传统 OAuth2 模式

    • 深度扩展 、、 几种模式,全面融合 IdToken、Opaque Token、JWT Token 与现有权限体系,同时提供 IdToken 和 自定义Token 扩展两种无须二次请求的用户信息传递方式,减少用户信息的频繁请求。

    • 自定义 授权码模式登录认证页面和授权确认页面,授权码模式登录采用数据加密传输。支持多种验证码类型,暂不支持行为验证码。

    • 基于 JetCache 的多级缓存支持,实现自定义 二级缓存,有效解决 Spring Cache 查询缓存更新问题。
    • 全面整合 注解权限与 权限,通过后端动态配置,无须在代码中配置 权限注解以及权限方法,即可实现接口鉴权以及权限的动态修改。采用分布式鉴权方案,规避 Gateway 统一鉴权的压力以及重复鉴权问题
    • 采用分布式服务独立鉴权方案, 的权限注解、权限方法以及 权限,通过后端动态配置后,实时动态分发至对应服务。
    • 核心数据支持直连数据库获取和 远程调用两种模式。 直连数据库模式性能更优, 访问远程调用可扩展性更强。可通过配置动态修改采用策略方式。
    • 基于自定义 Session,混合国密 SM2(非对称) 和 SM4(对称加密) 算法,实现秘钥动态生成加密传输。利用“一人一码机制”,实现密码模式登录数据进行动态加密传输。配合 验证,保护接口调用和前后端数据传输的合理性及安全性。

    [5]、界面预览

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Dromara 开源社区

    一、社区愿景

    让每一位开源爱好者,体会到开源的快乐。

    二、社区官网

    https://dromara.org 是 Dromara 开源社区官方网站。

    三、成员项目

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    一、前言

    京东到家小程序最初只有微信小程序,随着业务的发展,同样的功能需要支持容器越来越多,包括支付宝小程序、京东小程序、到家APP、京东APP等,然而每个端分开实现要面临研发成本高、不一致等问题。

    为了提高研发效率,经过技术选型采用了taro3+原生混合开发模式,本文主要讲解我们是如何基于taro框架,进行多端能力的探索和性能优化。

    二、多端能力的探索

    1.到家小程序基于taro3的架构流程图

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    框架分层解释

    1.配置层:主要包含编译配置、路由配置、分包加载、拓展口子。

    2.视图层:主要完成App生命周期初始化、页面初始化、注入宿主事件、解析配置为页面和组件绑定事件和属性。

    3.组件库:是一个单独维护的项目,多端组件库包括业务组件和原子组件,可由视图层根据配置动态加载组件。

    
    

    4.逻辑层:包括业务处理逻辑,请求、异常、状态、性能、公共工具类,以及与基础库对接的适配能力。

    5.基础库: 提供基本能力,定位、登录、请求、埋点等基础功能,主要是抹平各端基础功能的差异。

    2、基础库

    1.统一接口,分端实现,差异内部抹平

    关于基础库我们采用分端实现的方式,即统一接口的多端文件。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    基础库如何对接在项目里,修改config/index.js,结合taro提供的MultiPlatformPlugin插件编译。

    
    

    业务里使用方式

    
    

    2.高复用

    基础库不应该耦合框架,那么基础库应该如何设计,使其既能满足taro项目又能满足原生项目使用呢?

    npm基础库 在taro经过编译后生成为 vendors文件

    npm基础库 在小程序原生项目npm构建后 生成miniprogram_npm

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    一样的基础库经过编译后会存在2种形态,多占了一份空间呢。

    我们对小程序包体积大小是比较敏感的,为了节约空间,那么如何让taro使用小程序的miniprogram_npm呢?

    先简单说一下思路,更改 webpack 的配置项,通过 externals 配置处理公共方法和公共模块的引入,保留这些引入的语句,并将引入方式设置成 commonjs 相对路径的方式,详细代码如下所示。

    
    

    3、组件库

    想要实现跨端组件,难点有三个

    第一:如何在多个技术栈中找到最恰当的磨平方案,不同的方案会导致 开发适配的成本不同,而人效提升才是我们最终想要实现的目的;

    第二:如何在一码多端实现组件之后,确保没有对各个组件的性能产生影响

    第三:如何在各项目中进行跨端组件的使用

    基于以上,在我们已经确定的以Taro为基础开发框架的前提下,我们进行了整体跨端组件方案实现的规划设计:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    在组件层面,划分为三层:UI基础组件和业务组件 为最底层;容器组件是中间层,最上层是业务模板组件;我们首先从UI基础组件与业务组件入手,进行方案的最终确认;

    调研过程中,UI组件和业务组件主要从API、样式、逻辑三个方面去调研跨端的复用率:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    经过以上调研得出结论:API层面仍需要使用各自技术栈进行实践,通过属性一致的方式进行API层面的磨平;样式上,基础都使用Sass语法,通过babel工具在转化过程中生成各端可识别的样式形式;逻辑上基本是平移,不需要做改动;所以当我们想做跨端组件时,我们最大工作量在于:API的磨平和样式的跨端写法的探索;

    例:图片组件的磨平:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    基于以上,跨端组件的复用方案经过调研是可行的,但是接下来,我们该如何保证转化后的组件能够和原生组件的性能媲美呢?我们的跨端组件又该如何在各个项目中使用呢?

    在这个过程中,我们主要调研对比两种方案:

    第一:直接利用Taro提供的跨端编辑功能进行转换,转换编译成RN . 微信小程序 以及H5;

    第二:通过babel进行编译,直接转换成RN原生代码,微信小程序原生代码,以及H5原生代码

    对比方向 原码大小 编译成本 生成的组件性能 Taro直接编译 大(携带了Taro环境) 中(Taro直接提供,但需要各端调试) 与原生相同 通过babel转义 小(只有当前组件的源码代码) 中(需要开发Babel转义组件) 与原生相同

    经过以上几组对比,我们最终选用了babel转义的方式。在项目中使用时,发布到Npm服务器上,供各个项目进行使用。

    方案落地与未来规划:

    在确认整体的方案方向之后,我们进行了项目的落地,首先搭建了跨端组件库的运行项目:能够支持预览京东小程序、微信小程序以及H5的组件生成的页面;以下是整个组件从生成到发布到对应项目的全部流程。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    目前已经完成了个5种UI组件的实现,4种业务组件;其中优惠券模块已经落地在到家小程序项目中,并已经沉淀了跨端组件的设计规则和方案。未来一年中,会继续跨端组件的实现与落地,从UI、业务层到复杂容器以及复杂页面中。

    4、工程化构建

    1.构建微信小程序

    因为存在多个taro项目由不同业务负责,需要将taro聚合编译后的产物,和微信原生聚合在一起,才能构成完整的小程序项目。

    下面是设计的构建流程。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    为了使其自动化,减少人工操作,在迪迦发布后台( 到家自研的小程序发布后台 创建依赖任务即可,完成整体构建并上传。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    其中执行【依赖任务】这个环节会进行,taro项目聚合编译,并将产物合并到原生项目。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    迪迦发布后台

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2.构建京东小程序

    yarn deploy:jd 版本号 描述

    
    

    3.构建发布h5

    yarn deploy:h5

    h5的应用通常采用 cdn资源 +html入口 这种模式。先发布cdn资源进行预热,在发布html入口进行上线。

    主要进行3个操作

    1.编译出h5dist产物,即html+静态资源

    2.静态资源,利用集成 @jd/upload-oss-tools 工具上传到 cdn。

    3.触发【行云部署编排】发布html文件入口

    关于cdn: 我们集成了cdn上传工具,辅助快速上线。

    
    

    三、性能优化

    性能优化是一个亘古不变的话题,总结来说优化方向:包下载阶段、js注入阶段、请求阶段、渲染阶段。

    以下主要介绍在下载阶段如何优化包体积,请求阶段如何提高请求效率。

    (一)体积优化

    相信使用过taro3的同学,都有个同样的体会,就是编译出来的产物过大,主包可能超2M!

    1.主包是否开启

    优化主包的体积大小 :optimizeMainPackage。

    像下面这样简单配置之后,可以避免主包没有引入的 module 不被提取到中,该功能会在打包时分析 module 和 chunk 的依赖关系,筛选出主包没有引用到的 module 把它提取到分包内。

    
    

    2.使用压缩插件 terser-webpack-plugin

    
    

    3.把公共文件提取到分包。

    mini.addChunkPages​为某些页面单独指定需要引用的公共文件。

    例如在使用小程序分包的时候,为了减少主包大小,分包的页面希望引入自己的公共文件,而不希望直接放在主包内。那么我们首先可以通过 webpackChain 配置 来单独抽离分包的公共文件,然后通过 为分包页面配置引入分包的公共文件,其使用方式如下:

    配置为一个函数,接受两个参数

    • 参数为 Map 类型,用于为页面添加公共文件

    • 参数为当前应用的所有页面标识列表,可以通过打印的方式进行查看页面的标识

    例如,为 页面添加 和 两个抽离的公共文件:

    
    

    4.代码分析

    如果以上方式,还达不到我们想要的效果,那么我们只能静下心来分析下taro的打包逻辑。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    .LICENSE.txt文件, 里面罗列打包了哪些文件,需要自行分析去除冗余。

    以下以vendors.LICENSE.txt 为例

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    •: webpack 运行时入口 ,只有2k,没有优化空间。

    •: node_modules 中 Taro 相关依赖,112k,可以魔改源码,否则没有优化空间。

    •: node_modules 除 Taro 外的公共依赖,查看vendors.js.LICENSE.txt文件分析包括哪些文件

    •: 项目中业务代码公共逻辑,查看 .js.LICENSE.txt文件分析包括哪些文件

    •app.js app生命周期中依赖的文件。查看app .js.LICENSE.txt文件分析包括哪些文件

    •app.wxss 公共样式文件 ,看业务需求优化,去除非必要的全局样式。

    •base.wxml 取决于使用组件的方式,可优化空间较小。

    (二)网络请求优化:

    相信大家的业务里有多种类型的请求,业务类、埋点类、行为分析、监控、其他sdk封装的请求。然而在不同的宿主环境有不同的并发限制,比如,微信小程序请求并发限制 10个,京东等小程序限制为5个。

    如下图,以微信小程序为例,在请求过多时,业务与埋点类的请求争抢请求资源,造成业务请求排队,导致页面展示滞后,弱网情况甚至造成卡顿。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    那么基于以上问题,如何平衡业务请求和非业务请求呢?

    这里我们有2个方案:

    1.动态调度方案 https://www.cnblogs.com/rsapaper/p/15047813.html

    思路就行将请求分为高优和低优请求,当发生阻塞时,将高优请求放入请求队列,低优进入等待队列。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    请求分发器 QueueRequest:对新的请求进行分发。

    ◦加入等待队列:正在进行的请求数超过设置的 threshold,且请求为低优先级时;

    ◦加入请求池:请求为高优先级,或并发数未达到 threshold。

    等待队列 WaitingQueue:维护需要延时发送的请求等待队列。在请求池空闲或请求超过最长等待时间时,补发等待请求。

    请求池 RequestPool:发送请求并维护所有正在进行的请求的状态。对外暴露正在进行的请求数量,并在有请求完成时通知等待队列尝试补发。

    2.虚拟请求池方案

    该思路是将微信的10个请求资源,分成3个请求池,业务请求:埋点类:其他请求的比例为6:2:2。比例可以自行调整。

    这样各类型请求都在自己的请求池,不存在争抢其他请求池资源,保障了业务不被其他请求阻塞。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    实现方式

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    方案对比

    优缺点 动态调度(方案一) 虚拟请求池(方案二) 拓展性 低 高 成本(开发、测试、维护) 高 低 请求效率 低 高

    2个方案都可以完成请求资源的分配,但结合业务实际采用的是虚拟请求方案,经测试在弱网情况下,请求效率可以提升15%.

    四、总结和展望

    未来一定是一码多端的方向,所以我们未来在基础建设上会投入更多的精力,包括框架层升级优化、基础库建设、组件库建设、工程化建设快速部署多端。

    在性能优化上我们还可以探索的方向有京东小程序分包预加载、分包异步化、京东容器flutter渲染、腾讯skyLine渲染引擎等。

    在团队沟通协作上会与Taro团队、京东小程序容器团队、nut-ui、拼拼等团队进行学习沟通, 也希望能与大家合作共建。

    五、结束语

    京东小程序开放平台是京东自研平台,提供丰富的开放能力和底层的引擎支持,目前有开发者工具、转化工具、可视化拖拽等多种开发工具可供内部研发同事使用,提升开发质量同时快速实现业务功能的上线。内部已有京东支付、京东读书、京东居家等业务使用京东小程序作为技术框架开展其业务。

    如您想深入了解和体验京东小程序,可前往京东小程序官网(https://mp.jd.com/?entrance=shendeng)查看更多信息。

    参考:

    https://www.cnblogs.com/rsapaper/p/15047813.html

    https://taro-docs.jd.com/docs/next/config-detail#minioptimizemainpackage

    https://taro-docs.jd.com/docs/next/dynamic-import

    https://zhuanlan.zhihu.com/p/

    作者:京东零售 邓树海、姜微

    来源:京东云开发者社区

    DragGAN 是由 Google 的研究人员与 Max Planck 信息学研究所和麻省理工学院 CSAIL 一起开发的项目,是一个非常直观的图像编辑工具,用户只需要控制图像中的像素点和方向,就可以快速调整照片主体的位置、姿态、表情、大小和角度等。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    下载预训练的 StyleGAN2 权重

    要下载预训练的权重,只需运行:

    sh scripts/download_model.sh

    运行 DragGAN GUI

    要启动 DragGAN GUI,只需运行:

    sh scripts/gui.sh

    此 GUI 支持编辑 GAN 生成的图像。要编辑真实图像,需要首先使用 PTI 等工具执行 GAN 反演。然后将新的潜在代码和模型权重加载到 GUI 中。

    Proton 是由来自欧洲核研究组织 (CERN) 的科学家于 2014 年在瑞士日内瓦创立的一家公司,其最知名的应该就是电子邮件服务 Proton Mail,主打端到端加密、安全和隐私保护。Proton 由科学家领导,其中包括万维网的发明者 Tim Berners-Lee。

    该公司曾于今年 4 月份宣布推出一个新的开源密码管理器 Proton Pass,但彼时处于封闭测试阶段,只有订阅了 Proton Lifetime 和 Visionary 计划的用户可以使用它。现在,他们则宣布面向全球推出 Proton Pass,可作为大多数主要浏览器(Chrome、Firefox、Edge、Brave 等)以及 iPhone/iPad 和 Android 上的浏览器扩展使用。

    Proton Pass 不仅仅是一个密码管理器,它还是一个身份管理器,这是一个更强大的概念。”

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Proton Pass 使用了端到端的加密技术来安全地存储用户数据。与一些密码管理器最大的不同在于,它不仅对密码字段进行加密,而且还对诸如用户名、电话、URL,甚至注释部分所包含的数据进行加密。

    Proton Pass 还允许用户创建“隐藏我的电子邮件别名”。根据介绍,电子邮件别名是随机生成的电子邮件地址,位于第三方(例如 Amazon、Facebook 或 Netflix)和用户的真实电子邮件帐户之间。这不仅可以防止第三方识别用户身份,而且可以在将消息转发到用户的主收件箱之前过滤掉跟踪器和其他营销工具。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    这些电子邮件别名还限制了数据泄露的影响,当用户使用“隐藏我的电子邮件”别名注册的网站受到黑客攻击时,所暴露的信息只有该别名,真实电子邮件地址将保持安全。“如果发生这种情况并且你开始通过该别名接收网络钓鱼电子邮件或垃圾邮件,只需将其禁用即可”。 

    Proton Pass 免费版本支持无限登录、无限加密笔记以及有限数量的隐藏我的电子邮件别名和 2FA 登录。付费订阅可以获得用于组织登录的额外保管库、无限制的电子邮件别名和无限制的 2FA 登录。

    更多详情可查看官方博客。

    外媒 TechCrunch 消息称,苹果公司成为首家在交易日收盘时市值达到 3 万亿美的上市公司,公司股价在本周五上涨约 2.31%,创历史新高。早在 2022 年 1 月,该公司的市值就曾首次短暂达到了 3 万亿美,但最终收盘时未能保持住这个水平。

    今年以来,苹果公司的股票已经暴涨了近 46%,与 2022 年的表现形成了鲜明的对比。今年 1 月份,苹果交易市值自 2021 年初以来首次跌破 2 万亿美。

    2022 年底,OpenAI 的 ChatGPT 首次亮相引发了一片 AI 炒作。从那时起,微软、谷歌、Nvidia 和 Meta 等公司纷纷加入人工智能浪潮。Nvidia 今年在标准普尔 500 指数中领先,跃升 181%;Meta 紧随其后,跃升了 137%。反观苹果,在竞争对手都在全力投入这项新兴技术的时候,该公司则鲜少提及 AI。

    在达到这一里程碑式估值前不久,苹果公司刚推出了其传闻已久的 AR 头盔 Apple Vision Pro。价值 3499 美,预计将于明年上市销售。尽管销售额和利润有所下降,但苹果公司 5 月份公布的第二季度收益也强于预期。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    值得注意的是,还有四家美国公司的估值超过了 1 万亿美,分别是 Alphabet、微软、亚马逊和 Nvidia。

    大家好,我是 Kagol。

    非常高兴跟大家宣布,2023年6月29日,OpenTiny Vue 发布了 v3.9.0 🎉。

    OpenTiny 每次大版本发布,都会给大家带来一些实用的新特性,5.18 我们发布了 v3.8.0 版本,推出了一套全新的极客黑主题。

    🎉OpenTiny 3.8.0 正式发布:推出「极客黑」新主题!

    本次 3.9.0 版本主要推出以下新特性:

    • 新增 Drawer 抽屉组件
    • 新增 Guide 引导组件
    • 新增 PopConfirm 气泡确认框组件
    • 支持 SSR 服务器端渲染

    OpenTiny 新增了一名贡献者 @KevinAndrewDong,感谢 对 OpenTiny Vue 3.9.0 版本的贡献🤝

    大家可以更新 进行体验!

    Drawer 抽屉

    3.9.0 版本之前,大家要使用抽屉组件,需要使用 Dialog 组件的 right-slide 属性。

     

    效果如下:

    dialogbox.png

    由于抽屉组件没有一个单独的 Drawer 组件,大家在咱们的组件库官网搜索 或者 等关键字时,搜索不到这个组件,经常有人问我们有没有抽屉组件。

    另外由于 DialogBox 组件的 属性只能配置从右侧进行弹出,如果有用户想要从左边弹出就没法支持啦。

    出于以上原因,我们决定单独抽取一个 Drawer 组件,包含丰富的功能:

    • 支持4个方向弹出抽屉
    • 支持定制抽屉宽度,以及动态拖拽改变抽屉的宽度
    • 支持 default/header/footer 等丰富的插槽

    更多丰富的功能可以在 OpenTiny 官网体验,也可以尝试单独安装 Drawer 组件进行体验。

    安装 OpenTiny 的 Drawer 组件

     

    在 App.vue 中使用

     

    效果如下:

    drawer.png

    Guide 引导

    当我们的产品推出一个比较复杂的新特性时,一般会在用户第一次使用产品时弹出一个用户指引,让用户更好地使用我们的产品,提升用户体验和满意度。

    这时就需要用户指引组件 Guide,OpenTiny 的 Guide 组件效果如下:

    guide.png

    使用方式也很简单:

     

    效果如下:

    2023-07-01 13.44.38.gif

    PopConfirm 气泡确认框

    PopConfirm 组件用于删除确认提示等场景,基于 Popover 组件进行封装。

    使用起来很方便:

     

    效果如下:

    PopConfirm.png

    支持 SSR

    为了扩展 OpenTiny Vue 组件库的使用场景,支持在 Vitepress、Nuxt 等 SSG/SSR 场景中使用,我们在 3.9.0 版本中增加了对 SSR 的支持,欢迎大家体验。

    更多版本特性,请查看以下链接:https://github.com/opentiny/tiny-vue/releases/tag/v3.9.0

    关于 OpenTiny

    OpenTiny 是一套华为云出品的企业级组件库解决方案,适配 PC 端 / 移动端等多端,涵盖 Vue2 / Vue3 / Angular 多技术栈,拥有主题配置系统 / 中后台模板 / CLI 命令行等效率提升工具,可帮助开发者高效开发 Web 应用。

    核心亮点:

    1. :使用 Renderless 无渲染组件设计架构,实现了一套代码同时支持 Vue2 / Vue3,PC / Mobile 端,并支持函数级别的逻辑定制和全模板替换,灵活性好、二次开发能力强。
    2. :PC 端游80+组件,移动端游30+组件,包含高频组件 Table、Tree、Select 等,内置虚拟滚动,保证大数据场景下的流畅体验,除了业界常见组件之外,我们还提供了一些独有的特色组件,如:Split 面板分割器、IpAddress IP地址输入框、Calendar 日历、Crop 图片裁切等
    3. :组件支持模板式和配置式两种使用方式,适合低代码平台,目前团队已经将 OpenTiny 集成到内部的低代码平台,针对低码平台做了大量优化
    4. :提供了基于 Angular + TypeScript 的 TinyNG 组件库,提供包含 10+ 实用功能、20+ 典型页面的 TinyPro 中后台模板,提供覆盖前端开发全流程的 TinyCLI 工程化工具,提供强大的在线主题配置平台 TinyTheme

    联系我们:

    • 官方公众号:
    • OpenTiny 官网
    • Vue 组件库(欢迎 Star 🌟)

    往期文章推荐

    • 🎉OpenTiny 3.8.0 正式发布:推出「极客黑」新主题!
    • 🌈使用 TinyCLI 两行命令创建一个美观大气的 Admin 系统
    • 🌈一个 OpenTiny,Vue2 Vue3 都支持!
    • 🌈历史性的时刻!OpenTiny 跨端、跨框架组件库正式升级 TypeScript,10 万行代码重获新生!
    • 🌈OpenTiny 的这些特色组件,很实用,但你应该没见过

    ShopWind 多商户商城系统 v4.2 发布更新,PHP+MySQL,服务端 Yii2 框架,移动端 uniapp。使用 vue3/vite、Element Plus UI、 axios 数据请求、页面异步加载。 本次更新新增虚拟商品,服务类型商品,虚拟商品,支持线下到店二维码核销,无需发货,修复优化了 webIM 客服系统等多项。

    移动端预览:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    平台后台预览

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    新增部分功能如下:

    1. 产品发布新增商品类型选择(实物商品、服务商品、虚拟商品)。实物商品:走常规的发货物流流程;服务商品:线下到店二维码核销,无需发货,下单无需收货地址;虚拟商品:无需收货地址,虚拟发货,如软件行业,充值卡券

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2. 新增api接口,服务商品订单核销接口。

    3. 新增服务商品订单核销二维码,买家订单展示二维码,商家通过扫码核销。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4. WebIM客服聊天增加回车发送消息,支持表情、图片上传,支持回话窗口展示订单。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5. 演示数据增加完整地区数据。数据库表region(地区表)字段增加letter(首字母)

    6. 页面装修支持自定义新增新的页面,pc端,移动端均支持自定义增加新页面,增加新页面diy可视化组件编辑页面,发布新的页面。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    7. 优惠券新增领券页面,增加作废操作

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    … … …

    PC 端预览

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    商家管理预览

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    自定义页面装修预览

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    演示体验

    • 后台体验: https://v4.shopwind‍.net/admin 平台管理员账号:admin 密码:

    • 前台体验: https://v4.shopwi‍n‍d.net 自行微信登录、、支付宝登录

    • 商家体验: https://v4.shopwind.n‍et/seller/login 商家测试账号: 密码:

    移动端体验

    • H5 端体验: ‍https://v4.shopwind.net/h5
    • Android(安卓版)体验: 下载安装
    • iOS(苹果版)体验: https://apps.apple.com/cn/app/id 

    扫码体验其他端

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    更新内容如下:

    • 新增商品类型(实物商品、服务商品、虚拟商品)
    • 新增订单列表中筛选参数(商品类型)条件筛选
    • 新增服务商品订单核销二维码
    • 新增服务商品订单核销接口
    • 新增虚拟商品订单发货流程处理
    • 新增数据库表 region(地区表)字段增加 letter(首字母)
    • 新增管理后台增加对上传图片 / 文件的格式和大小控制
    • 新增 WebIM 客服聊天增加回车发送消息
    • 优化移动端购物车页将商品购买数量修改为 0 后,即快速删除该商品
    • 优化移动端价格显示问题,去掉价格数据未获取时显示 “0.00”
    • 优化发货模块,增加对服务商品,虚拟商品的发货流程兼容
    • 优化微信 JSAPI 获取微信签名错误提示
    • 修复 pc 端频道页在没有安装演示数据(或没有商品分类)的情况下加载有误的问题
    • 修复移动端新增 / 编辑收货地址出现重复 “加载中” 提示
    • 修复移动端瀑布流商品列表数据显示有误的问题
    • 修复移动端购物车页加入商品后,回到购物车页面不刷新问题,以及没有购物车商品时页面报 js 错误
    • 修复移动端商品详情页输入购买数量未保存的问题

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    web 文件传输工具( trzsz.js 组件 )发布 v1.1.1 ,做了一些细节上的优化。


     trzsz (trz /tsz) 是一个兼容 tmux 的文件传输工具,和 lrzsz ( rz /sz ) 类似,并且有进度条,支持目录传输,支持拖动上传。

    https://github.com/trzsz/trzsz.js 支持在 web 浏览器中使用类似 rz /sz 上传和下载文件,也支持 electron 开发的跨平台应用。


     版的 trzsz.js,可以在 Chrome 浏览器中使用 trzsz (trz /tsz) 上传和下载文件,如图:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     版的 trzsz.js,可以集成到 electron 开发的终端中,使用 trzsz (trz /tsz) 上传和下载文件,如图:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Calibre 开源项目是 Calibre 官方出的电子书管理工具。它可以查看,转换,编辑和分类所有主流格式的电子书。Calibre 是个跨平台软件,可以在 Linux、Windows 和 macOS 上运行。

    Calibre 6.22 现已正式发布,此次更新内容如下:

    New features

    • Kobo driver:添加对最新固件的支持
    • Trash bin:允许将已删除的书籍设置为在图书馆关闭时永久删除
    • Windows:当文件/文件夹被另一个程序锁定时,出现更好的错误消息

    Bug 修复

    • PDF Output:修复了将具有大量内部 HTML 文件的书籍转换为 PDF 时导致速度大幅下降的回归问题
    • CHM Input:修复使用不支持的片段的 ToC entries
    • E-book viewer:修复搜索隐藏文本旁边的文本不滚动到匹配项的问题
    • E-book viewer:修复了当选择内容位于顶行时,某些平台上的某些书籍不显示选择弹出窗口的问题
    • DOCX Output:修复输入文档中的多个 SVG 图像,导致输出中的所有 SVG 图像只是输入图像之一
    • MOBI Input:忽略 trailing bytes 中另一种形式的损坏

    更多详情可查看:https://calibre-ebook.com/whats-new

    Semi Design 是现代、全面、灵活的设计系统和 UI 库,由字节跳动抖音前端与 UED 团队设计、开发并维护,是一款包含设计语言、React 组件、主题等开箱即用的中后台解决方案,可用于快速搭建美观的 React 应用。

    Semi Design v2.38.0 现已发布,此版本带来如下更新内容:

    • 【Fix】
      • 修复 AutoComplete 长按无法选中,onSelect 未触发问题 #1665
      • 修复 Cascader 禁用态 Tag 背景色与其他输入类组件不一致问题 #1651
      • 修复 min-Width 属性大小写拼写错误导致的 warning,影响范围 (2.37.0-beta.0 – 2.38.0-beta.0) #1680
      • 修复 tooltip 在 custom trigger 的情况下,特殊场景小概率不消失的问题 #1676
      • 修复在 changeWithObject 时的 Select 中,treeData 中的 id 项无法出现的 onChange 回调的 value 值中问题 #1678
    • 【Design Token】
      • Toast padding token 拆分细化,$spacing-toast_content-paddingY 拆分为 $spacing-toast_content-paddingTop、$spacing-toast_content-paddingBottom,$spacing-toast_content-paddingX 拆分为 $spacing-toast_content-paddingLeft、$spacing-toast_content-paddingRight #1674

    更新说明:https://github.com/DouyinFE/semi-design/releases/tag/v2.38.0

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    背景

    前端文件上传本来是一个常规交互操作,没什么特殊性可言,但是最近在做文件上传,需要实现截图粘贴上传,去找了下有没有什么好用的组件,网上提供的方法有,但是没找完整的组件来支持cv上传,经过了解发现可以用剪贴板功能让自己的cv实现文件上传,于是自己就整合了目前几种文件上传的交互方式,码了一个支持cv的vue3文件上传组件(造个轮子)。

    介绍

    作为一个完整的组件内容还是挺多的,这里主要介绍下上传交互中一些主要功能,包括上传的几种交互方式,

    上传进度的获取,上传类型的限制,默认上传请求和自定义上传请求。

    以下代码都是非完整代码,大家用于参考实现过程,可以通过以下代码修改来完成自己想要的交互功能。

    几种交互

    1,选择上传

    选择是最常见的上传交互,之前原生上传控件,样式修改比较麻烦,为了修改上传样式,我们可以把该控件设置隐藏,用其他素通过从click交互, 来触发该文件选择控件。在选择文件控件上绑定onchange事件,该控件在change后获取到文件,然后调用上传方法,实现如下:

    
    

    2,拖动上传

    拖拽文件上传,首先在页面上建立一个拖放区域,在拖放区域上绑定拖放事件,监听拖放事件drop内容中datTransfer中是包含files,如果存在files,获取files然后调用上传附件方法。

    拖放区域可以通过事件dragover来检查拖放文件是否进入拖放区域来设置拖放区域悬浮样式,通过dragleave来检查离开拖放区取消悬浮样式。

    进行交互提示

    实现如下:

    
    

    3,复制上传(复制检测区域设置)

    复制上传的交互步骤

    •将文件保存到剪贴板: 执行键盘快捷键或者使用鼠标复制

    •将鼠标移动到可粘贴区: 判断是否移动到可粘贴区,来确定是否在执行粘贴后上传,否则整个页面都会作为粘贴区,

    •执行粘贴操作:执行键盘粘贴快捷键(ctrl+v)

    粘贴区绑定paste事件,在触发paste事件前将鼠标移到粘贴区,复制会被检查不在粘贴区,阻止上传操作,实现如下:

    
    

    上传模式

    根据以上三种交互,大家可自由组合上传形式,比如和拖拽,拖拽和粘贴组合等等,我这边目前按,拖拽,粘贴叠加组合,设置为:

    •上传,click

    •拖拽上传 drag(包括上传和拖拽上传)

    •粘贴上传 paste (包括,拖拽和复制上传)

    通过传参 uploadeMode设置 (click, drag, paste)

    组件设置:

    
    

    组件应用

    
    

    文件限制

    文件限制包括是否多文件上传限制multiple, 上传数量limit限制,上传类型accept限制,这些设置参考了element-plus上传组件,在其基础上做了简化。实现如下

    multiple 和 accept 首先需要在控件上绑定,以便于在选择上传时就能够过滤对应文件,拖拽上传和粘贴上传,无法通过input[type=file] 组件控制需要在上传方法中判断过滤,(以粘贴上传为例)

    组件实现

    
    

    上传进度设置

    获取文件上传进度,使用ajax中的progress 事件监听机制,回传数据loaded进度,和ttotal进行计算,获取到计算的百分比通过process插槽线上在界面上。

    具体实现如下:

    组件实现

    文件限制后执行组件上传,默认情况下走内置的上传方法,如果做了自定义,上传进度也需要自己实现(自己实现过程可以参考内置方法中的实现)

    
    

    同样文件上传成功,异常等方法也可以通过监听load并且判断 xhr.status 来实现,

    
    

    组件使用

    •配置获取进度数据回调函数 onProgress

    •配置接收回传的进度数据进行赋值

    •配置进度条插槽显示进度数据

    
    

    自定义上传请求

    默认情况下,不需要自定义上传请求,组件内置了上传请求,如果个人有需求可以自定义上传请求,子定义上传请求,是在文件限制流程后,检查是否有自定义请求方法,如果存在就将文件传入自定义请求方法。

    组件实现:

    
    

    组件应用:

    注意点: 通过自定义上传方法实现时,在原来组件上的属性action无效

    
    

    总结

    通过以上可以实现一个支持多种交互方式的文件上传组件,同时也将element-plus中文件上传的流程做了一个学习,因为该组件的实现过程就是参考了element-plus的实现,在element-plus上传的基础上添加了粘贴上传交互, 该组件的实现重在交互方式,各个样式风格通过插槽自定义。

    作者:京东物流 刘海鼎

    来源:京东云开发者社区

    di18n  是滴滴开源的自动转换、基于配置的前端国际化方案。它能自动扫描代码中的主语言,将其替换成国际化标记;同时将语言抽取成配置,可以放到服务端保存及更新。

    工作原理

    di18n 会先按如下步骤扫描源码:

    • 使用 Babel 解析得到 AST,遍历 AST,并对特殊的节点进行检查,抽取出需要翻译的字符串;
    • 自动为每一个字符串分配一个 key 因随机 key 可读性差,已改成使用主语言(如中文)文案为 key;
    • 自动调用 Google 翻译服务(可选),得到一个英文的字符串。

    注:对于 React,上面提到的特殊节点包括:    等。

    扫描之后,对于源代码:

    • 构造  表达式 
    • 替换原有节点 
    • 将新的 AST 通过 Babel 转换为代码;
    • 使用 Prettier 格式化代码;
    • 将新的代码落盘。

    对于国际化资源:

    • 将 key-value 转换为 i18n 配置文件格式。

    流程图

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    安装

     

    初始化

    React

     

    注意: 需要将配置文件 di18n.config.js 的  改为 

    Vue

     

    转换

     

    时至今日,Linus Torvalds 实际上已经很少会亲自动手写内核代码;更多的是忙于监督上游的内核开发社区、审查代码、管理发布,并在邮件列表中进行讨论。不过近日,他就为 Linux 6.5 进行了将近 500 行的 code rework ,以改进用户模式的堆栈扩展代码

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    他在合并报告中解释称:

    这修改了我们的用户模式堆栈扩展代码,使其在修改 VM 布局之前始终获取 mmap_lock 进行写入。

    实际上这是我们在技术上应该做到的事情,但是因为我们并不严格地需要它,所以我们有点偷懒(”机会主义”听起来好多了,不是吗?)。并且在我们需要的地方设置了这个 hack,会在不进行适当锁定的情况下就地扩展堆栈 vma。

    而且效果很好。我们只需要改变 vm_start(或者,在 grow-up stacks 的情况下,vm_end),再加上一些使用 anon_vma 锁和 mm>page_table_lock 的特殊的临时锁,这一切都相当简单明了。

    也就是说这一切都很好,直到 Ruihan Li 指出,现在 vma 布局使用 maple tree code,我们真的不只是改变 vm_start 和 vm_end 了,而且 locking 真的被打破了。

    一劳永逸地解决这个问题并做适当的 locking 其实并不可怕,但有点痛苦。 我们基本上有三种不同的堆栈扩展情况,它们的工作方式都略有不同。

    目前,Linux 6.5 中的这个问题应该已经得到了解决。更多详情可查看此处。

    上海一游戏公司三名离职员工利用职务之便,盗取了公司开发的手游源代码;并“换皮”成新游戏上线,半年内成功盈利 1.5 亿。

    事情的起始经过具体为,该公司在 2022 年 11 月发现网上出现了一款与自家产品十分类似的游戏,让他们开始怀疑是否存在源代码泄露问题,于是向公安进行了报案。警方立案调查后发现,最初开发该游戏的员工有较大嫌疑。

    据悉,这三名离职员工曾是该公司手游的开发人员;游戏上线后收获了不错的热度,他们也因此获得了丰厚的提成。之后,3 人向公司提出开发升级版的新游戏,但遭到了管理层的否定。这致使他们产生了离职自行发展的想法,并在深圳注册了一家公司。

    三人在协商之后将该手游的源代码提供给了另一家网络公司,对方进行简单“换皮”之后就开始上线经营。而此时,3 人还没有从原公司离职。且为了成功上线,他们还套用了《计算机软件著作权登记证》和《网络游戏出版核发单》。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    图片来源/上海警方

    警方将三人抓捕归案后经过审理得知,双方达成合作协议之后按比分配所得利润,对方公司占 85%,3 人所在公司占 15%;自“盗版”游戏上线以来,盈利超过 1. 5亿,三人分得利润超过1500万。上游新闻从警方出了解到,除了游戏名称、人物和背景图片稍有差别外,两款游戏在服务器数据表和服务器战斗服上的相似度 100%,服务器游戏服和客户端相似度也在 90%左右。

    目前,这 3 人因涉嫌非法获取计算机信息系统数据罪,已被采取刑事强制措施,并处于取保候审阶段。与其合作的网络公司负责人和经理在明知代码来源的情况下,仍然选择使用并上线游戏获利,涉嫌侵犯著作权罪被普陀警方强制调查。案件正在进一步侦办中。

    主要更新内容 

    • 文章归档功能
    • 文章页打印样式

    关于 Fluid

    Fluid  是一款基于 Hexo 框架的 Material Design 风格主题。

    ScreenShot

    该主题相较于其他主题的优势:

    1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作;
    2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式;
    3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对;
    4. 主题中少有的整合了 LaTeX 和 mermaid 的支持

    目前具有的功能特性:

    • 图片懒加载
    • 自定义代码高亮方案
    • 内置多语言
    • 支持多款评论插件
    • 支持使用数据文件存放配置
    • 自定义静态资源 CDN
    • 无比详实的用户文档
    • 内置文章搜索
    • 页脚备案信息
    • 网页访问统计
    • 支持脚注语法
    • 支持 LaTeX 数学公式
    • 支持 mermaid 流程图
    • 暗色模式

    详情查看:https://github.com/fluid-dev/hexo-theme-fluid

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    作者:刘霖

    背景现状

    随着 ChatGPT 的广泛应用,各种大规模语言模型层出不穷,其中包括 EleutherAI 推出的 200 亿参数的 GPT-NeoX-20B 和 BigScience 发布的 1760 亿参数的 Bloom 模型。

    由于模型越来越大,单张 GPU 已无法加载整个模型,分布式模型训练成为了一种必然的趋势。在 GPT-NeoX 和 Bloom 的背后,DeepSpeed 框架是实现分布式模型训练的关键。

    DeepSpeed 是一个开源的深度学习训练优化库,提供了多种优化策略,如混合精度训练、数据并行、模型并行、流水线并行等,这些策略可用于加速大规模模型的训练。此外,DeepSpeed 还提供了高性能的分布式训练框架,支持多种主流的深度学习框架,并且可以在不同的硬件和云平台上进行训练。借助 DeepSpeed,算法工程师可以更加快速地训练大规模深度学习模型,从而提高模型的准确性和效率。

    当前,越来越多企业在云上基于容器和 Kubernetes 进行大规模的分布式深度学习训练,充分利用弹性、扩展性、自动化、高可用等优势,大幅提高分布式训练的效率和可靠性,同时降低管理成本和复杂性。

    然而,随着模型规模扩大以及企业对生产效率的不断追求,将 DeepSpeed 分布式训练任务在 Kubernetes 中搭建和运行仍然存在着很多挑战和难点。例如,GPU资源利用率低,分布式训练扩展性差,以及难以方便地获取实时日志和监控等。

    方案介绍

    目前,阿里云容器服务 ACK 云原生 AI 套件已经支持 DeepSpeed 分布式训练,为您提供高效便捷的解决方案。

    您只需准备好训练代码和数据,就可以利用命令行工具 Arena 快速在 ACK 集群中部署基于 DeepSpeed 的分布式训练任务。此外,可以通过 TensorBoard 可视化工具方便地查看训练作业的状态和结果,从而使 DeepSpeed 分布式训练变得更加容易和高效。

    关于 ACK 云原生 AI 套件的更多信息,请通过往期文章进行了解:摆脱 AI 生产“小作坊”:如何基于 Kubernetes 构建云原生 AI 平台

    image

    核心优势

    基于阿里云容器服务 ACK 云原生 AI 套件搭建和运行 DeepSpeed 分布式训练任务具备以下优势:

    1. 大规模异构资源管理

    使用容器服务 ACK,您可以轻松管理大规模异构资源,快速搭建基于 CPU、GPU、FPGA 等不同类型计算资源的标准 Kubernetes 集群,实现对各类异构资源进行统一、灵活的管理、调度和运维。云原生 AI 套件还支持多种 GPU 调度策略(共享+隔离、优先级、拓扑感知等)和丰富的 GPU 监控告警等能力,帮您进一步优化资源利用率。

    1. 灵活弹性与成本优化

    使用 ACK 弹性节点池和 HPA/VPA,您可以灵活按需自动伸缩 GPU 节点数和 Pod 数,并基于 GPU 指标实现 AHPA 弹性预测。云原生 AI 套件支持 ECS、ECI 等弹性资源混合的高级调度,包括 affinity/anti-affinity、pod topology spreading、deploymentset 感知等调度。此外,通过支持资源不足到时终止、checkpoint 自动保存、容错、Failover 等能力,解决基于抢占式实例进行分布式训练的可用性问题,减少训练成本的同时,近乎不影响训练作业成功率。ACK 还提供了成本监控和分析等能力,能够面向任务去管理和优化分布式训练的成本。

    1. 高效的任务管理调度

    云原生 AI 套件提供命令行工具 Arena,对深度学习核心生产环节(包括数据管理、模型开发、模型训练、模型评估、推理服务部署等)任务进行简单抽象和高效管理。通过 Arena,您可以快速提交分布式训练任务,并提升训练任务从提交到运行的性能,以及进行任务的生命周期管理。此外,云原生AI套件还提供针对分布式场景优化的调度策略,例如按 GPU 卡的 Binpack 算法分配策略,提升 GPU 卡利用率,还支持自定义的任务优先级管理和租户弹性资源配额控制,在确保用户资源分配的基础上,通过资源共享的方式来提升集群的整体资源利用率。

    快速使用

    下面将介绍如何基于阿里云容器服务 ACK 云原生 AI 套件快速搭建和运行 DeepSpeed 分布式训练:

    前提条件

    • 已创建包含 GPU 的 Kubernetes 集群。具体操作,请参见创建包含 GPU 的 Kubernetes 集群 [ 1]
    • 已安装云原生 AI 套件(ack-arena 版本不低于 0.9.6)。具体操作,请参见部署云原生 AI 套件 [ 2]
    • 已安装 Arena 客户端(版本不低于 0.9.6)。具体操作,请参见安装 Arena [ 3]
    • 已给集群配置了 Arena 使用的 PVC,具体操作,请参见配置 NAS 共享存储 [ 4] (或者配置 CPFS 共享存储 [ 5] )。

    使用说明

    本示例使用 DeepSpeed 训练一个掩码语言模型(Masked Language Model)。为方便运行,已将示例代码 [ 6] 和数据集下载至示例镜像中;若您无需使用示例镜像,也支持从 Git URL下载源代码,并将数据集存放在共享存储系统(基于 NAS 的 PV 和 PVC)中。本示例假设您已经获得了一个名称为 training-data 的 PVC 实例(一个共享存储),用来存放训练结果。

    如需自定义训练镜像,请参考如下方式:

    • 方式一:

    参考该 Dockerfile [ 7] ,在基础镜像中安装 OpenSSH

    • 方式二:

    使用 ACK 提供的 DeepSpeed 基础镜像:

    registry.cn-beijing.aliyuncs.com/acs/deepspeed:v072_base

    示例介绍

    本示例中创建了一个 Transformer Bert 模型,根据句子前后的上下文来填充句子。比如在下列句子中:

    
    

    根据提供的’In the beautiful season of’ 和 ‘shed their leaves’,可以预测到空白处应该填入 ‘Autumn’ 和 ‘trees’。

    本示例通过整合 DeepSpeed 的能力来提高训练的速度和效率,在下列几个方面进行了优化:

    • 混合精度训练:DeepSpeed 支持使用 fp16 数据类型进行混合精度训练。通过在 ds_config 中设置以下配置,即可启用混合精度训练。
    
    
    • ZeRO 数据并行:Zero Redundancy Optimizer(零冗余优化器)可以支持每个 GPU 都只存储模型参数、梯度和优化器状态的一部分,从而降低 GPU 显存占用,支持更大的模型。当前支持 3 个阶段,阶段 1 对优化器状态进行分片。阶段2还会对梯度进行分片。阶段 3 进一步对模型权重进行分片。通过在 ds_config 中设置以下配置,即可启动阶段 1。
    
    
    • ZeRO-Offload:通过同时利用 GPU 和 CPU 的计算和存储资源,比如将优化器状态和梯度保存在内存上,从而使单 GPU 可以支持的模型更大。比如在一张 P40 GPU 上,无法训练一个 20 亿参数的模型,但是使用 ZeRO-Offload 可以做到。通过在 ds_config 中设置以下配置,即可启用 ZeRO-Offload。
    
    

    本示例中 DeepSpeed 的完整配置文件 ds_config 参考如下。

    
    

    DeepSpeed 是基于 AllReduce 的分布式训练框架,在 hostfile 中保存了所有的 worker 信息,luancher 读取 hostfile 文件获取 worker 信息,通过 PDSH 的方式在每个 worker 上启动训练任务。

    ACK 云原生 AI 套件中的 Operator 组件会自动生成上述配置。准备好模型训练代码和数据后,即可通过 Arena 提交 DeepSpeed 分布式训练任务。如下图所示,Operator 会创建一个 Launcher Pod 和多个 Worker Pod 并在 Worker Pod 上启动训练任务。

    image

    操作步骤

    1. 提交 DeepSpeed 作业

    通过以下代码示例提交包含 1 个 Launcher 节点,3 个 Worker 节点的 DeepSpeed 训练任务。该任务将使用 3 台机器,每台机器上的一张 GPU 卡进行训练。

    
    

    预期输出如下:

    
    
    1. 执行以下命令获取作业详情
    
    

    预期输出如下:

    
    
    1. 通过浏览器查看 TensorBoard

    执行以下命令,将集群中的 TensorBoard 映射到本地 9090 端口。

    
    

    在浏览器中访问 localhost:9090,即可查看 TensorBoard。

    image

    执行以下命令可获取作业日志信息:

    
    

    更多操作命令及参数解释可参考云原生 AI 套件文档 [ 8]

    相关链接:

    [1] 创建包含 GPU 的 Kubernetes 集群

    https://help.aliyun.com/document_detail/171074.html?spm=a2c4g.171073.0.0.4c78f95a00Mb5P

    [2] 部署云原生 AI 套件

    https://help.aliyun.com/document_detail/201997.htm#section-2al-4w3-dpd

    [3] 安装 Arena

    https://help.aliyun.com/document_detail/212117.htm#task-1917487

    [4] 配置 NAS 共享存储

    https://help.aliyun.com/document_detail/212177.htm#task-1917776

    [5] 配置 CPFS 共享存储

    https://help.aliyun.com/document_detail/212178.htm#task-1917776

    [6] 示例代码

    https://github.com/microsoft/DeepSpeedExamples/tree/master/training/HelloDeepSpeed

    [7] Dockerfile

    https://github.com/kubeflow/arena/blob/master/samples/deepspeed/Dockerfile

    [8] 云原生 AI 套件文档

    https://help.aliyun.com/document_detail/2249322.html?spm=a2c4g.201994.0.0.23257371FAcYuc

    如果您希望深入了解更多关于 ACK 云原生 AI 套件的信息,或者需要与我们就 LLM/AIGC 等相关需求进行交流,欢迎加入我们的钉钉群:。

    作者:斜阳

    高可用架构演进背景

    在分布式系统中不可避免的会遇到网络故障,机器宕机,磁盘损坏等问题,为了向用户不中断且正确的提供服务,要求系统有一定的冗余与容错能力。RocketMQ 在日志,统计分析,在线交易,金融交易等丰富的生产场景中发挥着至关重要的作用,而不同环境对基础设施的成本与可靠性提出了不同的诉求。在 RocketMQ v4 版本中有两种主流高可用设计,分别是主备模式的无切换架构和基于 Raft 的多副本架构(图中左侧和右侧所示)。生产实践中我们发现,两副本的冷备模式下备节点资源利用率低,主宕机时特殊类型消息存在可用性问题;而 Raft 高度串行化,基于多数派的确认机制在扩展只读副本时不够灵活,无法很好的支持两机房对等部署,异地多中心等复杂场景。RocketMQ v5 版本融合了上述方案的优势,提出 DLedger Controller 作为管控节点(中间部分所示),将选举逻辑插件化并优化了数据复制的实现。

    image

    如何实现高可用系统

    副本组与数据分片

    在 Primary-Backup 架构的分布式系统中,一份数据将被复制成多个副本来避免数据丢失。处理相同数据的一组节点被称为副本组(ReplicaSet),副本组的粒度可以是单个文件级别的(例如 HDFS),也可以是分区级 / 队列级的(例如 Kafka),每个真实存储节点上可以容纳若干个不同副本组的副本,也可以像 RocketMQ 一样粗粒度的独占节点。独占能够显著简化数据写入时确保持久化成功的复杂度,因为每个副本组上只有主副本会响应读写请求,备机一般配置只读来提供均衡读负载,选举这件事儿等价于让副本组内一个副本持有独占的写锁。

    RocketMQ 为每个存储数据的 Broker 节点配置 ClusterName,BrokerName 标识来更好的进行资源管理。多个 BrokerName 相同的节点构成一个副本组。每个副本还拥有一个从 0 开始编号,不重复也不一定连续的 BrokerId 用来表示身份,编号为 0 的节点是这个副本组的 Leader / Primary / Master,故障时通过选举来重新对 Broker 编号标识新的身份。例如 BrokerId = {0, 1, 3},则 0 为主,其他两个为备。

    一个副本组内,节点间共享数据的方式有多种,资源的共享程度由低到高来说一般有 Shared Nothing,Shared Disk,Shared Memory,Shared EveryThing。典型的 Shared Nothing 架构是 TiDB 这类纯分布式的数据库,TiDB 在每个存储节点上使用基于 RocksDB 封装的 TiKV 进行数据存储,上层通过协议交互实现事务或者 MVCC。相比于传统的分库分表策略来说,TiKV 易用性和灵活程度很高,更容易解决数据热点与伸缩时数据打散的一系列问题,但实现跨多节点的事务就需要涉及到多次网络的通信。另一端 Shared EveryThing 的案例是 AWS 的 Aurora,Aliyun 的 PolarStore,旁路 Kernal 的方式使应用完全运行于用户态,以最大程度的存储复用来减少资源消耗,一主多备完全共用一份底层可靠的存储,实现一写多读,快速切换。

    大多数 KV 操作都是通过关键字的一致性哈希来计算所分配的节点,当这个节点所在的主副本组产生存储抖动,主备切换,网络分区等情况下,这个分片所对应的所有键都无法更新,局部会有一些操作失败。消息系统的模型有所不同,流量大但跨副本组的数据交互极少,无序消息发送到预期分区失败时还可以向其他副本组(分片)写入,一个副本组的故障不影响全局,这在整体服务的层面上额外提供了跨副本组的可用性。此外,考虑到 MQ 作为 Paas 层产品,被广泛部署于 Windows,Linux on Arm 等各种环境,只有减少和 Iaas 层产品的深度绑定,才能提供更好的灵活性。这种局部故障隔离和轻依赖的特性是 RocketMQ 选则 Shared Nothing 模型重要原因。

    副本组中,各个节点处理的速度不同,也就有了日志水位的概念。Master 和与其差距不大的 Slave 共同组成了同步副本集(SyncStateSet)。如何定义差距不大呢?衡量的指标可以是日志水位(文件大小)差距较小,也可以是备落后的时间在一定范围内。在主宕机时,同步副本集中的其余节点有机会被提升为主,有时需要对系统进行容灾演练,或者对某些机器进行维护或灰度升级时希望定向的切换某一个副本成为新主,这又产生了优先副本(PriorityReplica)的概念。选择优先副本的原则和策略很多,可以动态选择水位最高,加入时间最久或 CommitLog 最长的副本,也可以支持机架,可用区优先这类静态策略。

    从模型的角度来看,RocketMQ 单节点上 Topic 数量较多,如果像 kafka 以 topic / partition 粒度维护状态机,节点宕机会导致上万个状态机切换,这种惊群效应会带来很多潜在风险,因此 v4 版本时 RocketMQ 选择以单个 Broker 作为切换的最小粒度来管理,相比于其他更细粒度的实现,副本身份切换时只需要重分配 Broker 编号,对数据节点压力最小。由于通信的数据量少,可以加快主备切换的速度,单个副本下线的影响被限制在副本组内,减少管理和运维成本。这种实现也一些缺点,例如存储节点的负载无法以最佳状态在集群上进行负载均衡,Topic 与存储节点本身的耦合度较高,水平扩展一般会改变分区总数,这就需要在上层附加额外的处理逻辑。

    image.png

    为了更规范更准确的衡量副本组的可用性指标,学术上就引入了几个名词:

    • RTO(Recovery Time Objective)恢复时间目标,一般表示业务中断到恢复的时间。
    • RPO(Recovery Point Object)恢复点目标,用于衡量业务连续性。例如某个硬盘每天备份,故障时丢失最近备份后的所有更新。
    • SLA(Service-Level Agreement)服务等级协议,厂商以合约的形式对用户进行服务质量承诺,SLA 越高通常成本也越高。

    节点数量与可靠性关系密切,根据不同生产场景,RocketMQ 的一个副本组可能会有 1,2,3,5 个副本。

    1. 单副本成本最低,维护最简单,宕机时其他副本组接管新消息的写入,但已写入的数据无法读取,造成部分消息消费延迟。底层硬件故障还可能导致数据永久丢失,一般用于非关键日志,数据采集等低可靠性成本诉求较强的场景。
    2. 两副本较好的权衡了数据冗余的成本与性能,RocketMQ 跨副本组容灾的特性使得两副本模式适用于绝大部分 IOPS 比较高的场景。此时备机可以分摊一定的读压力(尤其是主副本由于内存紧张或者产生冷读时)。两副本由于不满足多数派(quorum)原则,没有外部系统的参与时,故障时无法进行选举切换。
    3. 三副本和五副本是业界使用最为广泛的,精心设计的算法使得多数情况下系统可以自愈。基于 Paxos / Raft 属于牺牲高可用性来保证一致性的 CP 型设计,存储成本很高,容易受到 IO 分布不均匀和水桶效应的影响。每条数据都需要半数以上副本响应的设计在需要写透(write through)多副本的消息场景下不够灵活。

    日志复制还是消息复制

    如何保证副本组中数据的最终一致性?那肯定是通过数据复制的方式实现,我们该选择逻辑复制还是物理复制呢?

    逻辑复制: 使用消息来进行同步的场景也很多,各种 connector 实现本质上就是把消息从一个系统挪到另外一个系统上,例如将数据导入导出到 ES,Flink 这样的系统上进行分析,根据业务需要选择特定 Topic / Tag 进行同步,灵活程度和可扩展性非常高。这种方案随着 Topic 增多,系统还会有服务发现,位点和心跳管理等上层实现造成的性能损失。因此对于消息同步的场景,RocketMQ 也支持以消息路由的形式进行数据转移,将消息复制作为业务消费的特例来看待。

    物理复制: 大名鼎鼎的 MySQL 对于操作会记录逻辑日志(bin log)和重做日志(redo log)两种日志。其中 bin log 记录了语句的原始逻辑,比如修改某一行某个字段,redo log 属于物理日志,记录了哪个表空间哪个数据页改了什么。在 RocketMQ 的场景下,存储层的 CommitLog 通过链表和内核的 MappedFile 机制抽象出一条 append only 的数据流。主副本将未提交的消息按序传输给其他副本(相当于 redo log),并根据一定规则计算确认位点(confirm offset)判断日志流是否被提交。这种方案仅使用一份日志和位点就可以保证主备之间预写日志的一致性,简化复制实现的同时也提高了性能。

    为了可用性而设计的多副本结构,很明显是需要对所有需要持久化的数据进行复制的,选择物理复制更加节省资源。RocketMQ 在物理复制时又是如何保证数据的最终一致性呢?这就涉及到数据的水位对齐。对于消息和流这样近似 FIFO 的系统来说,越近期的消息价值越高,消息系统的副本组的单个节点不会像数据库系统一样,保留这个副本的全量数据,Broker 一方面不断的将冷数据规整并转入低频介质来节约成本,同时对热数据盘上的数据也会由远及近滚动删除。如果副本组中有副本宕机较久,或者在备份重建等场景下就会出现日志流的不对齐和分叉的复杂情况。在下图中我们将主节点的 CommitLog 的首尾位点作为参考点,这样就可以划分出三个区间。在下图中以蓝色箭头表示。排列组合一下就可以证明备机此时的 CommitLog 一定满足下列 6 种情况之一。

    image

    下面对每种情况进行讨论与分析:

    • 1-1 情况下满足备 Max <= 主 Min,一般是备新上线或下线较久,备跳过存量日志,从主的 Min 开始复制。
    • 1-2,2-2 两种情况下满足 主 Min < 备 Max <= 主 Max,一般是由于备网络闪断导致日志水位落后,通过 HA 连接追随主即可。
    • 1-3,2-3 两种情况下备 Max > 主 Max,可能由于主异步写磁盘宕机后又成为主,或者网络分区时双主写入造成 CommitLog 分叉。由于新主落后于备,少量未确认的消息丢失,非正常模式的选举(RocketMQ 将这种情况称为 unclean 选举)是应该尽量避免的。
    • 3-3 理论上不会出现,备的数据长于主,原因可能是主节点数据丢失又叠加了非正常选举,因此这种情况需要人工介入处理。

    租约与节点身份变更

    前文提到 RocketMQ 每个副本组的主副本才接受外部写请求,节点的身份又是如何决定的呢?

    分布式系统一般分为中心化架构和去中心化架构。对于 MultiRaft,每个副本组包含三个或者五个副本,副本组内可以通过 Paxos / Raft 这样的共识协议来进行选主。典型的中心化架构,为了节省数据面资源成本会部署两副本,此时依赖于外部 ZK,ETCD,或者 DLedger Controller 这样的组件作为中心节点进行选举。由外置组件裁决成员身份涉及到分布式中两个重要的问题:1. 如何判断节点的状态是否正常。2. 如何避免双主问题。

    对于第一个问题,kubernetes 的解决方案相对优雅,k8s 对与 Pod 的健康检查包括存活检测(Liveness probes)和就绪检测(Readiness probes),Liveness probes 主要是探测应用是否还活着,失败时重启 Pod。Readiness probes 来判断探测应用是否接受流量。简单的心跳机制一般只能实现存活检测,来看一个例子:假设有副本组中有 A、B、C 三个副本,另有一个节点 Q(哨兵) 负责观测节点状态,同时承担了全局选举与状态维护的职责。节点 A、B、C 周期性的向 Q 发送心跳,如果 Q 超过一段时间(一般是两个心跳间隔 )收不到某个节点的心跳则认为这个节点异常。如果异常的是主副本,Q 将副本组的其他副本提升为主并广播告知其他副本。

    image.png

    在工程实践中,节点下线的可能性一般要小于网络抖动的可能性。我们假设节点 A 是副本组的主,节点 Q 与节点 A 之间的网络中断。节点 Q 认为 A 异常。重新选择节点 B 作为新的 Master,并通知节点 A、B、C 新的 Master 是节点 B。节点 A 本身工作正常,与节点 B、C 之间的网络也正常。由于节点 Q 的通知事件到达节点 A、B、C 的顺序是未知的,假如先达到 B,在这一时刻,系统中同时存在两个工作的主,一个是 A,另一个是 B。假如此时 A、B 都接收外部请求并与 C 同步数据,会产生严重的数据错误。上述 “双主” 问题出现的原因在于虽然节点 Q 认为节点 A 异常,但节点 A 自己不认为自己异常,在旧主新主都接受写入的时候就产生了日志流的分叉,其问题的本质是由于网络分区造成的系统对于节点状态没有达成一致。

    租约是一种避免双主的有效手段,租约的典型含义是现在中心节点承认哪个节点为主,并允许节点在租约有效期内正常工作。如果节点 Q 希望切换新的主,只需等待前一个主的租约过期,则就可以安全的颁发新租约给新 Master 节点,而不会出现双主问题。这种情况下系统对 Q 本身的可用性诉求非常高,可能会成为集群的性能瓶颈。生产中使用租约还有很多实现细节,例如依赖时钟同步需要颁发者的有效期设置的比接收者的略大,颁发者本身的切换也较为复杂。

    在 RocketMQ 的设计中,希望以一种去中心化的设计降低中心节点宕机带来的全局风险,(这里认为中心化和是否存在中心节点是两件事)所以没有引入租约机制。在 Controller (对应于 Q )崩溃恢复期间,由于 Broker 对自己身份会进行永久缓存,每个主副本会管理这个副本组的状态机,RocketMQ Dledger Controller 这种模式能够尽量保证在大部分副本组在哨兵组件不可用时仍然不影响收发消息的核心流程。而旧主由于永久缓存身份,无法降级导致了网络分区时系统必须容忍双主。产生了多种解决方案,用户可以通过预配置选择 AP 型可用性优先,即允许系统通过短时分叉来保障服务连续性(下文还会继续谈谈为什么消息系统中分叉很难避免),还是 CP 型一致性优先,通过配置最小副本 ack 数超过集群半数以上节点。此时发送到旧主的消息将因为无法通过 ha 链路将数据发送给备,向客户端返回超时,由客户端将发起重试到其他分片。客户端经历一个服务发现的周期之后,客户端就可以正确发现新主。

    特别的,在网络分区的情况下,例如旧主和备,Controller 之间产生网络分区,此时由于没有引入租约机制,旧主不会自动降级,旧主可以配置为异步双写,每一条消息需要经过主备的双重确认才能向客户端返回成功。而备在切换为主时,会设置自己只需要单个副本确认的同步写盘模式。此时,客户端短时间内仍然可以向旧主发送消息,旧主需要两副本确认才能返回成功,因此发送到旧主的消息会返回 SLAVE_NOT_AVAILABLE 的超时响应,通过客户端重试将消息发往新的节点。几秒后,客户端从 NameServer / Controller 获取新的路由时,旧主从客户端缓存中移除,此时完成了备节点的提升。

    image.png

    外置的组件可以对节点身份进行分配,上图展示了一个两副本的副本组上线流程:

    1. 多个 Controller 通过选举和对 Broker 的请求进行重定向,最终由一个 Controller 做为主节点进行身份分配。
    2. 如果 RocketMQ 副本组存在多个副本且需要选主,节点默认以备的身份启动,备节点会将自己注册到 Controller。
    3. 节点从 Controller 获取 BrokerMemberGroup,包含了这个副本组的描述和连接信息。

    <!—->

      1. 若分配的身份为备,解析出主节点的对外服务的地址并连接,完成日志截断后进行 HA 同步。
      2. 若分配的身份为主,等待备机连接到自身的 HA 端口,并向 NameServer 再次宣告自己是主节点。

    <!—->

    1. 主节点维护整个副本组的信息,向备发起数据复制,周期性的向 Controller 汇报主备之间水位差距,复制速度等。

    RocketMQ 弱依赖 Controller 的实现并不会打破 Raft 中每个 term 最多只有一个 leader 的假设,工程中一般会使用 Leader Lease 解决脏读的问题,配合 Leader Stickiness 解决频繁切换的问题,保证主的唯一性。

    • Leader Lease: 租约,上一任 Leader 的 Lease 过期后,等待一段时间再发起 Leader 选举。
    • Leader Stickiness:Leader Lease 未过期的 Follower 拒绝新的 Leader 选举请求。

    注:Raft 认为具有最新已提交的日志的节点才有资格成为 Leader,而 Multi-Paxos 无此限制。

    对于日志的连续性问题,Raft 在确认一条日志之前会通过位点检查日志连续性,若检查到日志不连续会拒绝此日志,保证日志连续性,Multi-Paxos 允许日志中有空洞。Raft 在 AppendEntries 中会携带 Leader 的 commit index,一旦日志形成多数派,Leader 更新本地的 commit index(对应于 RocketMQ 的 confirm offset)即完成提交,下一条 AppendEntries 会携带新的 commit index 通知其它节点,Multi-Paxos 没有日志连接性假设,需要额外的 commit 消息通知其它节点。

    计算日志分叉位点

    除了网络分区,很多情况导致日志数据流分叉。有如下案例:三副本采用异步复制,异步持久化,A 为旧主 B C 为备,切换瞬间 B 日志水位大于 C,此时 C 成为新主,B C 副本上的数据会产生分叉,因为 B 还多出了一段未确认的数据。那么 B 是如何以一个简单可靠的方法去判断自己和 C 数据分叉的位点?

    一个直观的想法就是,直接将主备的 CommitLog 从前向后逐渐字节比较,一般生产环境下,主备都有数百 GB 的日志文件流,读取和传输大量数据的方案费时费力。很快我们发现,确定两个大文件是否相同的一个好办法就是比较数据的哈希值,需要对比的数据量一下子就从数百 GB 降低为了几百个哈希值,对于第一个不相同的 CommitLog 文件,还可以采取局部哈希的方式对齐,这里仍然存在一些计算的代价。还有没有优化的空间呢,那就是利用任期 Epoch 和偏移量 StartOffset 实现一个新的截断算法。这种 Epoch-StartOffset 满足如下原则:

    1. 通过共识协议保证给定的一个任期 Epoch 只有一个Leader。
    2. 只有 Leader 可以写入新的数据流,满足一定条件才会被提交。
    3. Follower 只能从 Leader 获取最新的数据流,Follower 上线时按照选举算法进行截断。

    下面是一个选举截断的具体案例,选举截断算法思想和流程如下:

    主 CommitLog Min = 300,Max = 2500,EpochMap = {<6, 200>, <7, 1200>, <8,2500>}备 CommitLog Min = 300,Max = 2500,EpochMap = {<6, 200>, <7, 1200>, <8,2250>}

    image.png

    1. 备节点连接到主节点进行 HA 协商,获取主节点的 Epoch-StartOffset 信息并比较
    2. 备从后向前找到任期-起始点相同的那个点作为分叉任期,在上述案例里是 <8,2250>
    3. 选择这个任期里主备结束位点的最小值(如果主副本没有切换且为最大任期,则主副本的结束位点是无穷大)

    实现的代码如下:

    
    

    数据回发与日志截断

    故障发生后,系统将会对分叉数据进行修复,有很多小小细节值得深究与探讨。

    在实现数据截断的过程中,有一个很特殊的动作,当备切主的时候要把 ConsumeQueue 的 Confirm Offset 提升到 CommitLog 的 MaxPhyOffset,即使这一部分数据在主上是否被提交是未知的。回想起几年前看 Raft 的时候,当一条日志被传输到 Follower,Follower 确认收到这条消息,主再把这条日志应用到自己的状态机时,通知客户端和通知所有的 follower 去 commit 这条日志这两件事是并行的,假如 leader 先回复 client 处理成功,此时 leader 挂了,由于其他 follower 的确认位点 confirm offset 一般会略低于 leader,中间这段未决日志还没应用到 follower 的状态机上,这时就出现了状态机不一致的情况,即已经写入 leader 的数据丢失了。让我们来举一个具体的案例,假设两副本一主一备:

    1. 主的 max offset = 100,主向备发送当前 confirm offset = 40 和 message buffer = [40-100] 的数据
    2. 备向主回复 confirm offset = 100 后主需要同时做几件事

    <!—->

      1. 本地提交(apply) [40-100] 区间的数据,用后台的 dispatch 线程异步构建这段数据的索引
      2. 向 producer 响应 [40-100] 这段数据是发送成功的。
      3. 向多个备机异步的提交,实际上是发送了 confirm offset = 100

    <!—->

    1. 此时主突然宕机,备机的 confirm offset 可能是 [40-100] 中的值

    所以当备切换为主的时候,如果直接以 40 进行截断,意味着客户端已经发送到服务端的消息丢失了,正确的水位应该被提升至 100。但是备还没有收到 2.3 的 confirm = 100 的信息,这个行为相当于要提交了未决消息。事实上新 leader 会遵守 “Leader Completeness” 的约定,切换时任何副本都不会删除也不会更改旧 leader 未决的 entry。新 leader 在新的 term 下,会直接应用一个较大的版本将未决的 entry 一起提交,这里副本组主备节点的行为共同保证了复制状态机的安全性。

    那么备切换成功的标志是什么,什么时候才能接收 producer 新的流量呢?对于 Raft 来说一旦切换就可以,对于 RocketMQ 来说这个阶段会被稍稍推迟,即索引已经完全构建结束的时候。RocketMQ 为了保证构建 consume queue 的一致性,会在 CommitLog 中记录 consume queue offset 的偏移量,此时 confirm offset 到 max offset 间的数据是副本作为备来接收的,这部分消息在 consume queue 中的偏移量已经固定下来了,而 producer 新的流量时由于 RocketMQ 预计算位点的优化,等到消息实际放入 CommitLog 的再真实的数据分发(dispatch)的时候就会发现对应位置的 consume queue 已经被占用了,此时就造成了主备索引数据不一致。本质原因是 RocketMQ 存储层预构建索引的优化对日志有一些侵入性,但切换时短暂等待的代价远远小于正常运行时提速的收益。

    消息中间件场景

    a. 数据变更是否依赖于日志

    目前 RocketMQ 对于数据是在内存中单独管理的,备机间隔 5 秒向当前的主节点同步数据。例如当前主节点上创建了一个临时 Topic 并接受了一条消息,在一个同步周期内这个 Topic 又被删除了,此时主备节点数据可能不一致。又比如位点更新的时候,对于单个队列而言,多副本架构中存在多条消费位点更新链路,Consumer 拉取消息时更新,Consumer 主动向 broker 更新,管控重置位点,HA 链路更新,当副本组发生主备切换时,consumer group 同时发生 consumer 上下线,由于路由发现的时间差,还可能造成同一个消费组两个不同 consumer 分别消费同一副本组主备上同一个队列的情况。

    原因在于备机重做数据更新和消息流这两件事是异步的,这有一定概率会造成脏数据。由于 RocketMQ 单个节点上 Topic / Group 数量较多,通过日志的实现会导致持久化的数据量很大,在复杂场景下基于日志做回滚依赖 snapshot 机制也会增加计算开销和恢复时间。这个问题和数据库很像,MySQL 在执行 DDL 修改数据时通过会创建 MDL 锁,阻塞用户其他操作访问表空间的访问。备库同步主库也会加锁,数据修改开始点和结束点所代表的两个日志并不是一个原子操作,这意味着主库上在修改数据的过程中如果宕机了,备库上持有的 MDL 锁就无法释放。MySQL 的解决方案是在主库每次崩溃恢复后,都写一条特殊的日志,通知所有连接的备库释放其持有的所有 MDL 排他锁。对所有操作都走日志流进行状态机复制要求存储层有多种日志类型,实现也更加复杂。RocketMQ 选择以另一种同步的模式操作,即类似 ZAB 这样二阶段协议,例如位点更新时的可以选择配置 LockInStrictMode 让备都同步这条修改。事实上 RocketMQ 为了优化上述位点跳跃的现象,客户端在未重启时,遇到服务端主备切换还会用优先采纳本地位点的方式获取消息,进一步减少重复消费。

    b. 同步复制与异步复制

    同步复制的含义是用户的一个操作在多个副本上都已经提交。正常情况下,假设一个副本组中的 3 个副本都要对相同一个请求进行确认,相当于数据写透 3 个副本(简称 3-3 写),3-3 写提供了非常高的数据可靠性,但是把所有从节点都配置为同步复制时任何一个同步节点的中断都会导致整个副本组处理请求失败。当第三个副本是跨可用区时,长尾也会带来一定的延迟。

    异步复制模式下,尚未复制到从节点的写请求都会丢失。向客户端确认的写操作也无法保证被持久化。异步复制是一种故障时 RPO 不为 0 的配置模式,由于不用考虑从节点上的状态,总是可以继续响应写请求,系统的延迟更低,吞吐性能更好。为了权衡两者,通常只有其中一个从节点是同步的,而其他节点是异步的模式。只要同步的从节点变得不可用或性能下降,则将另一个异步的从节点提升为同步模式。这样可以保证至少有两个节点(即主节点和一个同步从节点)拥有最新的数据副本。这种模式称为 2-3 写,能帮助避免抖动,提供更好的延迟稳定性,有时候也叫称为半同步。

    在 RocketMQ 的场景中,异步复制也被广泛应用在消息读写比极高,从节点数量多或者异地多副本场景。同步复制和异步复制是通过 Broker 配置文件里的 brokerRole 参数进行设置的,这个参数可以被设置成 ASYNC_MASTER、SYNC_MASTER、SLAVE 三个值中的一个。实际应用中要结合业务场景合理设置持久化方式和主从复制方式,通常,由于网络的速度高于本地 IO 速度,采用异步持久化和同步复制是一个权衡性能与可靠性的设置。

    image.png

    c. 副本组自适应降级

    同步复制的含义是一条数据同时被主备确认才返回用户操作成功,可以保证主宕机后消息还在备中,适合可靠性要求较高的场景,同步复制还可以限制未同步的数据量以减少 ha 链路的内存压力,缺点则是副本组中的某一个备出现假死就会影响写入。异步复制无需等待备确认,性能高于同步复制,切换时未提交的消息可能会丢失(参考前文的日志分叉)。在三副本甚至五副本且对可靠性要求高的场景中无法采用异步复制,采用同步复制需要每一个副本确认后才会返回,在副本数多的情况下严重影响效率。关于一条消息需要被多少副本确认这个问题,RocketMQ 服务端会有一些数量上的配置来进行灵活调整:

    • TotalReplicas:全部副本数
    • InSyncReplicas:每条消息至少要被这个数量的 Broker 确认(如果主为 ASYNC_MASTER 或者 AllAck 模式则该参数不生效)
    • MinInSyncReplicas:最小的同步副本数,如果 InSyncReplicas < MinInSyncReplicas 会对客户端快速失败
    • AllAckInSyncStateSet:主确认持久化成功,为 true 表示需要 SyncStateSet 中所有备确认。

    因此,RocketMQ 提出了副本组在同步复制的模式下,也可以支持副本组的自适应降级(参数名称为 enableAutoInSyncReplicas)来适配消息的特殊场景。当副本组中存活的副本数减少或日志流水位差距过大时进行自动降级,最小降级到 minInSyncReplicas 副本数。比如在两副本下配置 。对于正常情况下,两个副本会处于同步复制,当备下线或假死时,会进行自适应降级,保证主节点还能正常收发消息,这个功能为用户提供了一个可用性优先的选择。

    d. 轻量级心跳与快速隔离

    在 RocketMQ v4.x 版本的实现中,Broker 周期性的(间隔 30 秒)将自身的所有 Topic 序列化并传输到 NameServer 注册进行保活。由于 Broker 上 Topic 的数据规模较大,带来了较大的网络流量开销,Broker 的注册间隔不能设置的太短。同时 NameServer 对 Broker 是采取延迟隔离机制,防止 NameServer 网络抖动时可能瞬间移除所有 Broker 的注册信息,引发服务的雪崩。默认情况下异常主宕机时超过 2 分钟,或者备切换为主重新注册后才会替换。容错设计的同时导致 Broker 故障转移缓慢,RocketMQ v5.0 版本引入轻量级心跳(参数liteHeartBeat),将 Broker 的注册行为与 NameServer 的心跳进行了逻辑拆分,将心跳间隔减小到 1 秒。当 NameServer 间隔 5 秒(可配置)没有收到来自 Broker 的心跳请求就对 Broker 进行移除,使异常场景下自愈的时间从分钟级缩短到了秒级。

    RocketMQ 高可用架构演进路线

    无切换架构的演进

    最早的时候,RocketMQ 基于 Master-Slave 模式提供了主备部署的架构,这种模式提供了一定的高可用能力,在 Master 节点负载较高情况下,读流量可以被重定向到备机。由于没有选主机制,在 Master 节点不可用时,这个副本组的消息发送将会完全中断,还会出现延迟消息、事务消息、Pop 消息等二级消息无法消费或者延迟。此外,备机在正常工作场景下资源使用率较低,造成一定的资源浪费。为了解决这些问题,社区提出了在一个 Broker 进程内运行多个 BrokerContainer,这个设计类似于 Flink 的 slot,让一个 Broker 进程上可以以 Container 的形式运行多个节点,复用传输层的连接,业务线程池等资源,通过单节点主备交叉部署来同时承担多份流量,无外部依赖,自愈能力强。这种方式下隔离性弱于使用原生容器方式进行隔离,同时由于架构的复杂度增加导致了自愈流程较为复杂。

    切换架构的演进

    另一条演进路线则是基于可切换的,RocketMQ 也尝试过依托于 Zookeeper 的分布式锁和通知机制进行 HA 状态的管理。引入外部依赖的同时给架构带来了复杂性,不容易做小型化部署,部署运维和诊断的成本较高。另一种方式就是基于 Raft 在集群内自动选主,Raft 中的副本身份被透出和复用到 Broker Role 层面去除外部依赖,然而强一致的 Raft 版本并未支持灵活的降级策略,无法在 C 和 A 之间灵活调整。两种切换方案都是 CP 设计,牺牲高可用优先保证一致性。主副本下线时选主和路由定时更新策略导致整个故障转移时间依然较长,Raft 本身对三副本的要求也会面临较大的成本压力,RocketMQ 原生的 TransientPool,零拷贝等一些用来避免减少 IO 压力的方案在 Raft 下无法有效使用。

    RocketMQ DLedger 融合模式

    RocketMQ DLedger 融合模式是 RocketMQ 5.0 演进中结合上述两条路线后的一个系统的解决方案。核心的特性有以下几点:

    1. 利用可内嵌于 NameServer 的 Controller 进行选主,无外部依赖,对两副本支持友好。
    2. 引入 Epoch-StartOffset 机制来计算日志分叉位点。
    3. 消息在进行写入时,提供了灵活的配置来协调系统对于可用性还是一致性优先的诉求。
    4. 简化日志复制协议使得日志复制为高效。

    几种实现对比表如下:

    image

    与其他消息系统的对比

    控制节点

    1. 是否强制要求选主
      Kafka 的 Controller 是 Broker 选举产生,这需要有一个存储节点间的服务发现机制。RocketMQ 的 Controller 可以作为管控节点单独存在。对 Kafka,Pulsar 而言必须选择主副本进行写入,随着时间的运行节点之间负载需要通过复杂的方案进行再均衡。对 RocketMQ 的融合架构而言,由于选主是可选的,静态布局的方案(例如无需依赖复杂的动态调度就可以较为均衡的实现跨机架跨可用区),并且无切换与切换架构可以相互转换。
    2. Controller 的逻辑复杂度
      RocketMQ Controller 相比 Kafka Controller 更加轻量,Kafka 的 Controller 承担 Partition 粒度的 ISR 维护和选举等功能,而RocketMQ 的 Controller 维护的数据是副本组粒度的,对于数据只维护节点身份,更加简单。RocketMQ Controller 可以独立部署,也可以内嵌 NameServer 运行。
    3. Controller 依赖程度
      RocketMQ Broker 的同步副本集维护是 Master Broker 节点上报,由于不强依赖中心节点来提供租约,controller 宕机时虽然无法为同时有主故障的副本组选举,但不影响绝大部分副本组可用性。Pulsar 中通过 fencing 机制防止有多个 writer(pulsar 中的计算节点称为 broker)同时写同一个 partition,是对外部有依赖的。

    数据节点

    1. 副本存储结构的抽象与最小粒度不同,在这一点上其实三者的设计各有优势
      • Kafka 的存储抽象粒度是 Partition,对每个分区进行维护多副本,扩容需要进行数据复制,对于冷读支持更好。
      • RocketMQ 的日志流是 Broker 粒度的,顺序写盘效率更高,在磁盘空间不足时一般选择水平扩容,只需复制数据。
      • Pulsar 其实抽象了一个分布式日志流 Journal,分区被进一步分成分片,根据配置的时间或大小进行滚动,扩容只需复制数据。
    1. 复杂的参数配置被收敛至服务端
      Kafka 和 RocketMQ 都支持灵活的配置单条消息的 ack 数,即权衡数据写入灵活性与可靠性。RocketMQ 在向云原生演进的过程希望简化客户端 API 与配置,让业务方只需关心消息本身,选择在服务端配置统一配置这个值。
    2. 副本数据的同步方式不同
      Pulsar 采用星型写:数据直接从 writer 写到多个 bookeeper。适合客户端与存储节点混部场景。数据路径只需要 1 跳,延迟更低。缺点是当存储计算分离时,星型写需要更多的存储集群和计算集群间网络带宽。
      RocketMQ 和 Kafka 采用 Y 型写:client 先写到一个主副本,由其再转发给另外 Broker 副本。虽然服务端内部带宽充裕,但需要 2 跳网络,会增加延迟。Y 型写利于解决文件多客户端写的问题,也更容易利用 2-3 写克服毛刺,提供更好的延迟稳定性。

    高可用架构的未来

    仔细阅读 RocketMQ 的源码,其实大家也会发现 RocketMQ 在各种边缘问题处理上细节满满,节点失效,网络抖动,副本一致性,持久化,可用性与延迟之间存在各种细微的权衡,这也是 RocketMQ 多年来在生产环境下所积累的核心竞争力之一。随着分布式技术的进一步发展,更多更有意思的技术,如基于 RDMA 网络的复制协议也呼之欲出。RocketMQ 将与社区协同进步,发展为 “消息,事件,流” 一体化的融合平台。

    参考文档:

    1. Paxos design

    https://lamport.azurewebsites.net/pubs/paxos-simple.pdf

    1. SOFA-JRaft

    https://github.com/sofastack/sofa-jraft

    1. Pulsar Geo Replication

    https://pulsar.apache.org/zh-CN/docs/next/concepts-replication

    1. Pulsar Metadata

    https://pulsar.apache.org/zh-CN/docs/next/administration-metadata-store

    1. Kafka Persistence 

    https://kafka.apache.org/documentation/#persistence

    1. Kafka Balancing leadership

    https://kafka.apache.org/documentation/#basic_ops_leader_balancing

    1. Windows Azure Storage: A Highly Available Cloud Storage Service with Strong Consistency 

    https://azure.microsoft.com/en-us/blog/sosp-paper-windows-azure-storage-a-highly-available-cloud-storage-service-with-strong-consistency/

    1. PolarDB Serverless: A Cloud Native Database for Disaggregated Data Centers

    https://www.cs.utah.edu/~lifeifei/papers/polardbserverless-sigmod21.pdf

    RocketMQ 学习社区体验地址

    RocketMQ 学习社区重磅上线!AI 互动,一秒了解 RocketMQ 功能源码。RocketMQ 学习社区是国内首个基于 AIGC 提供的知识服务社区,旨在成为 RocketMQ 学习路上的“贴身小二”。

    PS:RocketMQ 社区以 RocketMQ 5.0 资料为主要训练内容,持续优化迭代中,回答内容均由人工智能模型生成,其准确性和完整性无法保证,且不代表 RocketMQ 学习社区的态度或观点。

    此处,立即体验 RocketMQ 学习社区(建议 PC 端体验完整功能)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2023 年 3 月,操作系统开源社区 OpenCloudOS 正式发布首个全自研社区 9.0 版本(以下简称 OC 9.0),OC 9.0 的内核及用户态软件均为自主选型、独立演进,在操作系统发行版的全链路均实现自主可控。

    当前,服务器操作系统发行版包含从 L1 到 L3 的不同层级。其中,L1 基于 Linux 内核及核心组件构建,是最上游的「源社区」版本;L2 企业版基于 L1 源社区版本加固,提供企业级的技术支持及服务,可用于真实业务场景,是稳定可靠的发行版本;L3 社区版基于 L2 企业版进一步优化,是代码完全开源、生态全面开放的发行版本。

    本次发布的 L3 社区版 OC 9.0,是基于 L1 源社区的 OpenCloudOS Stream 优化推出,由腾讯与 Intel、北京红旗、中兴、龙芯、中科方德等二十余家单位共同研发。OC 9 使用上游社区最新内核 Kernel 6.1,提供多体系架构和新硬件支持,多核性能优化,混部隔离特性增强。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    一、技术亮点

    1、全栈版本升级

    本次发布的 OC 9.0 使用上游社区最新内核 Kernel 6.1,应用了上游及自研的最新组件,包括 GCC 12、LLVM 14、Kona JDK 11/17 、Glibc 2.35、Python 3.10、Rust 1.64.0 等。

    在系统服务方面,OC 9.0 也进行了全栈版本升级。基于 Systemd 251,支持 Cgroup v2 更多特性;dracut 支持 zstd 固件、并行探测;GRUB2 支持 TPM、NVMe 设备、RAID5;存储、文件及设备管理也进行了全面的版本升级,如逻辑卷管理 LVM2 2.03.16,文件系统工具 e2fsprogs 1.46.5,分区工具 Parted 3.5。网络服务方面,集成 Nftables 1.0.4,iptables 1.8.8 等网络工具。

    2、安全性提升

    在安全方面,OC 9.0 对系统内核进行了优化,提供 GPG 加解密加速,PAM 新增验证模块等能力,并支持 OpenSSL 3.0 及更多密码算法,部分软件原生支持 SM3、SM4 国密算法。部分软件原生支持国密算法,提供了更加安全的数据保障。

    3、内存管理效率提升

    OC 9.0 提升了内存管理效率,基于 MGLRU、Mapple Tree 等特性,具备完善的 Cgroup V2 支持、多架构热补丁支持,并提供细致化的调优与系统适配。

    4、性能增强

    相对于已发布的 OC 8.6 版本,OC 9.0 在性能上也有明显提升。基于两个典型业务场景的数据对比,Mariadb 数据库性能上,OC 9.0 在多线程(4096 clients)下比 OC 8.6 数据库读写性能提升 50.49%;Nvme 读写性能上在随机读(rndrd_1m)下比 OC 8.6 性能提升26.5%,顺序写(seqwr_1m)提升 21.16%。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    OpenCloudOS 9.0 全部特性汇总,请查看:

    https://docs.opencloudos.org/release/v9.0/

    二、安装方式及支持平台

    OpenCloudOS Stream 提供 Netinst(网络安装镜像)、everything(标准安装镜像)、QCOW2(虚拟机镜像)、Docker(容器镜像)四种安装方式,方便用户快速部署。

    下载地址:

    https://www.opencloudos.org/iso

    支持硬件:

    OpenClousOS 9 支持 Intel、AMD 和 ARM 64 位架构,已验证的物理机平台如下:

    物理机平台
    架构
    规格 Intel 服务器 x86_64 x86 96核 Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz内存 256G,HDD 500G,SSD 3.6T,双网卡 泰山服务器 aarch64 aarch64 Kunpeng-920 128核2.6GHz内存512G,HDD 500G,SSD 3.6T,双25G网卡 长城服务器 aarch64 aarch64 长城擎天EF核,内存512G,HDD 1000G,SSD 4.4T

    已验证的虚拟机平台如下:

    虚拟化平台
    HostOS
    Host架构
    Host 芯片
    固件 qemu MacOS aarch64 Apple M1 UEFI Parallels MacOS aarch64 Apple M1 UEFI qemu TencentOS Server aarch64 Kunpeng-920 UEFI vmware Windows x86_64 Intel UEFI/BIOS virtualbox Windows x86_64 Intel UEFI/BIOS Hyper V Windows x86_64 Intel UEFI/BIOS qemu TencentOS Server x86_64 Intel UEFI/BIOS

    三、技术支持

    如果你对 OpenCloudOS 9.0 有任何疑问,或使用过程中遇到问题,可以扫描下方二维码,加入开发者交流群,即可免费获取各种 OpenCloudOS 相关的技术支持,参与群内抽奖活动。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    相关链接

    OpenCloudOS 社区官网:https://www.opencloudos.org

    软件兼容性列表:https://github.com/OpenCloudOS/SysDocs/blob/master/software.md

    硬件兼容性列表:https://github.com/OpenCloudOS/SysDocs/blob/master/hardware.md

    OpenCloudOS图形安装指南:https://docs.opencloudos.org/quickstart/V9_install/

    代码仓库:https://gitee.com/src-opencloudos-rpms问题反馈:https://bugs.opencloudos.tech

    作者:溪恒、谢石、遐宇

    Kubernetes 本身比较复杂,使用门槛较高,用户在开始容器化迁移时经常遇到各种各样的问题,由于缺乏故障定位的技能和工具,用户常常产生挫败感,甚至放弃业务容器化。其中网络问题表现尤为突出,Kubernetes 网络虚拟化导致网络问题排查的难度巨大。

    KubeSkoop 是阿里云容器服务团队开源的 Kubernetes 容器网络诊断工具,支持主流的网络插件和云厂商的 Kubernetes 集群诊断。它正是为了降低网络问题排查难度,让没有网络知识的人也可以自动化地定位网络问题。

    Kubernetes 容器网络诊断工具:https://github.com/alibaba/kubeskoop

    KubeSkoop 能够自动构建出给定源和目的地址在容器网络中的访问路径,自动化地采集和分析链路上每一个网络节点的配置,结合 eBPF 内核监控以及 IaaS 层的网络配置检查,定位出导致网络不通的根因,极大地降低了网络问题定位的时间,即使没有任何网络技能的用户也可以使用。目前在阿里云容器服务的环境中,作为自运维工具解决了大量客户在大规模 Kubernetes 集群场景下遇到的网络问题。

    本文将会对容器网络和传统定位手段带来的问题进行简单的介绍,以及对 KubeSkoop 的功能设计等方面进行总体解说。

    容器网络

    网络连通性-CNI

    容器网络是 Kubernetes 集群中及其重要的一部分,包括了构成集群网络连通性的 CNI 插件、Service 服务发现机制、NetworkPolicy 网络策略等。Kubernetes 集群网络保证了每个 Pod 拥有自己独立的网络空间,并且能够与集群中的 Pod 和 Node 互相通信。

    CNI 插件是构成集群容器网络中的核心,实现集群级别唯一的地址分配,将集群维度的网络打通。

    image

    不同的 CNI 插件,如 Flannel、Calico、Cilium、Terway 等,有其不同的网络实现,包括地址分配,网络虚拟化实现,网络连通性实现等。服务发现和网络策略除 CNI 插件外,Kubernetes 还提供了 Service 作为服务发现,以及 NetworkPolicy 作为网络策略能力。这些能力也是通过可替换的组件来实现的。

    image

    复杂性和网络问题定位

    由于概念繁多,以及插件实现选择的丰富性,导致 Kubernetes 网络问题存在着相当的复杂性,包括:

    • 逻辑概念的复杂性
    • Ingress/Service/NetworkPolicy 配置灵活,可能导致配置错误/规则冲突等问题。
    • 使用 ServiceMesh 或第三方 CNI 插件,带来更复杂的网络策略和扩展能力。
    • 数据面实现的复杂性
    • 数据平面经过不同组件的多层处理,且存在多种实现。
    • 协议栈链路复杂,涉及到网卡驱动 /netfilter/route/bridge 等配置。
    • 不同云厂商的底层配置不同,安全组、路由表等配置复杂。

    传统的容器网络问题定位手段,主要是通过抓包定位丢包点、压测复现、人工查配置等方式。存在着定位流程长、大量时间开销、人员经验要求高等问题。

    image.png

    在日常的工作中,排查容器网络问题占用了相当大部分的精力。因此,我们开发了 KubeSkoop 项目,来实现针对容器网络场景下问题的自动诊断系统。

    KubeSkoop 功能

    在我们的分析中,常见的 Kubernetes 网络问题可以分为以下两类:

    • 网络持续不通问题
    • 持续的无法访问:ping 不同、connect 超时、DNS 无法解析等。
    • 网络抖动问题
    • 偶发的网络问题:偶尔的业务超时、504、偶发 reset 等。
    • 网络性能问题:网络性能低、QPS 压不上去等。

    在这些问题中,80% 都是可以依赖经验解决的已知问题。而问题的处理时间主要浪费在问题上报、信息收集和验证上。

    KubeSkoop 即是针对这两类场景,通过信息收集(包括 CNI 插件、ServiceMesh、Kernel/eBPF、基础设施等)、推导和展示(容器服务智能运维、Prometheus、Grafana/Loki 等),实现全链路一键诊断、网络栈延迟分析、网络异常事件识别回溯,快速定位问题根因。

    image

    项目可分为两部分:诊断网络持续不通问题的 KubeSkoop 连通性诊断, 和分析网络抖动问题的 KubeSkoop 深度网络监控。

    连通性诊断

    通过 KubeSkoop,能够对网络持续不通问题进行一键诊断。

    用户通过指定网络不通的来源 IP 和目的 IP 发起一次诊断。在诊断中,KubeSkoop 将会自动构建网络访问链路,收集网络栈信息,分析链路问题。

    同时,诊断包含了 Service、NetworkPolicy 等 Kubernetes 概念的分析,全面覆盖协议栈、底层 IaaS 的连通性相关检查,让用户无需了解网络插件的实现,也无需拥有复杂网络问题排查经验,就能够一键定位网络问题并自助解决。

    image

    连通性诊断目前提供了 Flannel、Calico(内部包括 Terway)网络插件插件的诊断支持,以及阿里云作为基础设施的支持。关于诊断能力的完整使用文档,可见:https://kubeskoop.io/docs/guide/diagnose/intro

    深度网络监控

    针对网络抖动问题,KubeSkoop 深度网络监控提供了基于 eBPF 的,Pod 级别的容器网络异常监控能力。

    image.png

    基于 eBPF,KubeSkoop 提供了精简、低开销的内核异常监控能力,覆盖驱动、netfilter、TCP 等完整协议栈,几十种异常场景的识别。同时,基于云原生部署,提供了与 Prometheus 等可观测体系的对接,支持网络问题的 Metrics 查看和事件回溯。

    image

    关于深度网络监控能力的指标透出,可参考:https://kubeskoop.io/docs/guide/exporter/exporter-description

    KubeSkoop 设计

    KubeSkoop 的设计,同样分为连通性诊断和深度网络监控两部分。

    连通性诊断

    工作流程

    image

    KubeSkoop 连通性诊断的工作流程可分为三步:拓扑构建、信息采集和链路模拟。

    • 拓扑构建

    通过用户所提供的信息,再通过 API Server 获取集群内的 Pod/Node 资源和 Service/NetworkPolicy 规则,匹配对应的 CNI 插件、基础设施,构建集群内的访问关系。

    • 信息采集

    在构建链路的过程中,KubeSkoop 会按需向集群中的节点下发信息采集任务。采集的内容包括运行时信息、协议栈采集(路由、iptables、IPVS 等)和基础设施信息(ECS metadata)。采集后的信息用于后续的网络拓扑构建和诊断模拟过程。

    • 链路模拟

    KubeSkoop 会根据网络拓扑和所收集到到的信息,进行检查和模拟。包括对路径上的拓扑点和链路的转发模拟、对于 CNI 插件实现的模拟、云厂商的模拟,快速发现链路中存在的丢包或错误路由配置。

    最终,结合网络拓扑以及诊断中发现的异常链路,KubeSkoop 会输出诊断结果和链路中存在的问题,或在 Web UI 中进行直观地展示。

    扩展性

    image.png

    KubeSkoop 连通性诊断提供了对 CNI 插件和基础设施架构的扩展,能够轻松地在框架中提供对其它 CNI 插件和云厂商的支持。

    深度网络监控

    工作流程

    image

    KubeSkoop 深度网络监控通过在需要采集信息的集群节点上运行 KubeSkkop exporter 的方式,采集节点上 Pod 的网络监控信息并以多种形式导出,包括:

    • 深度容器网络采集
    • 通过 eBPF 采集协议栈关键点
    • 采集 procfs 下内核透出信息用于回溯
    • 采用 CRI 接口关联采集点和 Pod
    • 容器指标和异常事件预处理
    • 网络异常 Metrics 过滤,减少开销
    • 多指标聚合生成异常 Event
    • 网络 Metrics 和 Event 展示
    • 通过 Prometheus+Grafa 存储和回溯异常时间点指标
    • Grafana Loki 记录异常事件
    • KubeSkoop Inspector 查看实时异常事件流

    实现

    在实现中,采用了 eBPF 作为 KubeSkoop 主要数据的采集来源。eBPF 可以达到在内核中动态注入代码的目的,eBPF 代码在内核中执行效率高,并且可以通过 map 和 pert_event 与用户态通信。eBPF 还自带了校验机制,避免了因挂载的程序问题而导致宕机。

    image

    为了兼容性和性能考虑,在使用 eBPF 的过程中,我们也做了许多优化措施:

    • 采用 CO-RE 方式减少编译开销,提升内核兼容性
    • 减少在关键路径上的注入
    • 尽量在 eBPF 程序中过滤异常数据,以减少内存开销
    • 默认注入低开销程序,根据需求可动态插拔 eBPF 采集模块和修改过滤参数

    未来规划

    目前,KubeSkoop 项目仍旧处于早期阶段。我们下一步的规划包括:

    • 增加更多云厂商和网络插件的支持。
    • 支持模拟发包和追踪以定位未知问题点,缩小排查范围。
    • 提供 KubeSkoop Analysis 工具,智能分析 KubeSkoop 的指标和事件,降低诊断结果理解门槛。
    • 不限于网络诊断,增加存储、性能诊断。
    • 应用层感知能力,提供对7层协议(如 http、redis 等)的感知和处理。

    KubeSkoop 的官网位于:https://kubeskoop.io

    欢迎大家前来试用&提供建议&贡献代码!也欢迎通过搜索群号的方式加入 KubeSkoop 用户钉钉交流群~(群号:)

    此处了解 KubeSkoop 更多详情

    作者: 赵炳堃(秉钧)

    在传统的微服务体系中,Spring Cloud Alibaba 和 Zuul 常被用作配合 Spring Cloud 使用的微服务网关。然而,这些传统的 Java 网关在面对大规模流量的场景下仍存在种种问题。例如 Zuul 由于采用了非异步 IO 的架构,导致了其在面对高流量的情况下容易出现阻塞的现象,Spring Cloud Gateway 也会在流量很大的情况下产生 Full GC 的情况,导致请求 RT 变长,影响用户体验和业务稳定性。因此我们需要寻找一个新的选项,来替代这些传统的微服务网关。

    Higress: Spring Cloud生态下微服务网关的新选择

    Higress 是阿里巴巴开源的一款下一代云原生微服务网关。Higress 可以对接多种注册中心,包括Nacos/Zookeeper/Eureka 等,能够无缝集成 Spring Cloud 应用,对 Dubbo/Sentinel/OpenSergo 等微服务生态也有着深度的集成。与此同时,Higress 采用 C++内核,相比于传统的 Java 网关来说性能更高,更稳定,对比Spring Cloud Gateway 和 Zuul 来说,性能可以提升至2-4倍。另外,Higress 还天然兼容 K8s 的Ingress/Gateway API 标准,是一款更符合云原生时代标准的微服务网关。

    image

    更多性能压测试验,请参考:https://sigusoft.com/s/45ZAc5CGfND46Ao3lbHefQ

    Higress无缝对接Spring Cloud应用发布实战

    在现代软件架构逐渐走向微服务化、云原生化的过程中,应用的更新和迭代的频率变得越来越快,如何在尽可能保证用户体验不受影响的情况下完成应用的迭代发布就显得至关重要。目前业界普遍采用的几种典型的应用发布策略包括蓝绿发布、金丝雀发布、A/B Testing发布等。接下来本文将介绍如何使用Higress来实现Spring Cloud Alibaba应用发布的最佳实践。

    前提条件

    1. 安装Higress,并安装Istio CRD,参考Higress安装部署文档。
    2. 安装Naocs,参考Nacos安装部署文档。

    Higress支持将Nacos,Spring Cloud应用部署于K8s集群内,或者独立于K8s进行部署。为了演示方便,本文将Higress,Nacos,Spring Cloud应用都部署在本地K8s集群。

    1. 通过Higress实现Spring Cloud应用的服务发现和路由

    1.1. 部署SpringCloudAlibaba应用

    
    

    我们在k8s集群中部署如上Deployment,其中通过NACOS_REGISTRY_ADDRESS和SPRING_CLOUD_NACOS_DEMO_VERSION两个环境变量指定了Nacos的地址以及注册时携带的version信息。SpringCloud应用的application.properties配置会读取这两个环境变量,如下所示:

    
    

    1.2. 配置服务来源

    Higress支持多种服务来源,包括Nacos/Zookeeper/DNS/固定IP,通过创建Nacos服务来源,Higress就可以发现注册到Nacos上的服务,从而完成转发请求到这些服务上。

    进入Higress控制台(http://console.higress.io/), 服务来源-创建服务来源 以创建服务来源。这里选择Nacos 2.X,然后填写注册中心的地址,端口,命名空间,服务分组等信息。注册中心的地址可以填写ip或者域名,本文将Nacos部署在本地K8s中,通过K8s service暴露Nacos端口,因此这里填写对应的service域名。

    Higress 控制台:http://console.higress.io/

    image

    配置好Nacos服务来源后,我们可以在服务列表中看到我们刚刚部署好的应用。

    image

    1.3. 创建域名和路由

    在Higress控制台上域名管理-创建域名,创建一条demo.springcloud.com域名用于后续的访问。

    image

    路由配置-创建路由,创建一条名为demo的路由,域名选择我们刚刚创建好的demo.springcloud.com,目标服务选择我们在1.2中看到的Spring Cloud应用,path配置为/version。

    image

    1.4. 请求验证

    接下来我们就可以用配置好的路由来访问SpringCloud应用了,在请求时需要将demo.springcloud.com域名解析到本地ip,如下所示,可以成功得到返回结果。

    image

    注:如果您将Higress的80和443端口通过LoadBalancer的方式暴露出来,这里需要将本地ip替换为对应LoadBalancer的ip,详见Higress快速开始文档。

    2. 利用Higress进行蓝绿发布

    在蓝绿发布中,有两套相同的运行环境,一套是当前正在使用的生产环境(蓝色环境),另一套是新版本的测试环境(绿色环境)。新版本的代码只在绿色环境中运行,测试通过后,直接将流量切换到绿色环境中,从而完成新版本的上线。与此同时蓝色环境作为热备环境,当绿色环境出现问题需要回滚时,也可以直接将流量全部再切换回蓝色环境。

    image

    image

    2.1. 部署新版本应用

    在本地K8s集群中apply如下资源,以部署v2版本的SpringCloud应用。

    
    

    部署完毕后,我们可以在Higress控制台的服务列表中看到应用已经有两个endpoint了,如下图所示:

    image

    2.2. 为服务划分子集

    部署完v2版本的应用后,我们可以在Nacos控制台(http://localhost:8848/nacos)上看到service-provider这个服务有两个ip,它们的metadata中的version字段分别为v1和v2。Higress可以根据服务的信息将服务划分为不同的子集(subset),从而将请求转发到新版本或者老版本的应用中去。

    image

    在本地K8s集群中apply如下资源,从而根据应用信息中的version字段将服务划分为v1和v2两个子集。

    
    

    2.3. 修改ingress路由规则

    新版本应用上线后,我们需要把流量全部切到新版本应用中去,这时只需要简单地修改一下我们在1.3中创建的路由即可。我们可以在本地K8s集群中找到如下ingress资源,这对应了我们在1.3中创建的那条路由。

    image

    我们直接编辑这条ingress资源,将higress.io/destination这条annotation的value改为service-provider.DEFAULT-GROUP.public.nacos v2,即可将路由的目标服务修改为v2子集。

    
    

    2.4. 请求验证

    我们再发送请求,可以看到此时得到的是v2版本应用的返回结果,如此便实现了新版本的上线发布。

    image

    如果发现已上线的新版本出现问题需要回滚,只需要修改ingress路由中的higress.io/destination,将值更改为service-provider.DEFAULT-GROUP.public.nacos v1即可完成回滚。

    3. 利用Higress进行金丝雀发布

    金丝雀发布是将少量的请求引流到新版本上,因此部署新版本服务只需极小数的实例。验证新版本符合预期后,逐步调整流量权重比例,使得流量慢慢从老版本迁移至新版本,期间可以根据设置的流量比例,对新版本服务进行扩容,同时对老版本服务进行缩容,使得底层资源得到最大化利用。

    image

    3.1. 修改ingress路由规则

    Higress可以通过一条Ingress注解轻松完成应用的金丝雀发布。我们编辑2.3中的ingress资源,将ingress中的higress.io/destination注解按如下方式进行修改:

    
    

    这样Higress就可以把80%的流量转发到v1版本的应用,将20%的流量转发到v2版本的应用。

    3.2. 请求验证

    连续发送20条请求,可以看到v1和v2的比例符合我们在ingress中配置的比例。随着灰度的进行,可以逐渐调大v2版本的流量比例,最终完成新版本的平滑上线。

    image

    4. 利用Higress进行A/B Testing发布

    A/B测试基于用户请求的信息将流量路由到新版本,这是一种基于请求内容匹配的灰度发布策略。只有匹配特定规则的请求才会被引流到新版本,常见的做法包括基于HTTP Header和Cookie。基于HTTP Header方式,例如User-Agent的值为Android的请求 (来自安卓系统的请求)可以访问新版本,其他系统仍然访问旧版本。基于Cookie方式,Cookie中通常包含具有业务语义的用户信息,例如普通用户可以访问新版本,VIP用户仍然访问旧版本。

    image

    image

    4.1. 修改ingress路由规则

    在本示例中,我们通过HTTP header中的User-Agent对流量进行区分,将Android系统的流量转发到v2版本,其他系统的流量仍保持v1版本。首先修改2.3中名叫demo的ingress资源,将higress.io/destination修改为v1版本,代表目前线上的流量全部会打到原来的v1版本:

    
    

    当新版本部署完成后,再新建一条如下所示的ingress路由。这里采用正则匹配的方式,当User-Agent中含有Android时,将请求转发到v2版本的服务。

    
    

    4.2. 请求验证

    可以看到来自安卓系统的请求被转发到了v2版本,其余系统仍访问v1版本。

    image

    当新版本验证完毕需要全量上线时,只需要将demo路由的higress.io/destination注解修改为v2版本,并删除demo-ab路由,这样所有流量就都会访问v2版本了。

    加入Higress和Spring Cloud Aliaba社区

    Spring Cloud Alibaba社区交流群:钉钉群号

    Higress社区交流群:钉钉群号

    Higress 社区交流钉钉群中有历次 Higress 社区周会录屏,包括本文中提到的结合 Spring Cloud 应用发布的完整实操视频。

    file

    作者|云科NearFar X Lab团队 左益、周志银、洪守伟、陈超、武超

    一、导读

    无锡拈花云科技服务有限公司(以下简称:拈花云科)是由拈花湾文旅和北京滴普科技共同孵化的文旅目的地数智化服务商。2022年底,拈花云科NearFar X Lab团队开始测试DolphinScheduler作为交付型项目和产品项目的任务调度工具。本文主要分享了拈花云科在任务调度工具的选择、迭代和实践过程中的经验,希望对大家有所启发。

    二、业务背景

    我们的服务对象主要是国内各个景区、景点,业务范围涵盖文旅行业的多个板块,如票务、交通、零售、住宿、餐饮、演绎、游乐、影院、KTV、租赁、服务、会务、康乐、康养、电商、客服、营销、分销、安防等。由于业务系统来源较多,多系统下的数据源类型差异化较大,所以在实施数据项目时我们需要能够支持多种数据来源(Mysql、Oracle、SqlServer、Hive、Excel……)的数据集成任务。同时根据大部分景区为国有化的特点,我们也需要具备能够提供私有化交付部署及SAAS化数据中台产品解决方案的双重服务支撑能力。

    三、DolphinScheduler 调度系统选型过程

    在团队成立之初为了快速构建MVP业务版本,我们沿用了团队同事之前用过的Kettle调度方案。该方案下通过Kettle完成可视化调度的配置及对于异构数据的集成任务,通过Python 调用HQL脚本完成基于Hive的传参数据计算。 file 基于MVP的构建,我们也开始思考,在我们的整体中台架构下该需要一个什么样的调度系统,以及除了调度这件事本身我们还需要哪些功能和能力。带着这些问题我们开始整理自己的需求,以及每个需求下有什么样的产品可以适配。

    调度系统需要支撑的应用场景

    文旅业态下的数据使用场景与其它业态下的使用场景大体相同,主要分为以下四类:

    file

    调度系统需要支撑的项目类型

    我们选择的调度系统需要同时具备实施类项目、SAAS产品两种需求下的数据中台支撑能力 file

    基于以上需求我们进行了调度系统的选型对比。网上有非常多关于Oozie、Azkaban、Airflow、DolphinScheduler、Xxl-job、Kettle等调度选型的文章及介绍,在此不过多的展开他们的优缺点。我们觉得每个产品的设计都有它自身的考量,都有适用与不适用的场景。结合我们自身的使用需求最终我们选择了使用DolphinScheduler作为数据中台的调度平台。

    主要原因如下:

    1. High Reliability(高可靠性) 高可靠性是我们看重的第一要点,因为不管是实施项目还是SAAS产品,只有系统稳定产品才可以正常运行。DolphinScheduler通过去中心化设计、原生 HA 任务队列支持、过载容错能力支持提供了高度稳健的环境。在我们半年的使用过程中也验证了其非常稳定。
    2. High Scalability:(高扩展性) 由于我们要支持实施项目/SAAS产品两种场景下的使用,DolphinScheduler的多租户支持很好的契合了SAAS场景下资源隔离的使用需求。同时其扩缩容能力、高度的调度任务上限(10万+)都能很好的支撑我们业务的扩展性需求。
    3. 丰富的数据集成能力 DolphinScheduler提供的任务类型已经远远涵盖了我们经常使用的任务类型(DataX、SeaTunnel的支持本身就涵盖了较多的Source2Target同步/推送场景)。
    4. 支持Kubernetes部署 上文提到在私有化的部署方式下客户的部署环境大不相同,对于实施团队来说,如果能够简单、高效、一致的完成部署则会极大的提高项目投递部署效率,同时也能减少很多因环境原因而产生的问题。
    5. 不仅仅是调度 在调研DolphinScheduler的过程中我们发现,除了调度本身这个环节,结合DCMM(数据管理能力成熟度评估模型)的国标8个能力域,DolphinScheduler在数据质量模块也做了很多实现,这无疑又命中了我们对于数据质量能力建设的需求。同时Apache DolphinScheduler的服务架构中还有AlertServer服务。作为整体数据中台方案来说后期完全可以将所有报警需求集成在Apache DolphinScheduler的报警服务中,避免多系统重复造轮子。从这些点考虑DolphinScheduler它不仅仅是一个调度工具而更像是一个数据开发平台。(期待随着社区的迭代会有更完整的生态实现)
    6. 问题处理难度 DolphinScheduler社区非常的活跃,在加入DolphinScheduler社区群后每天都可以看到非常多的伙伴在交流关于Apache DolphinScheduler使用过程中的问题,社区人员也都积极的予以回复。同时Dolphinscheduler又是咱们国产开源软件,所以完全不必担心存在沟通上的障碍。

    四、基于DolphinScheduler的项目实践

    1、DolphinScheduler ON Kubernetes

    DolphinScheduler支持多种部署方式:单机部署(Standalone)、伪集群部署(Pseudo-Cluster)、集群部署(Cluster)、Kubernetes部署(Kubernetes)。在项目实施的场景下由于客户提供的部署环境千变万化,我们需要一种稳定、快速、不挑环境的部署方式。Apache DolphinScheduler on K8S的部署方式很好的满足了我们的需求,此部署方式能极大的提高整体项目的部署效率及动态扩展性。

    • Kubernetes是一个开源的容器编排平台,可以实现容器的自动化部署、扩缩容、服务发现、负载均衡,可以提高DolphinScheduler的可用性、可扩展性和可维护性
    • Kubernetes可以支持多种存储类型,包括本地存储、网络存储和云,可以满足DolphinScheduler多节点共享持久化存储需求
    • Kubernetes可以支持多种调度策略,包括亲和性、反亲和性、污点和容忍,可以优化DolphinScheduler的资源利用率,提高任务执行效率。
    • Kubernetes可以支持多种监控和日志方案,包括Prometheus、Grafana、ELK等等,可以方便地对DolphinScheduler的运行状态和性能进行监控,分析和告警

    在部署Apache DolphinScheduler on K8S 的过程中我们也曾遇到过一些问题,下面是我们总结的一些Kubernetes部署要点:

    自定义镜像

    
    

    dolphinscheduler-api

    
    

    dolphinscheduler-master

    
    

    dolphinscheduler-tools

    
    

    dolphinscheduler-worker

    
    

    配置文件修改

    官方教程中的helm进行安装,在安装过程中需要修改源码中 “” 路径下的 “” 里的相关镜像和版本(注:原配置没有指定持久化储存类,会使用默认的存储类,建议是修改并使用可多节点读写并且可以弹性扩展的,多节点读写便于worker节点共用同一套lib)

    生产配置

    • dolphinscheduler-api 3 副本(注:默认是 1副本,但是实际使用中发现,平台页面在使用过程中会有卡顿,增加副本数之后,会有明显改善
    • dolphinscheduler-alert 1副本
    • dolphinscheduler-zookeeper 1副本
    • dolphinscheduler-worker 3副本
    • dolphinscheduler-master 3副本

    k8s部署总结

    采用k8s部署后,最大感受就是可排除环境干扰,快速扩展,迁移,部署,帮助我司实现了数据中台私有化中的调度标准化,该方案已在多个景区中进行快速落地并应用。

    2、基于SQL脚本血缘的DolphinScheduler工作流自动化实现

    项目背景

    基于景区中各个业务系统(票务、营销、安防、酒店、商业、能耗、停车等)在景区机房下建设数据中台,完成以下应用需求:

    • 满足各个业务部门日常的报表需求
    • 支持各类大屏看板展示
    • 为景区的管理层决策提供数据依据

    技术选型

    数据仓库:Doris 调度工具:DolphinScheduler 使用版本:3.0.0 版本管理:Gitlab 容器编排:Kubernete

    处理流程

    • 业务分析与指标确认:与业务部门沟通,了解业务需求和目标,明确数据指标的定义、计算逻辑和展示方式。
    • 数据仓库分层和设计:根据数据仓库的四层架构(ODS、DWD、DWS、ADS),设计数据模型和表结构,规范命名和注释。
    • 数据脚本开发:编写数据抽取、清洗、转换、加载等脚本,实现数据从源系统到目标表的流转和处理。
    • 数据任务调度:入仓后的执行脚本通过血缘识别依赖自动录入DolphinScheduler形成工作流任务调度(设置任务依赖、触发条件、重试策略等参数)监控任务运行状态和日志。
    • 数据输出和文档:输出标准指标库和相关文档,供BI、可视化报表等使用,同时编写数据开发文档,记录数据开发过程中的关键信息和问题。

    下面介绍下我们根据SQL血缘识别自动生成Apache DolphinScheduler调度任务的实现过程:

    在DolphinScheduler平台上开发数据调度工作流的过程中我们遇到一个问题:如果一个工作流下的任务量太多,在原有的UI界面中想通过界面方式完成配置更改以及血缘关系的建立等操作会非常不便捷。即便是通过任务定义去配置,当上百个任务同时需要配置依赖关系时也是一个不小的工作量开销而且还容易出错,后期的更新迭代也较为不便。

    我们结合工作流下SQL任务本身的特点(数仓SQL任务是整体按照Apache DolphinScheduler、DWD、DWS、Apache DolphinScheduler 的计算流程进行计算,每个表对应一个Apache DolphinScheduler的Task既每个Task都会包含SourceTable及TargetTabe。通过这层关系我们就可以构建起完整的数仓任务血缘依赖)。基于以上想法我们实现了从数据脚本自动生成对应的工作流和任务的自动化方案:

    • 数据入仓后的开发脚本以每个表单为单位对应生成一个TaskSQL脚本提交到git。
    • 自动化工具生成工作流及任务前自动从git库中获取最新的数据脚本。
    • 自动化工具拉取到最新代码后识别和分析所有数据脚本之间的血缘关系。
    • 自动化工具通过血缘关系自动将所有的任务关联并组装到一个工作流中:每个任务执行完成后,会立即触发下游任务,最大化地利用服务器资源。

    以下是该实现的核心代码:

    sql解析

    
    

    节点对象定义

    
    

    树型结构组装

    
    

    部分效果图展示:

    自动化生成的任务定义

    file 自动化生成的工作流定义图 file 增量运行结果 file

    自动化实现总结

    1. 数仓调度任务的秒级上线与切换 通过该方式将数仓开发与DolphinScheduler解耦,实现了整体数据调度任务的秒级上线与切换。这样,我们可以快速复制标品化数据建模,极大地简化了实施的难度。
    2. 血缘进行的任务关联与生成 通过血缘进行的任务关联与生成,大大提升了整体的资源利用率,也减少了人工的投入和成本。
    3. 血缘监控和管理 通过血缘监控和管理,可以帮助我们及时发现和纠正任务执行过程中的问题和错误,保证数据质量和准确性。

    五、未来规划

    • 离在线统一调度 :实现基于Apache SeaTunnel的离线与实时数据同步调度,使得两个场景在一个平台完成。
    • 应用基线管理:根据各任务的上下游依赖构建数据应用基线,并监控各目标任务及其依赖任务是否按时成功运行,以确保目标任务的准时产出。
    • 任务指标监控:支持实时查看每个组件的指标,例如输入记录数、输出记录数和执行时间等。
    • 数据血缘关系:上报数据源、目标表、字段等信息,构建数据血缘关系图,方便追溯数据的来源和影响。
    • 资源文件版本管理:支持资源文件等的简单多版本管理,可以查看历史版本、回滚到指定版本等。

    六、总结与致谢

    1. 通过使用DolphinScheduler替换原有的调度工具,使得数据开发运维实现了平台统一化。基于Apache DolphinScheduler提供的强大集成扩展插件能力大大提升了数据集成与数据开发的效率。
    2. DolphinScheduler自带的告警管理功能非常全面。配合此功能我们建立了运维值班制度以及微信告警通知的功能。故障发生时,运维人员可以第一时间收到报警通知,有效提高了故障的感知能力。
    3. 基于DolphinScheduler调度技术方案在多个项目中的优异表现,使得我们更好的推动了公司的数据驱动战略。从实践中沉淀出公司的数据实施SOP,为各个客户、业务部门提供了及时、准确、全面的数据分析和决策支持。
    4. 我们第一次部署时使用的是3.0.0 版本。目前社区已经发布了 3.1.7 迭代速度非常快。如果你们的项目正在选型调度工具,我们强烈建议使用DolphinScheduler。加入社区进群会有非常多的前辈、大佬带你起飞。DolphinScheduler 值得大力推荐,希望大家都能从中受益,祝愿DolphinScheduler生态越来越繁荣,越来越好!

    本文由 白鲸开源科技 提供发布支持!

    AI 时代,DevOps 与 AI 共价结合。AI 由业务需求驱动,提高软件质量,而 DevOps 则从整体提升系统功能。DevOps 团队可以使用 AI 来进行测试、开发、监控、增强和系统发布。AI 能够有效地增强 DevOps 驱动流程,从开发人员的业务实用性和支持的角度来看,评估 AI 在 DevOps 中的重要性是十分必要的。  

    在本篇文章中,我们将一同探讨 DevOps 如何利用 AI 实现业务上的增强与提升。  

    DevOps 中存在的摩擦

    在 DevOps 实践中,摩擦可能源于软件开发和运营生命周期中的各种挑战和瓶颈。这里我们将总结6个 DevOps 中常见的摩擦。  

    DevOps 中的一个主要摩擦就是开发和运营团队之间存在孤岛。孤岛团队通常有不同的目标、优先级和流程,导致沟通障碍、协作延迟以及实现共同目标的困难。这种摩擦会阻碍开发和运营的无缝集成,影响软件交付的速度和质量。  

    此外,DevOps 中的手动流程,例如手动代码部署、环境设置和配置管理,同样会导致效率低下。手动任务耗时、容易出错,并且可能导致跨环境的不一致。这些过程会减慢开发周期,增加人为错误的可能性,并在企业实现高效可靠的软件交付的道路上制造障碍。各种 DevOps 实践中缺乏自动化会效率低下。当构建、测试和部署软件等重复性任务没有自动化时,会增加出错的机会,延长发布过程,并从更具战略意义的活动中转移宝贵的资源。自动化不足也会影响可扩展性,阻碍有效处理不断增加的工作负载的能力。  

    不充分的反馈循环也会在 DevOps 中产生摩擦。当对代码更改、测试结果或部署的反馈延迟时,会妨碍快速迭代和及时响应问题的能力。缓慢的反馈循环会阻碍缺陷的检测,限制持续集成的有效性,并影响整个开发周期。对软件系统的性能、健康状况和用户体验的可见性不足会在 DevOps 中造成摩擦。如果没有对系统指标、日志和应用程序性能的全面监控和强大的可见性,识别问题、解决问题以及主动响应潜在瓶颈或故障就变得很困难。有限的可见性会导致停机时间延长、系统可靠性降低以及维护服务水平协议困难重重。当事件响应和管理流程定义不明确或缺乏自动化时,就会在 DevOps 中引入摩擦。缓慢的事件检测、低效的沟通和手动事件处理会延长解决时间,影响系统可用性、客户满意度和 DevOps 团队的整体效率。  

    AI 时代下的 DevOps

    DevOps 和 AI 在很多方面都非常匹配。DevOps 需要自动化才能尽可能有效,而 AI 是处理重复性活动的自然选择。当我们盘点 DevOps 团队软件发布延迟的最常见原因是什么时,回答提到了手动、耗时、费力且可能容易出错的活动,例如软件测试、代码审查、安全测试和代码开发。由此可见 AI 可能对许多团队简化这些程序至关重要。  

    使用 AI 减少 DevOps 摩擦

    AI 可以通过提供简化流程和增强协作的自动化、智能和洞察力,从而减少 DevOps 中的摩擦。

    • 自动化流程:AI 可以自动化手动和重复性任务,例如环境设置、配置管理和部署流程。通过利用 AI 支持的工具和平台,DevOps 团队可以加快工作流程,减少人为错误,并释放资源用于更具战略意义的活动。

    • 持续反馈和测试:AI 通过自动化代码分析、测试用例生成和质量保证来实现持续集成和测试。AI 算法分析代码存储库、识别潜在问题并提供可操作的建议。这通过提高代码质量、增加测试覆盖率和启用更快的反馈循环来减少摩擦。

    • 智能监控和警报:AI 监控工具可以分析来自日志、指标和用户行为的大量数据。AI 算法检测异常、预测性能问题并触发智能警报。这提高了对系统健康状况的可见性,减少了平均检测时间 (MTTD),并促进了更快的事件响应和解决。

    • 预测分析和容量规划:AI 能够分析历史使用模式、用户行为和工作负载趋势,以提供准确的容量规划和资源分配建议。通过利用 AI 算法,DevOps 团队可以优化资源配置、预测峰值负载并避免过度配置和利用不足,从而减少由可扩展性和资源管理问题引起的摩擦。

    • 智能事件管理:AI 可以自动进行事件检测、分类和解决。AI算法可以分析事件数据、识别模式并建议适当的补救措施。AI 驱动的聊天机器人和虚拟助手可以协助事件报告和响应,减少响应时间,最大限度地减少停机时间,并提高事件管理效率。

      通过利用 AI 在自动化、数据分析和智能决策方面的能力,企业可以减少 DevOps 中的摩擦。AI 可以更快、更准确地执行任务,提高可见性,增强协作,并使团队能够做出数据驱动的决策,从而实现更顺畅的工作流程、更高的效率和加速的软件交付。  

    利用 AI 实现持续的安全性和合规性

    利用 AI 来实现 DevOps 中的持续的安全性和合规性可以提供实时的风险评估、自动化的安全测试和合规检查,并通过智能化驱动的决策支持来减少潜在的安全漏洞和风险。  

    • 实时风险评估:AI 监测和分析各种安全事件和数据源,包括日志、监控指标、网络流量等,以了解别潜在的威胁和漏洞。AI 算法以自动分析异常行为、恶意活动和安全事件模型,提供实时的风险评估,帮助 DevOps 团队快速识别和应对安全威胁。

    • 合规性检查和自动化:AI 可以分析合规性要求、标准和方法,并自动检查系统的合规性。AI 算法自行扫描配置文件件、访问控制策略和日志数据,识别违反合规性规则的为此,并提供自动化的合规性报告。这有助于确保系统满足标准和标准的要求,并降低合规性风险。

    • 智能决策支持:AI 为DevOps团队提供智能决策支持,帮助他们在安全和符合规范方面做出更明确的决策。通过分析。大量的安全数据和历史案例,AI 可以提供针对特定安全事件或合规问题的建议和最佳实践。这可以帮助团队更好地理解和评估风险,并采纳适当的措施来提出更高的安全性和合规性性。

    • 自动化安全审计和日志分析:AI 分析和审计大纲模型的安全日志和事件数据,以便检测异常活动、入试测试和数据暴露。AI 算法可以自动识别别潜在的威胁模型,提供实时的报警和响应,帮助团队及时间发现并应对安全事件。

      其中自动合规性测试应确保满足所有要求,并且使功能可用于生产。自动合规性检查的复杂性可以从一个框架到自动化基础设施合规性,再到一些基本的东西,比如专门为检查合规性而创建的一组测试。  

    成功案例一览

    以下是在 DevOps 中利用 AI 的组织的著名示例、通过 AI 集成实现了对业务的正面影响并获得可观收益。  

    • Netflix – Netflix 高度依赖于在其 DevOps 流程中使用 AI。他们复杂的推荐系统利用 AI 算法来分析用户数据并提供个性化的内容推荐。这个 AI 驱动的系统通过留住订阅者和提供个性化的用户体验,在很大程度上为他们的成功做出了贡献。

    • Google – Google 在 (CI/CD) 流水线中使用 AI。其 Cloud Build 平台采用 AI 算法来检测代码漏洞、推荐修复并自动运行测试,以确保已部署软件的完整性和安全性。

    • Facebook – 在 Facebook 的 DevOps 实践中使用 AI 提高了它们的性能。其 AI 系统 Proxygen 使用机器学习算法分析网络流量并优化网络服务器性能。此实施显著改善了更快的响应时间和更好的用户体验。

     

    AI 与 DevOps 未来趋势

    随着对有效且可扩展的软件开发流程的需求不断增长,AI-Enabled DevOps 的未来不可估量。为了最大限度地发挥其优势并保证无缝集成,AI 与 DevOps 集成需要仔细考虑。此外,预测分析、智能决策以及自动化测试和监控是 AI 在 DevOps 中的一些可能用途。为了降低漏洞风险并保持对法律法规的遵守,在 DevOps 中实施 AI 时优先考虑安全和数据隐私至关重要。  

    最重要的是,企业如果想要实现支持 AI 的 DevOps,就必须在基础设施和培训方面进行投资,以支持 AI 驱动的解决方案的创建和实施。

    在平时和开发者们交流的过程中,发现许多开发朋友尤其是新入门 Taier 的开发者,对于本地调试都有着诸多的不理解和问题。本文就大家平时问的最多的三个问题,服务编译,配置&本地运行,如何在 Taier 运行 Flink-standalone,进行简单的介绍,希望和大家共同交流学习。

    服务编译

    在本章将介绍服务编译中的两大插件 WorkerPlugins 及 DataSourcePlugin,以及 Taier 的前后端 UI & datadevelop 的作用。

    WorkerPlugins 的作用

    平台通过在 Taier-UI 运行任务之后,在 Taier-data-develop 中通过集群绑定到租户,再通过当前租户绑定集群中的组件类型以及版本号获取到不同的 WorkerPlugin,通过不同组件类型以及版本号进行提交任务。下图为整体的运行架构图:

    file

    WorkerPlugins 的编译

    运行任务时这是一个必要的选项,当我们需要本地调试或者部署运行时,WorkerPlugins 的编译是必须进行的,在编译之后会获取到一个 WorkerPlugins 的目录,具体的编译过程请看文末视频链接中的演示讲解。

    file

    DataSourcePlugin 的作用

    介绍完 WorkerPlugins 这个插件之后,来介绍一下另一个插件 DataSourcePlugin。

    在 Taier-UI 中我们可以配置诸多不同类型的数据源,如 MySQL,Doris,Oracle 等,这些功能都是依赖着强大的 DataSourcePlugin 来进行实现。同时在使用离线同步中的 GUI 任务配置相关功能时,获取数据库信息也都是依赖 DataSourcePlugin 来完成的。

    file

    DataSourcePlugin 的编译

    运行任务时这是一个必要的选项,当我们需要本地调试或者部署运行时,DataSourcePlugin 的编译是必须进行的,在编译之后会获取到一个 DataSourcePlugin 的目录,具体的编译过程请看文末视频链接中的演示讲解。

    file

    Taier-UI 的作用

    在 Taier-UI 中我们可以进行配置不同类型的数据源、创建任务、任务运维、提交调度、集群配置、集群绑定等各种操作。

    TaierDataDevelop 的作用

    在 Taier- UI 中进行操作的所有后端服务 API 的支持都是来自于 TaierDataDevelop 的支持,该服务主要是与前后端交互。

    file

    配置&本地运行

    该节内容主要介绍 TaierDataDevelop 的配置,在此进行后端服务的端口 ZK、WorkerPlugins、DataSourcePlugin 数据库等相关配置,前后端的启动,以及集群配置(Flink-standalone)和绑定。

    具体的代码流程请看文末视频链接中的演示讲解。

    file

    运行 Flink-Standalone 实践

    配置集群

    在任务运行时,通过配置的 CDH 集群,使用配置 YARN 组装任务,通过 ChunJun 或直接提交任务至 Flink、Doris、Spark 等计算引擎中。

    配置&运行任务

    通过任务 GUI 组装任务配置,包括数据来源和去向,通过字段映射、任务自定义参数等相关配置从而进行任务配置。

    file

    视频课程&PPT获取

    视频课程:

    https://www.bilibili.com/video/BV19M411L7f2/?spm_id_from=333.999.0.0

    课件获取:

    https://www.dtstack.com/resources/1031

    《数栈产品白皮书》:https://www.dtstack.com/resources/1004?src=szsm

    《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001?src=szsm 想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=szkyzg

    同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术qun」,交流最新开源技术信息,qun号码:,项目地址:https://github.com/DTStack

    摘要:解决SimpleDateFormat类在高并发场景下的线程安全问题可以有多种方式,这里,就列举几个常用的方式供参考。

    本文分享自华为云社区《【高并发】更正SimpleDateFormat类线程不安全问题分析的错误》,作者: 冰 河 。

    解决SimpleDateFormat类在高并发场景下的线程安全问题可以有多种方式,这里,就列举几个常用的方式供参考,大家也可以在评论区给出更多的解决方案。

    1.局部变量法

    最简单的一种方式就是将SimpleDateFormat类对象定义成局部变量,如下所示的代码,将SimpleDateFormat类对象定义在parse(String)方法的上面,即可解决问题。

    
    

    此时运行修改后的程序,输出结果如下所示。

    
    

    至于在高并发场景下使用局部变量为何能解决线程的安全问题,会在【JVM专题】的JVM内存模式相关内容中深入剖析,这里不做过多的介绍了。

    当然,这种方式在高并发下会创建大量的SimpleDateFormat类对象,影响程序的性能,所以,这种方式在实际生产环境不太被推荐。

    2.synchronized锁方式

    将SimpleDateFormat类对象定义成全局静态变量,此时所有线程共享SimpleDateFormat类对象,此时在调用格式化时间的方法时,对SimpleDateFormat对象进行同步即可,代码如下所示。

    
    

    此时,解决问题的关键代码如下所示。

    
    

    运行程序,输出结果如下所示。

    
    

    需要注意的是,虽然这种方式能够解决SimpleDateFormat类的线程安全问题,但是由于在程序的执行过程中,为SimpleDateFormat类对象加上了synchronized锁,导致同一时刻只能有一个线程执行parse(String)方法。此时,会影响程序的执行性能,在要求高并发的生产环境下,此种方式也是不太推荐使用的。

    3.Lock锁方式

    Lock锁方式与synchronized锁方式实现原理相同,都是在高并发下通过JVM的锁机制来保证程序的线程安全。通过Lock锁方式解决问题的代码如下所示。

    
    

    通过代码可以得知,首先,定义了一个Lock类型的全局静态变量作为加锁和释放锁的句柄。然后在simpleDateFormat.parse(String)代码之前通过lock.lock()加锁。这里需要注意的一点是:为防止程序抛出异常而导致锁不能被释放,一定要将释放锁的操作放到finally代码块中,如下所示。

    
    

    运行程序,输出结果如下所示。

    
    

    此种方式同样会影响高并发场景下的性能,不太建议在高并发的生产环境使用。

    4.ThreadLocal方式

    使用ThreadLocal存储每个线程拥有的SimpleDateFormat对象的副本,能够有效的避免多线程造成的线程安全问题,使用ThreadLocal解决线程安全问题的代码如下所示。

    
    

    通过代码可以得知,将每个线程使用的SimpleDateFormat副本保存在ThreadLocal中,各个线程在使用时互不干扰,从而解决了线程安全问题。

    运行程序,输出结果如下所示。

    
    

    此种方式运行效率比较高,推荐在高并发业务场景的生产环境使用。

    另外,使用ThreadLocal也可以写成如下形式的代码,效果是一样的。

    
    

    5.DateTimeFormatter方式

    DateTimeFormatter是Java8提供的新的日期时间API中的类,DateTimeFormatter类是线程安全的,可以在高并发场景下直接使用DateTimeFormatter类来处理日期的格式化操作。代码如下所示。

    
    

    可以看到,DateTimeFormatter类是线程安全的,可以在高并发场景下直接使用DateTimeFormatter类来处理日期的格式化操作。

    运行程序,输出结果如下所示。

    
    

    使用DateTimeFormatter类来处理日期的格式化操作运行效率比较高,推荐在高并发业务场景的生产环境使用

    6.joda-time方式

    joda-time是第三方处理日期时间格式化的类库,是线程安全的。如果使用joda-time来处理日期和时间的格式化,则需要引入第三方类库。这里,以Maven为例,如下所示引入joda-time库。

    
    

    引入joda-time库后,实现的程序代码如下所示。

    
    

    这里,需要注意的是:DateTime类是org.joda.time包下的类,DateTimeFormat类和DateTimeFormatter类都是org.joda.time.format包下的类,如下所示。

    
    

    运行程序,输出结果如下所示。

    
    

    使用joda-time库来处理日期的格式化操作运行效率比较高,推荐在高并发业务场景的生产环境使用。

    解决SimpleDateFormat类的线程安全问题的方案总结

    综上所示:在解决解决SimpleDateFormat类的线程安全问题的几种方案中,局部变量法由于线程每次执行格式化时间时,都会创建SimpleDateFormat类的对象,这会导致创建大量的SimpleDateFormat对象,浪费运行空间和消耗服务器的性能,因为JVM创建和销毁对象是要耗费性能的。所以,不推荐在高并发要求的生产环境使用

    synchronized锁方式和Lock锁方式在处理问题的本质上是一致的,通过加锁的方式,使同一时刻只能有一个线程执行格式化日期和时间的操作。这种方式虽然减少了SimpleDateFormat对象的创建,但是由于同步锁的存在,导致性能下降,所以,不推荐在高并发要求的生产环境使用。

    ThreadLocal通过保存各个线程的SimpleDateFormat类对象的副本,使每个线程在运行时,各自使用自身绑定的SimpleDateFormat对象,互不干扰,执行性能比较高,推荐在高并发的生产环境使用。

    DateTimeFormatter是Java 8中提供的处理日期和时间的类,DateTimeFormatter类本身就是线程安全的,经压测,DateTimeFormatter类处理日期和时间的性能效果还不错(后文单独写一篇关于高并发下性能压测的文章)。所以,推荐在高并发场景下的生产环境使用。

    joda-time是第三方处理日期和时间的类库,线程安全,性能经过高并发的考验,推荐在高并发场景下的生产环境使用

     

    关注,第一时间了解华为云新鲜技术~

    图片

    2023年6月24日,北京数变科技有限公司和腾讯云计算(北京)有限责任公司(以下简称:腾讯云)完成了 Databend Cloud 在腾讯云兼容性认证。

    本公司的产品《Databend 云数据仓库系统 V1.0》 正式通过了腾讯云产品《腾讯云容器服务 v3 COS 对象存储》的技术认证,并收到了腾讯云颁发的产品认证证书。 测试结果显示,经过严格联合测试,双方产品相互兼容良好、运行稳定。

    图片腾讯云是由腾讯集团倾力打造的云计算品牌,面向全世界各个国家和地区的政府机构、企业组织和个人开发者,提供全球领先的云计算、大数据、人工智能等技术产品与服务。以卓越的科技能力打造丰富的行业解决方案,构建开放共赢的云端生态,推动产业互联网建设,助力各行各业实现数字化升级。

    Databend Cloud 是基于开源云原生数仓项目 Databend 打造的一款易用、低成本、高性能的新一代大数据分析平台,实现按需、按量付费的 Data Cloud, 让你专注于数据价值的挖掘,算你所想。

    Databend Cloud 已经支持了腾讯云广州区,欢迎体验使用(https://app.databend.cn/qcloud-landing)。 如果有其它区需求的朋友也可以联系我们。

    图片

    图左:北京数变科技有限公司(Databend)联合创始人—王吟

    图右:腾讯云存储产品负责人—崔剑

    提到主从复制,我们可能立马会联想到 MySQL 的主从复制。

    MySQL 主从复制是 MySQL 高可用机制之一,数据可以从数据库服务器主节点复制到一个或多个从节点。

    这篇文章,我们聊聊 RocketMQ 的主从复制,希望你读完之后,能够理解主从复制的精髓。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1 同步与异步

    在 RocketMQ 的集群模式中,Broker 分为 Master 与 Slave,一个 Master 可以对应多个 Slave,但是一个 Slave 只能对应一个 Master。

    每个 Broker 与 Name Server 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 Name Server。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Master 节点负责接收客户端的写入请求,并将消息持久化到磁盘上。而 Slave 节点则负责从 Master 节点复制消息数据,并保持与 Master 节点的同步。

    • 同步复制

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    生产者发送消息后,Master 接收到存储消息请求,将消息数据同步给 Slave 后,才将存储结果返回给生产者。同步复制模式下,发送消息会有一定延迟,系统吞吐量也会降低。

    • 异步复制

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    生产者发送消息后,Master 接收到存储消息请求,将消息存储后,直接将存储结果返回给生产者。 Master 和 Slave 再通过异步的方式同步数据,这种复制模式具有较小的延迟,可以实现比较高的吞吐量。

    若 Master 出现故障,有些数据可能未写入 Slave ,未同步的数据可能丢失。

    复制流程分为两个部分:数据复制消息数据复制

    • 主从服务器同步主题,消费者进度,延迟消费进度,消费者配置数据
    • 主从服务器同步消息数据

    2 数据复制

    Slave Broker 定时任务每隔 10 秒会同步数据,包括主题消费进度延迟消费进度消费者配置

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    同步主题时, Slave Broker 向 Master Broker 发送 RPC 请求,返回数据后,首先加入本地缓存里,然后持久化到本地。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3 消息数据复制

    下图是 Master 和 Slave 消息数据同步的流程图。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1、Master 启动后监听指定端口;

    Master 启动后创建 AcceptSocketService 服务 , 用来创建客户端到服务端的 TCP 链接。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    RocketMQ 抽象了链接对象 HAConnection , HAConnection 会启动两个线程,分别用于读服务和写服务:

    • 读服务:处理 Slave 发送的请求
    • 写服务:用于向 Slave 传输数据

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2、Slave 启动后,尝试连接 Master ,建立 TCP 连接;

    HAClient 是客户端 Slave 的核心类 ,负责和 Master 创建连接和数据交互。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    客户端在启动后,首先尝试连接 Master , 查询当前消息存储中最大的物理偏移量 ,并存储在变量 currentReportedOffset 里。

    3、Slave 判定拉取间隔是否大于 5 秒,则向 Master 汇报已拉取消息偏移量;

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    上报进度的数据格式是一个 Long 类型的 Offset , 8个字节 , 非常简洁 。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    发送到 Socket 缓冲区后 , 修改最后一次的写时间 lastWriteTimestamp 。

    4、Master 解析请求偏移量,从消息文件中检索该偏移量后的所有消息;

    当 Slave 上报数据到 Master 时,触发 SelectionKey.OP_READ 事件,Master 将请求交由 ReadSocketService 服务处理:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    当 Slave Broker 传递了自身 commitlog 的 maxPhyOffset 时,Master 会马上中断 ,执行 方法。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    processReadEvent 方法的核心逻辑是设置 Slave 的当前进度 offset ,然后通知复制线程当前的复制进度。

    写服务 WriteSocketService 从消息文件中检索该偏移量后的所有消息,并将消息数据发送给 Slave。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5、Slave 接收到数据,将消息数据 append 到消息文件 commitlog 里 。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    首先 HAClient 类中调用 dispatchReadRequest 方法 , 解析出消息数据 ;

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    然后将消息数据 append 到本地的消息存储。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4 同步的实现

    从数据复制流程图,我们发觉数据复制本身就是一个异步执行的,但是同步是如何实现的呢?

    Master Broker 接收到写入消息的请求后 ,调用 Commitlog 的 aysncPutMessage 方法写入消息。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    这段代码中,当 commitLog 执行完 appendMessage 后, 需要执行刷盘任务同步复制两个任务。

    但这两个任务并不是同步执行,而是异步的方式,使用了 CompletableFuture 这个异步神器

    当 HAConnection 读服务接收到 Slave 的进度反馈,发现消息数据复制成功,则唤醒 future 。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    最后 Broker 组装响应命令 ,并将响应命令返回给客户端。

    5 总结

    1、主从复制包含数据复制和消息数据复制两个部分;

    2、数据复制

    ​ Slave Broker 定时任务每隔 10 秒向 Master Broker 发送 RPC 请求,将数据同步到缓存后,然后持久化到磁盘里;

    3、消息数据复制

    • Master 启动监听指定端口
    • Slave 启动 HaClient 服务,和 Master 创建 TCP 链接
    • Slave 向 Master 上报存储进度
    • Master 接收进度,消息文件中检索该偏移量后的所有消息,并传输给 Slave
    • Slave 接收到数据后,将消息数据 append 到本地的消息存储。

    4、同步的实现

    ​ 当 commitLog 执行完 appendMessage 后, 需要执行刷盘任务同步复制两个任务,这里用到了 CompletableFuture 这个异步神器。

    ​ 当 HAConnection 读服务接收到 Slave 的进度反馈,发现消息数据复制成功,则唤醒 future 。最后 Broker 组装响应命令 ,并将响应命令 返回给客户端 。


    如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢! Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    原文链接: Go 语言 context 都能做什么?

    很多 Go 项目的源码,在读的过程中会发现一个很常见的参数 ,而且基本都是作为函数的第一个参数。

    为什么要这么写呢?这个参数到底有什么用呢?带着这样的疑问,我研究了这个参数背后的故事。

    开局一张图:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    核心是 接口:

    
    

    包含四个方法:

    • :返回一个 channel,当 times out 或者调用 cancel 方法时。
    • :返回一个错误,表示取消 ctx 的原因。
    • :返回截止时间和一个 bool 值。
    • :返回 key 对应的值。

    有四个结构体实现了这个接口,分别是:, , 和 。

    其中 是空类型,暴露了两个方法:

    
    

    一般情况下,会使用 作为根 ctx,然后在其基础上再派生出子 ctx。要是不确定使用哪个 ctx,就使用 。

    另外三个也分别暴露了对应的方法:

    
    

    遵循规则

    在使用 Context 时,要遵循以下四点规则:

    1. 不要将 Context 放入结构体,而是应该作为第一个参数传入,命名为 。
    2. 即使函数允许,也不要传入 的 Context。如果不知道用哪种 Context,可以使用 。
    3. 使用 Context 的 Value 相关方法只应该用于在程序和接口中传递和请求相关的数据,不要用它来传递一些可选的参数。
    4. 相同的 Context 可以传递给不同的 goroutine;Context 是并发安全的。

    WithCancel

    
    

    返回带有新 通道的父级副本。当调用返回的 函数或关闭父上下文的 通道时,返回的 的 通道将关闭。

    取消此上下文会释放与其关联的资源,因此在此上下文中运行的操作完成后,代码应立即调用 。

    举个例子:

    这段代码演示了如何使用可取消上下文来防止 goroutine 泄漏。在函数结束时,由 启动的 goroutine 将返回而不会泄漏。

    
    

    输出:

    
    

    WithDeadline

    
    

    返回父上下文的副本,并将截止日期调整为不晚于 。如果父级的截止日期已经早于 ,则 在语义上等同于 。

    当截止时间到期、调用返回的取消函数时或当父上下文的 通道关闭时,返回的上下文的 通道将关闭。

    取消此上下文会释放与其关联的资源,因此在此上下文中运行的操作完成后,代码应立即调用取消。

    举个例子:

    这段代码传递具有截止时间的上下文,来告诉阻塞函数,它应该在到达截止时间时立刻退出。

    
    

    输出:

    
    

    WithTimeout

    
    

    返回 。

    取消此上下文会释放与其关联的资源,因此在此上下文中运行的操作完成后,代码应立即调用取消。

    举个例子:

    这段代码传递带有超时的上下文,以告诉阻塞函数应在超时后退出。

    
    

    输出:

    
    

    WithValue

    
    

    返回父级的副本,其中与 关联的值为 。

    其中键必须是可比较的,并且不应是字符串类型或任何其他内置类型,以避免使用上下文的包之间发生冲突。 的用户应该定义自己的键类型。

    为了避免分配给 ,上下文键通常具有具体的 类型。或者,导出的上下文键变量的静态类型应该是指针或接口。

    举个例子:

    这段代码演示了如何将值传递到上下文以及如何检索它(如果存在)。

    
    

    输出:

    
    

    本文的大部分内容,包括代码示例都是翻译自官方文档,代码都是经过验证可以执行的。如果有不是特别清晰的地方,可以直接去读官方文档。

    以上就是本文的全部内容,如果觉得还不错的话欢迎点赞转发关注,感谢支持。


    官方文档:

    • https://pkg.go.dev/context@go1.20.5

    源码分析:

    • https://mritd.com/2021/06/27/golang-context-source-code/
    • https://www.qtmuniao.com/2020/07/12/go-context/
    • https://seekload.net/2021/11/28/go-context.html

    推荐阅读:

    • Go 语言 map 如何顺序读取?
    • Go 语言 map 是并发安全的吗?
    • Go 语言切片是如何扩容的?
    • Go 语言数组和切片的区别
    • Go 语言 new 和 make 关键字的区别
    • 为什么 Go 不支持 []T 转换为 []interface
    • 为什么 Go 语言 struct 要使用 tags

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    虽然本周 GitHub 热榜都是一些熟悉的面孔,但还是有不少新开源的项目,比如受启发于 Stripe IDs 的 UUIDv7 扩展 typeid,相信有了它,数据标识问题就迎刃而解了。此外,还有刚开源就获得近 2k star 的抠背景项目 background-removal-js,一键就能去掉图片背景。

    还有一个非常有意思的 IDE,它是运行在容器里的 devpod,还有老牌的 GIS 项目,你可以用喜欢的画作来绘制地图的 QGIS。

    至于 AFFiNE、Tkinter-Designer、google-ctf 是什么,就要留给你自己去发现了。

    以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准: | | ,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 ,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知 🌝

    • 本文目录
      • 1. 本周特推
        • 1.1 运行在容器里的 IDE:devpod
        • 1.2 跨平台 GIS:QGIS
      • 2. GitHub Trending 周榜
        • 2.1 知识管理工具:AFFiNE
        • 2.2 唯一标识:typeid
        • 2.3 快速构建 Python 应用:Tkinter-Designer
        • 2.4 快速去背景:background-removal-js
        • 2.5 安全挑战:google-ctf
      • 3. HelloGitHub 热评
        • 3.1 隐私计算平台:primihub
        • 3.2 PyQt 组件库:PyQt-Fluent-Widgets
      • 4. 往期回顾

    1. 本周特推

    1.1 运行在容器里的 IDE:devpod

    主语言:Go

    DevPod 是一个仅限客户端使用的工具,它可基于 devcontainer.json 在任何存储端创建可复现的开发环境。每个开发环境都在容器中运行,并通过 devcontainer.json 进行指定存储。目前,devpod 支持 K8s 集群、云端虚拟机、任何可访问的远程机器。

    GitHub 地址→https://github.com/loft-sh/devpod

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1.2 跨平台 GIS:QGIS

    主语言:C++

    一个功能齐全、用户友好、免费的开源地理信息系统,即 GIS,它可运行在 Unix、Windows、macOS 等系统之上。具有以下特性:

    1. 可管理空间数据
    2. 精美的制图,下图便是根据梵高的经典画作绘制的地图
    3. 地理空间分析
    4. 支持高度定制化,具有良好的可扩展性

    GitHub 地址→https://github.com/qgis/QGIS

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2. GitHub Trending 周榜

    2.1 知识管理工具:AFFiNE

    本周 star 增长数:1,250+主语言:TypeScript

    一个类 Notion 的知识管理工具,支持离线使用。同 Notion 一样,集成了笔记、表格、数据库等功能。

    GitHub 地址→https://github.com/toeverything/AFFiNE

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2.2 唯一标识:typeid

    本周 star 增长数:1,600+主语言:Go

    受启发于 Stripe IDs(用于跟踪提现的追踪 ID)的全局唯一标识符 typeid,它是类型安全,且支持 K 排序的 UUIDv7 扩展。

    TypeIDs 的规范编码为由三个部分组成的小写字符串:

    1. 类型前缀(最多 63 个字符,全部为小写 ASCII [a-z])
    2. 下划线 作为分隔符
    3. 一个 128 位 UUIDv7 编码,使用修改后的 base32 编码表示为 26 个字符的字符串。

    以下便是一个示例:

    
    

    GitHub 地址→https://github.com/jetpack-io/typeid

    2.3 快速构建 Python 应用:Tkinter-Designer

    本周 star 增长数:800+主语言:Python

    一个简单快捷的方法来创建 Python 图形用户界面,Tkinter Designer 旨在加速 Python 中的 GUI 开发过程。因为使用到 Figma,所以它能方便地在 Python 中创建漂亮的 Tkinter GUI。它借助 Figma API 来分析设计文件并创建 GUI 所需的相应代码和文件。

    GitHub 地址→https://github.com/ParthJadhav/Tkinter-Designer

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2.4 快速去背景:background-removal-js

    本周 star 增长数 1,950+主语言:TypeScript

    不知道有多少小伙伴用过一个去背景服务叫做 remove.bg,这是一个开源的去背景服务,不用受限于 remove.bg 的清晰度限制,你可以自己抠掉图像中的背景。当然它提供了在线试用链接:https://img.ly/showcases/cesdk/web/background-removal/web

    GitHub 地址→https://github.com/imgly/background-removal-js

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2.5 安全挑战:google-ctf

    本周 star 增长数:550+

    google-ctf 收录了自 2017 年以来 Google CTF(安全网络竞赛)的挑战,如果你想试试你的密码学、逆向工程、漏洞检测等安全技能到底如何,不妨试试这些难题。

    GitHub 地址→https://github.com/google/google-ctf

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3. HelloGitHub 热评

    在这个章节,我们将会分享下本周 HelloGitHub 网站上的热评项目,HG 开源项目评价体系刚上线不久,期待你的评价。

    3.1 隐私计算平台:primihub

    主语言:C++

    随着《数据安全法》和《个人信息保护法》的相继颁布,隐私计算技术在近两年迎来了前所未有的热度。该项目是由密码学专家团队打造的隐私计算平台,它开箱即用、安全可靠,支持隐匿查询、隐私求交、联合统计、数据资源管理等功能,实现了“数据可用不可见”,为数据安全流通保驾护航。

    HG 评价地址→https://hellogithub.com/repository/686b51bae1becc94f72f7646a

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.2 PyQt 组件库:PyQt-Fluent-Widgets

    主语言:Python

    基于 PyQt/PySide 的 Fluent Design 风格组件库,内含多种美观、实用的组件,支持亮暗主题切换和自定义主题色。

    HG 评价地址→https://hellogithub.com/repository/80b9c3ecfbb10851d08834

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4. 往期回顾

    往期回顾:

    • 这就是艺术,优雅的二维码生成器「GitHub 热点速览」
    • 未来的编程语言「GitHub 热点速览」

    以上为 2023 年第 26 个工作周的 GitHub Trending 🎉如果你 Pick 其他好玩、实用的 GitHub 项目,来 HelloGitHub 和大家一起分享下哟 🌝

    高可用指标与问题

    高可用,英文单词High Availability,缩写HA,它是分布式系统架构设计中一个重要的度量。业界通常用多个9来衡量系统的可用性,如下表:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    既然有可用率,有一定会存在不可用的情况。系统宕机一般分为有计划的和无计划的,有计划的如日常维护、系统升级等,无计划的如设备故障、突发断电等。我们对此作如下分类:

    1.设备故障:机房断电、硬盘损坏、交换机故障。

    2.网络故障:网络带宽拥堵、网络连接中断。

    3.安全问题:利用系统漏洞进行网络攻击。

    4.性能问题:CPU利用率太高、内存不足、磁盘IO过载、数据库慢SQL。

    5.升级维护:由于业务变更或技术改进而引起的系统升级。

    6.系统问题:分布式系统中存在服务的依赖而导致数据的不一致性,或是核心服务出现异常。

    高可用主要手段

    负载均衡

    负载均衡(Load Balance),它将工作任务分发到多个工作单上进行运行,它可以提高网络设备的带宽,提升网络数据处理能力,增强网络的稳定性。可防止机房断电、网络设备故障等问题。

    负载均衡的实现可分为硬件负载与软件负载。硬件负载由专门的设备完成专门的任务,这种方式性能较高同时成本也高;软件负载通过软件代码实现,此种方式耗费操作系统资源,性能较低,容易出现BUG,也容易引起安全问题。

    负载策略一般有轮询策略、随机策略、最小连接策略以及最短响应时间策略。

    轮询策略:讲用户请求轮流分配给服务器,这种算法比较简单。

    随机策略:随机选择一台服务器来执行任务。

    最小连接策略:把请求分配给活动连接数最小的后端服务器。

    最短响应时间策略:将请求分配给平均响应时间最短的服务器。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    限流

    限流就是避免服务过载,随着流量的提高,无论负载策略如何高效,系统的某个环节总会过载。就如木桶能装多少水取决于最短的那块木板,我们是无法保证系统的每个部分都保持同样的高吞吐量,因此要考虑如何优雅地提供有损服务。

    常用的三种限流算法:计数器算法、滑动窗口算法、漏桶算法、令牌桶算法。

    计数器算法:使用计数器在一定周期内累加某个接口的访问次数,当达到限流阈值时,触发限流策略,进入下一个周期后,重新开始计数。此算法较为简单,但会降低服务器的负载能力。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    滑动窗口算法:将时间周期划分成更小的周期,按小周期来进行计数,根据时间滑动删除过期的小周期。这种算法使得周期划分得越小服务器的负载能力越高。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    漏桶算法:将请求直接放入漏桶中,如果当前访问量超出漏桶的限流值,则把后来的请求予以丢弃,这样可以最大限度地提高服务器的负载能力。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    令牌桶算法:以(时间周期/限流值)的速度向令牌桶里增加令牌,直到装满桶的容量,当请求到达时,分配一个令牌让其通过,如果没有获取到令牌则触发限流机制。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    异步调用

    异步调用一般有两种方式:一种是异步回调,一种是消息队列。消息队列方式也算是限流的一种手段,可以让请求一个一个地被处理,避免并发太高而引起的应用无法及时处理。这种方式相对与限流来讲,是一种无损的解决方案。但这种方案仅适用于非实时响应的业务。

    超时重试与幂等设计

    很多文章把超时重试与幂等设计分开来讨论,但我却认为它们是相辅相成,密切相关的。在设计超时重试时,一定要考虑幂等设计

    超时重试机制:由于服务器宕机、网络延时、服务器线程死锁等原因,导致应用程序无法先限定时间内对服务调用方进行响应。因此当发生调用超时后,应用程序可根据调度策略进行重试。被调用的服务没有及时响应,可能会存在两种情况,一是服务内部发生异常,导致执行失败,没有返回任何消息;一是执行的服务耗时太长,没有及时响应,但实际已经执行成功。所以针对第二种情况要做幂等设计。

    幂等设计:多次相同参数的请求对系统造成的作业都是相同的。常见的幂等方案有:MCVV多版本并发、唯一索引、token机制、悲观锁、状态机幂等、只读操作等。

    降级与熔断

    服务降级与服务熔断都是为了解决服务雪崩的问题,但不要把他们混为一谈,它们是有本质区别的。

    降级是对系统的某个功能进行降级,可以只提供部分功能也可以完全停止该功能。降级一般由开关来进行控制,在不重启服务的情况下,对功能进行降级。它常常发生在高并发时段、机器卡顿、下游不太重要的服务异常等情况下。

    熔断没有开关,它是一个框架级的设计,常常被称作断路器。它的主要作用是,当下游的服务因为某种原因变得不可用或服务不及时,为了保证整体服务的可用性,不再调用目标服务,直接返回默认处理或容错处理,从而使得整体服务可以快速响应。例如SpringCloud中的Hystrix。

    降级与熔断的主要区别是手动与自动。降级主要是通过配置中心的热刷新功能,人为地对开关进行打开与关闭操作。而熔断则是根据事先设计好的策略,系统自动地根据策略来进行开关操作。但它们都是对功能进行关闭。

    架构模式

    主备模式

    实际是一主多备,master负责提供读写服务,slave作为数据备份,一旦主机宕机,将其中一个备节点作为主节点。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    主从复制

    实际是一主多从,master对外提供读写服务,slave作为数据备份提供只读服务。主机定期复制数据给从机。多副本的关键问题是保证数据一致性,通常需要考虑数据同步延时的问题。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    集群分片

    集群分片是为了解决每台机器上存储全量数据的问题,面对大数据单机的存储量总是有上限的,当面对PB级数据时,单机是无法支撑的,因此就需要对数据进行分片。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    异地多活

    异地就是指在地理位置上不同的地方,可分为同城异地、跨城异地、跨国异地,多活就是指不同地理位置上的系统都能够提供服务。这种架构的复杂度较高,且部署成本也会提高。

    设计原则:

    1、 只把核心业务设计为异地多活,比如流量大、盈利高的业务

    2、 保证核心数据的一致性与实时性,且可丢失、可恢复

    3、 可采用多种数据同步的方案,比如存储系统同步、消息队列同步

    4、 异地多活仅适用于大部分用户,以地区来论,覆盖主要城区

    总结

    在互联网架构设计中,高可用是必不可少的环节,要从网络架构、服务架构、数据架构以及软硬件架构等多方面来分析设计,是架构师必备的技能之一。

    作者:京东零售 谷伟

    来源:京东云开发者社区

    一、引言

    Excel表格在后台管理系统中使用非常广泛,多用来进行批量配置、数据导出工作。在日常开发中,我们也免不了进行Excel数据处理。

    那么,如何恰当地处理数据量庞大的Excel文件,避免内存溢出问题?本文将对比分析业界主流的Excel解析技术,并给出解决方案。

    如果这是您第一次接触Excel解析,建议您从第二章了解本文基础概念;如果您已经对POI有所了解,请跳转第三章阅读本文重点内容。

    二、基础篇-POI

    说到Excel读写,就离不开这个圈子的的老大哥——POI。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Apache POI是一款Apache软件基金会用Java编写的免费开源的跨平台的 Java API,全称Poor Obfuscation Implementation,“简洁版的模糊实现”。它支持我们用Java语言和包括Word、Excel、PowerPoint、Visio在内的所有Microsoft Office文档交互,进行数据读写和修改操作。

    (1)“糟糕”的电子表格

    在POI中,每种文档都有一个与之对应的文档格式,如97-2003版本的Excel文件(.xls),文档格式为HSSF——Horrible SpreadSheet Format,意为“糟糕的电子表格格式”。虽然Apache幽默而谦虚地将自己的API冠以“糟糕”之名,不过这确实是一款全面而强大的API。

    以下是部分“糟糕”的POI文档格式,包括Excel、Word等:

    Office文档 对应POI格式 Excel (.xls) HSSF (Horrible SpreadSheet Format) Word (.doc) HWPF (Horrible Word Processor Format) Visio (.vsd) HDGF (Horrible DiaGram Format) PowerPoint(.ppt) HSLF(Horrible Slide Layout Format)

    (2)OOXML简介

    微软在Office 2007版本推出了基于XML的技术规范:Office Open XML,简称OOXML。不同于老版本的二进制存储,在新规范下,所有Office文档都使用了XML格式书写,并使用ZIP格式进行压缩存储,大大提升了规范性,也提高了压缩率,缩小了文件体积,同时支持向后兼容。简单来说,OOXML定义了如何用一系列的XML文件来表示Office文档。

    Xlsx文件的本质是XML

    让我们看看一个采用OOML标准的Xlsx文件的构成。我们右键一个Xlsx文件,可以发现它可以被ZIP解压工具解压(或直接修改扩展名为.zip后解压),这说明:Xlsx文件是用ZIP格式压缩的。解压后,可以看到如下目录格式:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    打开其中的“/xl”目录,这是这个Excel的主要结构信息:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    其中workbook.xml存储了整个Excel工作簿的结构,包含了几张sheet表单,而每张表单结构存储在/wooksheets文件夹中。styles.xml存放单格的格式信息,/theme文件夹存放一些预定义的字体、颜色等数据。为了减少压缩体积,表单中所有的字符数据被统一存放在sharedStrings.xml中。经过分析不难发现,Xlsx文件的主体数据都以XML格式书写。

    XSSF格式

    为了支持新标准的Office文档,POI也推出了一套兼容OOXML标准的API,称作poi-ooxml。如Excel 2007文件(.xlsx)对应的POI文档格式为XSSF(XML SpreadSheet Format)。

    以下是部分OOXML文档格式:

    Office文档 对应POI格式 Excel (.xlsx) XSSF (XML SpreadSheet Format) Word (.docx) XWPF (XML Word Processor Format) Visio (.vsdx) XDGF (XML DiaGram Format) PowerPoint (.pptx) XSLF (XML Slide Layout Format)

    (3)UserModel

    在POI中为我们提供了两种解析Excel的模型,UserModel(用户模型)和EventModel(事件模型) 。两种解析模式都可以处理Excel文件,但解析方式、处理效率、内存占用量都不尽相同。最简单和实用的当属UserModel。

    UserModel & DOM解析

    用户模型定义了如下接口:

    1. Workbook-工作簿,对应一个Excel文档。根据版本不同,有HSSFWorkbook、XSSFWorkbook等类。

    2. Sheet-表单,一个Excel中的若干个表单,同样有HSSFSheet、XSSFSheet等类。

    3. Row-行,一个表单由若干行组成,同样有HSSFRow、XSSFRow等类。

    4. Cell-单格,一个行由若干单格组成,同样有HSSFCell、XSSFCell等类。

    用户模型示意

    可以看到,用户模型十分贴合Excel用户的习惯,易于理解,就像我们打开一个Excel表格一样。同时用户模型提供了丰富的API,可以支持我们完成和Excel中一样的操作,如创建表单、创建行、获取表的行数、获取行的列数、读写单格的值等。

    为什么UserModel支持我们进行如此丰富的操作?因为在UserModel中,Excel中的所有XML节点都被解析成了一棵DOM树,整棵DOM树都被加载进内存,因此可以进行方便地对每个XML节点进行随机访问

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    UserModel数据转换

    了解了用户模型,我们就可以直接使用其API进行各种Excel操作。当然,更方便的办法是使用用户模型将一个Excel文件转化成我们想要的Java数据结构,更好地进行数据处理。

    我们很容易想到关系型数据库——因为二者的实质是一样的。类比数据库的数据表,我们的思路就有了:

    1. 将一个Sheet看作表头和数据两部分,这二者分别包含表的结构和表的数据。

    2. 对表头(第一行),校验表头信息是否和实体类的定义的属性匹配。

    3. 对数据(剩余行),从上向下遍历每一个Row,将每一行转化为一个对象,每一列作为该对象的一个属性,从而得到一个对象列表,该列表包含Excel中的所有数据。

    接下来我们就可以按照我们的需求处理我们的数据了,如果想把操作后的数据写回Excel,也是一样的逻辑。

    使用UserModel

    让我们看看如何使用UserModel读取Excel文件。此处使用POI 4.0.0版本,首先引入poi和poi-ooxml依赖:

    
    

    我们要读取一个简单的Sku信息表,内容如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    如何将UserModel的信息转化为数据列表?

    我们可以通过实现反射+注解的方式定义表头到数据的映射关系,帮助我们实现UserModel到数据对象的转换。实现基本思路是: ① 自定义注解,在注解中定义列号,用来标注实体类的每个属性对应在Excel表头的第几列。 ② 在实体类定义中,根据表结构,为每个实体类的属性加上注解。 ③ 通过反射,获取实体类的每个属性对应在Excel的列号,从而到相应的列中取得该属性的值。

    以下是简单的实现,首先准备自定义注解ExcelCol,其中包含列号和表头:

    
    

    接下来,根据Sku字段定义Sku对象,并添加注解,列号分别为0,1,2,并指定表头名称:

    
    

    然后,用反射获取表头的每一个Field,并以列号为索引,存入Map中。从Excel的第二行开始(第一行是表头),遍历后面的每一行,对每一行的每个属性,根据列号拿到对应Cell的值,并为数据对象赋值。根据单格中值类型的不同,如文本/数字等,进行不同的处理。以下为了简化逻辑,只对表头出现的类型进行了处理,其他情况的处理逻辑类似。全部代码如下:

    
    

    最后,将转换完成的数据列表打印出来。运行结果如下:

    
    

    Tips:如果您的程序出现“NoClassDefFoundError”,请引入ooxml-schemas依赖:

    
    

    版本选择见下表,如POI 4.0.0对应ooxml-schemas 1.4版本:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    UserModel的局限

    以上处理逻辑对于大部分的Excel文件都很适用,但最大的缺点是内存开销大,因为所有的数据都被加载入内存。实测,以上3列的Excel文件在7万行左右就会出现OOM,而XLS文件最大行数为65535行,XLSX更是达到了行,如果将几万甚至百万级别的数据全部读入内存,内存溢出风险极高。

    那么,该如何解决传统UserModel无法处理大批量Excel的问题呢?开发者们给出了许多精彩的解决方案,请看下一章。

    三、进阶篇-内存优化的探索

    接下来介绍本文重点内容,同时解决本文所提出的问题:如何进行Excel解析的内存优化,从而处理百万行Excel文件?

    (1)EventModel

    前面我们提到,除了UserModel外,POI还提供了另一种解析Excel的模型:EventModel事件模型。不同于用户模型的DOM解析,事件模型采用了SAX的方式去解析Excel。

    EventModel & SAX解析

    SAX的全称是Simple API for XML,是一种基于事件驱动的XML解析方法。不同于DOM一次性读入XML,SAX会采用边读取边处理的方式进行XML操作。简单来讲,SAX解析器会逐行地去扫描XML文档,当遇到标签时会触发解析处理器,从而触发相应的事件Handler。我们要做的就是继承DefaultHandler类,重写一系列事件处理方法,即可对Excel文件进行相应的处理。

    下面是一个简单的SAX解析的示例,这是要解析的XML文件:一个sku表,其中包含两个sku节点,每个节点有一个id属性和三个子节点。

    
    

    对照XML结构,创建Java实体类:

    
    

    自定义事件处理类SkuHandler:

    
    

    其中,SkuHandler重写了三个事件响应方法:

    startElement()——每当扫描到新XML素时,调用此方法,传入XML标签名称qName,XML属性列表attributes;

    characters()——每当扫描到未在XML标签中的字符串时,调用此方法,传入字符数组、起始下标和长度;

    endElement()——每当扫描到XML素的结束标签时,调用此方法,传入XML标签名称qName。

    我们用一个变量tagName存储当前扫描到的节点信息,每次扫描节点发送变化时,更新tagName;

    用一个Sku实例维护当前读入内存的Sku信息,每当该Sku读取完成时,我们打印该Sku信息,并执行相应业务逻辑。这样,就可以做到一次读取一条Sku信息,边解析边处理。由于每行Sku结构相同,因此,只需要在内存维护一条Sku信息即可,避免了一次性把所有信息读入内存。

    调用SAX解析器时,使用SAXParserFactory创建解析器实例,解析输入流即可,Main方法如下:

    
    

    输出结果如下:

    
    

    以上演示了SAX解析的基础原理。EventModel的API更复杂,同样通过重写Event handler,实现SAX解析。有兴趣的读者,请参见POI官网的示例代码: https://poi.apache.org/components/spreadsheet/how-to.html

    EventModel的局限

    POI官方提供的EventModel API虽然使用SAX方式解决了DOM解析的问题,但是存在一些局限性:

    ① 属于low level API,抽象级别低,相对比较复杂,学习使用成本高。

    ② 对于HSSF和XSSF类型的处理方式不同,代码需要根据不同类型分别做兼容。

    ③ 未能完美解决内存溢出问题,内存开销仍有优化空间。

    ④ 仅用于Excel解析,不支持Excel写入。

    因此,笔者不建议使用POI原生的EventModel,至于有哪些更推荐的工具,请看下文。

    (2)SXSSF

    SXSSF简介

    SXSSF,全称Streaming XML SpreadSheet Format,是POI 3.8-beta3版本后推出的低内存占用的流式Excel API,旨在解决Excel写入时的内存问题。它是XSSF的扩展,当需要将大批量数据写入Excel中时,只需要用SXSSF替换XSSF即可。SXSSF的原理是滑动窗口——在内存中保存一定数量的行,其余行存储在磁盘。这么做的好处是内存优化,代价是失去了随机访问的能力。SXSSF可以兼容XSSF的绝大多数API,非常适合了解UserModel的开发者。

    内存优化会难以避免地带来一定限制:

    ① 在某个时间点只能访问有限数量的行,因为其余行并未被加载入内存。

    ② 不支持需要随机访问的XSSF API,如删除/移动行、克隆sheet、公式计算等。

    ③ 不支持Excel读取操作。

    ④ 正因为它是XSSF的扩展,所以不支持写入Xls文件。

    UserModel、EventModel、SXSSF对比

    到这里就介绍完了所有的POI Excel API,下表是所有这些API的功能对比,来自POI官网:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    可以看到,UserModel基于DOM解析,功能是最齐全的,支持随机访问,唯一缺点是CPU和内存效率不稳定;

    EventModel是POI提供的流式读取方案,基于SAX解析,仅支持向前访问,其余API不支持;

    SXSSF是POI提供的流式写入方案,同样仅能向前访问,支持部分XSSF API。

    (3)EasyExcel

    EasyExcel简介

    为了解决POI原生的SAX解析的问题,阿里基于POI二次开发了EasyExcel。下面是引用自EasyExcel官网的介绍:

    Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。

    如介绍所言,EasyExcel同样采用SAX方式解析,但由于重写了xlsx的SAX解析,优化了内存开销;对xls文件,在上层进一步进行了封装,降低了使用成本。API上,采用注解的方式去定义Excel实体类,使用方便;通过事件监听器的方式做Excel读取,相比于原生EventModel,API大大简化;写入数据时,EasyExcel对大批数据,通过重复多次写入的方式从而降低内存开销。

    EasyExcel最大的优势是使用简便,十分钟可以上手。由于对POI的API都做了高级封装,所以适合不想了解POI基础API的开发者。总之,EasyExcel是一款值得一试的API。

    使用EasyExcel

    引入easyexcel依赖:

    
    

    首先,用注解定义Excel实体类:

    
    

    接下来,重写AnalysisEventListener中的invoke和doAfterAllAnalysed方法,这两个方法分别在监听到单行解析完成的事件时和全部解析完成的事件时调用。每次单行解析完成时,我们打印解析结果,代码如下:

    
    

    测验一下,用它解析一个十万行的excel,该文件用UserModel读取会OOM,如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    运行结果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    (4)Xlsx-streamer

    Xlsx-streamer简介

    Xlsx-streamer是一款用于流式读取Excel的工具,同样基于POI二次开发。虽然EasyExcel可以很好地解决Excel读取的问题,但解析方式为SAX,需要通过实现监听器以事件驱动的方式进行解析。有没有其他的解析方式呢?Xlsx-streamer给出了答案。

    译自官方文档的描述:

    如果您过去曾使用 Apache POI 读取 Excel 文件,您可能会注意到它的内存效率不是很高。 阅读整个工作簿会导致严重的内存使用高峰,这会对服务器造成严重破坏。 Apache 必须读取整个工作簿的原因有很多,但其中大部分与该库允许您使用随机地址进行读写有关。 如果(且仅当)您只想以快速且内存高效的方式读取 Excel 文件的内容,您可能不需要此功能。 不幸的是,POI 库中唯一用于读取流式工作簿的东西要求您的代码使用类似 SAX 的解析器。 该 API 中缺少所有友好的类,如 Row 和 Cell。 该库充当该流式 API 的包装器,同时保留标准 POI API 的语法。 继续阅读,看看它是否适合您。 注意:这个库只支持读取 XLSX 文件。

    如介绍所言,Xlsx-streamer最大的便利之处是兼容了用户使用POI UserModel的习惯,它对所有的UserModel接口都给出了自己的流式实现,如StreamingSheet、StreamingRow等,对于熟悉UserModel的开发者来说,几乎没有学习门槛,可以直接使用UserModel访问Excel。

    Xlsx-streamer的实现原理和SXSSF相同,都是滑动窗口——限定读入内存中的数据大小,将正在解析的数据读到内存缓冲区中,形成一个临时文件,以防止大量使用内存。缓冲区的内容会随着解析的过程不断变化,当流关闭后,临时文件也将被删除。由于内存缓冲区的存在,整个流不会被完整地读入内存,从而防止了内存溢出。

    与SXSSF一样,因为内存中仅加载入部分行,故牺牲了随机访问的能力,仅能通过遍历顺序访问整表,这是不可避免的局限。换言之,如果调用StreamingSheet.getRow(int rownum)方法,该方法会获取sheet的指定行,会抛出“不支持该操作”的异常。

    Xlsx-streamer最大的优势是兼容UserModel,尤其适合那些熟悉UserModel又不想使用繁琐的EventModel的开发者。它和SXSSF一样,都通过实现UserModel接口的方式给出解决内存问题的方案,很好地填补了SXSSF不支持读取的空白,可以说它是“读取版”的SXSSF。

    使用Xlsx-streamer

    引入pom依赖:

    
    

    下面是一个使用xlsx-streamer的demo:

    
    

    如代码所示,Xlsx-streamer的使用方法为:使用StreamingReader进行参数配置和流式读取,我们可以手动配置固定的滑动窗口大小,有两个指标,分别是缓存在内存中的最大行数和缓存在内存的最大字节数,这两个指标会同时限制该滑动窗口的上限。接下来,我们可以使用UserModel的API去遍历访问读到的表格。

    使用十万行量级的excel文件实测一下,运行结果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    StAX解析

    Xlsx-streamer底层采用的解析方式,被称作StAX解析。StAX于2004年3月在JSR 173规范中引入,是JDK 6.0推出的新特性。它的全称是Streaming API for XML,流式XML解析。更准确地讲,称作“流式拉分析”。之所以称作拉分析,是因为它和“流式推分析”——SAX解析相对。

    之前我们提到,SAX解析是一种事件驱动的解析模型,每当解析到标签时都会触发相应的事件Handler,将事件“推”给响应器。在这样的推模型中,解析器是主动,响应器是被动,我们不能选择想要响应哪些事件,因此这样的解析比较不灵活。

    为了解决SAX解析的问题,StAX解析采用了“拉”的方式——由解析器遍历流时,原来的响应器变成了驱动者,主动遍历事件解析器(迭代器),从中拉取一个个事件并处理。在解析过程中,StAX支持使用peek()方法来”偷看”下一个事件,从而决定是否有必要分析下一个事件,而不必从流中读取事件。这样可以有效提高灵活性和效率。

    下面用StAX的方式再解析一下相同的XML:

    
    

    这次我们不需要监听器,把所有处理的逻辑集成在一个方法中:

    
    

    以上代码与SAX解析的逻辑是等价的,用XMLEventReader作为迭代器从流中读取事件,循环遍历事件迭代器,再根据事件类型做分类处理。有兴趣的小伙伴可以自己动手尝试一下,探索更多StAX解析的细节。

    四、结论

    EventModel、SXSSF、EasyExcel和Xlsx-streamer分别针对UserModel的内存占用问题给出了各自的解决方案,下面是对所有本文提到的Excel API的对比:

      UserModel EventModel SXSSF EasyExcel Xlsx-streamer 内存占用量 高 较低 低 低 低 全表随机访问 是 否 否 否 否 读Excel 是 是 否 是 是 读取方式 DOM SAX — SAX StAX 写Excel 是 是 是 是 否

    建议您根据自己的使用场景选择适合的API:

    1. 处理大批量Excel文件的需求,推荐选择POI UserModel、EasyExcel;

    2. 读取大批量Excel文件,推荐选择EasyExcel、Xlsx-streamer;

    3. 写入大批量Excel文件,推荐选择SXSSF、EasyExcel。

    使用以上API,一定可以满足关于Excel开发的需求。当然Excel API不止这些,还有许多同类型的API,欢迎大家多多探索和创新。

    页面链接:

    POI官网: https://poi.apache.org/

    EasyExcel官网:https://easyexcel.opensource.alibaba.com

    Xlsx-streamer Github: https://github.com/monitorjbl/excel-streaming-reader

    作者:京东保险 孙昊宇

    来源:京东云开发者社区

    编者按:随着大规模预训练模型的发展和应用,大模型微调技术已经在很多领域都有了突破性的进展,并推动了人工智能技术的发展与应用。

    本文会简要介绍上下文学习(in-context learning)的含义,并介绍对LLMs进行微调的各种可行方式。还能够帮助我们了解如何选择大语言模型的微调方法。

    快快阅读此文,开启一趟大模型微调学习之旅吧!

    以下是译文,Enjoy!

    本文经原作者授权,由Baihai IDP编译。如需转载译文,请联系获取授权。

    原文链接:https://magazine.sebastianraschka.com/p/finetuning-large-language-models

    作者 | SEBASTIAN RASCHKA, PHD

    编译 | 岳扬

    在如今高速发展的人工智能领域,高效地利用大语言模型(LLMs)已经变得越来越重要。但是,利用大语言模型的方式太多了,如果你才刚刚开始接触它,可能会感到不知所措。

    实质上,我们可以通过两种主要方式将预训练大语言模型用于新任务:上下文学习(in-context learning)以及微调(finetuning)

    本文我们将简要介绍上下文学习(in-context learning)的含义,并介绍对LLMs进行微调的各种可行方式。

    01 In-Context Learning和Indexing

    自从GPT-2(Radford等人[1])和GPT-3(Brown等人[2])问世以来,我们发现,在通用文本语料库上进行预训练的生成式大语言模型(LLMs)可以进行上下文学习。这意味着,如果我们想要执行新的特定任务,我们无需对预训练的LLM进行进一步的训练或微调,可以通过输入Prompt直接提供一些目标任务的示例,如下面的例子所示。

    图片

    上下文学习的例子

    如果我们不能直接访问模型(例如如果我们通过API使用模型),那么上下文学习就用处非常大。

    与上下文学习相关的是hard prompt tuning,即试图通过修改输入改善输出,如下图所示。

    图片

    An illustration of (hard) prompt tuning顺便说一下,我们称这种方法为hard prompt tuning,因为在这种方法中,我们直接修改了输入的单词或tokens。稍后我们将讨论另外一种版本的方法,称为soft prompt tuning(或通常称为prompt tuning)。

    刚刚提到的prompt tuning方法为参数微调(parameter finetuning)提供了一种替代方案(且这种方案更节省资源)。然而,它的性能通常不及微调(finetuning),因为这种方法不会针对特定任务更新模型的参数,这可能会限制它对不同特定任务间细微差别的适应能力。此外,prompt tuning可能需要进行大量工作,耗费大量人力财力,因为这种方法需要人工参与比较不同prompt的质量。

    在我们更进一步地讨论微调之前,先来了解另一种利用纯粹的上下文学习的方法——indexing。在大语言模型领域中,indexing可以被视为一种上下文学习的变通方法,其使得LLMs能够转变为信息检索系统(information retrieval systems),从外部资源和网站中提取数据。在这个过程中,indexing模块将文档或网站分解成较小的片段,并将它们转换为可以存储在向量数据库中的向量(vectors) 。然后,当用户提交查询(query)时,indexing模块计算嵌入查询(embedded query)与数据库中每个向量之间的向量相似度(vector similarity)。最终,indexing模块检索出与查询最相似的前k个嵌入(embeddings),生成响应。

    图片

    An illustration of indexing.

    02 常规的基于特征的方法和微调方法

    如果我们无法直接访问大型语言模型(LLM),例如通过API或使用用户界面与LLM进行交互,那么上下文学习是一种有价值且用户友好的方法。

    然而,如果我们可以直接接触到LLM,使用目标领域的数据对其进行调整(adapting)和微调(finetuning)通常会获得更好的结果。那么,如何使一个模型适应目标任务呢?下图概述了三种常见的方法:

    图片

    3种常规的基于特征的方法和微调的方法

    下文中,我们将以对编码器类型(encoder-style)的大型语言模型(例如BERT)微调为例,解析具体的微调方式原理和示例代码。下述示例微调任务为分类器任务,在这个任务中,我们试图预测电影评论是正面情感还是负面情感。需要注意的是,除了对编码器类型(encoder-style)的LLM进行微调外,同样的方法也适用于类似GPT的解码器类型(decoder-style)的LLM。在后续的文章中,我将会举例说明这一点。

    此外,我们还可以对解码器类型(decoder-style)的LLM进行微调,以生成对特定指令的多句子回答(multiple-sentence answers),而不仅仅是进行文本分类。关于这个问题,我会在未来的文章中提供实战案例,敬请期待。

    2.1 基于特征的方法

    在基于特征的方法(feature-based approach)中,我们需要加载一个预训练LLM,并将其应用于目标数据集。在这种方法中,我对生成训练集的输出嵌入(output embeddings)特别感兴趣,这些嵌入可以作为输入特征(input features)用于训练分类模型(classification model)。虽然这种方法在像BERT这样以嵌入为重点的模型中非常常见,但我们也可以从生成式的 GPT-style 模型中提取嵌入。

    接下来,我们可以使用逻辑回归模型(logistic regression model)、随机森林(random forest)或XGBoost等任何我们想要使用的模型作为分类模型。(然而,根据我的经验,在这种情况下,像逻辑回归(logistic regression)这样的线性分类器(linear classifiers)表现最佳

    理论上,我们可以用下面这段代码来解释基于特征的方法:

    
    

    (对此感兴趣的读者可以在此处[4]找到完整的代码)

    2.2 微调方法 I —— 更新输出层(Output Layers)

    有一种方法与上述基于特征的方法比较相关,叫做微调输出层(本文称之为微调方法 I)。与基于特征的方法类似,这种方法不改变预训练LLM的参数,只会训练新增加的输出层,类似于在嵌入特征(embedded features)上训练逻辑回归分类器(logistic regression classifier)或小型多层感知器(small multilayer perceptron)。

    相关代码如下:

    
    

    (对此感兴趣的读者可以在此处[4]找到完整的代码)

    从理论上讲,这种方法的建模性能和速度(modeling performance and speed)应该与基于特征的方法差不多,因为都会去冻结骨干模型(frozen backbone model)(译者注:通过冻结骨干模型,我们可以保持其模型权重不变,仅对任务模块进行训练。这样可以减少需要更新的参数数量,提高训练效率,并在一定程度上保留原始骨干模型的特征提取能力)。然而,由于基于特征的方法使得预计算(pre-compute)和存储训练数据集的嵌入特征(embedded features)稍微更容易一些,所以在具体场景中,基于特征的方法可能更加方便

    2.3 微调方法 II – 更新所有层(All Layers)

    虽然BERT那篇论文(Devlin等人)说过,仅微调输出层(output layer)可以实现与微调所有层相当的模型性能,但由于后者涉及的参数更多,所以成本要高得多。 例如,BERT基础模型约有1.1亿个参数。然而,用于二分类的BERT基础模型最后一层仅包含1500个参数。此外,BERT基础模型的最后两层共有6万个参数,这仅占总模型大小的0.6%左右。

    我们选择走哪条路径会根据目标任务和目标领域与模型预训练的数据集的相似程度而有所不同。但是在具体实践中,微调所有层几乎总是能获得更优的模型性能。

    因此,在优化模型性能时,使用预训练LLM的黄金标准(the gold standard)是更新所有层(本文称之为微调方法 II)。从理论上讲,微调方法 II 与微调方法 I 非常相似。唯一的区别是方法II不会冻结预训练LLM的参数,而是对其进行微调

    
    

    (对此感兴趣的读者可以在此处[4]找到完整的代码)

    上面的这段代码被用来训练一个基于DistilBERT基础模型的电影评论分类器(你可以去the code notebooks看一看[4])

    1)基于特征的方法与逻辑回归:83%的测试准确率(accuracy);

    2)微调方法 I,更新最后两层:87%准确率(accuracy);

    3)微调方法 II,更新所有层:92%准确率(accuracy)。

    这些准确率结果符合预期,即微调更多层通常会获得更好的性能,但也需要花费更高的成本。

    图片

    本文3种方法的训练效率和模型性能权衡经验之谈

    上述场景强调了微调的三种最不同或最极端的情况:即仅训练最后一层(或几层)与训练所有层。当然,具体效果可能会因模型和数据集而异,但在探索两者之间的各种情况也是值得的。 例如,有时候我们只需训练一半的模型,就能获得与训练完成的模型相同的性能(更多关于轻量化微调(parameter-efficient finetuning)的内容将在下一节介绍)。如果你是一个好奇宝宝,下图描述了在IMDB电影评论数据集(IMDB movie review dataset)的2万个训练实例上进行微调的DistilBERT模型的预测性能(predictive performances)和训练时间。

    图片

    在IMDB电影评论数据集上微调的预训练DistilBERT模型的性能。相关代码可以在GitHub上找到[5]

    正如我们可以看到的,仅训练最后一层是最快速的,但模型性能也最差。 符合预期的是,训练更多层会提高模型性能,但也会增加计算成本。 有一件事情非常有趣,可以看到当训练两个全连接的输出层(fully connected output layers)和最后两个transformer blocks(从左边数起的第三个block)时,预测性能(predictive performance)就已经趋于饱和。因此,在这种特定情况下(即对于这个特定的模型和数据集组合),训练超过这些层(layers)似乎是一种计算资源的浪费。

    03 轻量化微调(Parameter-Efficient Fine-Tuning)

    轻量化微调让我们能够重复使用预训练的模型,同时最大限度地减少算力和资源的占用。总体来说,轻量化微调具有以下五个优点:

    1. 能够降低计算成本(需要更少的GPU和GPU运行时间);

    2. 拥有更快的训练时间(更快地完成训练);

    3. 具备更低的硬件要求(适用于较小显存的GPU和较小的内存);

    4. 具有更好的模型性能(降低过拟合);

    5. 需要更少的存储空间(大部分weights可以在不同任务(tasks)之间共享)。

    在之前的章节中,我们了解到微调更多的层通常会带来更好的结果。上面的实验是基于一个相对较小的DistilBERT模型。但是,如果我们想微调那些几乎无法容纳在GPU显存中的较大模型(例如最新的生成式LLM模型),我们该怎么办呢?当然,我们可以使用上述基于特征的方法或者微调方法I。但假设我们想要获得与微调方法II类似的模型质量呢?

    这些年来,研究人员们开发了几种技术(Lialin等人[6])来微调LLM,使其只需要训练少量的参数,也能具有较高的模型性能。这些方法通常被称为参数高效微调技术(parameter-efficient finetuning techniques,PEFT,本文亦译作轻量化微调)。

    一些目前最受欢迎的PEFT技术在下图中可见。

    图片

    最受欢迎的轻量化微调(PEFT)技术可选择项

    那么,这些技术是如何工作的呢?简单来说,都涉及到引入少量额外的参数进行微调(而不是像我们在上面的微调方法 II中那样对所有层进行微调)。从某种意义上说,微调方法 I(只微调最后一层)也可以被认为是一种轻量化微调(PEFT)技术。然而,像前缀微调(prefix tuning)、adapters和Low-Rank Adaptation (LoRA,低秩自适应))等技术,它们都“修改”了多个层(layers),以极低的成本实现了更好的预测性能(predictive performance)。

    由于本文的篇幅目前已经很长了,而且这些都是超级有趣的技术,我将在未来单独介绍这些技术。

    04 基于人类反馈的强化学习(Reinforcement Learning with Human Feedback)

    在基于人类反馈的强化学习(Reinforcement Learning with Human Feedback,RLHF)中,使用一种结合了监督学习(supervised learning)和强化学习(reinforcement learning)的方法对预训练模型进行微调——这一方法被 ChatGPT 使用而得到大力推广,而 ChatGPT 又是基于InstructGPT(Ouyang等人[7])的。

    在RLHF中,通过让人类对不同的模型输出进行排序或评分来收集人类反馈,从而提供奖励信号(reward signal) 。收集到的奖励标签(reward labels) 可以用来训练奖励模型(reward model) ,进而反过来指导LLM(Language Model)适应人类的喜好。

    奖励模型本身是通过监督学习(supervised learning)来学习的(通常使用预训练的LLM作为基础模型)。接下来,使用奖励模型来更新预训练的LLM,使其适应人类偏好——训练过程使用一种被称为近端策略优化(proximal policy optimization,Schulman等人[8])的强化学习方法。

    图片

    InstructGPT相关论文的截图,概述了RLHF的过程

    为什么要使用奖励模型而不是直接在人类反馈的基础上训练预训练模型?这是因为让人类参与模型的学习过程会产生瓶颈(bottleneck),因为我们无法实时获取反馈。

    这篇文章的篇幅已经很长了,所以我把更详细的解释推迟到以后的文章中,敬请期待!

    05 总结

    对预训练LLM的所有层(layers)进行微调仍然是适应新目标任务(new target tasks)的黄金标准(the gold standard),但是对于预训练的Transformer模型,有几种有效的替代方法。诸如基于特征的方法、上下文学习和轻量化微调等这些方法能够有效地将LLM应用于新的任务,同时还能最大限度地减少计算成本和计算资源

    此外,基于人类反馈的强化学习(RLHF)作为监督微调(supervised finetuning,SFT)的一种替代方法,可以提升模型性能。

    END

    参考资料

    1.https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf

    2.https://arxiv.org/abs/2005.14165

    3.https://arxiv.org/abs/1810.04805

    4.https://github.com/rasbt/LLM-finetuning-scripts/tree/main/conventional/distilbert-movie-review

    5.https://github.com/rasbt/LLM-finetuning-scripts/tree/main/conventional/distilbert-movie-review/layerwise-experiment

    6.https://arxiv.org/abs/2303.15647

    7.https://arxiv.org/abs/2203.02155

    8.https://arxiv.org/abs/1707.06347

    本文经原作者授权,由Baihai IDP编译。如需转载译文,请联系获取授权。

    原文链接

    https://magazine.sebastianraschka.com/p/finetuning-large-language-models

    1 前言

    Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具,具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换、属性校验等多种函数,方便使用人员使用。如果在使用过程中存在和业务强耦合的常用功能函数,在Jmeter不支持的情况下,那就需要单独开发自定义函数实现特定功能。

    本文介绍如何开发Jmeter自定义函数实现快速生成京东宙斯下单标准sign,同时深刻理解Jmeter的插件化机制及高扩展性特性。

    2 开发准备

    1. Java基础开发
    2. Maven基本使用
    3. 开发依赖版本
      JDK 1.8.0Maven 3.6.3Jmeter 5.4.3

    3 自定义函数核心实现

    3.1 新建项目

    • 新建maven项目,这里项目名为:JSF_Sampler
    • 因为是基于Jmeter的扩展,需要依赖包Jmeter两个核心包,分别是:
    • ApacheJMeter_core
    • ApacheJMeter_java
    • ApacehJMeter_functions

    pom.xml文件核心配置如下

    
    

    3.2 继承实现AbstractFunction类

    实现类依次实现以下几个步骤

    1)新建实现类并继承 AbstractFunction

    • 注意:实现类的包名必须包含xxx.functions.xxx,Jmeter使用命名规则实现实现类的加载。

    2)重写以下方法,每个方法的用途见下方代码注释

    • execute()
    • setParameters()
    • getReferenceKey()
    • getArgumentDesc()
    
    

    3.3 最终项目结构

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4 Jmeter加载扩展包

    以上开发完成,打包此项目,注意这里的打包要包含依赖包。

    4.1 maven构建配置

    
    

    4.2 项目打包

    
    

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4.3 Jmeter加载扩展包

    将打包后的扩展包放置到Jmeter的ext目录:apache-jmeter-5.4.3/lib/ext/

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    启动Jmeter后,Jmeter会自动加载ext目录中的扩展包

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    打开Jmeter函数助手后,可以看到本次实现类中打印的相关日志

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5 自定义函数调用调试

    5.1 打开Jmeter函数助手,选择自定义函数

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5.2 京东宙斯接口验证

    这里使用京东快递获取预制运单号接口,输入GET请求后,直接运行函数【Generate & Copy to clipboard】,出参返回32位sign值。

    
    

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    6 总结

    本文通过自定义函数实现了京东宙斯下单标准sign的生成,希望通过本项目大家可以学习到:

    • 如何二次开发Jmeter,实现自己特有的自定义函数。
    • 理解为何官方介绍Jmeter是插件化的,高扩展性特性。
    • 更好的理解Jmeter内部处理机制。

    作者:京东物流 苗浩冲

    来源:京东云开发者社区

    • 在进行序列化操作之前,我们还对系统进行压测,通过分析cpu,线程,垃圾回收情况等;运用火焰图分析系统性能,找出程序中占用CPU资源时间最长的代码块。
    • 代码放置GitHub:https://github.com/nateshao/leetcode/tree/main/source-code/src/main/java/com/nateshao/source/code/serializable

    1.什么是序列化与反序列化?

    聊到序列化与反序列化,先看看这个这个是什么或者是干嘛的

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    定义:序列化是指把转换为的过程;是指把恢复为的过程;

    一般都会知道有两个目的:和。

    1. 对象持久化。实现了数据的持久化,通过序列化可以把数据永久的保存在硬盘上;
    2. 网络传输。我们知道网络传输的是字节序列,那么利用序列化实现远程通信,即在网络上传递对象的字节序列。 (序列化与反序列化则实现了 进程通信间的对象传送,发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象)

    总结:序列化的目的是将对象变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结束后对象就从内存里消失,另外字节序列也更便于网络运输和传播

    2.选择序列化技术有哪些维度

    这里并不是说哪个是最好,只能说是各有千秋,所以面对不同的背景采用不同的技术方案。

    在同等情况下,编码后的字节数组越大,存储占空间,存储硬件成本高,网络传输时也占带宽,导致系统的吞吐量降低。

    1. 开发工作量和难度。工作量越少越好对吧,发挥的价值最大。
    2. 性能:需要考虑性能需求,序列化的速度和性能越高越好。
    3. 是否支持跨语言,支持的语言种类是否丰富。
    4. 安全性:对于安全性的需要考量。JDK序列化可能有卡死线程的漏洞。
    5. 占用空间大小:序列化的结果所占用的空间大小,序列化后的字节数据通常会持久化到硬盘(占用存储资源)或者在网络上传输给其他服务器(占用带宽资源),这个指标当然是越小越好。
    6. 可维护性:技术流行程序,越流行的技术可维护性就越高,维护成本会越低。

    3.为什么采用字节序列MessagePack,有什么依据?

    这个要结合当时的项目背景了。当时的项目痛点是:

    1. 老项目的结构调整比较大,交易性能上不去,所以先采取细节方面的优化。MessagePack是满足性能要求
    2. 老系统业务变化不多,MessagePack是满足要求
    3. 序列化反序列化效率高(比json快一倍),文件体积小,比json小一倍。MessagePack是满足要求

    所以,存在MessagePack也有不好的地方,如果是针对业务变化比较多,那就不适合,需要比较不同的版本,然后选择不同版本去解析。

    我在京东內部文章有看到,引用的MessagePack反序列化出现了一些线上的问题,原因是:新增了一些字段导致反序列化失败

    这里对比了JDK(不支持跨语言),JSON,Protobuf,MessagePack几种序列化的方式。

    当然,还有其他的XML、Hessian、Kryo(不支持跨语言)、FST(不支持跨语言)Thrift等。

    4.JDK序列化

    JDK序列化是Java默认自带的序列化方式。在Java中,一个对象要想实现序列化,实现接口或者接口即可。其中接口继承自接口。

    
    

    版本控制的作用

    1. 序列化的时候也会被写入二进制序列
    2. 反序列化时会检查是否和当前类的一致。不一致则会抛出 异常(序列化之后给类增加字段再反序列化的时候就会报错)

    serialVersionUID必须保证实体类在序列化前后严格一致,否则将会导致无法反序列化。

    JDK默认的序列化机制。需要实现java.io.Serializable接口

    1. 序列化后的码流太大:jdk序列化机制编码后的二进制数组大小竟然是二进制编码的5.29倍。
    2. 不支持跨语言平台调用, 性能较差(序列化后字节数组体积大)
    3. 序列化性能太低:java序列化的性能只有二进制编码的6.17%左右,Java原生序列化的性能实在太差。

    JDK默认的序列化机制很差。所以我们通常不会选择Java默认序列化这种

    5.JSON序列化

    json格式也是常见的一种,但是在json在解析的时候非常耗时,而且json结构非常占内存。JSON不适合存数字,特别是DOUBLE

    这里基于Fastjson ,加载maven依赖

    
    

    序列化对象

    利用JSON.toJSONString方法序列化对象:

    
    

    序列化数组

    利用JSON.toJSONString方法序列化数组:

    
    

    序列化集合

    利用JSON.toJSONString方法序列化集合(继承至Collection,比如List、Set等集合):

    
    

    序列化映射

    利用JSON.toJSONString方法序列化映射:

    
    

    其中,为了保证每次序列化的映射字符串一致,需要指定序列化参数MapSortField进行排序。

    序列化模板对象

    利用JSON.toJSONString方法序列化模板对象:

    
    

    代码

    
    

    序列化ObjectTest

    
    

    反序列化UN_ObjectTest

    
    

    json序列化总结

    • 好处

      1. 简单易用开发成本低
      2. 跨语言
      3. 轻量级数据交换
      4. 非冗长性(对比xml标签简单括号闭环)
    • 缺点

      1. 体积大,影响高并发
      2. 无版本检查,自己做兼容
      3. 片段的创建和验证过程比一般的XML复杂
      4. 缺乏命名空间导致信息混合

    6.Protobuf

    Protobuf是谷歌推出的,是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于通信协议、数据存储等。序列化后体积小,一般用于对传输性能有较高要求的系统。前期需要额外配置环境变量,学习他的语法也是需要时间。

    但是要使用Protobuf会相对来说麻烦一些,因为他有自己的语法,有自己的编译器,如果需要用到的话必须要去投入成本在这个技术的学习中

    Protobuf有个缺点就是传输的每一个类的结构都要生成相对应的proto文件,如果某个类发生修改,还要重新生成该类对应的proto文件。另外,Protobuf对象冗余,字段很多,生成的类较大,占用空间。维护成本较高。

    
    

    7.MessagePack(推荐)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1. 序列化反序列化效率高(比json快一倍),文件体积小,比json小一倍。
    2. 兼容json数据格式
    3. 跨语言,多语言支持(超多)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    不好的地方:

    1. 缺乏复杂模型支持。msgpack对复杂的数据类型(List、Map)支持的不够,序列化没有问题,但是反序列化回来就很麻烦,尤其是对于java开发人员。
    2. 维护成本较高。msgpack通过value的顺序来定位属性的,需要在不同的语言中都要维护同样的模型以及模型中属性的顺序。
    3. 不支持模型嵌套。msgpack无法支持在模型中包含和嵌套其他自定义的模型(如weibo模型中包含comment的列表)。

    上手

    通过配置msgpack的maven依赖

    
    

    封装MsgPackTemplate抽象类,对原有msgpack进行二次加工,比如int,Short,Byte,BigDecimal进行read和write处理

    MsgPackTemplate.java

    
    

    然后针对实体类进行读和写的序列化与反序列化操作。

    User.java

    
    

    UserTemplate.java

    
    

    参考文献:

    • 官网:MessagePack: It’s like JSON. but fast and small:https://msgpack.org/)
    • msgpack-java:https://github.com/msgpack/msgpack-java
    • MessagePack for C#译文:快速序列化组件MessagePack介绍 – 晓晨Master – 博客园:https://www.cnblogs.com/stulzq/p/8039933.html
    • 原理分析和使用:https://www.sigusoft.com/p/8c24bef40e2f
    1. https://blog.csdn.net/wzngzaixiaomantou/article/details/
    2. https://blog.csdn.net/weixin_/article/details/
    3. https://www.cnblogs.com/juno3550/p/15431623.html
    4. Protobuf:https://blog.csdn.net/wxw1997a/article/details/

    作者:京东零售 邵桐杰

    来源:京东云开发者社区

    本文整理自云原生 Meetup 杭州站上,极狐(GitLab) DevOps 技术布道师马景贺的演讲。

    当听到云原生的时候,你会想起什么?

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    可能很多人很自然地就会想到 Kubernetes、容器、微服务、开源等等,这些关键词是我们接触云原生绕不开的话题。但是以上还少了一个关键词:安全。

    云原生从 2013 年出现,2015 年发展起来以后,安全也逐渐被关注和重视。

    以云原生中常用的镜像安全为例,下图是通过拉取常用镜像,用 Trivy 进行扫描的结果,不同颜色对应不同等级的漏洞。例如 node.js 这个开源项目,高危漏洞有 544 个,中危级漏洞有 921 个;还有 Jenkins,漏洞数量也不少。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    可以看到,容器镜像安全问题比较严重,关于容器镜像安全的更多分析报告,感兴趣的朋友可以参阅 Anchore 发布的 2021 年、2022 年软件供应链安全报告。

    一个完整的软件开发生命周期包括源代码开发、构建、测试、部署等环节,每一个步骤都可能存在潜在安全风险。我们应该把安全嵌入到每一个环节中去,也就是将 DevSecOps 应用到云原生应用程序开发的每一个环节中去,再加上 K8s 容器镜像安全扫描,才能打造一个完整的云原生安全生态。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    DevSecOps 是什么?如何帮助我们打造云原生安全生态?

    DevSecOps 是一个兼具深度和广度的纵深安全防御系统,从 Source code、 Build 、Test 到 Deploy,任何一个阶段,都有对应的安全手段。其次,DevSecOps 是流程、工具、文化的深度结合,传统的研发团队里,开发人员只负责代码的开发,不会关注后续的运维等流程,但在 DevSecOps 标准要求下,安全是团队中每个人的责任,需要贯穿从开发到运维全生命周期的每一个环节。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    DevSecOps 强调的安全测试左移,其实就是更早地让研发加入进来。我们软件研发过程中的大部分安全问题,都是在开发阶段引入的,因此,如果从 Source code 阶段就尽早将安全考虑在内,从源头处提升安全能力,就能更有效、更低成本地发现和解决安全问题。

    安全持续自动化也是很重要的一个部分,因为一个完整的安全流程,涉及到很多安全工具,如果每个工具都手动配置,手动触发安全测试,那么工作量就会大大提升。所以 DevSecOps 期望的是安全持续自动化,开发写完代码提交变更以后(MR 或者 PR),就可以进行自动扫描,产出报告并建议你如何修复。

    当然了现在也进入 ChatGPT 时代,我前段时间做了一个 Demo,ChatGPT 在 Code Review 阶段就告诉你哪些是有安全风险的,甚至还会给出推荐的修复代码,感兴趣的朋友也可以去尝试一下

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Gartner 每年会针对新技术会发布一个技术成熟度曲线,上图是 2022 年的数据,DevSecOps 就在最右侧,代表着它已经很成熟了,这也是为什么从 2019 年开始,很多企业都在开始讨论 DevSecOps。

    下图是我根据行业数据绘制的示意图,可以看出 DevSecOps 一词是在 2012 年由 Gartner 提出,引起强烈关注,到达高峰期;2016 年慢慢往下走,2018 年前后到达泡沫破灭期;终于在 2022 年到达成熟期。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    从 2012 年提出概念,到今年已经有 11 年了,DevSecOps 经历了一个完整的技术成熟度曲线,现在已经到了落地生根的阶段,这也是为什么,现在我们可以分享 DevSecOps 的落地实践,而非停留在概念。

    如何寻找云原生 DevSecOps 落地切入点?

    安全是一个比较大的概念,当我们提到安全,可能包括主机安全、网络安全、应用安全……本文侧重于应用程序安全领域。

    下图虽然只是一个 Yaml 文件,但是已经包含了我们应该如何实践 DevSecOps 的重要信息。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    镜像是重点,因为云原生时代都是镜像交付。虽然它是一个简单的二进制文件,但包含了很多东西,比如 OS、代码等,大部分的安全问题由此而生,此外 Yaml 文件本身也可能存在安全问题,比如上图下方红框展示的内容,即把敏感信息写到了 Yaml 文件中。

    我们来进行一个拆分:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    应用程序部署整体可以拆分成 3 层:

    1. 底座是 K8s 集群

    2. 中间是容器镜像

    3. 顶层是应用程序

    我们落地 DevSecOps 时,也是按照这 3 层来打造安全防护体系。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    第一层:K8s 安全

    首先第一层,基于 K8s 的安全防护手段,可能很多人都知道,比如 RBAC(权限管理)、Network Policy(网络策略)、Audit(审计日志)等。

    第二层:容器镜像安全

    第二层容器镜像,当我们编写 Dockerfile 时,有一些最佳实践可以遵循,例如如何选择基础镜像。

    不同的基础镜像,安全漏洞数量不一样,攻击面大小也不一样。正如前文展示的几个容器镜像的漏洞数量,都是不一样。如果我们选择合适的基础镜像,那么就能减少攻击面。具体的就不展开了,大家可以去搜一下 Dockerfile best practice,网上有很多介绍。

    另外就是镜像扫描,这也是非常重要的一环。

    现在做镜像扫描的开源工具有不少,比如 Trivy、Clair、Anchore 等。使用这些工具可以帮助扫描我们采用的基础镜像是否安全,发现漏洞,然后进行修复,最后把这个镜像作为单一可信源的镜像,团队内部后续使用此镜像来制作其他镜像,那么安全性就能提高很多。

    另外这两年在讲软件供应链安全,有一条就是通过数字签名来提高制品的可信性,比如 OpenSSF 基金会(开源安全基金会)下的 cosign 项目就可以对镜像进行签名,但为什么需要签名呢?

    当构建镜像时,使用 1.0.0 tag 来构建,但是我们可以在再次修改代码之后,重新用 1.0.0 这个 tag 来构建镜像,并 push 到制品仓库。如果部署时仍旧拿 1.0.0 进行部署,那么内容其实已经被篡改,这也就是镜像的不可信,是镜像安全的另外一个维度。

    如果对镜像进行签名,就能很好的避免这个问题。当镜像构建之后就对其进行签名,在部署时再进行验证,如果验证不通过,那么说明这个镜像被篡改了,就不应该再进行后续的部署。

    以上就是关于容器镜像安全的几个方法。接下来我们看下最上层的应用程序安全。

    第三层:应用程序安全

    大部分公司,都有专门的运维人员或者安全人员帮我们加强 K8s 和容器镜像安全防护,而最上层最靠近业务,也是开发人员关注更多的一层。

    这一层有非常多的安全防护手段,例如 Secret Detection、Dependency scanning、SAST、DAST 等,上图只列举了一部分。

    以 Secret Detection 为例,根据我的经验,70% 以上的安全问题都来自于敏感信息泄漏。当我们在本地 Debug 时,很容易把 Password 写死,但测试提交代码时,可能忘了删除,直接把 Password Push 到代码仓库,就造成了泄漏,所以 Secret Detection 在应用程序安全这部分的作用非常重要。

    云原生 DevSecOps 是一个深度 + 广度的纵深防御体系,从 K8s、Docker 到应用程序安全,每一层展开都有非常多的安全手段。总结来说,有以下落地原则:

    • 分层实施,循序渐进

    • 由简入繁,化繁为简

    • 重视数据,简化工具

    • 安全左移,研发闭环

    • 持续优化,持续安全

    针对以上云原生开发安全防护体系,极狐 GitLab 提供开箱即用的 DevSecOps 功能,包括七大功能:容器镜像扫描、静态应用安全测试 (SAST)、动态应用安全扫描(DAST)、密钥检测、License 合规、依赖项扫描以及模糊测试

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    这么多安全功能,如何去实现落地?

    一言以蔽之,就是将这些安全功能集成到 CI/CD(持续集成/持续部署)中去,达到持续测试和持续安全的效果。极狐 GitLab 把所有安全功能和 CI/CD 集成到 Workflow 中,这个 Workflow 和研发工作流融合到一块,非常完整。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    而且,只需要几行代码,就可以完成对应手段的安全扫描,简单易用

    下图就是每个安全功能对应的 CI/CD Pipeline 代码。在这个过程中,开发不需要知道每个安全功能应用的工具是什么,不需要学习工具如何配置,只需要输入这几行代码,就能进行扫描,非常容易上手。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    图中不同安全手段标注不同颜色,是一个简单建议,也就是蓝色的几种安全手段是非常容易实践而且收效不错的,如果要全部落地实践,可以采取这种循序渐进的方式,先落地蓝色部分,再落地绿色部分。

    极狐GitLab x KubeSphere 云原生安全体系如何构建?

    接下来,我们来聊聊如何把 KubeSphere 和极狐GitLab 进行结合,利用 CI/CD,把安全防护手段集成到软件开发生命周期中。

    极狐GitLab 介绍

    极狐GitLab 是一个一体化的 DevOps 平台,其提供的一体化 DevOps 能力覆盖软件开发全生命周期(从计划到运维),同时内置安全功能,能够利用开箱即用的安全能力构建 DevSecOps 体系。

    KubeSphere 介绍

    Kubernetes 是一个非常复杂的容器编排平台,学习成本非常高,KubeSphere 所做的事情就是高度产品化和抽象了底层 Kubernetes,是一个面向云原生的操作系统,解决了 K8s 使用门槛高和云原生生态工具庞杂的痛点。

    在 KubeSphere 上使用极狐GitLab 搭建 DevOps 有什么优势?

    最典型的优点就是可以实现极狐GitLab & Runner 的云原生运行并实现灵活调度。

    可以看下图这个实例,当研发人员提交代码变更之后,就会触发 CI/CD Pipeline,而极狐GitLab CI 如果检测到有 Job 需要运行,就会给 Runner 一个信号,触发背后的调度机制,Executors 帮助完成所有的 Step,例如对 Go 源码进行 Check out、Build、Test。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    如何在 KubeSphere 上安装极狐GitLab ?

    极狐GitLab 和 KubeSphere 的集成主要有两个方式:

    ➤ 方式一

    直接把极狐GitLab Runner 作为单组件,安装在 KubeSphere 上,当我们的应用程序代码提交之后,开始跑 CI 时,就会自动在 KubeSphere 上完成所有构建操作,并直接反馈数据。

    安装步骤如下:

    1. 在 KubeSphere 的 App Management 下,通过 App Repositories 添加一个 App Repo; Add 按钮,在出现的界面中输入 Repo name 和 URL(极狐GitLab Runner 的 Helm Chart 地址为 https://charts.gitlab.io)。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1. 在 Create App 中选择“From App Template”:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1. 选择 gitlab runner:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1. 修改 Yaml 文件内容,输入极狐GitLab 实例地址 Runner Token 等, Install 即可。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1. 安装成功以后,就可以在 KubeSphere 上看到 jh-runner namespace 下面有 Pod 在正常运行。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    ➤ 方式二

    把整个极狐GitLab 源代码托管平台安装到 KubeSphere 上面去,目前在 KubeSphere 上部署极狐GitLab 非常便利,只需要利用 KubeSphere 应用商店搜索极狐GitLab 即可一键部署。安装好以后,团队就可以直接在 KubeSphere 上面使用极狐GitLab 进行协作了。

    详细安装教程:

    https://gitlab.cn/blog/2022/04/01/jihu-kubesphere/?jh=gu0%20%E4%BD%9C%E8%80%85%EF%BC%9ABender%E5%BC%80%E6%BA%90%E4%B8%8D%20https://www.bilibili.com/read/cv/%20%E5%87%BA%E5%A4%84%EF%BC%9Abilibili

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    以上介绍了如何在 KubeSphere 上安装极狐GitLab/Runner,接下来我们通过一个 Demo 介绍如何在 KubeSphere 上进行 DevSecOps 检测。

    极狐GitLab x KubeSphere 安全扫描 Demo

    安装完以后,通过 Project → Settings → CI/CD 这个路径找到 Runner 页面,左边是项目专用 Runner,也就是只有这个项目可以用,其他项目用不了;右边共享 Runner 则是可以被此实例下的其他项目所使用的 Runner。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    接下来详细演示一下扫描过程:

    • 先创建一个 Issue,这是 Workflow 的第一步,然后将这个需求 Issue 指派给自己;接着开始进行本地的代码编写,这里模拟一个场景,把 Token 这个敏感信息写进去,看看安全扫描过程是否能发现。

    • 接下来我们创建一个 MR,把这段有问题的代码提交上去,提交时可以选定指派人或审核人,让其他人来帮忙审核代码。

    • 创建 MR 以后,就会进行自动扫描,这时候就扫描出来了我们故意放进去的 Token,从而发现这个潜在安全问题。

    • 最后,修复后重新提交,再次扫描没有问题就可以合入了。

    以上就是一个简单的 Demo,来使用极狐GitLab 的安全扫描功能。

    总结

    本文给大家介绍了极狐GitLab 和 KubeSphere 各自的优势,并探讨了如何结合 KubeSphere 和极狐GitLab 来构建一个云原生应用安全体系,最后通过一个示例来展示极狐GiLab DevSecOps 功能的工作原理,希望对大家有帮助~

    本文由博客一文多发平台 OpenWrite 发布!

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    各位社区小伙伴们,Databend 于 2023 年 6 月 29 日迎来了 v1.2.0 版本的正式发布!相较于 v1.1.0 版本,开发者们一共新增了 600 次 commit,涉及 3083 个文件变更,约 17 万 行代码修改。感谢各位社区伙伴的参与,以及每一个让 Databend 变得更好的你!

    在 v1.2.0 版本中,Databend 新增了 BITMAP 数据类型使用列号直接查询 CSV/TSV/NDJSON 文件AI Functions 等特性,设计并实现全新哈希表 大幅提升 Join 的性能。这个版本的发布使得 Databend 更接近实现 LakeHouse 的愿景,能够直接读取和分析储存在对象存储上的 CSV/TSV/NDJSON/Parquet 等格式文件,你也可以在 Databend 内部对这些文件进行 ETL 操作,从而做一些更高性能的 OLAP 分析。

    同时,Databend 也设计并实现了 计算列VACUUM TABLEServerless Background Service 等企业级特性,感兴趣的小伙伴可以联系 Databend 团队 了解升级信息,或者访问 Databend Cloud 即时体验。

    Databend x 内核

    Databend 重要新特性速览,遇到更贴近你心意的 Databend 。

    数据类型:

    Databend 新增对 数据类型的支持并实现了一系列相关函数。

    是一种压缩数据结构,可以高效地存储和操作布尔值集合。它提供了快速的集合运算和聚合能力,在数据分析和查询方面应用广泛。常见的使用场景包括:去重计数、过滤选择和压缩存储。 Databend 中的 数据类型实现采用 。与其他位图实现相比,使用这种数据结构可以提高性能并减少内存使用。

    
    

    如果你想要了解更多信息,请查看下面列出的资源。

    • Docs | Data Types – BITMAP
    • Docs | SQL Functions – Bitmap Functions
    • Paper | Consistently faster and smaller compressed bitmaps with Roaring

    使用列号直接查询 CSV/TSV/NDJSON 文件

    要想查询 CSV/TSV/NDJSON 这类没有 schema 的文件,以前需要将其加载到表中再进行查询。但是有时候用户事先并不了解文件的具体情况(例如 CSV 文件有多少列),或者只是想做临时的查询。

    为此,Databend 引入了列号(column position), 使用 语法来表示第 列。CSV/TSV 文件所有列都视作 类型,如果某行的列数少于使用到的列号,则会用空字符串进行补齐。NDJSON 文件只有一列 , 类型是 。

    将这一能力与 COPY 语句结合使用,可以实现按需加载部分列,并在加载同时使用函数进行数据转换。

    
    

    如果你想要了解更多信息,请查看下面列出的资源。

    • Docs | SELECT – Column Position

    设计并实现全新哈希表以提高 Hash Join 性能

    在过去,Databend 的哈希表是为了满足聚合算子的需求而专门设计的,为了进一步提高 Hash Join 的性能,我们着手设计并实现了一种专为 Hash Join 优化的全新哈希表,通过并行化的设计,使 Databend 能够充分利用计算资源,同时在内存控制方面也变得更为精准,避免了不必要的内存开销,显著提高了 Hash Join 的性能。

    商业智能分析师 Mimoune Djouallah 评论称:Databend 性能出色,在 8 核和 32GB 内存的条件下,运行 TPCH-SF10 只需要 25 秒。他甚至撰写了一篇题为《Databend and the rise of Data warehouse as a code》的博客文章。

    image.png

    如果你想要了解更多信息,请查看下面列出的资源。

    • Data Infra #12 | Databend’s New Hash Table for Hash Join
    • PR #11140 | feat(query): new hash table and parallel finalize for hash join

    AI Functions

    Databend 在 v1.2.0 版本引入了强大的 AI 功能,实现了 Data 与 AI 的无缝融合,我们可以通过 SQL 来实现:

    1. 自然语言生成 SQL
    2. Embedding 向量化并存储
    3. 相似度计算
    4. 文本生成

    自然语言生成 SQL

    比如,如果你在一个 nginx log 的数据库中提问:”What are the top 5 IP addresses making the most requests”,运用 Databend 的 函数,你将直接得到相应的 SQL 语句,使用非常便捷。

    image.png

    Embedding 向量化

    借助 Databend 的 函数,我们可以实现数据的向量化,并将其保存在 Databend 的 类型中。这样一来,Databend 事实上变成了一个向量数据库。

    image.png

    相似度计算

    在向量化表示下,可以计算两个词语、句子或文档的相似度。 例如,假设我们有 “dog” 和 “puppy” 两个词语(也可以是句子),我们首先将它们各自转化为向量 v1 和 v2,然后使用余弦相似度来计算它们的相似度。

    
    

    Databend 中的 函数就是对这个公式的实现。

    image.png

    文本生成

    文本生成在很多场景下非常有用,现在你可以在 SQL 中使用 函数来完成。

    image.png

    目前,我们已经利用以上 Data + AI 能力,对 https://databend.rs 的所有文档进行了 Embedding 处理,并将其存储到 Databend 中,构建了一个智能问答网站:https://ask.databend.rs 。 在这个网站上,你可以提问关于 Databend 的任何问题。

    Databend 企业级特性

    全新企业级特性上线啦!了解 Databend 如何推动更具价值的数据分析服务。

    计算列

    计算列(Computed Columns)是一种通过表达式从其他列计算生成数据的列,使用计算列可以将表达式的数据存储下来加快查询速度,同时可以简化一些复杂的查询的表达式。计算列包括存储(STORED)和虚拟(VIRTUAL)两种类型。

    • 存储计算列在每次插入或更新时生成数据并存储在磁盘,在查询时不需要重复计算,可以更快的读取数据。
    • 虚拟计算列不存储数据,不占用额外的空间,在每次查询时实时进行计算。

    计算列对读取 JSON 内部字段的数据特别有用,通过将常用的内部字段定义为计算列可以大大减少每次查询过程中提取 JSON 数据的耗时操作。例如:

    
    

    如果你想要了解更多信息,请查看下面列出的资源。

    • Docs | CREATE TABLE – COMPUTED COLUMNS

    VACUUM TABLE

    命令通过从表中永久删除历史数据文件来释放存储空间,有助于优化系统性能。删除的文件包括:

    • 与表相关的快照及其关联的 segments 和 blocks 。
    • 孤立文件。在 Databend 中,孤立文件指不再与该表关联的快照、segments 和 blocks 。孤立文件可能由各种操作和错误生成,例如在数据备份和还原期间,并且随着时间的推移会占用宝贵的磁盘空间并降低系统性能。

    如果你想要了解更多信息,请查看下面列出的资源。

    • Docs | VACUUM TABLE

    Serverless Background Service

    Databend 的内置存储引擎 是一种与 Apache Iceberg 类似的日志结构表,在数据持续写入的过程中,需要定期执行表压缩、重聚类和清理以合并小数据块。小数据块合并的过程会涉及按聚类键排序数据或清理不需要的分支等阶段。

    为了自动化执行这一过程需要使用不同的驱动,增加了基础设施的复杂性。而且必须部署和维护其他服务来触发驱动事件。为简化这一过程,Databend 设计并实现了 Serverless Background Service ,能自动发现数据写入之后需要压缩、重排序、清理的表,无需其他服务,也无需用户手动操作,自动触发对应表的维护工作,降低了用户维护的负担,提升了表查询的性能,也降低了数据在对象存储中的成本。

    Databend x 生态

    Databend 的生态版图得到了进一步的完善。是时候将 Databend 引入你的数据洞见工作流啦!

    databend 的 Python 绑定

    Databend 现在提供 Python 绑定,为在 Python 中执行 SQL 查询提供了新选择。该绑定内置 Databend ,无需部署实例即可使用。

    
    

    从 databend 导入 并创建会话上下文即可开始使用:

    
    

    结果 DataFrame 可以使用 或 转换为 PyArrow 或者 Pandas 格式:

    
    

    现在行动起来,将 Databend 集成到你的数据科学工作流中。

    • databend · PyPI

    BendSQL – Databend 原生命令行工具

    BendSQL 是一款专为 Databend 设计的原生命令行工具,现在已经用 Rust 语言重写,并且同时支持 REST APIFlight SQL 协议。

    使用 BendSQL ,你可以轻松高效地管理 Databend 中的数据库、表和数据,并轻松执行各种查询和运算。

    
    

    我们期待与你分享更多关于 BendSQL 的更新!欢迎试用并给我们反馈。

    • Docs | SQL Clients – BendSQL
    • Crates.io – bendsql
    • Github – datafuselabs/databend-client | Rust

    数据集成和 BI 服务

    Apache DolphinScheduler

    Apache DolphinScheduler 是一个分布式和可扩展的开源工作流协调平台,具有强大的DAG可视化界面。支持 30+ 的任务类型,包括像 Flink SQL、DataX、HiveCli 等。能够高并发、高吞吐量、低延迟和稳定地执行百万个量级任务,可以根据计划时间(特殊日期范围或特殊的日期列表)批量执行任务,而且在不影响工作流模板的情况下,工作流实例支持修改、回滚和重新运行。

    image.png

    DolphinScheduler 现已支持 Databend 数据源,可以使用 DolphinScheduler 管理 DataX 任务实现从 MySQL 到 Databend 异构数据库数据同步。

    Apache Flink CDC

    Apache Flink CDC(Change Data Capture)是指 Apache Flink 使用基于 SQL 的查询从各种来源捕获和处理实时数据更改的能力。CDC 允许监视和捕获数据库或流系统中发生的数据修改(插入、更新和删除),并对这些更改进行实时响应。

    Databend 现在提供 Flink SQL Connector,可以将 Flink 的流处理能力与 Databend 集成。通过对连接器进行配置,可以以流的形式从各种数据库中捕获数据更改,并将其载入到 Databend 中以进行实时处理和分析。

    如果你想要了解更多信息,请查看下面列出的资源。

    • Docs | Loading Data with Tools – Flink CDC

    Tableau

    Tableau 是一款流行的数据可视化和业务智能工具。它提供了直观、交互式的方式来探索、分析和呈现数据,帮助用户更好地理解数据的意义和洞察。

    参考 Other Databases (JDBC),将 databend-jdbc 放置在 Tableau 驱动路径下,就可以使用 Tableau 分析 Databend 中的数据。

    image.png

    如果你想要了解更多信息,请查看下面列出的资源。

    • Blog | Databend x Tableau

    下载使用

    如果你对我们新版本功能感兴趣,欢迎访问 https://github.com/datafuselabs/databend/releases/tag/v1.2.0-nightly 页面查看全部的 changelog 或者下载 release 体验。

    如果你还在使用旧版本的 Databend,我们推荐升级到最新版本,升级过程请参考:

    https://databend.rs/doc/operations/upgrade

    意见反馈

    如果您遇到任何使用上的问题,欢迎随时通过 GitHub issue 或社区用户群中提建议

    GitHub: https://github.com/datafuselabs/databend/

    摘要:本文主要介绍如何进行用户的各种依赖识别与清理,并简单介绍下推荐的权限管理方式。

    本文分享自华为云社区《GaussDB(DWS) 用户删除不掉时候总是报错,依赖如何处理干净?》,作者:Malick 。

    数据库的使用中,有时会遇到某些用户离职,或者角色变更时,要对其账号进行销户,权限进行回收等操作。此时如果各种对象的权限比较复杂,依赖较多,是很难顺利直接清理掉该用户的。

    本文主要介绍如何进行用户的各种依赖识别与清理,并简单介绍下推荐的权限管理方式。

    postgres类数据库经常碰到的问题 – role “test1” cannot be dropped because some objects depend on it

    如下图所示,要删除用户test1时,出现如下提示:

    
    

    ERROR的提示信息说明:

    • 当前用户时testdb这个数据库的owner
    • 有3个依赖的对象在postgres数据库中

    OK,那么我们就按照提示信息来一次处理

    首先,当前用户是一个数据库的owner,那么有以下两种处理办法

    方法一、将数据库owner转移给其他用户,例如如下转移给grantor用户

    
    

    方法二、如果不需要该库,也可以直接将其删除

    PS:对于非数据库的对象:表或者schema等,可以使用如下方法将其全部转移给其他用户

    
    

    接下来,我们owner的提示信息已经处理完了,处理下一步提示:3 objects in database postgres

    这个意思是,在postgres里面有3个对象有依赖该用户。由于库内系统表的依赖,在其他数据库中不会打印出详细的依赖对象信息,那么在postgres库下去执行drop user的时候,会打印出具体的信息。

    连接到postgres库执行如下:

    
    

    这里就可以看到,有两个依赖项:

    • privileges for table pg_class:pg_class上test1用户的权限
    • schema grator上test1用户的权限

    那么,我们就可以直接看一下这两个对象对应的权限,去除即可。

    
    

    此时再进行用户删除,就没有其他依赖了。

    
    

    PS:如果不知道具体对象还删不掉的时候,我们怎么操作呢,此处构造一个案例作为演示,新建用户test2,并赋予其grantor的select权限,此时无法drop

    
    

    用户的依赖内部实际储存,为pg_shdepend系统表,里面记录了各个有依赖的对象的oid及其依赖关系。首先我们获取到用户的oid,再去系统表中找对应的依赖记录。

    
    

    我们获取到classid之后,这个代表依赖当前用户的对象的记录表的id,那么我们去pg_class表中找到这个依赖即可:

    
    

    OK,通过看到记录表是pg_namespace,那么就可以确认依赖用户的是一个schema。这里再到pg_namespace中,查上面获取到的objid,就知道了具体的对象

    
    

    这里看到有两个schema,一个是用户同名的schema,一个是刚才赋权的grantor,赋权的处理掉之后,用户即可删除。

    
    

     

    关注,第一时间了解华为云新鲜技术~

    CXYGZL 介绍

    现在开源的工作流引擎,基本都是以 BPMN.js 为基础的,导致使用门槛过高,非专业人员无法驾驭。本工作流借鉴钉钉 / 飞书的方式,以低代码方式降低用户使用门槛,即使是普通企业用户也可以几分钟内就能搭建自己的工作流引擎。

    体验地址:https://pro.cxygzl.com CXYGZL

    文档地址:https://www.cxygzl.com CXYGZL

    V2.0.2 版本介绍

    ✨紧急修复了一些bug和添加了一些新功能,详细如下:

    1. 🏆 I7GLCU:添加表单组件-明细表
    2. 🏆 I7GECI:添加文本描述表单组件
    3. 🏆 I7GCIT:审批人支持角色
    4. 🏆 I7G8IF:添加并行分支
    5. 🏆 I7G8I2:添加表单组件:日期时间组件支持
    6. 🏆 I7G7Q4:流程组列表显示发起人范围
    7. 🏆 I7G7NU:表单组件库分组显示,流程基础信息的说明改成非必填
    8. 🏆 I7G78S:默认流程发起人是当前登录用户
    9. 🏆 I7G77S:只有发起人节点禁止保存流程
    10. 🏆 I7G77P:没有表单禁止发布流程
    11. 🎯 I7GUXL:表单拖拽组件之后会影响到原始表单
    12. 🎯 I7GG40:审批人执行人为空 渲染节点显示报空指针
    13. 🎯 I7GEBQ:日期显示不全
    14. 🎯 I7GBIF:不可用部门和人员,在表单选择时还可以选到
    15. 🎯 I7G8JN:用户被禁用了,仍然可以登录
    16. 🎯 I7G8J1:人员组件表单,未选择可选自己,仍然能选择自己
    17. 🎯 I7G7QY:上传图片组件限制文件格式为图片
    18. 🎯 I7G5EQ:流程设计-发起人设置:设置审批人错误,应该是设置发起人

    📢注意事项

    1. 有新的sql脚本,请先在业务库执行:
    2. 已经存在的流程不支持并行分支,请新建流程再创建并行分支(流程节点添加了字段)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    发布摘要

    • 启动工程增加对流的发布订阅的单测试和基准测试

    • 修复发布和订阅并发创建流产生的panic

    • 修复IdleTimeout无效问题

    • 修复订阅者阻塞导致读写并发问题

    • 插件修复https默认端口

    • 插件PR合并

       

      升级模块 升级后版本
      e
      ngin
      e
      4.13.
      5 gb28181 4.3.6 hls 4.3.1 preview 4.1.2 record 4.3.7

    详细说明

    单测试和基准测试

    测试用例所在目录:github.com/langhuihui/monibuca工程下的test目录

    推荐使用vscode打开工程,方便一键测试单个用例,也可以通过vscode侧边栏里的单测试栏目管理。

     

    TestPubAndSub

     

    该用例会启动一个发布者和一个订阅者,发布者将会写入假数据,订阅者读取后会校验数据是否正确。

    BenchmarkPubAndSub

     

    该用例为基准测试,启动10个发布者,每个流会批量订阅,以测试并发性能以及稳定性。

    TestSlowSubscriber

     

    这个用例会模拟一个订阅者被阻塞(sleep)后导致发布者写入的位置追上,此时engine通过标记这个写入点废弃来避免并发读写问题,废弃后订阅者如果被唤醒就会自动停止订阅。

    通常出现这种情况订阅者进行了某种耗时操作,比如写文件,或者网络阻塞等。

    其他修复问题

    并发创建流

    修复如下:

     

    原理:当并发调用函数时,前者尚未来得及对赋值,后者就调用了导致空指针错误。

    修复读写并发问题

    这个问题在前面的单测试中已经提到,就是订阅者阻塞引起的。

     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    订阅者阻塞后,读取点移动很慢或者不移动,导致写入点追上

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    由于RingBuffer是由链表结构实现,因此很容易将节点剥离主环

     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    废弃后,这个订阅者将无法再读取主环内容,也将遭到抛弃

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    抛弃

    https默认端口

    默认端口已经设置为,插件在选择的时候跳转错了端口号。

    https证书已经嵌入到程序里面,可以直接设置文件 访问https://local.monibuca.com:8443/preview/

    gb28181 合并PR #95

    本次PR主要修改了定时任务相关功能,包括:

    • 定时删除超时设备

    • 修改注册有效期配置默认值为3600s

    • 设备状态变更处理

    具体可以看代码变动

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    序号 表名 字段 操作 描述 1 retry_task_log update_dt
    删除 更新时间 2 retry_task_log error_message
    删除 异常信息 2 retry_task_log idx_create_dt 新增索引   3 scene_config uk_name
    变更索引uk_group_name_scene_name group_name、scene_name联合索引 4 server_node ext_attrs
    新增 扩展字段 5 server_node idx_expire_at_node_type
    新增索引   6 retry_task_log_message  
    新增表 任务调度日志信息记录表 版本名称 版本说明 版本地址 Django+Layui混编版 采用Django、Layui等框架研发 https://gitee.com/djangoadmin/DjangoAdmin_Django_Layui Flask+Layui混编版 采用Flask、Layui等框架研发 https://gitee.com/djangoadmin/DjangoAdmin_Flask_Layui FastAPI+Layui混编版 采用FastAPI、Layui等框架研发 https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_Layui Tornado+Layui混编版 采用Tornado、Layui等框架研发 https://gitee.com/djangoadmin/DjangoAdmin_Tornado_Layui Django+EleVue前后端分离版 采用Django、Vue2.x、ElementUI等框架研发前后端分离版本 https://gitee.com/djangoadmin/DjangoAdmin_Django_EleVue Flask+EleVue前后端分离版 采用Flask、Vue2.x、ElementUI等框架研发前后端分离版本 https://gitee.com/djangoadmin/DjangoAdmin_Flask_EleVue FastAPI+EleVue前后端分离版 采用FastAPI、Vue2.x、ElementUI等框架研发前后端分离版本 https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_EleVue Tornado+EleVue前后端分离版 采用Tornado、Vue2.x、ElementUI等框架研发前后端分离版本 https://gitee.com/djangoadmin/DjangoAdmin_Tornado_EleVue Django+AntdVue前后端分离版 采用Django、Vue3.x、AntDesign等框架研发前后端分离版本 https://gitee.com/djangoadmin/DjangoAdmin_Django_AntdVue Flask+AntdVue前后端分离版 采用Flask、Vue3.x、AntDesign等框架研发前后端分离版本 https://gitee.com/djangoadmin/DjangoAdmin_Flask_AntdVue FastAPI+AntdVue前后端分离版 采用FastAPI、Vue3.x、AntDesign等框架研发前后端分离版本 https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_AntdVue Tornado+AntdVue前后端分离版 采用Tornado、Vue、AntDesign等框架研发前后端分离版本 https://gitee.com/djangoadmin/DjangoAdmin_Tornado_AntdVue

    v6.0 主要更新
    1、新增举报模块。
    2、新增发贴用户归属地。
    3、新增楼中楼回复路径显示。
    4、新增手机端Popup弹出层在后退按钮时仅关闭弹出框功能。
    5、修复手机端富文本编辑器工具栏弹出窗口在工具栏浮动时没出现在工具栏下面。
    6、修复富文本编辑器在token过期后上传文件不能自动续期的问题。
    7、修复m3u8文件的视频请求HLS流协议没有添加Token的问题。
    8、修复管理后台话题明细页在翻多页时查询‘点赞用户’、‘收藏用户‘、‘解锁隐藏内容用户‘为空的问题。

    轻论坛系统简介

    巡云轻论坛系统包含论坛、问答模块。系统采用 JAVA+MYSQL 架构,自适应手机端和电脑端,界面简洁,性能高效。数据库表结构设计使用分表方案,提高系统的负载能力。 后台数据库备份 / 还原、全站指定目录打包、一键自动升级等功能使维护简单方便。

    演示网站:http://www.diyhi.com/cms.html页面可获取前后台演示地址、登录账号和密码 (Spring 版)

    开源代码托管平台
    码云 (Spring 版):https://gitee.com/diyhi/bbs
    码云 (Spring Boot 版):https://gitee.com/diyhi/bbs-pro
    github (Spring 版):https://github.com/diyhi/bbs
    码云 (前台前后端分离电脑版前端):https://gitee.com/diyhi/bbs-web-pc

    码云 (前台前后端分离手机版前端):https://gitee.com/diyhi/bbs-web-mobile

    码云 (后端分离管理后台):https://gitee.com/diyhi/bbs-web-admin

     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     

     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    (本文部分内容采用生成)

    ThinkPHP为基于PHP8的重构版本,升级了相关依赖,官方开启了AI助理提升开发体验,提升版本依赖为,支持/的无缝升级。

    ThinkPHP在核心功能上虽然并没有大的更新(事实上大部分用户也不需要太复杂的底层功能),作为一个全新的版本,更多的意义在于一种官方的姿态——我思故我在。在寻求一种改变或者是新的探索,从新版LOGO、新版官网,以及一系列的官方生态服务的陆续推出,无一不是在告诉用户,我们希望为生态、为用户做更多的事情,更好打造官方对大道至简的开发理念和愿景,从而帮助开发者更好的开发。值此新版发布之际,官方也正式宣布推出了的私人开发AI助理服务。

    ThinkPHP作为一个全新的版本,承载了官方对未来生态的全新期望。官方也将始终秉承大道至简及无缝升级的策略,努力打造简单易用的框架及服务,方便生态产品和服务的更新迭代。这一版本的发布,标志着在持续创新和改进的道路上迈出了重要一步。新版不仅是对过去版本的升级,更是对国内PHP开发生态的一次推动和革新。相信通过这一全新版本及AI开发助理的引入,将为广大开发者带来更便捷、高效的开发体验,助力他们构建出更出色的Web应用。

    在ThinkPHP发布以来的这些年,官方一直在致力于摸索和打造生态及商业模式,在企业知识管理、、SSL证书、云市场及应用认证方面的不断尝试,让我们坚信只有构建可持续的生态及发展才能让框架走的更好更远。

    在此也要感恩一直以来支持和赞助我们的用户和赞助商,我们唯有不负众望,做一个值得开发者信赖的框架,并砥砺前行!

    主要更新

    • 基于PHP重构

    • 增加、及验证规则

    • 简化验证类的正则

    • 优化路由检测

    • 升级依赖

    • 依赖3.0版本

    版本后续会陆续更新其它功能,/版本将不再做新功能更新,仅限BUG修正和安全更新。

    文档

    版本开始官方手册启用新的域名:doc.thinkphp.cn,并支持版本切换。

    官方服务

    现在开始,你可以使用官方提供的,让你在学习的旅途中享受私人AI助理服务!
    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    赞助我们

    全新的赞助计划,可以让你通过我们的网站、手册、欢迎页及GIT仓库获得巨大曝光,同时提升企业的品牌声誉,也更好保障的可持续发展。

    Kodi 是由 XBMC 基金会开发的开源媒体播放器,原名 XBMC(最后一个以 XBMC 命名的版本是 13.2 Gotham,14.0 Helix 是第一个以 Kodi 命名的版本),Kodi 可以运行在多种操作系统和硬件平台,让用户播放本地或网络存储设备中的大多数视频、音乐、播客及各种常见数位媒体文件。该软件最初是为计划运行在 Xbox 上的,名称也由此而来。随后有了 Android、Linux、BSD、macOS、iOS 和 Windows 操作系统的原生版。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Kodi 的可定制性很高,有许多可以更改软件外观的皮肤及各种可以访问网络内容的插件,包括 Spotify 和 Youtube。从版本 12.0(代号 “Frodo”)开始,XBMC 附带录制直播节目的数位视频录像机图形界面前端,同时支持电子节目指南和高清视频录制。

    Kodi 20 是最新的稳定系列,近日发布了第二个维护版本,修复了多项错误,包括一些向后移植的功能,但没有引入新特性。

    • 修复了 Windows 已处于 HDR 模式时的 HDR 播放问题
    • 修复保存搜索时的崩溃问题
    • 修复了使用某些模拟器时因内存耗尽而导致的崩溃
    • 向后移植了一系列与 E-AC3 相关的修复程序
    • GameInfo 已添加到 Player 类中,以允许获取/设置 GameInfoTag 数据
    • ……

    详情查看 Release Notes。

    仙童光速开发Go Web应用程序,助力找到Go语言工程师职位

    现在,Go语言日渐流行,使用的人多了,职位也多了。几乎是后端语言中除了Java语言的第二多的后端开发语言了。您想不想尝试一下Go语言工程师职位?

    对程序员,尤其是还不通Go语言和初通go语言的程序员而言,最大的瓶颈是完整的Go语言应用程序的开发能力。现在好了,Go语言通用代码生成器仙童已发布Beta7版,光速开发Go Web应用程序可以助力您找到Go语言的职位。

    如何使用?您可以使用仙童自带的模板或者自己写一个SGS2的Excel模板,并使用仙童生成一个完整的Go Web应用。而后,您可以部署代码生成物。从而得到一个完整的Go语言例程。而后您可以抄写学习这个例程,从而得到完整的Go语言应用开发能力。

    仙童易用,完整,速度快,是一个优秀的Go语言代码生成器。

    Go 语言通用代码生成器:仙童已发布 Beta7 版,完善支持 Oracle 数据库,已发布最新介绍视频。请见:
    https://www.bilibili.com/video/BV1uM4y1774F/

    Beta7 版完善了对 Oracle 数据的支持。更多测试,更多错误修正。现在,仙童 Beta7 版已可以完善支持 Oracle 数据库。支持从源码构建代码生成器。您只需下载源码,即可以 mvn install 编译构建 Go 语言通用代码生成器仙童。Beta7 版修正了 Excelize 的 API 修改引起的代码错误。Beta7 版改进了用户的注册流程。现在,新注册的用户自动获得 user 角色,更加方便。

    仙童的项目地址:https://gitee.com/jerryshensjf/Fairchild

    二进制版本下载地址:https://gitee.com/jerryshensjf/Fairchild/attach_files

    Go语言通用代码生成器:仙童

    简介

    Go语言通用代码生成器:仙童

    百度话题

    #通用代码生成器#

    版本更新

    Go语言通用代码生成器仙童已发布 Beta 7版。完善支持Oracle数据库,并有错误修正。可以从源码编译生成构建。

    Go语言通用代码生成器仙童Beta6版,发布最新介绍视频,支持从源码构建代码生成器。您只需下载源码,即可以mvn install编译构建Go语言通用代码生成器仙童。

    Go语言通用代码生成器:仙童Beta5版。彻底修复弹性登录模块,修复了注册,修改密码,管理员新增用户时使用过时加密算法问题。更多测试。

    Go语言通用代码生成器:仙童Beta3版。修复几处错误。包括登录权限问题和图形报表UI的语言问题。更多测试。

    GO语言通用代码生成器仙童已发布Beta2版,支持Rust语言兼容性,即可以使用Rust通用代码生成器莲花的SGS2模板直接生成Go语言代码生成物。同时支持Java语言兼容性。即支持Java通用代码生成器的模板直接生成Go语言代码生成物。

    仙童Beta版,此版本修复了Excelize组件API变化引起的编译错误,另有文档更新和更多检查。

    仙童尝鲜版十二。支持PDF格式数据导出。在尝鲜版十一基础上有增强和修错。流畅支持模板向导代码生成。支持三大变形功能群,支持四种数据库。已完成所有功能规划,下一个版本即可进入Beta阶段。

    尝鲜版十一。在尝鲜版十基础上有增强和修错,并支持数据库表与字段的中文注释和兼容所有java通用代码生成器的SGS2模板,直接生成go语言后端和Vue前端,并自动格式化java语言SGS2模板至go语言模板。支持三大变形功能群,支持四种数据库,支持Excel数据导出。支持图形报表和复杂版面,支持弹性登录模块。

    尝鲜版十是第一个稳定版本。功能基本完备,所有示例通过检测,初步完整测试。

    尝鲜版九在尝鲜版八基础上有功能增强和缺陷修复。

    尝鲜版八初步支持SimpleAuth弹性登录界面。

    尝鲜版7是一个错误修复版本。

    尝鲜版5支持前端和后端的复杂版面和图形报表功能

    尝鲜版4支持Vue和ElementUI的基于Node.js的独立前端。

    尝鲜版3进行了广泛的测试和修错。

    尝鲜版2新增对Oracle数据库的支持。

    架构

    基于Java通用代码生成器:光的架构。

    生成的代码基于go语言,使用gin作为web框架。目前支持MariaDB,MySQL,PostgreSQL和Oracle四种数据库。支持生成Vue和ElementUI的基于Node.js的独立前端。支持Excel,PDF两种数据导出格式。

    开发测试环境

    • jdk 17
    • Apache Tomcat 9
    • Node.js 14
    • golang 1.19
    • MariaDB 15.1
    • MySQL 8
    • PostgreSQL 14
    • Oracle 11

    B站介绍视频

    Go语言通用代码生成器仙童已发布Beta7版视频,请见:

    https://www.bilibili.com/video/BV1uM4y1774F/

    Go语言通用代码生成器仙童Beta6版视频,请见:

    https://www.bilibili.com/video/BV1Jg4y1473X/

    ​Go语言通用代码生成器仙童已发布Beta5版,发布最新介绍视频,彻底修复弹性登录模块。修复了注册,修改密码,管理员新增用户时使用过时加密算法问题。更多测试。

    视频请见:

    https://www.bilibili.com/video/BV1xg4y1E7FA/

    ​Beta3版,请见:

    https://www.bilibili.com/video/BV1g84y1n73B/

    Beta版两个视频的合集,请见:

    https://www.bilibili.com/video/BV13D4y1G7L4/

    Beta2版:

    https://www.bilibili.com/video/BV13M411A7nH/

    Beta版:

    https://www.bilibili.com/video/BV19j411T7wx/

    尝鲜版十二:

    https://www.bilibili.com/video/BV14K411i7DM/

    尝鲜版十一:

    https://www.bilibili.com/video/BV1ce411P7qU/

    尝鲜版九:

    https://www.bilibili.com/video/BV1a5411R7Zt/

    https://www.bilibili.com/video/BV1pR4y1w7aB/

    项目图片

    Image description

    下一个大版本号

    下一个大版本号是仙童2.4.0 电音仙女 TechnoFairy 短名TF。对标java通用代码生成器光2.4.0电音之王

    输入图片说明

    百度话题

    #通用代码生成器#

    代码生成器截图

    代码生成器正在研发中,Beta7版已发布,这是一个稳定版本。

    Image description

    Image description

    Beta7版下载

    本版本完善支持Oracle数据库,已支持集成的前端代码生成功能。已集成完整的弹性登录模块。

    现在,本项目已有下载权限,

    请去https://gitee.com/jerryshensjf/Fairchild/attach_files

    仙童的安装运行

    仙童是使用Java语言写成的代码生成器。运行仙童您需要装好Java8和安装好Tomcat9或8.5应用服务器。并把仙童的war包部署在Tomcat的webapps目录下。

    代码生成物的运行还需要安装好Go语言开发环境,您要使用go mod管理依赖,并把代码生成物解压在go语言工作空间的src文件夹的一级子目录下。还需要对应的数据库服务器运行代码生成物的建库sql脚本。

    前端代码生成物的运行需要装好node.js运行环境并安装js依赖库。

    Vue独立前端截图

    输入图片说明

    输入图片说明

    输入图片说明

    输入图片说明

    代码生成物截图

    Image description

    Image description

    源码编译用户指南

    通用代码生成器已经支持自己编译源码,我已把原来缺的前端代码生成器的jar包上传。支持大家自行编译源码。

    需要注意的是,现在我的开发平台是Fedora 37上的openjdk 17。所以大家编译源码最好使用openjdk17。编译好的war包运行在apache tomcat 9.0上。

    已有jdk8的用户报告默认下载的代码生成器war包在他的平台上无法运行。您如果遇到类似问题请报告。我的电子邮件是:jerry_shen_sjf@.com

    附openjdk 17下载地址:

    https://jdk.java.net/java-se-ri/17

    使用前端功能的注意事项

    由于图片文件比较大,原来前端使用cnpm instll安装类型,npm run dev运行有所改动,改为先使用npm install –registry=https://registry.npm.taobao.org安装类库,出错后使用cnpm install安装类库, 使用node –max-http-header-size= https://www.xujun.org/node_modules/.bin/webpack-dev-server –inline –progress –config build/webpack.dev.conf.js 运行系统。

    您也可以从安装好的本系列代码生成器的前端项目中拷贝node_modules目录,即可运行前端。

    node-sass不兼容的解决办法

    办法一:

     npm uninstall node-sass npm install sass-loader npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
     

    办法二:

     npm uninstall sass-loader node-sass //卸载 npm install sass-loader@7.3.1 node-sass@4.14.1 --save-dev //安装对应的版本
     

    动词算子式代码生成器的应用场景

    1. 快速原型:项目或演示场景使用。可以生成具有关系型数据库后端,使用MyBatis的数据库后端和Vue和ElementUI前端。
    2. 项目前期:如果项目和动词算子式代码生成器兼容,可以使用动词算子式代码生成器执行项目前期的自动化生成。

    源码研读者注意事项

    无垠式代码生成器第一个完整版本源码,有兴趣可以抄写一下:

    https://gitee.com/jerryshensjf/InfinityGPGenerator_0_6_5

    相关技术视频:

    https://www.bilibili.com/video/BV1fX4y1u7Bn/

    https://www.bilibili.com/video/BV1rv41187qY/

    https://www.bilibili.com/video/BV1xv41187cA/

    https://www.bilibili.com/video/BV1t64y1v7WA/

    IntelliJ IDEA 2023.2 EAP 7 引入了一系列值得注意的改进,包括面向插件开发人员的 LSP 支持、OpenAPI 和 Swagger 文件的 Redoc UI 预览,以及使用 HTTP 客户端、Spring 和其他技术和框架的改进。

    面向插件开发人员的 LSP 支持

    通过此 EAP 版本引入了一项重要功能:面向插件开发人员的 LSP API。LSP API 主要针对想要在 IDE 中使用特定 LSP 服务器进行编码辅助的插件开发人员。如果你创建了自己的编程语言或框架,则可以通过编写 LSP 服务器和插件来在 IDE 中获得支持。

    目前,LSP 支持包括错误和警告高亮显示、快速修复、代码完成以及声明导航。更多功能即将推出。

    一个最小的全功能插件只需要编写几行代码。该插件实现了 com.intellij.platform.lsp.api.LspServerSupportProvider 接口,并指定它将支持哪些文件以及如何启动服务器。JetBrains 的 Prisma ORM 插件是开源的,可以用作参考实现。该代码库相当大,但有一些类与基于 LSP 的支持相关 – 可参阅 org.intellij.prisma.ide.lsp.* 包。

    OpenAPI 和 Swagger 文件的 Redoc UI 预览

    IntelliJ IDEA 现在支持 OpenAPI 和 Swagger 规范文件(包括 YAML 和 JSON 文件)的 Redoc UI 预览,允许你在 IDE 内的 Redoc 和 Swagger UI 之间切换。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    HTTP Client CLI 中对 GraphQL 和 WebSocket 的支持

    现在可以使用 IntelliJ IDEA 中的 HTTPClient CLI 与 GraphQL API 交互,并与服务建立 WebSocket 连接,例如用于测试或自动化脚本。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    检查 YAML 文件中的 Norway 问题

    在 IntelliJ IDEA 2023.2 EAP 7 中引入了一项新的检查,以消除所谓的 Norway 问题,并防止对 YAML 文件中 Boolean values 的意外误解。

    当列表主要由字符串组成但包含一个 Boolean-like literal 时,IntelliJ IDEA 将突出显示该文字,指示潜在的不一致,并建议为其添加引号。如果列表主要由 Boolean-like literals(例如 true、false、off、on、yes、no)组成,则任何偏离此模式的字词都会突出显示为可能的错误,尽管在这种情况下没有任何具体的快速修复方法建议。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Spring 配置 bean 不再需要注释处理器

    简化了在 IntelliJ IDEA 中使用 Spring 中的自定义配置 bean 时的用户体验。IDE 现在在属性和 YAML 配置文件中提供代码完成和验证,而无需设置 Spring 配置注释处理器。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Gradle 和 Maven 项目的 JUnit 持续测试

    扩展了 JUnit 的自动测试功能,使其与 Maven 和 Gradle 构建系统兼容。此外,还使激活连续测试模式变得更加容易。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    更多详情可查看官方博客

    智能制造一体化管理系统 [SpringBoot2 – 快速开发平台],适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模块、动态表单、知识库、公告模块、企业论坛、云售后模块、生产模块、系统模块化同步模块等多种复杂业务功能。

    有一些小伙伴很好奇最近更新的内容和智能制造有什么关系?

    :目前 Skyeye 整体在做重构,优先从底层的一些功能开始,所以现在大家看到的和智能制造的联系不是很大,也希望大家能够理解,一个大型的智能制造对底层的依赖性也是非常高的。

    智能制造一体化 v3.10.6 发布 ,更新内容如下:

    • 考勤模块:加班申请
    • 行政模块:印章借用,印章归还,车辆管理,车辆事故,车辆加油,车辆年检,车辆保险,车辆维修保养,用车申请

    Skyeye 具备低代码、快捷开发、可视化设计、微服务等特点,方便客户二次开发,极大的提高了开发效率。

    erp: https://gitee.com/doc_wei01/erp-pro

    OA: https://gitee.com/doc_wei01/skyeye

    报表:https://gitee.com/doc_wei01/skyeye-report  有问题可以联系作者,详情请看开发计划。

    效果图

    效果图 效果图

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    背景

    随着文本生成图像的语言模型兴起,SolidUI想帮人们快速构建可视化工具,可视化内容包括2D,3D,3D场景,从而快速构三维数据演示场景。SolidUI 是一个创新的项目,旨在将自然语言处理(NLP)与计算机图形学相结合,实现文生图功能。通过构建自研的文生图语言模型,SolidUI 利用 RLHF (Reinforcement Learning Human Feedback) 流程实现从文本描述到图形生成的过程。

    https://github.com/CloudOrc/SolidUI/

    SolidUI 0.1.0 版本简介

    SolidUI 0.1.0 版本主要增加功能,登录、项目管理、数据源管理、设计管理。各个模块文档,测试用例,github action。

    发版清单

    功能

    • 登录:登录信息,预置用户
    • 数据源管理:数据类型管理,编辑数据源,单行删除数据源,添加数据源,数据源过期
    • 项目管理:添加项目,查询项目列表,编辑项目名,预览
    • 设计管理:创建场景,创建页,创建图例,选择数据源,输入 SQL 查询语句,保存页面, 预览场景,编辑场景名称,删除场景,编辑页名称,删除页,编辑图例名称, 删除图例,编辑 SQL 查询语句,撤销图例编辑

    部署

    • 独立部署相关脚本
    • docker-compose

    文档

    • 前端架构设计文档
    • 服务端架构设计文档
    • 项目共建流程
    • 项目发版流程
    • 服务端编译文档
    • 前端编译文档
    • Docker 编译
    • Web 部署
    • Docker 部署
    • 单独部署
    • 测试用例

    Github Action

    • Create Comment
    • build
    • License check
    • third-party dependencies check
    • CodeQL
    • check markdown

    详细指引

    本版本总览: https://github.com/CloudOrc/SolidUI/releases/tag/release-0.1.0-rc1

    详细安装部署见指引: https://github.com/CloudOrc/SolidUI-Doc/blob/main/zh_CN/%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3/%E6%95%B4%E4%BD%93%E9%83%A8%E7%BD%B2/README_STANDALONE.md

    Docker-Compose 部署:https://github.com/CloudOrc/SolidUI-Doc/blob/main/zh_CN/%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3/%E6%95%B4%E4%BD%93%E9%83%A8%E7%BD%B2/README_DOCKER.md

    官方下载链接: https://github.com/CloudOrc/SolidUI/releases/download/release-0.1.0-rc1/solidui-0.1.0-bin.tar.gz

    贡献者

    SolidUI v0.1.0 的发布离不开 SolidUI 社区的贡献者,感谢所有的社区贡献者,包括但不仅限于以下 Contributors(排名不分先后)

    • dlimeng
    • nutsjian
    • jacktao007

    如果成为贡献者

    • 官方文档贡献。发现文档的不足、优化文档,持续更新文档等方式参与社区贡献。通过文档贡献,让开发者熟悉如何提交 PR 和真正参与到社区的建设。参考攻略:https://github.com/CloudOrc/SolidUI/discussions/54
    • 代码贡献。我们梳理了社区中简单并且容易入门的的任务,非常适合新人做代码贡献。请查阅新手任务列表:https://github.com/CloudOrc/SolidUI/issues/12
    • 内容贡献:发布 SolidUI 开源组件相关的内容,包括但不限于安装部署教程、使用经验、案例实践等,形式不限,请投稿给小助手。例如:https://github.com/CloudOrc/SolidUI/issues/10
    • 社区答疑:积极在社区中进行答疑、分享技术、帮助开发者解决问题等;
    • 其他:积极参与社区活动、成为社区志愿者、帮助社区宣传、为社区发展提供有效建议等;

     

    漏洞描述

    Sealos 是一个以 Kubernetes 为内核的开源云操作系统,用于部署和管理 Kubernetes 集群。

    Sealos 4.2.0之前版本中由于缺少用户对集群的访问控制,具有 Sealos 访问权限的攻击者可获得 Sealos 所在集群的控制权限,如启动/停止服务、创建/删除资源等,同时可以操纵集群中其它的pod(调度单)、容器等资源,例如访问敏感数据、修改应用程序配置等。

    漏洞名称 Sealos<4.2.0 RBAC权限配置不当漏洞 漏洞类型 访问控制不当 发现时间 2023-06-30 漏洞影响广度 一般 MPS编号 MPS-7zk5-xms4 CVE编号 CVE-2023-33190 CNVD编号 –

    影响范围

    Sealos@[1.0.0, 4.2.0)

    修复方案

    升级Sealos到 4.2.0 或更高版本

    官方已发布补丁:https://github.com/labring/sealos/commit/0eb07c460a0ffcb6f41355f9da64a

    参考链接

    https://www.oscs1024.com/hd/MPS-7zk5-xms4

    https://nvd.nist.gov/vuln/detail/CVE-2023-33190

    https://github.com/labring/sealos/security/advisories/GHSA-74j8-w7f9-pp62

    https://github.com/labring/sealos/commit/b1b01df4b9ab255fbd25c1f5d28b8b19f19812e4

    https://github.com/labring/sealos/commit/0eb07c460a0ffcb6f41355f9da64a

    免费情报订阅&代码安全检测

    OSCS是国内首个开源软件供应链安全社区,社区联合开发者帮助全球顶级开源项目解决安全问题,并提供实时的安全漏洞情报,同时提供专业的代码安全检测工具为开发者免费使用。社区开发者可以通过配置飞书、钉钉、企业微信机器人获取一手的情报。

    免费代码安全检测工具: https://www.murphysec.com/?src=osc

    免费情报订阅: https://www.oscs1024.com/cm/?src=osc

    具体订阅方式详见: https://www.oscs1024.com/docs/vuln-warning/intro/?src=osc

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    漏洞描述

    Airflow Hive Provider 是Apache Airflow与Apache Hive集成的插件。Beeline 是Hive客户端与服务器进行交互的命令行工具。

    Airflow Apache Hive Provider 6.1.1之前版本中由于 hive#_prepare_cli_cmd 方法未对用户参数正确过滤,具有修改 Hive 连接参数权限的攻击者可将包含分号(‘;’)的恶意负载注入到 extra_dejson 参数的 principal 值中,从而在Hive服务器远程执行任意命令。

    漏洞名称 Apache Airflow Hive Provider Beeline 远程代码执行漏洞 漏洞类型 代码注入 发现时间 2023-07-02 漏洞影响广度 广 MPS编号 MPS-gyzv-dxst CVE编号 CVE-2023-35797 CNVD编号 –

    影响范围

    apache-airflow-providers-apache-hive@[1.0.0, 6.1.1)

    修复方案

    升级apache-airflow-providers-apache-hive到 6.1.1 或更高版本

    官方已发布漏洞补丁:https://github.com/apache/airflow/commit/fc7bb05289c9949fcee5e9168e4467e95cdf2c87

    参考链接

    https://www.oscs1024.com/hd/MPS-gyzv-dxst

    https://nvd.nist.gov/vuln/detail/CVE-2023-35797

    https://github.com/apache/airflow/commit/fc7bb05289c9949fcee5e9168e4467e95cdf2c87

    https://github.com/apache/airflow/pull/31983

    https://lists.apache.org/thread/30y19ok07fw52x5hnkbhwqo3ho0wwc1y

    免费情报订阅&代码安全检测

    OSCS是国内首个开源软件供应链安全社区,社区联合开发者帮助全球顶级开源项目解决安全问题,并提供实时的安全漏洞情报,同时提供专业的代码安全检测工具为开发者免费使用。社区开发者可以通过配置飞书、钉钉、企业微信机器人获取一手的情报。

    免费代码安全检测工具: https://www.murphysec.com/?src=osc

    免费情报订阅: https://www.oscs1024.com/cm/?src=osc

    具体订阅方式详见: https://www.oscs1024.com/docs/vuln-warning/intro/?src=osc

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    作者:vivo 互联网运维团队- Peng Jiahong

    本文介绍了vivo业务运维证书管理从手工到平台化的历程。

    一、背景

    以往,vivo 互联网业务的域名证书运维管理工作,严重依赖经验丰富的高级运维工程师个人专职管理,证书管理存在单点以及过于依赖的人的情况。

    随着业务规模的持续扩大,以及对证书管理质量标准的要求提升,加强全网证书信息准确的收敛把控。

    为此,业务运维团队决定,通过证书管理流程标准化、平台化,完成全生命周期管理证书,来消除因依赖人为管理证书问题导致业务可用性受损的痛点。

    二、能力规划

    全生命周期管理业务证书,我们建设的平台需具备以下特性和能力:

    • 高效的证书申请

      新申请以及续期场景,平台引导用户自动的生成私钥和 CSR 并提交工作申请联络单,用户完成验证后自动存储证书合并私钥。

    • 便捷的证书管理

      支持多种证书格式导入、导出功能,查看完整的证书信息。

    • 安全的私钥存储

      使用 AES256 等 高强度算法加密存储。

    • 证书逾期监控

      支持 30/60 天,可自定义逾期的证书监控告警。

    • 证书变更白屏化

      覆盖 NGINX、 SLB、CDN 以及 VUA 证书变更场景。

    三、设计思路

    3.1 技术选型

    (1)前端框架:

    用基于Vue2的Element构建基础页面

    (2)后端框架:

    以 Go 语言为基础,快速利用gin框架提供restful的api,业务数据存储在MySQL

    3.2 架构设计

    证书管理平台整体架构设计:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.3 模块设计

    证书管理平台包含四个非常重要的子模块:

    • 可视

      是整个平台最基础的模块,除基础的权限功能外,通过收敛汇总所以证书信息,实现证书总览数据分析,证书的操作的追溯以及变更审计和操作可视化。

    • 管理

      是证书信息管理的核心功能之一,实现证书信息的可视化以及信息变更、证书申请、证书续期的能力。

    • 变更

      提供 NGINX、SLB、CDN、VUA 证书的推送能力。

    • 监控

      提供证书的生命周期检测、有效期提醒、线上证书扫描的能力。

    四、技术实现

    4.1 前端

    前端是基于Vue2和Element来组建用户的操作界面,整个详细的设计图如下:

    其中

    • main.j包含整个业务系统落地所需要的各类组件和素,实现组件 的提供以及基础的权限校验;

    • api的方法通过合理的封装后端的接口,提供view中呈现给用户的界面调用方法,来实现整个证书管理的业务流程操作。

    在整个证书管理平台的迭代过程中,只需重点关注view中vcm前缀用户界面的代码实现即可。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4.2 后端

    后端使用Go语言来编写业务逻辑和API接口。其中架构可以参考3.2设计图,管理平台核心逻辑通过代码片段展示如下:

    (1)基于casbin实现的权限管理:通过角色控制权限,并按需赋予用户角色默认访问权限(如下图创建角色时AddMenuAuthority、UpdateCasbin方法)。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    (2)证书相关数据加密处理:获取前端用户选择的相关算法进行加密。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    (3)基于证书管理标准化流程的业务代码实现,覆盖证书的信息管理&变更推送&监控告警&平台的角色权限控制。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    五、平台预览

    经过多个开发迭代,平台相关的核心功能如下:

    5.1 证书信息概览

    概览首页收敛证书管理的功能入口,以及收纳管理证书的全貌,方便管理员了解所管理的证书状态和最近的申请进度。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5.2 证书信息管理

    汇总了目前内销所有证书信息,后续平台上申请的证书信息管理也会收敛于此,并提供证书私钥相关的查看和下载。 

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5.3 证书申请/续期

    通过平台场景化证书申请续期的操作,解决过往碎片化操作以及无经验人员需通过文档阅读或者人员指导完成证书申请问题。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5.4 证书变更管理

    平台覆盖云上、NGINX 集群、CDN 以及 VUA 的证书白屏化、可追溯操作历史更新能力。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    5.5 证书监控

    收敛在平台上管理的证书都会有逾期监控提醒,来提醒运维人员及时完成对应的证书更新管理,确保业务不受影响。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    六、总结

    证书管理平台的实践落地,通过流程标准化以及管理平台的建立,规范证书的信息、变更、告警、变更审计相关管理,上线后至今,也无证书管理相关的问题导致的可用性告警,解决了传统域名证书管理场景下人效、可用性隐患的痛点,是业务运维 SRE 可用性保障&运维提效的一个成功案例。

    七、展望

    目前我们获取的证书,依旧依赖于传统的域名证书分发模式(站点管理员需要花费金钱购买数字证书,并且证书的签发和更新需要时间和人力成本)。随着区块链和Web 3.0技术的发展,新增了去中心化身份验证和身份管理技术,在证书的分发上具备以下优势

    1. 不可篡改性

      区块链技术保证证书的安全性和不可篡改性。因为每一个区块链节点都会对交易进行验证和记录,从而保证数据的一致性和完整性,防止伪造和篡改。

    2. 透明性

      区块链技术使得所有参与者都可以获得统一的信息,从而保证证书的透明性,避免信息不对称或不公平的情况发生,同时也可以有效地降低信息传递成本。

    3. 保密性

      区块链技术可以采用加密算法,保证证书的保密性和隐私性。同时,也可以根据需求设定只允许特定的参与者访问相关信息。

    4. 高效性

      传统的证书分发需要进行大量的人力和物力投入,而基于区块链的证书分发可以实现自动化,从而提高证书分发的效率。

    5. 可追溯性

      基于区块链的证书分发可以实现对证书的溯源和追踪,从而可以更好地防止证书的丢失或滥用。

    综上所述,基于区块链的证书分发可以有效降低证书分发的成本和提高证书的安全性。

    未来,基于相关技术的成熟程度,也会合理的应用和替换过往的证书申请分发模式,迭代证书管理平台相关的功能,来配合提高证书的管理效率和安全性。

    END

    猜你喜欢

    • 浅析 Jetty 中的线程优化思路

    • “事后达尔文”—— 游戏业务效果评估方法实践

    • vivo 帐号服务稳定性建设之路-平台产品系列06

    • vivo 游戏黑产反作弊实践

     package com.didichuxing.datachannel.arius.admin.task.metadata; import com.didichuxing.datachannel.arius.admin.metadata.job.cluster.monitor.esMonitorJob.MonitorJobHandler; import com.didiglobal.logi.job.annotation.Task; import com.didiglobal.logi.job.common.TaskResult; import com.didiglobal.logi.job.core.job.Job; import com.didiglobal.logi.job.core.job.JobContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; // @Task 注解自带了 @Component @Task(name = "esMonitorJob", description = "monitor调度任务", cron = "0 0/1 * * * ? *", autoRegister = true) public class ESMonitorJobTask implements Job { private static final Logger LOGGER = LoggerFactory.getLogger(ESMonitorJobTask.class); @Autowired private MonitorJobHandler monitorJobHandler; @Override public TaskResult execute(JobContext jobContext) throws Exception { LOGGER.info("class=ESMonitorJobTask||method=execute||msg=start"); monitorJobHandler.handleJobTask(""); return TaskResult.SUCCESS; } }

    工信部发布了 2023 年 1-5 月份互联网和相关服务业运行情况指出,1-5 月份,互联网业务收入小幅增长,利润总额快速增长

    一、总体运行情况

    互联网业务收入小幅增长15月份,我国规模以上互联网和相关服务企业(以下简称互联网企业)完成互联网业务收入5310亿,同比增长2.8%

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    利润总额快速增长15月份,我国规模以上互联网企业营业成本同比增长6.3%。实现利润总额576.2亿,同比增长43%

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    研发经费降幅收窄15月份,我国规模以上互联网企业共投入研发经费260.7亿,同比下降5.9%,降幅14月份收窄2.6个百分点。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    二、分领域运行情况

    (一)信息服务领域企业收入略显低迷15月份,以信息服务为主的企业(包括新闻资讯、搜索、社交、游戏、音乐视频等)互联网业务收入同比下降1%

    (二)生活服务领域企业收入较快增长15月份,以提供生活服务为主的平台企业(包括本地生活、租车约车、旅游出行、金融服务、汽车、房屋住宅等)互联网业务收入同比增长12.5%

    (三)网络销售领域企业收入保持较高增势15月份,主要提供网络销售服务的企业(包括大宗商品、农副产品、综合电商、医疗用品、快递等)互联网业务收入同比增长33.9%

    三、分地区运行情况

    东部地区互联网业务收入小幅增长15月份,东部地区完成互联网业务收入4943亿,同比增长4%,增速较14月份回落0.7个百分点,高于全国增速1.2个百分点,占全国互联网业务收入的比重为93.1%。中部地区完成互联网业务收入180.8亿,同比下降7.2%,降幅较14月份收窄3.3个百分点,于全国增速10个百分点。西部地区完成互联网业务收入172.1亿,同比下降11.6%,降幅较14月份扩大2.3个百分点,于全国增速14.4个百分点。东北地区完成互联网业务收入13.9亿,同比下降42.3%,降幅较14月份扩大0.1个百分点,于全国增速45.1个百分点。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    数地区互联网业务增速实现正增长15月份,互联网业务累计收入居前5名的北京增长2.7%)、上海增长13.3%)、浙江(增长0.8%)、广东(下降7.5%)和天津(增长25.8%)共完成业务收入4645亿,同比增长5%,占全国(扣除跨地区企业)比重达87.5%。全国互联网业务增速实现正增长的省(区、市)有15个,其中河北山东、黑龙江增速超40%

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    四、我国移动应用程序(APP)发展情况

    根据全国APP技术检测平台统计,截至5月底,我国国内市场上监测到活跃的APP数量为261万款(包括安卓和苹果商店)。移动应用开发者数量为82,其中安卓开发者为24万,苹果开发者为58万。5月份,安卓应用商店在架应用累计下载量359亿次。

    附注:

    1.规模以上互联网和相关服务企业口径由上年互联网和相关服务收入500万以上调整为2000万及以上,文中所有同比增速均按可比口径计算。

    2.活跃的移动应用程序数量是指报告期内我国市场上经过用户主动下载安装的第三方移动应用的总个数,其中安卓应用数的计算方法是根据智能手机记录的已安装移动应用去重后获得。

    谷歌推出了一款名为 “ Odd One Out ”的网页小游戏,玩家需要从 4 张图片中找出一张 AI 生成的图片。

    尝试一下:点此进入

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等) 

    这个游戏不允许玩家仔细斟酌,每一轮都有一个极短的时间戳,大概只有十五秒的辨别时间。正常图片包含一些艺术画作、摄影、实物模型拍摄等图片,辨认难度很高。

    第一轮:小编认为最写实的一张标本图,结果是 AI 生成的。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    第二轮,小编觉得最写实的一张刺绣图,结果是 AI 生成的。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    第三轮,小编告诉自己越浮夸的设计越可能是真的,忍住了选 2 的心,终于蒙对了一次。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    不难发现, AI 生成的图已经可以做到以假乱真,得仔细看才能发现不对劲的地方。如果将 AI 生成的内容和一些复杂的艺术作品放在一起, AI 作品反而显得更真实。

    值得一提的是,游戏里的艺术作品画像,还可以了解其作者、创作时间等详细信息。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    DragGAN-Windows-GUI 是封装了 DragGAN 的图片处理工具,直接解压即可使用,内置 17 个模型。

    DragGAN 是由 Google 的研究人员与 Max Planck 信息学研究所和麻省理工学院 CSAIL 一起开发的项目,是一个非常直观的图像编辑工具,用户只需要控制图像中的像素点和方向,就可以快速调整照片主体的位置、姿态、表情、大小和角度等。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    LLVM  Git 仓库的代码提交记录显示,它已初步支持 Fat LTO 对象。预计今年秋季的 LLVM/Clang 17 将提供”-ffat-lto-objects”支持。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    据介绍,为编译器启用 Fat LTO 对象支持可以让编译器 IR 与最终目标代码一起保存。因此,这些 “fat” 对象可以用于开发构建和优化构建的生产,但代价是增加了对象大小和更长的构建时间。然后在链接时间阶段确定是否丢弃 link-time 优化 (LTO) 信息,或者是否使用它。

    GCC 支持 Fat LTO 对象已经有一段时间,本周 LLVM 也提供了初步支持,其实现与 GCC 类似。添加初步 Fat LTO 支持的 commit 解释道:

    “Fat LTO 对象包含 LTO 兼容的 IR 以及生成的目标代码。该特性为开发者提供推迟是否使用 LTO 的 link-time。GCC 已提供此特性。”

    按照 LLVM 的发布节奏,当 LLVM 17 于 9 月份左右首次亮相时,这将与许多其他新的编译器功能一起发布。

    Inflection AI 宣布在新一轮融资中筹集了 13 亿美,该轮融资由微软、里德霍夫曼、比尔盖茨、埃里克施密特和新投资者 NVIDIA 领投,新一轮融资使公司融资总额达到15.25 亿美,在 AI 领域的估值仅次于 OpenAI 公司。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Inflection AI 总部位于加利福尼亚州帕洛阿尔托,是一家专注于创建个人人工智能的“人工智能工作室”。它由 Mustafa Suleyman、Karén Simonyan 和 Reid Hoffman 于 2022 年初创立,是一家公益公司( Public Benefit Corporation),团队包括一些曾在 DeepMind、谷歌、微软、OpenAI 和 Meta 工作过的业界顶尖人工智能专家。

    在短短一年多的时间里,Inflection AI 开发出了市场上最复杂的大型语言模型之一,以及对应的人工智能产品“ Pi ”,使人们能够以最简单、自然的方式与其人工智能进行交互。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    目前 Inflection AI 与其合作伙伴 CoreWeave 和 NVIDIA 一起,正在构建世界上最大的人工智能集群,该集群包含 22,000 个 NVIDIA H100 Tensor Core GPU,在 16 位精度模式下可实现惊人的 22 exaFLOPS,如果使用较低精度,则性能甚至会更高。

     Inflection AI 宣布新一轮融资将继续用于人工智能集群和新产品 Pi 的进一步开发。

    OneOS驱动RTC

    1、简介

    RTC(Real-Time Clock)实时时钟可以提供精确的实时时间,它可以用于产生年、月、日、时、分、秒等信息。目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。有些时钟芯片为了在主电源掉电时还可以工作,会外加电池供电,使时间信息一直保持有效。

    2、RTC设备注册

    以stm32l475-atk-pandora为例。

    2.1.os_driver_info_t和os_device_info_t结构体创建

    1. os_driver_info_t

    位置:drivershalstdriversdrv_rtc.c

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    OS_DRIVER_INFO:注册结构体os_driver_info_t到”driver_table”段;

    OS_DRIVER_DEFINE:注册系统启动进行初始化时调用的初始化函数。

    1. os_device_info_t

    位置:templatesstm32l475-atk-pandoraboardperipherals.c

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    OS_HAL_DEVICE_DEFINE注册结构体os_device_info_t到”device_table”段

    2.2.RTC_HandleTypeDef结构体(hrtc)

    1. 结构体定义

    drivershalstSTM32L4xx_HALSTM32L4xx_HAL_DriverIncstm32l4xx_hal_rtc.h

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    1. 结构体初始化
    1. MX_RTC_Init函数

    位置:templatesstm32l475-atk-pandoraboardCubeMX_ConfigSrcmain.c

    对Instance和Init成员进行初始化。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    由上图可知,Instance成员赋值为RTC宏。RTC宏定义和RTC_TypeDef结构体定义如下。宏RTC定义为RTC寄存器的基地址,该地址指向RTC_TypeDef结构体。该结构体的成员都是32位的寄存器,是与时间、日期等相关的寄存器。只要知道该结构体的基地址,即下图中的RTC_BASE,那么就能够访问其中的寄存器成员,从而可以进行时间和日期的获取、设置等操作。

     

    位置:stSTM32L4xx_HALCMSISDeviceSTSTM32L4xxIncludestm32l475xx.h

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    (2)其他初始化函数

    位置:drivershalstSTM32L4xx_HALSTM32L4xx_HAL_DriverSrcstm32l4xx_hal_rtc.c

    HAL_RTC_InitHAL_RTC_DeInit函数:主要对结构体中的函数指针成员的赋值;

    HAL_RTC_RegisterCallbackHAL_RTC_UnRegisterCallback函数:同样是对结构体中的函数指针成员的赋值。

     

    3、注册函数

    设备驱动层probe函数:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    注意:操作接口只有一个os_rtc_control接口。

    结构体stm32_rtc

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    注意,上面probe函数直接调用os_device_register,即无设备框架层,直接注册到设备管理层

    虽然没有注册到设备框架层,但是仍然有drivers tc tc.c本来一般rtc.c为设备框架层,但是此处不同,注册时并未到这一层,而且用户调用也从rtc.c开始,并不是从设备管理层开始。访问RTC设备直接从rtc.c中的接口开始,而设备管理层的接口又放在rtc.c中的接口中调用。具体看下面设备访问一节。

    4、RTC设备访问

    位置:drivers tc tc.c

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    另外还有set_date和set_time两个接口,用户可由这两个接口通过调用rtc_get、rtc_set接口完成日期和时间的设置。

     

    rtc_get结构的执行流程。

     

    rtc.c

    rtc_get

    device.c

    os_device_open_s

    os_device_control

    drv_rtc.c

    os_rtc_control

    stm32_rtc_get_timestamp

    device.c

    os_device_close

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等) 

    其中的RTC_HandleTypeDef结构体hrtc中包含有RTC寄存器基地址成员,这在前面的内容中讲过。再借助HAL_RTC_GetTime和HAL_RTC_GetDate接口来访问寄存器获取时间和日期。

    OceanBase 环境基本都会先安装 OCP 来部署、监控、运维数据库集群。但如果有机器过保等问题,就需要有平稳的 OCP 节点的替换方案。

    作者:张瑞远

    上海某公司 DBA,曾经从事银行、证券数仓设计、开发、优化类工作,现主要从事电信级 IT 系统及数据库工作。有三年以上 OceanBase 工作经验。获得的专业技能与认证包括 OceanBase OBCP、Oracle OCP 11g、OracleOCM 11g 、MySQL OCP 5.7。

    本文来源:原创投稿

    • 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

    前言

    OceanBase 云平台(OceanBase Cloud Platform,OCP),是以 OceanBase 为核心的企业级数据库管理平台。

    我们生产环境基本都是需要先创建 OCP 平台,然后依赖 OCP 去创建及管理监控生产集群,所以安装 OCP 一般是系统上线的第一步。之后可能随着机房规划等问题,就会有需要搬迁或者替换 OCP 的机器的需求。

    分别介绍两种 OCP 节点的替换方法。一种是使用 OAT 平台(OceanBase Admin Toolkit,管理者工具)来替换;另一种就是使用 ANTMAN 工具替换。上次我们介绍了第一种 OAT 的方案,本文介绍第二种。

    PS:我的环境的 OCP 负载均衡使用的 F5,所以新的机器需要先配置 F5,其他负载均衡场景同理。

    环境背景

    大家如果有接触 OB 生产环境的经验的话,可能会了解,前期版本在安装 OCP 的时候,需要安装 OCP 软件/metadb/obproxy 三个 Docker 包,后期 OCP 版本将 DB+Proxy 集成在了一个 Docker 包里,OAT 的话只能纳管 DB + Proxy。集成的 metadb,分开的情况还需要使用 ANTMAN 工具来替换。

    软件信息

    软件 版本 OCP ocp-all-in-one:3.3.3-643 metadb+proxy OB2277_OBP320_x86_ Proxy 4.1.1__x86 antman t-oceanbase-antman-1.4.3-355.alios7.x86_64

    操作过程

    3.1 环境检查/准备

    检查替换机器环境,包括分盘,创建 admin 用户,安装 Docker 软件等。安装好后检查下。

    
    

    登录 库检查有没有 的主 ZONE 在要被替换的节点,提前切主。

    
    

    因为使用 ANTMAN 工具迁移,需要在执行机器上修改 文件,或者直接从原 OCP 上 copy 后检查下,镜像包也需要传到该机器 目录下。

    
    

    检查执行 ANTMAN 脚本机器上默认集群密码是否正确。,执行 的脚本,如果不对需要使用 修改,因为后续 Proxy 的 Docker 迁移后会有验证,OCP 的 Docker 迁移前也会验证。

    
    

    3.2 添加新机器

    执行 ANTMAN 的 manage 脚本进行新机器的添加。

    PS:这个版本 manage 会有报错,文末会有分享。

    
    

    这里日志太多,就不都粘贴出来了,可以从上面看到 metadb 的 Docker 服务添加完后开始了 OBProxy 的 Docker 服务添加。

    过程说明

    1. 是要去替换 OCP 的服务器的实际物理 IP。

    2. 选项,指定的 会被添加到 OCP 环境中的第 1 个 ZONE,即和上文查到的 机器在同一个 ZONE 里。

      这里关于 ZONE 的定义,主要是针对 OCP 服务器上的 而言,obproxy dockerocp docker 并没有 ZONE 的概念。

      关于每台 OCP 服务器上的 meta_ob docker 属于哪一个 ZONE,请参考 配置文件中的三个变量:

    3. 和 ,后面需要分别填写成 服务器的 用户密码和 用户密码。

    4. 是安装,如果替换成 就是清除。

    这时候正常的话可以通过新添加节点的 前台登录 OCP,也可以通过这个机器的 端口去连 库了。

    3.3 新增租户

    登录 OCP 的 metadb 的 租户新增 Docker 的上线。

    
    

    3.4 替换下线

    登录 OCP 的 metadb 的 租户将被替换 Docker 的下线。

    
    

    3.5 更新服务器信息

    登录 租户,手工更新 OCP 服务器信息。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    前面步骤处理完,OCP 前台还可以看到残留的信息,需要替换下信息。

    
    

    3.6 清理被替换机器上残留的服务

    
    

    服务已经被清除。

    报错记录处理

    脚本执行报错。

    
    

    这个问题也需要修改脚本代码解决。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    执行 语句之后很久,被替换的 Server 没有 Delete 掉,一直是 状态,检查发现 OCP 的 库内存参数调整过,新加的 Server 参数小,导致 UNIT 迁移卡住。

    
    

    总结

    到此,使用 ANTMAN 工具的方式去替换 OCP 机器的操作就结束了,包括前面一篇使用 OAT 替换 OCP 节点的文章可能看起来没什么难度,但是整个过程来回做了好几遍,充满我的坎坷和泪水。为了别人以后少踩坑,所以写了这两篇文章分享。

    如果看了上篇文章的话,应该知道 OAT 替换 OCP 的时候,新加机器是在 中新创建了一个 ZONE,然后再把被替换机器下掉。其中还涉及新建资源池修改 Locality,增加副本数等操作。其实使用 ANTMAN 工具的话这个步骤就不太一样,是将新机器加入到需要替换机器的同一个 ZONE 内,然后做同 ZONE 内 UNIT 的迁移,然后把被替换的机器下线。

    现阶段的话,相对来说使用 ANTMAN 工具替换之后对于 OCP 数据的影响更小一些,但是 OAT 黑屏操作更少已些。对于 OBProxy 单独 Docker 的前期场景必须使用 ANTMAN,后期版本就看大家自己酌情选择了。

    行之所向,莫问远方。

    关于 SQLE

    爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。

    SQLE 获取

    类型 地址 版本库 https://github.com/actiontech/sqle 文档 https://actiontech.github.io/sqle-docs/ 发布信息 https://github.com/actiontech/sqle/releases 数据审核插件开发文档 https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Stellarium 23.2 已发布。从 v23.1 开始,发布的版本号将显示 year.release scheme。对于 Windows,所使用的 Qt 框架版本作为包名称的一部分可见。

    Stellarium 是一款免费开源 GPL(自由软件基金会 GNU 通用公共许可证)软件,它使用 OpenGL 图形接口对星空进行实时渲染。软件可以模拟肉眼、双筒望远镜和小型天文等观察天空,根据观测者所处时间和位置,计算出天空中太阳、月球、行星等天体位置,并将其精确地显示出来。还可以绘制星座、演示天文现象,如流星雨、日食和月食等。

    Stellarium 还被应用于天文馆中作为教学展示软件,作为天文爱好者星空望远镜观测辅助软件。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    此版本的主要变化内容如下:

    • 深空物体的矢量化标记
    • 更新的支持地点
    • 太阳系天体的发现情况
    • 以及一些 bug 修复。

    详情可参阅完整的更改列表

    短信而已,何必那么麻烦 — sms4j功能介绍

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    在实际项目中,越来越多的东西需要我们去发送短信,虽说这个问题本身不难,但是各家短信厂商有着不同的方式和标准,导致我们学习和使用的成本极高,再加上发送代码及其繁琐,极大的浪费了我们宝贵的摸鱼时间。于是,为解决广大程序猿/媛的麻烦,将简单的事情回归到简单的本质,sms4j应运而生!

    接下来我们介绍一下他的使用方式

    maven引入

    目前sms4j支持多种形式的使用,springboot模式,java原生se模式,solon模式,我们以springboot模式为例

      <dependency>       <groupId>org.dromara.sms4j</groupId>       <artifactId>sms4j-spring-boot-starter</artifactId>       <version> version最新版本查看官网 </version>  </dependency>

    配置

    各家厂商有着许多的差异化的配置,这里我们也预留出了多种的配置方式,例如yml配置,sql配置,对象化配置等等。我们可以根据自己的实际情况选择一种合适的配置方式。

    我们以yml配置为例:

       sms:       alibaba:         #阿里云的accessKey         accessKeyId: 您的accessKey         #阿里云的accessKeySecret         accessKeySecret: 您的accessKeySecret         #短信签名         signature: 测试签名         #模板ID 用于发送固定模板短信使用         templateId: SMS_         #模板变量 上述模板的变量         templateName: code         #请求地址 默认为dysmsapi.aliyuncs.com 如无特殊改变可以不用设置         requestUrl: dysmsapi.aliyuncs.com       huawei:         #华为短信appKey         appKey: 5N6fvXXXX920HaWhVXXXXXX7fYa         #华为短信appSecret         app-secret: Wujt7EYzZTBXXXXXXEhSP6XXXX         #短信签名         signature: 华为短信测试         #通道号         sender: 97         #模板ID 如果使用自定义模板发送方法可不设定         template-id: acXXXXXXXXc274b2ab954c1ab5         #华为回调地址,如不需要可不设置或为空         statusCallBack:          #华为分配的app请求地址         url: https://XXXXX.cn-north-4.XXXXXXXX.com:443  ​

    进阶配置

    sms4j框架本身支持了很多的功能,还有内部的一些参数值也可以进行配置,下面我们还是以yml为例:

      sms:      # 以下设置仅在开启短信发送限制后生效      # 是否使用redis进行缓存 默认false     redis-cache: false      # 单账号每日最大发送量     account-max: 20      # 单账号每分钟最大发送     minute-max: 2      #默认厂商配置来源 此处为枚举设置,支持sql和配置文件,默认为从yml配置文件获取,如无需求可不改变     config-type: config-file      #启用框架banner打印,默认开启状态     is-print: true       #核心线程池大小       corePoolSize: 10       #最大线程数       maxPoolSize: 30       #队列容量       queueCapacity: 50       #设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean       shutdownStrategy: true

    发送短信

    sms4j对于各个厂商的常用的短信发送方法都进行了封装,我们可以很方便的进行使用。

    示例:

      @RestController  @RequestMapping("/test/")  public class DemoController {  ​      // 测试发送固定模板短信      @RequestMapping("/")      public void doLogin(String username, String password) {           //阿里云向此手机号发送短信          SmsFactory.createSmsBlend(SupplierType.ALIBABA).sendMessage("","");          //华为短信向此手机号发送短信          SmsFactory.createSmsBlend(SupplierType.HUAWEI).sendMessage("","000000");     }  }

    至此为止,一个完整的短信发送流程就完成了。你不需要对他进行额外的封装,并且他统一了各个厂商的发送差距,降低了学习成本,可以在几分钟内完成短信发送的完整流程。

    当然,身为一个gitee推荐项目必然不可能只有这一点功能啦!他在2.2版本还新增了邮件发送的插件,秉承了sms4j一向极简的传统,让本应该100行完成的邮件发送,变得一行代码即可完成,在这里呢我就不多介绍了,有兴趣的小伙伴可以去仓库或者官网查看详细的使用教程(都是保姆级教程哦)

    gitee仓库地址: https://gitee.com/dromara/sms4j

    github仓库: https://github.com/dromara/sms4j

    官方文档:https://wind.kim/

    各位别忘了用你发财的小手给点点star哦!

     

    近日,网传中国人民大学一名硕士毕业生涉嫌在校期间非法获取全校学生的个人信息,并利用这些信息制作了一个给学生颜值打分的网站。

    针对“中国人民大学部分学生信息被非法获取”的情况,海淀警方接到报警后,立即开展调查。经查,嫌疑人马某某(男,25岁,该校毕业生)涉嫌非法获取该校部分学生个人信息等违法犯罪行为。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    目前,马某某已被海淀公安分局依法刑事拘留,案件正在进一步调查中。

    据悉,该毕业生还曾在自己的社交账号上公开炫耀自己的所作所为,但后来删除了相关内容。网传截图显示,该动态发布于 2020 年 10 月。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    据网友爆料,该名硕士毕业生是中国人民大学高瓴人工智能学院 2019 级的一名男生,目前已经毕业。他在读研期间,利用自己的专业技术,盗取了全校学生的照片、姓名、学号、籍贯、生日等个人信息,并将这些信息按照不同的类别进行整理,搭建了一个网站,给全校学生进行颜值打分。

    该网站不仅可以查看每个学生的颜值分数,还可以查看全校或各个院系的颜值排行榜。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    介绍

    多智能体框架MetaGPT开源了:https://github.com/geekan/MetaGPT
    • 输入一句话需求,它就可以运行一个软件公司,输出产品文档/设计文档/任务/代码REPO
    • 它能设计一个类似今日头条的推荐系统,也能设计一个大模型训练框架

    正文

     
    在内部,它抽象了多个不同角色,包括产品经理、架构师、项目经理、工程师、QA等等。
     
    已有框架如gpt-engineer,只有单一的工程师抽象;而MetaGPT提供了软件公司的完整抽象,每个角色有了更明确的技能,之前很难由工程师完成的市场调研、竞品分析、架构设计等环节,现在都可以实现了,拥有了很好的效果。
     
    比如说当需要设计一个类似今日头条的推荐系统,它就可以在一分钟左右给我们一个比较靠谱的设计,而这只需要¥1。用人来完成这个过程耗时良久,成本高昂,ROI可能有几千上万倍
     
    当我们向内部看时,会发现内部的实现实际就是一个完整的软件公司,软件公司中由多个智能体协作,可以完成一个相对复杂的软件问题
     
     

     

    更多信息请访问:https://github.com/geekan/MetaGPT

    昨天晚上(美中时间),Twitter更新了一个版本的网页版前端,导致一个component不断反复刷新,只要你用浏览器点开一条推文,就会每秒钟给Twitter server带来近100次的request压力,整个div肉眼可见地在抖。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    然后Twitter压力巨大,Elon Musk官宣自家被爬虫们DDoS攻击了, 为了对抗爬虫,全面限制访问数。

    然后昨天晚上大家发现Twitter不能打开了,所有的request都被limit了。

    今天早晨,这个前端的bug偷偷被修好了,那个div已经不抖了,但是全球Twitter用户来骂Elon Musk。

    然后Elon Musk又在找借口,”你们应该放下手机”、”这些已经够用了”,开始在推特上胡言乱语,为这个决策买单负责。

    Elon Musk被手下人逐级上报,真的认为是DDoS攻击,坚决咬死不松口,后来在舆论的压力下,提升了一点点request limit。

    再后来,因为整个问题在今天早晨被偷偷全部解决了,所以Twitter官方也把这个limit偷偷彻底放开了。

    但是Elon Musk不懂,非程序员不懂,非前端不懂——如果你是前端,昨天晚上那一阵子没上Twitter,没把那个版本的烂前端cache到你浏览器里,你也不会懂。

    为什么我懂呢?因为我昨天晚上刚好刷到Twitter,发现了这个问题,肉眼可见地看到了它的thread在抖,在刷新,看了chrome的console,发现这事儿挺可怕。

    但是Twitter内部大概率不会这么上报给Elon Musk,前端惹祸,后端背锅,逐级上报,稀里糊涂做了最高决策,然后恶心了全球用户。

    然后前端偷偷更新擦屁股,全球人民骂Elon Musk,推特也偷偷放开限制,这件事就算过去了。

    嗯,以上就是从昨天到今天,整个Twitter乌龙事件的来龙去脉。

    来源1、来源2

    Postman 发布了一份 2023 年 API 状况报告,基于超 40000 名开发人员和 API 专业人士分享的对开发优先事项、API 工具以及 API 发展方向的想法。这是该公司对 API 专业人员进行的第五次年度调查,在以前的版本基础上扩展了 API 货币化和生成式 AI 两个领域。

    报告的一些主要发现包括:

    • API 对大多数人来说都是赚钱的工具

    近三分之二的受访者表示他们的 API 会产生收入。在这些受访者中,43% 的人表示 API 创造了公司收入的四分之一以上。在金融服务和广告领域,API 收入受到密切衡量。它被评为衡量公共 API 成功与否的第二重要指标,仅次于使用率。 

    对于少数公司来说,API 产生了超过 75% 的总收入。这些公司涉足金融服务业的可能性几乎是其他行业的两倍。35% 的 API 没有产生收入的受访者往往在较小的组织中工作。随着公司规模的增长(以开发人员人数衡量),受访者越来越有可能表示他们的 API 产生了收入。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    • API 定价变得越来越重要

    在决定是否与 API 集成时,47% 的受访者表示价格是一个考虑因素,相较前两年的 41% 有所上升。虽然存在性能和安全性等其他因素的排名高于定价,但报告认为这一发现可能反映了在科技经济收缩后,API 消费者更加注重成本。

    高管们尤其可能注重定价,60% 的高管将其视为与 API 集成之前需要考虑的一个因素。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    • API 投资前景光明

    92% 的受访者表示,未来 12 个月内对 API 投资将增加或保持不变,高于去年的 89%。这一增长可能反映出某些方面认为科技行业经济收缩最糟糕的时期已经过去。53% 的首席执行官表示明年将增加 API 投资,而持相同看法的开发人员只有 44%。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    • 大多数 API 专业人员正在使用 AI 来帮助编码

    60% 的 API 专业人员表示他们在工作中使用生成式 AI 工具,最常见的用途是查找代码中的错误、生成代码和编码指令与初级开发人员相比,高级 API 开发人员使用人工智能工具的可能性要小得多。

    其中超过一半使用 AI 工具来查找代码中的错误,超过三分之一的人依靠 AI 来生成计算机可以理解的代码。当被问及来年什么类型的项目最让开发者兴奋时,排名第一的答案是构建 AI 驱动的应用程序,占比超三分之一。

    在各行业中,政府和国防最不可能使用 AI 工具,只有 51% 的受访者采用它们。一些受访者提到了安全风险以及企业禁止与第三方 AI 工具共享数据的禁令。教育领域的接受率最高,65% 的受访者表示他们使用了 AI 工具。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    当被问及“预计 ChatGPT 和 Copilot 等工具将在未来两年内为开发带来什么样的生产力效益?”时。受访者普遍认为,AI 将提高开发者的生产力,41% 的受访者预计将提高 10% 至 25%。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    • API-first leaders 的数量增加了近一半

    今年,11% 的受访者将自己定义为 API-first leaders,高于前两年的 8%。这个精英群体几乎在每一个指标上都表现出色。例如,他们可以更快地生产 API 并报告更少的故障。当 API 发生故障时,大多数 API-first leaders 可以在不到一个小时的时间内恢复它 —— 只有少数受访者可以达到这一水平。

    虽然总数据显示 11% 的受访者是 API-first leaders,但这一比例会随着公司规模的扩大而上升。在拥有 1000+ 及以上的开发人员公司中,15% 的受访者将自己定义为 API-first leaders。在各行业中,金融服务业的这一比例最高,也为 15%。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    • API 安全性正在改善

    受访者报告 2023 年与 API 相关的安全事件有所减少:56% 的人表示此类事件每年发生的次数少于一次,相较去年的 52% 有所改善。

    在美国,此类事件最为罕见,67% 的受访者表示 API 安全事件每年发生的次数不到一次。在欧洲、中东和非洲,这一比例降到了 57%。而在亚太地区和拉丁美洲这一数字更低,只有 47% 的人表示 API 安全事件每年发生的次数少于一次。

    某些行业的表现比其他行业更差。调查者表示,汽车、教育和零售行业的每月事故发生率高于平均水平。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    组织最关心的 API 安全风险是问题是“不正确的身份验证、授权或访问控制”,与其他风险的比例几乎为二比一。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    此外,有关最常用的 API 工具和平台,大多数受访者都提到了 Postman。其次分别是 SwaggerHub、Datadog 和 SoapUI。有 14% 的受访者使用 SoapUI,但在政府和金融服务行业,这一数字跃升至 20% 以上。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    数据显示,过去一年中五个最流行的 API 集合(最常分叉的)是 Salesforce Platform API、WhatsApp Cloud API、Twitter API v2、Notion API 和 PayPal API。

    REST 仍然是最常用的 API 架构,有 86% 的人使用它;但相较去年的 89% 和 2021 年的 92% 有所下降。SOAP 占比出现显着下降,今年只有 26% 的受访者使用,而去年这一比例为 34%;这种下降使得 SOAP 从去年的第三位下降到调查中第四位最常用的架构。GraphQL 取代了 SOAP 的地位,并被 29% 的受访者使用。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    更多详情可查看完整报告。

    开发者 Jie Mei 合并到 GCC Git 的一组补丁显示,正在开发中的 GCC 14 编译器增加了对 MIPS16e2 处理器 ISA 的支持。

    MIPS16e2 是 MIPS16e 指令集的扩展,与 MIPS32 和 MIPS64 指令集兼容,可与现有 MIPS 指令二进制文件混合使用。不同的是 MIPS16e2 ASE 添加了 8 个通用寄存器和多个专用寄存器,并定义了新指令,以帮助提高代码密度。

    值得一提的是,MIPS16e2 规范起草于 2014 年并于 2016 年正式发布,但直到现在才有开源开发人员开始注意到并实现它。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    MIPS16e2 还提供了有关缓存、左/右加载/存储字、LUI、按位、MOVx 指令等新指令,感兴趣的人可以通过 MIPS 规范查看关于 MIPS16e2 的详细信息。

    这是继 CentOS 停服之后,红帽的又一大动作。消息一出,引发了许多人的担忧。事实上,有关红帽对 CentOS 相关代码发行方式的变更可以追溯到更早之前。CentOS 是红帽发行的社区版 Linux,其上游原本是红帽的企业发行版Linux 系统 RHEL (Red Hat Enterprise Linux) ,因此对使用者来说更加稳定。

    在服务器生产环境中,CentOS 占有率达到了 90%2021 年国内存量 400 万台。

    2020  12 月份,CentOS 官网正式宣布,将停止维护 CentOS Linux,并将更多资金和人力投入到 CentOS Stream 中。而 CentOS Stream 则是在 RHEL 的上游,其稳定性自然不如 CentOS

    CentOS 停服带来了一系列的问题,如安全性风险,随着更新和补丁的停止,系统将不再收到安全补丁;软件和依赖性问题,部分软件包和应用程序可能会面临过期和兼容性问题;技术支持缺失;迁移成本问题;遗留系统兼容性问题。

     CentOS 宣布停服之后,许多人开始寻找更稳定的替代方案,OpenCloudOS 社区便应运而生。在过去一年多的时间,已经有 600 多家公司加入 OpenCloudOS 社区,实现了产业链类型全覆盖(12大行业),主流芯片、数据库、整机全覆盖,覆盖 10000+ 用户群体……

     1 日,在 OSCHINA 主办的 93 期源创会上,腾讯操作系统 TencentOS 研发团队产品负责人,OpenCloudOS 社区贡献者汪礼超为到场观众详细讲解了 OpenCloudOS 社区发展与建设思路,以及技术特性。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    汪礼超介绍,最初 OpenCloudOS 社区希望能在短期解决 CentOS 断供替代问题,长期解决国产操作系统上游供应问题,保障行业应用的基础软件安全供应及可持续健康发展。社区定位是从源社区(L1)、商业版(L2)、到社区稳定版(L3)的全链路覆盖,输出经海量业务验证的企业级稳定操作系统版本。避免断供风险,为行业提供可控的操作系统的上下游供应,做中国操作系统全链路供应标杆。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    OpenCloudOS 社区作为核心底座,全面保障国产操作系统软件供应链,同源支撑服务器、桌面、嵌入式、边缘全场景。目前,OpenCloudOS 社区及衍生版本装机量累计超 1000万台,覆盖银行、保险、证券等 12大行业。

    技术能力方面,OpenCloudOS 依托 TencentOS 10  + 专业技术打磨、系统整体可用性 99.999%、宕机自动分析成功率 95%,享有多级质量保障,提供高级别的安全防护服务,健全的运营支撑服务。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    汪礼超带来了多个 OpenCloudOS 版本的介绍。

     OpenCloudOS Stream23 系列版本,是 OpenCloudOS 社区 Stream SIG 成员联合研发独立演进的首个 L1 源社区项目,此系列紧跟上游,保障供应安全。目前已发布 3 个版本,产品能力持续完善,软件包自主选型达到 3000,实现不依赖其他发行版的自编译。

    OpenCloudOS v9系列版本,这是 OpenCloudOS 社区成员联合研发基于OpenCloudOS Stream23 的首个 L3 全自研版本,高效经济,独立开放。OpenCloudOS 桌面系列版本,兼具实用和自主性,桌面支持是 OC 社区的重点工作之一,目前 OC8 已完成 NDE 桌面的支持,OC9 完成了 Gnome 桌面的适配工作。

    未来,OpenCloudOS 开源社区将持续优化用户体验,继续提升操作系统易用性、安全性、稳定性;提升资源利用率,降本增效;持续打造绿色经济基础软件;紧跟新技术发展;协同开发者、伙伴、客户、行业共同打造基础软件基石、确保应用环境稳定、基础服务设施供应安全。

    目录

    一、前言

    二、应用系统数据库设计的基本流程

    三、数据库模型设计

    1、概念结构设计阶段

    2、逻辑结构设计阶段

    3、物理结构设计阶段

    四、小结

    一、前言

    GaussDB数据库是一款企业级分布式数据库,支持集中式和分布式两种部署形态。它面向金融互联网交易和政企OA/办公等场景,具有安全可靠、超高性能、简单易用等优势。

    在GaussDB中,数据建模是非常重要的一部分。数据建模是指根据业务需求和数据特点,将现实世界中的实体、属性、关系等概念抽象出来,并用一定的方式表示成计算机可以理解的形式。数据库模型设计的目的是为了建立一个能够满足业务需求的数据存储结构,使得数据的存储、查询、更新等操作更加高效、可靠、安全。

    在GaussDB中,可以使用E-R图来进行数据建模,E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型,它可以帮助您更好地理解您的业务逻辑并将其转换为关系模型。

    二、应用系统数据库设计的基本流程

    应用系统数据库设计基本流程简图:

    第一步:需求分析:主要包括数据、功能、性能等

    第二步:数据库设计:主要包括概念结构设计、逻辑结构设计、物理结构设计等

    第三步:数据库实施:选择数据库软件,并进行落地。

    第四步:数据库系统运行、维护和优化。

    其中数据库设计(Database Design)是E-R设计模型中的主要环节。

    三、数据库模型设计

    本节结合GaussDB数据库的相关知识点,以简单的订单模型举例来演示数据库模型的设计过程。

    数据库模型设计主要分以下3个阶段:

    1、概念结构设计阶段

    概念数据模型(CDM)是按用户的观点来对数据和信息建模,其目标是统一业务概念,作为业务人员和技术人员之间沟通的桥梁,确定不同实体之间的最高层次的关系。其特征包括:

    • 面向用户,反映用户的业务需求
    • 抽象性强,不涉及具体实现细节
    • 层次结构清晰,各层之间有一定的关系
    • 可扩展性好,可以方便地添加新的实体和关系等。

    所以这个阶段,我们主要完成从需求中抽象出示实体集和关系集。

    示例系统:订单系统,实体(订单、客户、供应商、商品、地址)。

    实体集之间关系集梳理:

    1)客户与订单是一对多

    2)客户与地址是一对一

    3)供应商与地址是一对一

    4)供应商与商品是一对多

    5)订单与商品是一对多

    如图, 确定不同实体之间的最高层次的关系:

    2、逻辑结构设计阶段

    逻辑数据模型(LDM)尽可能详细地描述数据, 逻辑数据模型的特征包括:

    • 包括所有实体和它们之间的关系
    • 指定了每个实体的所有属性
    • 指定外键(标识不同实体之间关系的键)
    • 关系表规范化等。

    如图, 完善每个实体的属性: ​​​​​​

    3、物理结构设计阶段

    物理数据模型(PDM)表示如何在数据库中构建模型。 物理数据库模型显示所有表结构,包括列名,列数据类型,列约束,主键,外键以及表之间的关系。物理数据模型的功能包括:

    • 规范所有表和列
    • 外键用于标识表之间的关系。
    • 物理上的考虑可能导致物理数据模型与逻辑数据模型有差异
    • 不同的RDBMS的物理数据模型将有所不同,例如MySQL和GaussDB之间列的数据类型可能有所不同。
    • 目标是指定如何用数据库模式来实现逻辑数据模型,以及真正的保存数据。

    如图,完成所有实体转换为表,转换所有关系集为相关表的外键,转换所有属性为列。

     

    针对上面的物理数据模型设计时,GaussDB数据库有如下字段设置规范建议:

    1. 合理选用字符串数据类型。优先使用变长字符类VARCHAR。只有该字段输入确定为固定字符则使用定长字符类型,或需要自动补充空格,才使用CHAR(n)。
    2. 字符类型字段不应存储数字类型的数据。如果对存储在字符类型字段中的数据进行数值计算,或者与数值进行比较操作(如置于过滤条件中),会带来不必要的数据类型转换的开销,同时该字段上的索引可能失效,影响查询性能。
    3. 字符类型字段不应存储时间或日期类数据。如果对存储在字符类型字段中的数据与日期类数据进行计算或比较操作(如置于过滤条件中),会带来不必要的数据类型转换的开销,同时该字段上的索引可能失效,影响查询性能。
    4. 对于明确不存在NULL值的字段加上NOT NULL约束。对于NOT NULL字段,优化器在某些场景下会进行特殊优化,可较大提升查询性能。
    5. 相关联字段的数据类型应保持一致。在进行关联操作时,如果字段类型不一致,会带来数据类型转换开销。
    6. 大字段(例如varchar(1000)、varchar(4000))不建议超过8个。
    7. 字段定义时建议同时创建COMMENT注释信息,以便于未来维护。
    8. 不建议对表预留字段。大部分场景下可支持快速新增、删除表字段,或者修改字段的DEFAULT值。
    9. 尽量使用高效的数值类数据类型。在满足业务精度的情况下,选择的优先级从高到低依次为整数、浮点数、NUMERIC。
    10. 合理设置数值字段的数据类型,根据取值范围选择合适的数值类型,尽量少用NUMERIC/DECIMAL类型。NUMERIC和DECIMAL等价,NUMERIC(或DECIMAL)数据类型操作对CPU消耗较高。

    数据库模型设计的三个主要阶段汇总如下:

    • 概念数据模型设计阶段:实体、关系集
    • 逻辑数据模型设计阶段:实体、关系集、属性、主键、外键
    • 物理数据模型设计阶段:表、列名、列数据类型、主键、外键

    四、小结

    通常,数据建模是为了让查询更简单、更高效。在现实场景中,如果要想高效的使用好数据库,那么一个优秀的数据建模是必不可少的。数据模型是应用系统数据库设计的基础,而数据库则是数据模型实现的工具。本文建模后是在GaussDB数据库平台上进行落地实验的,其逻辑与思路与大多少关系型数据库基本通用。

    ——结束 

    1 前言

    随着SpringBoot的普及,Spring的使用也越来越广,在某些场景下,我们无法通过注解或配置的形式直接获取到某个Bean。比如,在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean,此时就需要直接获取到对应的Bean。

    本文为大家整理汇总了常见的获取Bean的方式,并提供一些优劣分析,方便大家在使用到时有更好的选择。同时,也会为大家适当的普及和拓展一些相关知识。

    2 Spring的IoC容器

    在Spring中,Bean的实例化、定位、配置应用程序中的对象及建立对象间的依赖关系,都是在IoC容器中进行的。因此,要在Spring中获取Bean,本质上就是从IoC容器当中获取Bean。

    在Spring中,BeanFactory是IoC容器的实际代表者,该接口提供了IoC容器最基本功能。同时,Spring还提供了另外一种类型的容器:ApplicationContext容器。

    ApplicationContext容器包括BeanFactory容器的所有功能(BeanFactory的子接口),提供了更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建实际应用。

    一般情况,我们称BeanFactory为IoC容器,称ApplicationContext为应用上下文。但有时为了方便,也将ApplicationContext称为Spring容器。

    通常不建议使用BeanFactory,但BeanFactory 仍然可以用于轻量级的应用程序,如移动设备或基于applet的应用程序,其中它的数据量和速度是显著。

    2.1 BeanFactory与ApplicationContext的区别

    BeanFactory是Spring框架的基础设施,面向Spring本身。ApplicationContext则面向使用Spring框架的开发者,几乎所有的应用场景都可以直接使用ApplicationContext,而非底层的BeanFactory。

    另外,ApplicationContext的初始化和BeanFactory有一个重大的区别:

    BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。

    而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean,相对应的,ApplicationContext的初始化时间会比BeanFactory长一些。

    了解了上述的基本理论知识之后,我们就可以尝试从IoC容器当中获取Bean对象了。

    3 Bean获取方式

    3.1 方式一:通过BeanFactory获取

    通过BeanFactory来获取Bean。基于xml配置文件的时代,可以通过如下方式获得BeanFactory,再通过BeanFactory来获得对应的Bean。

    
    

    有一定编程年龄的程序员,应该对此还有一些印象。这种写法估计也只会出现在古老的项目当中。鉴于xml形式配置文件已经被基于注解形式所替代,同时XmlBeanFactory也被标注为废弃。此种方式不推荐使用。

    其实,不推荐的理由还有一个,在上面已经提到,尽量不要使用BeanFactory,而应该使用ApplicationContext。

    3.2 方式二 :通过BeanFactoryAware获取

    在上面的方式中,XmlBeanFactory已经被废弃,但可以通过其他方式来获得BeanFactory,然后再从BeanFactory中获得指定的Bean。获取BeanFactory实例最简单的方式就是实现BeanFactoryAware接口。

    BeanFactoryAware接口源码:

    
    

    BeanFactoryAware属于
    org.springframework.beans.factory.Aware根标记接口,使用setter注入来在应用程序上下文启动期间获取对象。Aware接口是回调,监听器和观察者设计模式的混合,它表示Bean有资格通过回调方式被Spring容器通知。

    示例如下:

    
    

    在上述工具类中,便是基于BeanFactoryAware的特性,获得了BeanFactory,然后再通过BeanFactory来获得指定的Bean。

    该方案满足了获取Bean的基本需求,但同时具有使用BeanFactory的缺点。根据前文介绍的BeanFactory特性,可酌情使用。

    上面提供了两种基于BeanFactory容器获得Bean的方式,下面则通过ApplicationContext来获取容器中的Bean,不同的是获取ApplicationContext的方式的区别。

    3.3 方式三:启动获取ApplicationContext

    在项目启动时先获取ApplicationContext对象,然后将其存储在一个地方,以便后续用到时进行使用。

    这里提供两种场景的获取:

    1.基于xml配置bean的形式,适用于比较古老的项目,已经很少使用了;

    2.基于SpringBoot启动时获取ApplicationContext对象;

    基于xml的形式实现:

    
    

    这里等于直接初始化容器,并且获得容器的引用。这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。目前大多数Spring项目已经不再采用xml配置,很少使用了。

    基于SpringBoot启动实现:

    
    

    对应的SpringContextUtil类如下:

    
    

    两种方式都是在启动Spring项目时,直接获取到ApplicationContext的引用,然后将其存储到工具类当中。在使用时,则从工具类中获取ApplicationContext容器,进而从中获得Bean对象。

    3.4 方式四:通过继承ApplicationObjectSupport

    此种方式依旧是先获得ApplicationContext容器,然后从中获取Bean对象,只不过是基于继承ApplicationObjectSupport类实现的。

    具体实现代码:

    
    

    注意,这里的SpringContextUtil类需要实例化。

    ApplicationObjectSupport类图入下,我们看到它实现了ApplicationContextAware接口,在Spring容器初始化过程中回调方法setApplicationContext来完成ApplicationContext的赋值。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.5 方式五:通过继承WebApplicationObjectSupport

    WebApplicationObjectSupport是ApplicationObjectSupport的一个实现类,提供了Web相关的支持。实现原理与ApplicationObjectSupport一样。

    具体实现代码如下:

    
    

    通过类图我们可以看到它是ApplicationObjectSupport的实现子类,此方式除了继承对象不同外,没有其他区别,都是基于getApplicationContext方法来获取。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.6 方式六:通过WebApplicationContextUtils

    Spring提供了工具类
    WebApplicationContextUtils,通过该类可获取WebApplicationContext对象。

    具体实现代码如下:

    
    

    这个方法很常见于SpringMVC构建的Web项目中,适用于Web项目的B/S结构。

    3.7 方式七:通过ApplicationContextAware

    通过实现ApplicationContextAware接口,在Spring容器启动时将ApplicationContext注入进去,从而获取ApplicationContext对象,这种方法也是常见的获取Bean的一种方式,推荐使用。

    具体实现代码如下:

    
    

    这种方式与前面通过BeanFactoryAware获得BeanFactory的思路一致。其本质和四、五两种方式一样。

    3.8 方式八:通过ContextLoader

    使用ContextLoader提供的
    getCurrentWebApplicationContext方法,也是常用的获取WebApplicationContext的一种方法。

    具体实现代码如下:

    
    

    该方法常见于SpringMVC实现的Web项目中。该方式是一种不依赖于Servlet,不需要注入的方式。但是需要注意一点,在服务器启动时和Spring容器初始化时,不能通过该方法获取Spring容器。

    3.9 方式九:通过BeanFactoryPostProcessor

    Spring工具类,方便在非Spring管理环境中获取Bean。

    
    

    其中
    ConfigurableListableBeanFactory接口,也属于BeanFactory的子接口。

    4 总结

    在本文中介绍了9种从Spring容器中获取Bean的方法,虽然每种方式实现各有不同,但从本质上来讲,无非就是通过BeanFactory或ApplicationContext获取Bean,只不过获取BeanFactory或ApplicationContext容器的方式不同而已。 严格来说ApplicationContext也是BeanFactory。

    那么,你是否意识到,学习一项技术或一个实现方式,只要把握住它的根本,无论形式如何变化,都万变不离其宗。而这里“宗”就是IoC容器。

    作者:京东零售 曾登均

    来源:京东云开发者社区

    并发指同一时间内进行了多个线程。并发问题是多个线程对同一资源进行操作时产生的问题。通过加锁可以解决并发问题,ReentrantLock是锁的一种。

    1 ReentrantLock

    1.1 定义

    ReentrantLock是Lock接口的实现类,可以手动的对某一段进行加锁。ReentrantLock可重入锁,具有可重入性,并且支持可中断锁。其内部对锁的控制有两种实现,一种为公平锁,另一种为非公平锁.

    1.2 实现原理

    ReentrantLock的实现原理为volatile+CAS。想要说明volatile和CAS首先要说明JMM。

    1.2.1 JMM

    JMM(java 内存模型 Java Memory Model 简称JMM) 本身是一个抽象的概念,并不在内存中真实存在的,它描述的是一组规范或者规则,通过这组规范定义了程序中各个变量的访问方式.

    由于 JMM 运行程序的实体是线程.而每个线程创建时JMM都会为其创建一个自己的工作内存(栈空间),工作内存是每个线程的私有 数据区域.而java内存模型中规定所有的变量都存储在主内存中,主内存是共享内存区域,所有线程都可以访问,但线程的变量的操作(读取赋值等)必须在自己的工作内存中去进行,首先要 将变量从主存拷贝到自己的工作内存中,然后对变量进行操作,操作完成后再将变量操作完后的新值写回主内存,不能直接操作主内存的变量,各个线程的工作内存中存储着主内存的变量拷贝的副本,因不同的线程间无法访问对方的工作内存,线程间的通信必须在主内存来完成。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    如图所示:线程A对变量A的操作,只能是从主内存中拷贝到线程中,再写回到主内存中。

    1.2.2 volatile

    volatile 是JAVA的关键字用于修饰变量,是java虚拟机的轻量同步机制,volatile不能保证原子性。
    作用:

    • 线程可见性:一个变量在某个线程里修改了它的值,如果使用了volatile关键字,那么别的线程可以马上读到修改后的值。
    • 指令重排序:没加之前,指令是并发执行的,第一个线程执行到一半另一个线程可能开始执行了。加了volatile关键字后,不同线程是按照顺序一步一步执行的。1.2.3 CASCAS是Compare and Swap,就是比较和交换,而比较和交换是一个原子操作。线程基于CAS修改数据的方式:先获取主内存数据,在修改之前,先比较数据是否一致,如果一致修改主内存数据,如果不一致,放弃这次修改。

    作用:CAS会使用现代处理器上提供的高效机器级别原子指令,这些原子指令以原子方式对内存执行读-改-写操作。1.2.4 AQSAQS的全称是AbstractQueuedSynchronizer(抽象的队列式的同步器),AQS定义了一套多线程访问共享资源的同步器框架。

    AQS主要包含两部分内容:共享资源和等待队列。AQS底层已经对这两部分内容提供了很多方法。

    • 共享资源:共享资源是一个volatile的int类型变量。
    • 等待队列:等待队列是一个线程安全的队列,当线程拿不到锁时,会被park并放入队列。

    2 源码解析

    ReentrantLock在包java.util.concurrent.locks下,实现Lock接口。

    2.1 lock方法

    lock分为公平锁和非公平锁。

    公平锁:

    
    

    非公平锁:上来先尝试将state从0修改为1,如果成功,代表获取锁资源。如果没有成功,调用acquire。state是AQS中的一个由volatile修饰的int类型变量,多个线程会通过CAS的方式修改state,在并发情况下,只会有一个线程成功的修改state。

    
    

    2.2 acquire方法

    acquire是一个业务方法,里面并没有实际的业务处理,都是在调用其他方法。

    
    

    2.3 tryAcquire方法

    tryAcquire分为公平和非公平两种。

    公平:

    
    

    非公平:

    
    

    2.4 addWaiter方法

    在获取锁资源失败后,需要将当前线程封装为Node对象,并且插入到AQS队列的末尾。

    
    

    2.5 acquireQueued方法

    
    

    2.6 unlock方法

    释放锁资源,将state减1,如果state减为0了,唤醒在队列中排队的Node。

    
    

    3 使用实例

    3.1 公平锁

    1.代码:

    
    

    2.执行结果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.小结:

    公平锁可以保证每个线程获取锁的机会是相等的。

    3.2 非公平锁

    1.代码:

    
    

    2.执行结果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.小结:

    非公平锁每个线程获取锁的机会是随机的。

    3.3 忽略重复操作

    1.代码:

    
    

    2.执行结果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.小结:

    当线程持有锁时,不会重复执行,可以用来防止定时任务重复执行或者页面事件多次触发时不会重复触发。

    3.4 超时不执行

    1.代码:

    
    

    2.执行结果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.小结:

    超时不执行可以防止由于资源处理不当长时间占用资源产生的死锁问题。

    4 总结

    并发是现在软件系统不可避免的问题,ReentrantLock是可重入的独占锁,比起synchronized功能更加丰富,支持公平锁实现,支持中断响应以及限时等待等,是处理并发问题很好的解决方案。

    作者:京东物流 陈昌浩

    来源:京东云开发者社区

    摘要:智能体agent在环境environment中学习,根据环境的状态state(或观测到的observation),执行动作action,并根据环境的反馈reward(奖励)来指导更好的动作。

    本文分享自华为云社区《强化学习从基础到进阶-案例与实践[5.1]:Policy Gradient-Cart pole游戏展示》,作者:汀丶 。

    • 强化学习(Reinforcement learning,简称RL)是机器学习中的一个领域,区别与监督学习和无监督学习,强调如何基于环境而行动,以取得最大化的预期利益。
    • 基本操作步骤:智能体agent在环境environment中学习,根据环境的状态state(或观测到的observation),执行动作action,并根据环境的反馈reward(奖励)来指导更好的动作。

    比如本项目的Cart pole小游戏中,agent就是动图中的杆子,杆子有向左向右两种action。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    1.Policy Gradient简介

    • 在强化学习中,有两大类方法,一种基于值(Value-based),一种基于策略(Policy-based)
      • Value-based的算法的典型代表为Q-learning和SARSA,将Q函数优化到最优,再根据Q函数取最优策略。
      • Policy-based的算法的典型代表为Policy Gradient,直接优化策略函数。
    • 采用神经网络拟合策略函数,需计算策略梯度用于优化策略网络。
      • 优化的目标是在策略π(s,a)的期望回报:所有的轨迹获得的回报R与对应的轨迹发生概率p的加权和,当N足够大时,可通过采样N个Episode求平均的方式近似表达。
    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)
      • 优化目标对参数θ求导后得到策略梯度:
    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)
    
    

    2.模型Model

    这里的模型可以根据自己的需求选择不同的神经网络组建。

    PolicyGradient用来定义前向(Forward)网络,可以自由的定制自己的网络结构。

    
    

    3.智能体Agent的学习函数

    这里包括模型探索与模型训练两个部分

    Agent负责算法与环境的交互,在交互过程中把生成的数据提供给Algorithm来更新模型(Model),数据的预处理流程也一般定义在这里。

    
    

    4.模型梯度更新算法

    
    

    5.训练函数与验证函数

    设置超参数

    
    

     

    
    

    项目链接fork一下即可运行。

     

    关注,第一时间了解华为云新鲜技术~

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    作者 | Seven

    导读 

    随着移动互联网的快速发展,业界涌现出大量有创意又有趣的交互体验。扫光动效就是其中一种有意思的加载动效,常见的扫光动效有骨架屏扫光、logo扫光。那么这两种扫光动效的原理是什么,如何实现这两种扫光效果,以及在iOS和Andoird双端实现起来有什么差异,本文会为你详细揭晓。

    全文10549字,预计阅读时间27分钟。

    GEEK TALK

    01

    引言

    扫光动效作为移动端的常见加载动效,与传统的转圈加载相比,能给人更好的视觉和感官体验。其主要特点是光效会随着时间进行扫射,文字或图案有被颜色填充的感觉。

    笔者先后做过骨架屏扫光、熊掌扫光loading, 本文将分别从 iOS 和 Android的视角, 介绍这两种扫光动效的实现和双端的技术差异。

    图片

    △熊掌扫光动效

    GEEK TALK

    02

    骨架屏扫光动效

    骨架屏是一种界面加载过程中的过渡效果。它在页面数据加载完成前,先给用户展示出页面的大致结构,在拿到接口数据后渲染出实际页面内容然后替换掉。这种技术能够降低用户的焦灼情绪,使界面加载过程变得自然通畅,提升用户体验。常用于文章列表、动态列表页等相对比较规则的列表页面。这里以支付半屏面板面板为例,可以看到有光效在骨架图上扫过的效果。

    图片

    △骨架屏扫光

    2.1 骨架屏扫光原理分析

    骨架屏的扫光场景比较简单, 因为其背景是不透明, 可以通过在骨架图上面叠加一个遮罩视图作为光块, 对遮罩进行移动来达到扫光的效果。

    其视图的层级整体分位两层,底层为自定义视图的骨架部分,上层为渐变透明遮罩。其中,骨架图部分为常规的列表实现,这里不再赘述,而渐变透明遮罩作为扫光的,可以用切图或通过代码来实现。遮罩切图相对代码实现,会增加一部分包体积,所以可以选择自定义一个和骨架图一样大小的视图,覆盖到骨架图之上,并设置其为从左到右渐变透明。

    此外,位移动画,可以通过设置在 xxx时间内,将遮罩视图在水平方向上,从骨架图的左侧移动到骨架图的右侧来实现。

    2.2 iOS实现

    Core Animation 是 AppKit 和 UIKit 完美的底层支持,同时也被整合进入 Cocoa 和 Cocoa Touch 的工作流之中,它是 app 界面渲染和构建的最基础架构。Core Animation 主要职责包含:渲染、构建和实现动画,尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的 layer(iOS 中具体而言就是 CALayer),并且被存储为树状层级结构。这个树也形成了 UIKit 以及在 iOS 应用程序当中我们所能在屏幕上看见的一切的基础。

    图片

    在 iOS 上,可以通过 CALayer +View 动画方法+Transform来实现。layer 是UIView 的底层图层, 负责视图的绘制,动画,边框,阴影等视觉效果。动画部分直接用 View 的类方法animateWithDuration即可,在动画回调中通过设置视图的Transform属性来实现水平位移。

    渐变遮罩部分可以按如下代码定义,通过一个 ImageView 作为遮罩视图,通过设置CAGradientLayer做为其layer实现透明渐变效果:

    
    

    通过定时器循环位移动画:

    
    

    动画部分直接用View 的 animateWithDuration方法实现:

    
    

    因为定时器执行时间较长,可以在加载时先执行一次动画:

    
    

    2.3 Android 实现

    Android的渲染技术主要建立在View系统之上,View系统处理视图的布局和绘制。View代表一个控件,主要负责自己的绘制,ViewGroup代表一个容器,主要负责管理和布局它包含的子View和子ViewGroup。

    图片

    这里可以通过自定义 Shape+ObjectAnimator 实现。Shape是一种特殊的 View,通过XML中定义的<shape>标签来实现自定义形状和相关效果,可以通过<shape>的相关属性来绘制出各种形状,并为其应用渐变色、阴影、边框等效果。ObjectAnimator可以用于所有支持动画的属性,包括位置、大小、旋转、缩放和透明度等,只需指定要动画的属性名称和目标值即可。

    遮罩部分可按如下定义一个渐变矩形:

    
    

    图片

    再定义一个 Handler,用于在主线程刷新视图:

    
    

    通过 ObjectAnimator以及属性translationX 定义位移动画:

    
    

    延迟一段时间后继续执行动画:

    
    

    开始加载的时候,先执行一次动画:

    
    

    GEEK TALK

    03

    熊掌扫光动效

    熊掌扫光主要是作为页面加载时的过渡效果,会在内容加载完成前展示,其通常在页面内容上面,不能完全遮挡底部内容。而且在日间模式(存在多种内容背景底色),夜间模式(在日间模式的基础上,覆盖了一层灰色透明蒙层),暗黑模式多种场景模式下,也会对扫光的效果产生干扰,尤其是在日间模式灰色背景以及夜间模式下,甚至可能无法看到扫光。

    图片

    △分别为日间模式白底,日间模式灰底,夜间模式,暗黑模式

    3.1 iOS  实现

    熊掌扫光的复杂场景,仅靠双层视图叠加无法满足需要,滑块会有各种异常情况(具体见 3.2.1 部分)。在 iOS上可以使用三层结构,最底层是待扫光的图,中间是移动的光块,最上层是根据底图绘制的镂空图层,三层视图叠加在一起,形成光和图案混合的效果。

    图片

    △iOS 通过遮罩实现扫光效果原理

    iOS的 CoreAnimation 框架非常优秀,其 View的实现,刚好满足了这种三层结构需要。

    图片

    • view 视图

    • View是基本的用户界面素,用于展示和处理用户界面。它们可以是标准的UI控件(如UILabel、UIButton等),也可以是自定义的视图。

    • 每个View都有自己的绘制区域,可以包含其他视图作为其子视图。

    • layer 图层

    • Layer是View的底层绘制层次结构中的一个组成部分。每个View都有一个与之关联的Layer对象(CALayer类的实例)。

    • Layer负责处理View的内容的绘制和显示,包括视图的背景颜色、边框、阴影等。每个Layer都有一个自己的绘制区域,与View的边界对应。

    • mask 遮罩

    • Mask是一种用于控制图层可见性的机制。它是一个透明的图像或形状,可以与Layer关联。

    • 通过应用遮罩,可以定义Layer中哪些区域应该是可见的,哪些区域应该是隐藏的。

    • 遮罩通常是由另一个Layer或者自定义的图像创建的,它们确定了图层中内容的可见部分。

    iOS可以通过layer作为光,mask作为遮罩,来实现光混合在熊掌logo 上的效果:

    
    

    在 layer 层通过CABasicAnimation实现水平位移:

    
    

    3.2 Android 实现

    这里以 Andoird上的双层视图叠加为例,可以看到会有各种各样的问题。

    3.2.1 通过双层自定义视图叠加

    通过叠加切图实现,存在的问题有:日间模式(灰色背景)下无法看到滑块,同时暗黑模式下滑块较为明显。

    图片

    △叠加切图

    通过叠加Shape实现,在骨架屏场景上进行扫光效果还行,但在熊掌扫光上效果不佳。存在的问题有:如果是日间模式下的的白底背景正常,但灰底背景无法看到扫光滑块。此外,不加旋转角度,在暗黑模式效果还行,叠加旋转度角度后,可以看到明显的滑块痕迹。

    图片

    叠加 shape 图层

    图片

    叠加 shape 图层(旋转角度)

    甚至还可以通过 LinearGradient 实现自定义带斜率的渐变扫光,其核心方法如下:

    
    

    在ValueAnimator的更新回调中:

    • 根据value和斜率k计算两个控制点的坐标

    • 创建一个线性渐变LinearGradient,由这两个控制点定义

    • 将该渐变设置为Paint的Shader

    • 调用invalidate()重绘View

    由于ValueAnimator不断更新,所以线性渐变的两个控制点也在不断变化,产生渐变动画效果:

    图片

    但是这种方式,在仅白底背景下效果较好,在灰底背景或暗黑效果下不尽人意,可以看到较明显的滑块。

    3.2.2 通过Canvas 绘图

    Android上不像 iOS一样,View 本身还可以再设置多个图层。如果要混合渲染扫光和背景图,除非自己再自定义一个遮罩层形成三层结构,或者直接通过更底层的绘图来处理。

    那么,怎么把扫光和背景图混合渲染呢?答案是可以通过 PorterDuffXferMode来实现。

    PorterDuffXferMode使用PorterDuff.Mode规则将所绘制图形和Canvas上图形混合,最终更新Canvas展示新的图形。PorterDuffXferMode的使用也非常简单,在需要使用的时候paint.setXfermode(PorterDuff.Mode mode)设置混合模式。

    PorterDuff.Mode共分为16种模式:CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、SRC_ATOP、DST_ATOP、XOR、DARKEN、LIGHTEN、MULTIPLY、SCREEN。

    Android 使用 Canvas 在 View 上绘制图形 ,所绘制的图形中的像素称作源像素(source,简称src),所绘制的矩形在Canvas中对应位置的矩形内的像素称作目标像素(destination,简称dst)。源像素的ARGB四个分量会和Canvas上同一位置处的目标像素的ARGB四个分量按照 Xfermode定义的规则进行计算,形成最终的ARGB值,然后用该最终的ARGB值更新目标像素的ARGB值。

    以官网提供的图示来说明,假设有一个蓝色的源像素图形和一个红色的目标像素图形。

    图片

    通过DST_IN, 可以得到相交部分是红色的扇形,即相交的部分保留目标像素,不相交的部分,丢弃源像素。

    图片

    这样,首先通过PorterDuffXfermode来设置DST_IN的混合效果,通过LinearGradient来创建遮罩的渐变效果。其次使用Canvas和Paint来绘制和渲染位图,先绘制一个未经过遮罩处理的位图,作为src,再绘制一个经过遮罩处理的位图,作为dst,两者组合一起,形成扫光效果,最后在通过使用ValueAnimator来实现动画效果。

    图片

    △图中亮光的部分为 dst

    首先,创建带斜率的渐变遮罩位图:

    
    

    其次,在 dispatchDraw方法 中依次绘制源位图和目标位图:

    
    

    接着,通过 ValueAnimator实现位移并触发实时绘制闪光效果:

    
    

    最终效果如下图所示:

    图片

    日间模式

    图片

    夜间模式

    图片

    暗黑模式

    GEEK TALK

    04

    结语

    在上面内容中,我们介绍到了基于遮罩实现的扫光效果,遮罩常见的应用有圆角效果,穿人像弹幕,还有在新手指引中用于绘制挖孔效果,或者是刮彩票效果。

    在渲染技术上主要是运用到了 iOS 系统中的 Core Animation框架以及 Android 的 View 系统。

    iOS 上通常会使用 Core Animation 来高效、方便地实现动画。它使用CALayer进行图形渲染和动画操作。Apple并没有直接在UIView上提供masking的支持,而是在其底层的CALayer上实现。这使开发者可以灵活控制和修改mask,达到更强大的效果。而 Android 想要制作更灵活和强大的效果,可以通过 Canvas 来实现。

    END

    推荐阅读:

    Android SDK安全加固问题与分析

    搜索语义模型的大规模量化实践

    如何设计一个高效的分布式日志服务平台

    视频与图片检索中的多模态语义匹配模型:原理、启示、应用与展望

    百度离线资源治理

    百度APP iOS端包体积50M优化实践(三) 资源优化

    图片

    一键三连,好运连连,bug不见👇

    基础理论

    CAP理论

    一致性(Consistency) :在分布式系统中所有的数据备份,在同一时刻都保持一致状态,如无法保证状态一致,直接返回错误;

    可用性(Availability):在集群中一部分节点故障,也能保证客户端访问系统并得到正确响应,允许一定时间内数据状态不一致;

    分区容错性(Partition tolerance):分布式系统在遇到任何网络分区故障时,仍然能保证对外提供满足一致性和可用性的服务,除非整个网络环境都发生故障;

    本地事务四大特性(ACID)

    事务应该是具备原子性、一致性、隔离性和持久性,简称 ACID。

    原子性(Atomicity) ,可以理解为一个事务内的所有操作要么都执行,要么都不执行。

    一致性(Consistency) ,可以理解为数据是满足完整性约束的,也就是不会存在中间状态的数据,事务前后数据的完整性必须保持一致。。

    隔离性(Isolation) ,指的是多个事务并发执行的时候不会互相干扰,即一个事务内部的数据对于其他事务来说是隔离的。

    持久性(Durability) ,指的是一个事务完成了之后数据就被永远保存下来,之后的其他操作或故障都不会对事务的结果产生影响。

    BASE理论

    基本可用(Basically Available):分布式系统在出现故障时,保证核心可用,允许损失部分可用性。(响应时间上的损失、功能上的损失)

    软状态(Soft State):系统中的数据允许存在中间状态,中间状态不影响系统的整体可用性。(支付中、处理中等)

    最终一致性(Eventually Consistent):系统中的数据不可一直处于软状态,必须在有时间期限,在期限过后应当保证数据的一致性。(支付中变为支付成功)

    相比于本地事务的ADIC强一致性模型,BASE理论提出通过牺牲一定的强一致性来获得可用性;

    不同业务单和业务组件对数据一致性的要求不一样,因此分布式系统中BASE理论和ACID特性会结合使用。

    幂等性设计

    幂等(Idempotent)是一个数学与计算机学中的概念。f(n) = 1^n , 无论n等于多少,f(n)永远值等于1;

    在程序中,使用相同参数执行同一个方法,每一次执行结果都是相同的,即具有幂等性;

    以订单状态处理为例的幂等性设计,不论执行多少次orderProcess()方法,都只会扣减一次库存,并且返回true。

    分布式事务分类

    二段提交2PC(Two-Phase-Commit)|三段提交3PC (Three-Phase-Commit)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    三阶段提交引入两个机制

    1、 引入超时机制。同时在协调者和参与者中都引入超时机制。

    2、在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

    主要解决的问题:

    避免了参与者在长时间无法与协调者节点通讯(协调者挂掉了)的情况下,无法释放资源的问题,因为参与者自身拥有超时机制会在超时后,自动进行本地commit从而进行释放资源。而这种机制也侧面降低了整个事务的阻塞时间和范围。

    缺点:

    性能较差,会存在长时间的锁表。

    补偿事务-TCC(Try-Confirm-Cancel)|Saga

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    TCC 与Saga其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。确认和补偿都有采用幂等性设计。

    缺点:代码量大,可维护性差。

    消息事务

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    消息一致性方案是通过消息中间件保证上、下游应用数据操作的一致性。基本思路是将本地操作和发送消息放在一个事务中,保证本地操作和消息发送要么两者都成功或者都失败。下游应用向消息系统订阅该消息,收到消息后执行相应操作。

    消息方案从本质上讲是将分布式事务转换为两个本地事务,然后依靠下游业务的重试机制达到最终一致性。

    代表产品:RocketMQ

    分布式事务产品框架

    京东jdts

    服务通过lb连到集群中任何一个节点均能保证业务正确执行,某一个节点异常时集群可正常提供服务,同时支持集群横向、纵向扩展。

    Seata

    一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

    全局事务服务GTS

    用于实现分布式环境下,特别是微服务架构下的高性能事务一致性。可以与RDS、MySQL、PostgreSQL等数据源,Spring Cloud、Dubbo、HSF及其他RPC框架,MQ消息队列等中间件产品配合使用,轻松实现分布式数据库事务、多库事务、消息事务、服务链路级事务及各种组合。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    作者:京东零售 谷伟

    来源:京东云开发者社区

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来的方法,如有错误欢迎纠正。

    Langchain官方文档地址: https://python.langchain.com/

    基础功能

    LLM 调用

    • 支持多种模型接口,比如 OpenAI、HuggingFace、AzureOpenAI …
    • Fake LLM,用于测试
    • 缓存的支持,比如 in-mem(内存)、SQLite、Redis、SQL
    • 用量记录
    • 支持流模式(就是一个字一个字的返回,类似打字效果)

    Prompt管理,支持各种自定义模板

    拥有大量的文档加载器,比如 Email、Markdown、PDF、Youtube …

    对索引的支持

    • 文档分割器
    • 向量化
    • 对接向量存储与搜索,比如 Chroma、Pinecone、Qdrand

    Chains

    • LLMChain
    • 各种工具Chain
    • LangChainHub

    详细地址可参考:
    https://www.langchain.cn/t/topic/35

    测试Langchain工程的3个方法:

    1 使用Langchian提供的FakeListLLM

    为了节约时间,直接上代码

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    
    

    这里mock下ChatGPT,使用mockLLm

    
    

    REPL 是 “Read–Eval–Print Loop”(读取-求值-打印-循环)的缩写,它是一种简单的、交互式的编程环境。

    在 REPL 环境中,用户可以输入一条或多条编程语句,系统会立即执行这些语句并输出结果。这种方式非常适合进行快速的代码试验和调试。

    
    

    2 使用Langchian提供的HumanInputLLM,访问维基百科查询

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    
    

    使用维基百科工具

    
    

    这里必须要设置为中文url前缀,不然访问不了

    
    

    初始化LLM

    
    

    初始化agent

    
    

    使用huggingface

    https://huggingface.co/docs

    1.注册账号

    2.创建Access Tokens

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Demo: 使用模型对文档进行摘要

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    
    

    这里mock下ChatGPT,使用HUGGINGFACEHUB

    
    

    导入文本

    
    

    将文本转成 Document 对象

    
    

    初始化文本分割器

    
    

    切分文本

    
    

    加载 LLM 模型

    
    

    创建总结链

    
    

    执行总结链

    
    

    作者:京东科技 杨建

    来源:京东云开发者社区

    摘要:Raft算法是一种分布式共识算法,用于解决分布式系统中的一致性问题。

    本文分享自华为云社区《共识算法之Raft算法模拟数》,作者: TiAmoZhang 。

    01、Leader选举

    存在A、B、C三个成员组成的Raft集群,刚启动时,每个成员都处于Follower状态,其中,成员A心跳超时为110ms,成员B心跳超时为150ms,成员C心跳超时为130ms,其他相关信息如图1所示。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    ■ 图1 Raft模拟初始状态

    由于集群中不存在Leader,A、B、C三个成员都不会收到来自Leader的心跳信息。其中,成员A的超时最短,最先进入选举状态,修改自己的状态为Candidate,并增加自己的任期编号为1,发起请求投票消息,如图2所示。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    ■ 图2 请求投票

    成员A通过RequestVote广播自己的选票给成员B、C,选票描述了成员A所拥有的数据,其包含成员A所处的term及最新的日志索引。成员B、C根据投票规则处理RequestVote消息。

    term大的成员拒绝投票给term小的成员。

    日志索引大的成员拒绝投票给日志索引小的成员。

    一个term内只投出一张选票,采用先来先获得投票的原则。

    很明显,成员B、C的term小于成员A的term,也不存在比成员A日志索引更大的日志索引,并且term为1的选票还没有投给其他成员,因此成员B、C将term为1的选票投给成员A并更新自己的term为1。

    成员A获得包括自己在内的3张选票,赢得大多数选票,成员A晋升为Leader,并向其他成员发送心跳信息,维护自己的领导地位,如图3所示。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    ■ 图3 Leader晋升示意

    如果成员A在等待投票超过约定的时间内没有收到多数派的选票,则会重置自己的超时,并结束本次选举进程。接着会有其他成员在等待心跳超时后发起Leader选举,在当前案例中,发起Leader选举的顺序为A→C→B。

    可能因为网络问题,使集群中的所有成员又发起了一轮选举,但是都没有获得多数派的选票,因此会随机产生新的超时,开始下一个循环的选举。

    02、日志复制

    日志复制是一个一阶段协商的过程,其中,日志项的提交操作由下一轮协商或者心跳消息来代替完成。因此处理事务请求,Raft只需要发送一轮AppendEntries消息即可。

    AppendEntries消息除了会包含需要复制日志项的相关信息外,通常会携带Leader的committedIndex参数,标示着最后一个已提交的日志索引。每个Follower的本地都维护了committedIndex,Follower可以对比Leader的committedIndex来推进自己的提交操作。

    接着如图3所示的示例,一个三个成员组成的集群,成员A为Leader,成员B和C为Follower,并且在集群中未提交任何日志项。Leader收到客户端发送的Add请求后,Leader和Follower依次执行以下步骤,如图4所示。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    ■ 图4 日志复制-复制

    (1)Leader将其封装成日志项追加到本地的日志中,日志索引为1。

    (2)Leader通过AppendEntries(0, <1, Add>)消息时将日志项广播给所有的Follower。其中:

    • 第一个参数为committedIndex,即Leader最后提交的日志索引。
    • 第二个参数为Leader所处的日志索引,即Add日志项的索引。
    • 第三个参数为事务操作指令,即客户端的指令。

    (3)Follower收到消息,将日志项追加到本地的日志中。

    此时,成员A、B、C都拥有日志项Add且都已在索引为1上完成了持久化。Follower在处理完AppendEntries消息后需要回复ACK消息给Leader,代表接受该日志项。Leader收到多数派的ACK消息后,可以在本地提交该日志项并执行状态转移,之后将执行结果返回给客户端,如图5所示。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    ■ 图5 日志复制-回复

    在当前场景中,成员A提交了索引为1的日志项,成员B、C仅仅拥有索引为1的日志项的所有信息但并未提交。成员B、C需要等待下一次AppendEntries消息,根据其committedIndex推进索引为1的日志项的提交操作。以心跳的AppendEntries消息为例,该AppendEntries消息仅携带了committedIndex,此时Leader已经提交了索引为1的日志项,因此committedIndex为1。Follower则可以提交索引为1及其之前的所有日志项,如图6所示。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    ■ 图6 日志复制-心跳

    03、日志对齐

    我们使用<term, logIndex>表示一个日志项,如表1所示为Follower E的日志索引3和Follower D的日志索引4,与当前Leader处理不一致的情况。出现这种情况可能是Follower E和Follower D曾经当选过Leader,并且在自己的term上提出了日志索引为3和4的日志项后立即宕机造成的。

    ■ 表1 日志对齐

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    要使Follower E和Follower D与Leader数据保持一致,大致步骤分为两步:寻找nextIndex,复制nextIndex及其之后的日志项。在Raft中,这个步骤均可由AppendEntries消息来完成。这里以Follower E成员为例,交互细节如下:

    (1)Leader为Follower E初始化nextIndex,nextIndex=lastLogIndex+1,即nextIndex=6+1=7。

    (2)Leader通过AppendEntries发送探测消息,携带preLogIndex(nextIndex-1)及preLogTerm,其中,preLogIndex=6,preLogTerm=3。

    (3)Follower收到探测消息,对比索引为6的日志项,返回失败的响应给Leader并携带lastLogIndex=3。

    (4)Leader收到失败的响应,更新nextIndex=lastLogIndexmsg+1,即nextIndex=4。

    (5)Leader发送下一轮的探测消息,其中,preLogIndex=3,preLogTerm=2。

    (6)Follower收到探测消息,对比索引为3的日志项,返回失败的响应给Leader并携带lastLogIndex=3。

    (7)Leader收到失败的响应,此时lastLogIndexmsg+1 ≤ nextIndex,则nextIndex单调递减为3。

    (8)Leader发送下一轮的探测消息,其中,preLogIndex=2,preLogTerm=1。

    (9)Follower收到探测消息,对比索引为2的日志项,返回探测成功的响应给Leader。

    (10)Leader在成功探测到nextIndex之后,通过AppendEntries消息从nextIndex开始发送索引为3的日志项给Follower。

    (11)Follower将以Leader的数据为准,覆盖本地的日志项并返回处理成功的响应给Leader。

    (12)Leader收到成功响应后,单调递增nextIndex,继续发送下一个日志项。直到nextIndex等于Leader的lastLogIndex,意味着该Follower拥有Leader所有的数据,本次日志对齐即完成。

     

    关注,第一时间了解华为云新鲜技术~

    简介

    Restful Fast Request 是一个类似于 Postman 的 IDEA 插件。它是一个强大的 restful api 工具包插件,可以根据已有的方法帮助您快速、自动生成 url 和 params。 Restful Fast Request = API 调试工具 + API 管理工具 + API 搜索工具。 它有一个漂亮的界面来完成请求、检查服务器响应、存储你的 api 请求和导出 api 请求。插件帮助你在 IDEA 界面内更快更高效得调试你的 API。

    Restful Fast Request 为简化 API 调试而生

    倾听用户的声音,不断提升自我本次 Restful Fast Request 更新主要内容如下:

    新功能、优化项修复项

    • 全新扁平化图标
    • SearchEveryWhere加入过滤条件
    • 精简版http图标
    • 字段拷贝
    • 脚本片段插入优化
    • table与textarea优化
    • 自动域名解析优化
    • cUrl导入
    • 全屏操作
    • 参数解析
    • Gradle项目的模块名去除.main
    • SearchEveryWhere关键字带空格搜索
    • 众多操作细节优化
    • 批量导出api文档
    • 历史请求回显问题

    1. 全新扁平化图标

    toolwindowNew

    2.SearchEveryWhere 加入过滤条件

     

    支持、、搜索

    searchEveryWhere

    3.精简版 http 图标

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4.字段拷贝

    支持字段行拷贝,key用结尾标注。集合场景不变更key,开发者需要自行处理修改下标 fieldDup

    功能更新视频介绍

    本版本优化了众多操作细节,使得体验性更加友善,更有更新视频介绍–>https://www.bilibili.com/video/BV1gM4y177QU

    更多详情

    请 ————-> 这里

     

    Simple Admin Tools v1.5.11 更新
    修复: 指针导致的前端model生成bug
    新增: api 命令新增 extra_field 参数用于生成额外字段
    优化: 初始化代码生成新增 other 支持,用于生成其他服务的初始化代码
    修复: 部分已知错误,更新依赖

    Simple Admin Core v1.0.12 更新
    优化:删除无用翻译
    优化: 删除fms初始化代码
    修复: api method长度限制
    新增: all in one 部署文件新增 postgresql 支持,建议使用postgresql 部署

    Simple Admin File v1.0.12 更新
    新增: 文件标签管理
    优化: 初始化代码

    Simple Admin Member v1.0.12 更新
    新增: token 和 第三方登录管理
    修复: 优化会员等级缓存更新策略
    新增: 新增 mms-rpc-docker 和 mms-api-docker 镜像
    优化: 初始化代码

    Simple Admin Backend UI v1.0.12 更新
    新增: 文件标签,会员token 和第三方管理页面
    重构: 优化 fms 文件夹结构

    更新预览

    文件上传新增标签

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    会员管理新增 token 及第三方

     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    会员新增强制登出

     

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    goctls 新增 extra_field 参数

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

    文档网站: https://doc.ryansu.pro/

    Gitee:          https://gitee.com/hopefire/simple-admin-core

    Github:        https://github.com/suyuan32/simple-admin-core

    fastmybatis 2.7.0 发布,本次更新内容如下:

    • 简化标准使用方式,详情查看 
    • 新增H2数据库模板
    • 新增LambdaQuery

    LambdaQuery使用方式:

     

    子表达式

     

    下个版本预告:支持JPA Query Method查询(findByXxxx)

    关于fastmybatis

    fastmybatis 是一个 mybatis 开发框架,其宗旨为:简单、快速、有效。

    • 零配置快速上手,无需依赖 Spring
    • 无需编写 xml 文件即可完成增删改查操作
    • 支持 mysql、sqlserver、oracle、postgresql、sqlite、StarRocks(原 DorisDB)
    • 支持自定义 sql,对于基本的增删改查不需要写 SQL,对于其它特殊 SQL(如统计 SQL)可写在 xml 中
    • 支持与 spring-boot 集成,依赖 starter 即可,支持 Springboot3.0
    • 支持插件编写
    • 支持 ActiveRecord 模式
    • 支持多租户
    • 提供通用 Service
    • API 丰富,多达 40 + 方法,满足日常开发需求
    • 轻量级,无侵入性,是官方 mybatis 的一种扩展

    全新体验版 Windows  9.9.0 正式上线官网,开放官方下载渠道。

    下载地址:https://im..com/pc/index.shtml

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    继 对 macOS 、Linux 版本进行升级后,本次 Windows 版本的更新,标志 基于 NT 技术架构,实现了桌面端 的三端体验统一(Windows、macOS 和 Linux)。

    NT 技术架构的一个重点就是使用 Electron 作为新版 桌面端 UI 跨平台解决方案。Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架,基于 Chromium 和 Node.js,兼容 Mac、Windows 和 Linux。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    同时,新版本  Windows 新增 64 位版本支持,并针对大众关注的内存占用问题进行了深度拆解和优化。

    据了解,针对三端用户广为关注的内存占用问题, 技术团队根据其占用的几大主要进程,重点设定优化目标,通过工具分析、定向优化、线上监控及自动化测试等,尽可能减少缓存占用及内存泄露,实现资源使用效率的最大化。

    目前, 技术团队已通过多个阶段目标的设定,从单个进程内存优化到整体内存控制,新版本已取得有效的优化成果。

    Perl 5.38 已正式发布,以下为此版本部分新特性:

    新  功能

    现在可以使用新的实验性语法来定义对象类,其中每个实例的数据存储在行为类似于词汇的“字段”变量中。

     

    这是一个新的实验性功能,并且仍在开发中。

    支持 Unicode 15.0

    有关 Unicode 15.0 的详细信息,请参阅 https://www.unicode.org/versions/Unicode15.0.0/

    弃用警告有特定的子类别

    所有弃用警告现在都有自己特定的弃用类别,可以单独禁用。可以在 perldeprecation 和警告中查看所有已弃用功能的列表。

     

    仍然可以在单个语句中禁用所有弃用警告

     

    但现在可以进行更细粒度的控制,这些警告会自动启用

     

    %{^HOOK} API 引入

    引入了一个名为  的新哈希,当关键字支持任何类型的特殊 hook 时,该 hook 将存在于这个新的哈希中。此哈希中的 hook 将以调用它们的函数命名,后跟两个下划线,然后是它们执行的阶段,当前是在执行关键字之前或之后。

    此初始版本支持两个 hooks: 和  ,可更轻松地在 require 语句之前和之后执行任务。

    有关详细信息,请参阅 perlvar 

    PERL_RAND_SEED

    添加了一个新的环境变量  ,可用于导致 Perl 程序使用  而不显式使用  或使用  没有可重复的参数。详情参见 perlrun。

    可以在编译时通过传递禁用此功能

     

    在构建过程中进行配置。

    签名中的定义或和逻辑或赋值默认表达式

    现在可以使用    运算符分配子例程签名参数的默认表达式,以便在调用者(分别)提供未定义或 false 值时应用默认值,而不仅限于当参数完全丢失时。

    有关更多详细信息,请参阅 perlsub 中的文档。

    @INC Hook 增强功能以​​及 $INC 和 INCDIR

     hook 的内部结构已得到强化,可以处理各种边缘情况,且当 hook 在 require 操作期间修改  时,不再出现段错误或抛出断言失败。现在确保任何给定的钩子在 require 调用期间最多执行一次,并且任何重复的目录不会触发额外的目录探测。

    为了更好地控制动态模块查找,现在支持新的 hook 方法  。支持该方法的对象可以被注入到  数组中,当模块搜索过程中遇到它时就会执行它,就像 INC hook 的执行方式一样,其返回值作为列表使用用于搜索模块的目录。返回空列表相当于无操作。

     中不支持    方法的 Blessed CODE 引用将不再触发异常,而是被视为与 Unblessed coderef 相同,并像  hook 一样执行。

    REG_INF 已从 65,536 增加到 2,147,483,647

    许多正则表达式量词过去仅限于  ,但现在仅限于  ,因此现在可以编写  。请注意,这样做可能会导致正则表达式引擎运行时间更长并使用更多内存。

     和  块中允许某些 

    Perl 版本 5.36.0 添加了  块,并允许  关键字添加与  /  语法类似的行为。但不允许主体内有任何  表达式,因为它可能导致控制流跳出块。

    现在,部分 表达式已被允许添加,如果它们具有恒定的目标标签,并且该标签可在块中找到。

     

     

    以上为部分重点更新功能,完整的功能变更和弃用/修复,可在官方公告中查看。

    libjpeg-turbo 3.0.0 现已正式发布。libjpeg-turbo 是一个 JPEG 图像编解码器,它使用 SIMD 指令(MMX、SSE2、AVX2、Neon、AltiVec)来加速 x86、x86-64、Arm 和 PowerPC 系统上的基线 JPEG 压缩和解压缩,以及 x86、x86-64 和 Arm 系统的渐进式 JPEG 压缩。

    相对于 3.0 beta2 的重大变化:

    • TurboJPEG API 现在支持 4:4:1(transposed  4:1:1)色度子采样,允许无损转置或旋转 4:1:1 JPEG 图像进行无损裁剪、部分解压缩或解压缩为平面 YUV 图像。

    • 修复了各种 segfaults 和缓冲区溢出 (CVE-2023-2804)在尝试使用颜色量化或合并色度上采样/颜色转换来解压缩各种特制的格式错误的每分量 12 位和每分量 16 位无损 JPEG 图像时发生。这些问题的根本原因是颜色量化和合并色度上采样/颜色转换算法在设计时并未考虑到无损解压缩。由于 libjpeg-turbo 在压缩或解压缩无损 JPEG 图像时明确不支持颜色转换,因此不应为此类图像启用合并色度上采样/颜色转换。颜色量化是一项传统功能,对于无损 JPEG 图像几乎没有作用,因此现在在解压缩此类图像时也被禁用。(因此,djpeg 无法再将无损 JPEG 图像解压缩为 GIF 图像。)

    • 修复了 1.4 beta1[8] 中的一个疏忽,该疏忽在尝试使用启用了颜色量化和 RGB565 颜色转换的 djpeg 解压缩各种特制的格式错误的每组件 12 位 JPEG 图像时导致各种 segfaults 和缓冲区溢出。

    • 修复了以下问题:如果启用了解压缩放,有时会错误计算具有 4×2 或 2×4 子采样因子的组件的下采样宽度。这导致组件上采样不完全,从而导致颜色转换器从未初始化的内存中读取。对于 12 位数据精度,如果从未初始化的内存读取的样本值超出了有效样本范围,则会导致缓冲区溢出或欠载以及随后的 segfault。

    • 修复了一个长期存在的问题,即当函数与 转换操作一起使用时,在没有自动的 JPEG 目标缓冲区(重新)分配或无损裁剪的情况下,基于源图像尺寸而不是转换后的图像尺寸计算最坏情况下转换的 JPEG 图像大小。如果一个调用程序按照 API 文档的指示,根据转换后的图像尺寸分配 JPEG 目标缓冲区,并试图转换一个特别制作的 4:2:2、4:4:0、4:1:1 或 4:4:1 的包含大量数据的 JPEG 源图像,这个问题导致溢出 JPEG 目标缓冲区而不是正常失败。这个问题可以通过设置来解决。请注意,不管这个问题如何,都能不可靠地转换包含大量数据的 JPEG 源图像,除非使用自动 JPEG 目标缓冲区(重新)分配或设置。

    • 修复了 3.0 beta2[6] 引入的一个回归问题,该回归使得 djpeg 选项在解压 12-bit-per-component 有损的 JPEG 图像时无法工作。

    • 修复了在尝试将特制格式错误的算术编码 JPEG 源图像转换为 baseline Huffman-coded JPEG 目标时导致 C Huffman encoder (默认情况下在 x86 和 Arm CPU 上不使用)从未初始化的内存中读取的问题图像。

    更新说明:https://github.com/libjpeg-turbo/libjpeg-turbo/releases/tag/3.0.0

    VLOOK™ 是针对 Typora(跨平台 Markdown 编辑器)的 主题包  增强插件(针对导出的 HTML 文件),旨在与众 Markdown 粉共创 Markdown 的自动化排版 2.0,在保持 Markdown 简洁性的基础上,让编辑、阅读 Markdown 文档更实用,也更愉悦。

    VLOOK™ 属于开源软件(遵从 MIT License),也是 OSCHINA 开源中国 推荐的国产开源产品、Typora 的首个增强插件。

    VLOOK™ 的所有特性清单,详见快速入坑 → 一键了解 (备用链接)


    这是一个比较重大的版本,旨在让使用 Typora + VLOOK 插件进行 Markdown 文档编写与输出时,能保持简洁的同时获得更实用、更好用的体检。

    对一些关键的自动化排版特性(引用折叠、分栏、彩虹标签&徽章、彩虹引用、刮刮卡)、预置颜色标识都进行了重构。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    重构后还新增对了指定文本、段落设置指定的颜色、渐变色,表格单格背景也能指定颜色和渐变色了,语法上保持Markdown的简洁、清晰的设定。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    以下是本次迭代涉及的关键的的新特性、改善点:

    🎉 — NEW 新特性 — 🎉

    ⭐️ 文本可指定颜色、渐变色

    终于高效、简洁地满足了众多 Markdown 粉的这个诉求,还支持编辑时的提示样式 …详细

    ⭐️ 表格单格可指定背景色、渐变色

    表格除了合并单格、列格式、行分组这些非常好用的特性外,现在还可以指定单背景色,还可以是渐变色 …详细

    ⭐️ 重构关键特性的语法(更多编辑时预览样式)

    新的「彩虹引用/标签/徽章」颜色标识语法

    终于将涉及预置颜色标识的语法都统一,实现内容与格式分离(旧语法已不再支持,须手工批量更新)…详细

    新的引用折叠语法

    更简洁和清晰,还支持编辑时可视(旧语法内容会兼容支持,但不再推荐使用)…详细

    新的「注音」语法

    写法更简洁更形象(旧语法内容会兼容支持,但不再推荐使用)…详细

    新的「刮刮卡」语法

    写法更简洁更形象(旧语法内容会兼容支持,但不再推荐使用)…详细

    ⭐️ 索引搜索快捷键 CMD+K

    通过快捷键触发的搜索,会自动读取剪粘板的文本内容

    ⭐️ VIP主题新选项

    新增:h6 前的符号、分级标题自动编号格式、欢迎页面auto模式时的等待秒数
    以及标准主题的多项细节优化


    ♻️ — What’s IMPROVED — ♻️

    • 优化复制为 Markdown 功能以适配新语法
    • 优化 Typora 编辑时表格工具栏、行/列数编辑的样式
    • 优化键盘操作的处理逻辑
    • 优化各种排版内容的间距细节
    • 优化题注样式,以及编辑时样式
    • 优化 Dark 模式下 Mermaid 图表样式
    • 彩虹引用内的高亮样式适配
    • 对废弃的 W3C 标准相关代码进行重写
    • 欢迎页的auto模式,支持指定秒数(调校参数指定或VIP主题指定)
    • 优化激光笔的光标处理机制,减少异常情况
    • 优化适配 Typora 新版本对无效页内链接检查机制

    ⚠️ — What’s CHANGED — ⚠️

    • 移除标签、徽章、引用、刮刮卡、注音对旧语法的支持
    • 简化表格列格式「复选框」语法,方括号内可以不加空格
    • 为与新的预置颜色标识语法兼容,彩虹引用的颜色标识必须独占一行
    • 高亮样式改为主题主色
    • 为适配新语法,调整封面上标格式规则,改为下划线格式
    • 将表格阅读模式(十字光标)调整为默认关闭
    • 自动题注改写为采用 H5标准的 
    • 彩虹标签默认颜色调整为主题辅助色
    • 更换导航中心按钮图标

    🧯— What’s FIXED — 🧯

    • 修复部分主题 Dark 模式下文档图标失效的问题
    • 修复任务列表的图标状态显示异常
    • 修复 h4 指定为不自动编码时,导出后在大纲中仍显示的问题
    • 修复第 2 题注丢失的问题
    • 修复非插图图片资源无效的处理机制
    • 修复导航中心搜索后鼠标指针异常问题(如 Mermaid 图)
    • 修复注音线上服务入口失效问题
    • 修复链接的样式在引用/段落/表格内有不一致的问题
    • 修复手工切换 Dark / Light 时图片的明暗度没有同步调整的问题
    • 修复彩虹引用的颜色标识空白行未删除的问题
     sudo apt install curl gpg curl -s 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x7074ce75da7cc691c1ae1a7c7e51d1adca'   | gpg --dearmor -o /usr/share/keyrings/trzsz.gpg echo 'deb [signed-by=/usr/share/keyrings/trzsz.gpg] https://ppa.launchpadcontent.net/trzsz/ppa/ubuntu jammy main'   | sudo tee /etc/apt/sources.list.d/trzsz.list sudo apt update sudo apt install tssh 

    清华大学人工智能研究院基础模型研究中心(简称“研究中心”)于 6 月 30 日下午正式宣布成立。

    清华大学校长王希勤,中国科学院院士、清华大学人工智能研究院名誉院长张钹,中国工程院院士、清华大学网研院院长、中关村实验室主任吴建平,中国工程院院士、清华大学人工智能研究院院长张尧学,青海省工业与信息化厅副厅长靳力,青海大学校长史春等出席仪式。

    仪式由清华大学计算机系党委书记贾珈主持。计算机系教授唐杰受聘为研究中心主任,计算机系教授黄民烈、刘知远受聘为研究中心副主任,清华大学人工智能研究院常务副院长孙茂松受聘为研究中心首席科学家。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    王希勤指出,基础模型对通用人工智能的发展至关重要,学校面向世界科技前沿成立研究中心旨在推动相关领域有组织科研和学科发展。希望研究中心能加强统筹规划,积极探索创新治理模式。要处理好个人与集体、传承与创新、应用与理论研究的关系,统筹发展与安全,推动科学与人文相结合。要充分发挥党的集中统一领导作用,促进政校企等多方合作,加强有组织科研。要用好清华综合学科优势,汇聚院系部处多方资源,同向发力、形成合力,共同推动人工智能基础模型创新与应用,为我国关键核心技术自主可控、拔尖创新人才自主培养作出应有贡献。

    吴建平则表示,希望研究中心既要团结全校科研力量、汇聚社会各界资源、对接国家重大需求,做出具有国际影响力和引领性的重大人工智能技术和应用,又要勇于担当,急国家之所急、忧国家之所忧,为提升我国网络和人工智能安全治理水平、维护我国国家安全和政治安全作出重要贡献。

    张尧学指出,清华大学人工智能研究院在人工智能基础模型研究与应用方面具有很好的前期工作积累,已经建设了多个有影响力的基础模型并在产业化方面有了良好的开端。此次成立研究中心,将聚焦人工智能基础模型的研究与应用,为推动学校人工智能相关学科建设、科研水平提升及科研成果转化贡献力量。

    清华大学计算机系主任尹霞在致辞中表示,本系将充分发挥学科优势,为推动人工智能基础模型的创新性研究与应用提供有力支撑。清华大学智库中心主任苏竣表示,将充分发挥智库信息分析平台的作用,为积极推进人工智能与其他学科的大跨度交叉与融合作出应有贡献。

    研究中心的成立也得到了地方政府和相关企业的大力支持。青海省工信厅靳力副厅长在发言中指出,青海省将积极推动人工智能领域的政策创新、体制创新和人才培养,促进“政产学研用”一体化,为国家科技创新和技术发展作出更大贡献。智谱华章公司首席执行官张鹏表示,清华大学在人工智能基础模型研究领域取得的原始创新性成果令人瞩目,智谱愿与清华大学共同打造有影响力的基础性、源头性的新高地,积极推进大范围技术与产业、学校与企业的融合。

    Linux 6.5 内核目前正处于合并窗口阶段。近日,龙芯开发者提交了多个补丁为即将发布的龙芯 3A6000 处理器提供支持。

    这些补丁的功能包括:

    • 初步启用 ClangBuiltLinux
    • 支持克隆时间命名空间 (time namespace)
    • 支持向量扩展 (vector extensions)——128 位 LSX (Loongson SIMD eXtension) 和 256 位 LASX (Loongson Advanced SIMD eXtension)
    • 支持超线程 SMT (Simultaneous Multi-Threading)
    • 支持包含不同 hints 的 dbar
    • 支持硬件页表遍历器 (hardware page table walker)
    • 实现 jump-label
    • 支持 Rethook 和 Uprobes

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    从提交的补丁内容来看,基于龙架构 (LoongArch) 的 3A6000 将是一款四核八线处理器。

    此前曾报道过,3A6000 是国内自主研发的首款支持 SMT 技术的通用 CPU 产品,集成 4 个龙芯自主设计的 LA664 核心,每个物理核心有 2 个逻辑核心。

    在 5 月份,龙芯 3A6000 已流片回来,但仅经过初步测试,后续还有性能摸底、优化与产品化的过程,而且完成产品化计划需要半年到一年的时间。

    3A6000 主频为 2.5GHz,采用四核、双 DDR4-3200 内存通道,IPC 高,单线程定点 base 分值超过 40 分,浮点分值超过 50 分,多线程定点分值超过 140 分,浮点分值超过 130 分。

    龙芯中科表示,基于目前的判断,龙芯 3A6000 的性能可对标 7nm 工艺制造的 AMD Zen 2 架构,相当于英特尔第 10 代酷睿的水平

    据介绍,在 2020 年之前,龙芯 CPU 的指令集基于 MIP S 进行扩展。在 2020 年之后,龙芯所有新设计的 CPU 都基于自主设计的 LoongArc h 架构。

    龙芯于 2019 年发布的 3A4000 每 GHz 性能首次接近 AMD Zen1,3A5000 主要是因为更换成了 LoongArch 架构,使 IPC 进一步提高了 10%。

    印度电子和信息技术部宣布大手笔投入全面建设 6G 技术,以后将成为 6G 技术的全球领导者。

    目前印度电子和信息技术部牵头成立了一个“Bharat 6G 联盟”,这是一个由公共和私营公司、学术界、研究机构和标准开发组织组成的协作平台,其终极目标是使印度成为可负担得起的 5G 和 6G 以及其他电信解决方案,使印度的电信 IP、产品和解决方案成为全球领先的供应商。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    通信国务部长 Shri Devusinh Chauhan 表示,印度是世界经济的亮点,电信行业是印度最亮点,通过 Bharat6G 联盟,印度现在将在 6G 技术方面处于领先地位。

    印度通信、铁路、电子和信息技术部长 Ashwini Vaishnaw 在致辞时表示,在过去 9 年中,印度电信部门进行了一系列改革,包括结构性、程序性改革和救济措施,使印度电信部门成为日出部门全世界都正在遵循印度走过的技术道路

    为了证明自己的发言并非空穴来风,Ashwini 部长列举了一些数据和成就:

    • 数据成本已从 2014 年的 300卢比/GB 降至 2023 年的 10卢比/GB
    • 印度正在向包括美国在内的 12 个国家出口技术
    • 4G覆盖率现已达到99%
    • 在5G方面,印度电信业已投资超过2.25万个核心
    • 超过 2.7 lakh 5G 塔几乎以每分钟 1 塔的速度安装,使印度成为世界三大 5G 生态系统之一。
    • 在农村地区提供了近150万宽带连接。
    • 日本已与印度“就印度的数字支付系统达成一致”。
    • ,…

    有些数据看起来比较奇怪,且有点春秋笔法的意思。因为在印度政府宣布该 6G 计划的同一天,印度最大的电信运营商 Jio宣布和当地智能手机制造商 Karbonn 联手打造一款售价 999 卢比(12.19 美,约 100 块人民币)的互联网功能手机 “Jio Bharat”。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    “Jio Bharat” 是一款 4G 手机,捆绑每月 123 卢比(1.50 美)的话费套餐出售,包括无限语音通话和 14GB 数据流量。该手机的目标市场直接瞄准了目前使用 2G 功能手机的 2.5 亿印度人

    这么看来,虽然印度的 4G 覆盖率现已达到 99% ,但能用得起 4G 网络和设备的用户却只是很小一部分。

    另一方面,该部长还提到了印度的半导体规划,其中美光科技在印度投资的土地审批和项目审批已在宣布会在两周内完成,第一个芯片制造点的破土仪式将在未来 40- 45 天内完成。(此前美光科技因安全问题而被我国政府加入制裁名单)。

    网站封面

    我们非常高兴地向大家宣布,历时 2 年开发的 LeaferJS 引擎正式面世!

    欢迎来到 LeaferJS 的世界,一个激发创造力、开启无限可能的引擎!在这里,数字化产品开发不再是一项艰难的任务,而是一个令人愉悦的探索之旅。感谢所有参与其中、提供支持的小伙伴们,正是因为你们的协助,我们才能够骄傲的向大家呈现出这款与众不同的图形渲染引擎。

    应用场景​

    LeaferJS 是一款绚丽多彩的 HTML5 Canvas 2D 图形渲染引擎,具备瞬间创建 100 万个图形的超强能力,可结合 AI 进行绘图,生成界面。同时,LeaferJS 还为跨平台开发提供了统一而丰富的交互事件,后续会支持小程序、Node.js。

    LeaferJS 提供了一项全新的服务,你可以利用它开发与绘图、UI 界面相关的任何技术和产品。它提供了开箱即用的功能,能帮助你快速开发在线图形、图像、文字等数字化产品,不论是 Photoshop、Figma、Miro、InVision、Canva、Notion 还是 Webflow 的类似产品,LeaferJS 都能满足你的需求,应用场景相当丰富!

    包括但不限于以下应用场景:

    1. 在线设计和在线白板工具
    2. 在线图形编辑器和创作工具
    3. 在线文档浏览和创作工具
    4. 数据可视化和图表绘制工具
    5. 网站和应用程序的界面开发
    6. 无代码平台的界面生成工具
    7. 制作互动游戏和动画效果

    最重要的是,LeaferJS 完全免费开源,而且易学易用,让你可以快速掌握它的强大功能。

    核心优势​

    极速创建,百万级图形​

    LeaferJS 引擎突破了行业常规,实现了百万级图形的运行能力。创建速度更是惊人, 短短的 1.5 秒内,可以创建出 100 万个可交互矩形。相比同类引擎,LeaferJS 具备了 10 倍以上的速度提升,甚至远远超越了 HTML5 本身。

    创建速度对比

    正如马斯克超级高铁计划将高铁速度推向新境界一样,LeaferJS 引擎突破了图形行业的速度极限,为开发者创造出惊人的图形效果提供了无限可能。

    极致性能,极低资源占用​

    LeaferJS 追求极致的性能。创建 100 万个可交互的矩形仅占用 350MB 内存,远低于同类引擎。此外,LeaferJS 的代码量极少,经过 gzip 压缩后仅为 42KB,是同类引擎中最为精简的之一。

    内存占用对比

    丰富表现力,简洁易用的 API​

    LeaferJS 引擎拥有丰富的表现力,包括各种渐变、图案填充、内外阴影、模糊、 遮罩、裁剪、路径转换等特性。我们经过反复推敲和打磨,提供了简洁易用的 API,让开发者能够用最少的代码实现功能。

    功能

    完善的文档,持续进化​

    我们为 LeaferJS 提供了易于学习和使用的文档,每个重要功能都有详细的代码示例和显示效果。我们致力于保证产品主要功能的稳定性,并已经进行了全面的自动化测试工作。虽然 LeaferJS 仍在不断进化中,但我们相信它已经具备了启动你的项目的能力。

    功能

    使命与愿景​

    我们致力于通过 LeaferJS 实现一套简洁、开放、现代化的 UI 绘图语言标准,为数字化产品开发提供跨平台、轻量化、高性能的运行时。我们希望不同的软件之间能够沟通、协作、共享绘图数据与数字界面,通过不断革新的图形技术和配套支持, 吸引更多的开发者加入使用,建立起一个开放的生态环境,沟通有无,以推动行业的快速发展,并诞生出更多有创意的技术和产品。

    我们的热情,让一切成为可能​

    LeaferJS 的诞生并非一帆风顺。在开发过程中,我们面临了诸多技术挑战,付出了巨大的代价,并多次徘徊在失败的边缘。然而,正是我们对图形行业的热爱和对使命的追求,推动我们不断向前探索,克服重重困难,战胜一个又一个挑战。最终,我们成功地将 LeaferJS 引擎带到了大家面前。

    开启创意之旅​

    现在,你可以借助 LeaferJS 引擎开启你的创意之旅了!LeaferJS 的发布不仅仅是一个引擎的诞生,更是一个激动人心的时刻。我们相信,通过 LeaferJS,你将拥有超越想象的创作能力,并为数字化产品开发带来全新的可能性。

    让我们一起开创一个充满创意和创新的未来,让 LeaferJS 成为你创造美好数字世界的重要伙伴!

    请访问我们的官方网站,了解更多关于 LeaferJS 的信息,并体验其卓越的性能。

    www.leaferjs.com

    1.背景

    得物社区是一大批年轻人获取潮流信息、分享日常生活的潮流生活社区。其中用户浏览的信息,进行个性化的分发,是由推荐系统来决策完成的。目前得物社区多个场景接入了推荐算法,包括首页推荐双列流、沉浸式视频推荐、分类tab推荐流、直播推荐流等多个场景,为了给用户提供更好的服务和体验,我们从整个推荐系统维度为相关服务做了大量优化。现在主流的推荐系统都会有召回、粗排、精排和机制等多个模块组成,本文主要介绍我们在精排层面演进过程中做的一些工作和思考。

    1.png

    2.挑战和解法

    用户在与信息流交互过程中,会产生、阅读、点赞、关注、收藏、评论和负反馈等行为,一般是业务关心的核心指标,也可作为算法同学建模的信号。其中,是用户一系列行为轨迹的入口,相对不稀疏,往往是一个信息流推荐系统初期最关注的目标之一。如何对用户兴趣进行精准建模,是这些年来推荐系统在工业界从初出茅庐到大展身手的过程中始终热门的主题。在工业界中一个好的业务建模范式是在一定资源约束下,做好服务于业务目标的可迭代的系统优化,对于推荐系统来说,需要考虑系统引擎、计算资源、模型迭代和维护的人力、系统和模型的可迭代性以及多团队合作等多方面因素下,推动整个系统向着业务目标持续前进。拆解到精排层面,我们需要解决多场景、多人群和多目标等为准确预估用户兴趣带来的挑战。下面从特征、样本、多目标建模和新用户冷启动等多个方向来阐述我们对这些挑战在得物社区的具体解法。

    2.png

    2.1 特征

    单目标的CTR模型的技术演进可从两个不同的视角进行观察,一个维度是特征工程,另外一个维度就是模型结构复杂度。在CTR模型早期的时候,受限于计算资源,模型结构往往比较简单,初期应用最广泛的便是LR模型。这个阶段算法工程师更多的时间是人工设计特征,从而针对不同的业务背景进行迭代拿到指标收益。

    推荐系统精排模型其实是一个预估用户行为概率的模型,我们希望模型一方面能够记住用户的历史行为(即拟合能力),另一方面可以基于历史数据进行合理扩展(即泛化能力)。在传统机器学习时期,LR、SVM和GDBT等模型就已经具备很好的拟合能力,可以在训练数据集上有极好的表现。但在实际业务上,真实的困难在于,如何基于过去数据准确地预估未来行为。万物基于数,在数学的视角上,模型建模本质上是对现实世界一部分运行规律在数字空间的抽象和模拟。现实行为在数字空间的表征的准确性很大程度上决定了建模的效果,幸运的是随着深度学习的发展,基于Embedding的表征技术越来越成熟,基本解决了建模的表征瓶颈,而这个映射空间往往称为特征向量空间。

    对于推荐系统精排模型而言,在向量空间中具备现实概念的基本单就是特征,这也揭示了针对特征的工作,对于整个建模的重要性。各个业务场景特征的设计,要求算法工程师对业务具备足够的理解,以及拥有丰富相关经验,特征工程也是算法工作中资源投入权重很大的工作,需要持续打磨优化,所谓磨刀不误砍柴工。

    2.1.1 特征设计

    模型使用的特征根据不同的角度可进行不一样的划分。根据特征来源,可以分为用户特征、Item特征、上下文特征、交叉特征以及级联模型特征;根据特征结构,一般可按照Dense和Sparse进行区分;根据特征时效性,往往又分为离线特征和实时特征。对于具体的业务场景,可根据特征来源,按照下表从整体上设计各个域的特征,在迭代的过程中持续优化升级特征。

    飞书20230111143234.jpg

    每个特征都应该结合业务进行设计,比如其中统计类特征需要考虑聚合的时间窗口,序列特征需要考虑序列的长度,这些都可以根据实际情况进行取舍和选择。

    3.png

    在设计特征的基础上,算法工程师还需要推动上下游打通数据链路,校验特征质量,引入到现有模型中进行离线调研,要是小流量AB实验有置信收益,新版特征就可以全量生效。一个常见的挖掘特征的手段,便是基于内容理解算法,利用自然语言处理、计算机视觉、语音识别等等,对内容进行深度挖掘,生产优质特征,从而让模型更容易捕获用户兴趣点。根据业务需要在持续迭代的过程中,会不断新增有效特征,旧的失效特征也会慢慢下线,在我们的业务场景中,模型使用的特征数也在迭代的过程相对增加了30%,系统的分发效率也有很大的提升。特征对模型预估的重要性可以通过auc-diff进行评估,为了系统的稳定性,还需要实时监控线上每个特征的覆盖率和取值分布情况,避免异常数据影响大盘。

    2.1.2 特征处理

    在推荐系统中使用的所有特征,按照特征结构和处理方式的不同,可以分为四类。

    数值型特征,特征的原始值是一定区间内的连续值,比如动态后验CTR、视频时长、点赞数等等,通常处理方式如下

    • 可以增加对特征异常值的鲁棒性、提升非线性能力、加快算法处理性能、方便特征交叉
    • 会丢失部分信息、边界离散值的跳变会影响模型预估稳定性
    • 可以采用等宽分箱、聚类分箱、等频分箱、决策树分箱和卡方分箱等方式
    • 特征最大最小归一化、标准化等等
    • 连续特征离散化
    • 非线性变换,比如常用的log(x+1)等等

    单值离散特征,一个样本只有一个离散取值,比如手机型号、用户性别等等

    • One-Hot编码
    • 查LookUp表,得到向量表征

    多值离线特征,一个样本可以有多个离散取值,比如用户序列、Item标签等等

    • 人工生成交叉特征
    • 查LookUp表,得到多维向量,可采用拼接、Pooling、Attention等方式生成融合后唯一的向量表征

    KV特征,一个样本Key可以有多个离线取值,并有与之对应的Value值

    • Key和Value离散化后,加权使用
    • 可以将Key和Value进行拼接后,离散化使用

    在推荐系统领域,在上表各式各样的特征中,有两种类型的特征很具备推荐特色,并在不同的业务上往往都是算法工程师大力投入,基本会取得不错收益的技术点。

    2.1.3 高维稀疏类别特征

    第一个就是高维稀疏的类别特征,这类特征由于其高维稀疏性,在向量空间上具备更好的线性可分性,从而模型更容易记住样本。对于一个相对成熟的推荐系统来说,此类特征的维度可达到上亿维,甚至几十亿维。

    为了让模型顺利使用这么大的高维特征,需要算法联合工程做很多深度优化工作。一般采用的解决方案是动态弹性特征(EmbeddingVariable),可以解决静态特征词表大小难预估、特征冲突、内存和IO冗余等问题,并能够通过特征准入、特征退场、底层哈希表无锁化和精细化内存布局等措施,来提高存储和访问效率。随着动态弹性EV特征的引入,在得物社区的各个场景上均有着不错的收益。

    2.1.4 交叉特征

    另外一个就是大名鼎鼎的交叉特征。交叉特征是通过多个特征进行交叉组合而来,能够有效地增强模型的表达能力。这些年来算法工程师在特征交叉上尝试了大量的工作,总体来说分为显示交叉和隐式交叉。

    显式交叉是基于先验知识,算法工程师人工构造交叉特征,一般可以采用的交叉形式有如下三种。其中笛卡尔积由于效果好更常使用,但笛卡尔积可能会发生维度爆炸,所以需要根据实际业务的数据分析情况来构造笛卡尔积。举个例子,在我们的场景中,每个用户在不同类目上兴趣偏好会有所区别,为了让系统在给用户提供服务时更关注这一点,可以在模型中尝试引入用户偏好和动态类目的交叉特征,提升用户体验。

    飞书20230111143804.jpg

    隐式交叉是通过网络结构让模型自动学习交叉,随着交叉技术的发展,算法工程师更多时候使用的方式是隐式交叉,不仅可以解除对人工经验的依赖,同时可在模型训练过程中不断自我优化。近些年在这方面经典的工作主要是FM、FFM、Wide&Deep、DeepFM、DCN和CAN等结构,其中DeepFM更是由于其结构简单、效果突出,在不同的推荐场景下均可作为比较好的基准。

    作为特征交叉结构的经典集大成者,DeepFM可以实现端对端的低阶和高阶特征交叉融合。其中FM结构可以进行低阶特征的交叉,提升模型的记忆能力;Deep结构进行高阶特征的交叉融合,提高模型的泛化能力。得物社区最早期的时候,在排序层面,精排模型只是对CTR进行建模,模型架构就采用了比较成熟的DeepFM。

    4.png

    2.2 样本

    对于一个推荐系统,模型训练样本和特征决定了模型效果的上限,一个高质量的训练样本集能够有效提高精排模型的预估能力。样本的产生需要依赖线上日志,一个优秀的生产样本流的框架会涉及多方,包括前端埋点、推荐引擎、预估服务和数仓等等。为了对业务效果负责,算法工程师除了关注模型本身外,还需要对样本质量进行监控,与上下游一起确保高质量样本生产的稳定性。

    2.2.1 实时样本流架构

    得物社区早期时,模型训练样本是基于离线特征表和离线用户行为表拼接而成,除了会有明显的时效性问题外,还可能会发生样本特征线上线下不一致性问题,影响系统整体的分发效率和分发效果。

    为了解决高质量样本生产的问题,我们通过协调资源,设计和推动多方搭建了实时样本流框架。通过实时样本流生产样本,样本的时效性大幅提升,从天级到分钟级,从而可以支持实时模型的上线,也为后续算法模型的快速迭代打下了坚实的基础。

    实时数据流架构可以概述为三条日志流的生产、归因和拼接。

    • 第一条数据流是客户端日志流,它是基于客户端埋点通过触发事件上报埋点信息而来,埋点数据包含了服务端下发给客户端的(reqid, userid, itemid)三组等信息。用户在浏览信息流时,会持续触发曝光、、点赞等行为数据,从而客户端日志流源源不断生产数据。
    • 第二条数据流是服务端引擎日志流,它是根据客户端发起的用户请求,经过服务端和整个推荐引擎,拿到推荐结果并返回给客户端这个过程中,在引擎落下的重要信息,同样包括(reqid, userid, itemid)三组、推荐结果以及正排信息等。
    • 最后一条数据流是在预估服务落下的预估日志流,它是引擎将用户画像和召回或者粗排的结果下发到预估机器,由预估机器中的精排模型进行打分,在这个过程中会将模型使用的item特征和user特征等特征信息dump下来。特征流的数据量也是三个流中最大的,往往需要通过ACK的形式降低dump的物品数,从而有效节约资源。

    三条日志流可以通过(reqid, userid, itemid)三组进行有效关联,从而形成实时归因大宽表。其中,客户端日志流提供了用户真实反馈标签,服务端引擎日志流提供了推荐引擎各环节的信息,预估服务日志流提供了模型使用的特征信息,保证了线上线下特征一致性。

    5.jpeg

    在使用实时样本流生产实时样本的过程中,会遇到一个经典的问题,那就是“用户延迟反馈”。这是由于从曝光埋点上报数据,到用户对动态进行和更深度的交互行为,这两个事件往往存在一定的时间差。比如用户在观看一个视频时,过了几分钟看完后才会对视频进行点赞和评论,此时如果我们对归因设计不合理就会造成这条实时样本是负样本。一般对用户反馈标签进行归因时,会考虑归因的时间窗口。离线表的归因窗口可以理解为1d,不过实时计算是在内存中实现的,出于对成本的考虑,很难设到很大的窗口,可以结合分析真实的业务数据情况,在成本、时效性和标签准确性之间找到合适的平衡点。在我们的场景上,通过选取合适的阈值,最后实时样本表的正标签达到了离线表的95%。对于延迟样本,一个有效的解决方案是设计不同的样本回补机制,基于重要性采样对样本分布进行纠偏。

    6.png

    2.2.2 采样

    CTR模型为了预估用户浏览到的曝光中会进行的概率,是一个二分类模型。直观上建模时,会将用户作为正样本,曝光未作为负样本。但由于用户行为相对稀疏,这种直接构建训练样本集的方式,会造成正负样本严重失衡,有些场景可能低于1:100,训练效果往往不够好。

    为了解决类别不均衡问题,一个常用的做法就是对负样本进行采样,只有通过一定策略采样后的负样本可以用来训练模型。负采样有很多实现方式,一般会根据采样质量、采样偏差和采样效率进行取舍,大体分为人工规则采样和基于模型采样。其中,常用的人工规则采样是随机负采样和基于流行度负采样,基于模型采样本质上是通过模型迭代优化负样本的质量,一般借鉴Boosting和GAN对抗学习的思想,不断挖掘强负样本,这块近期比较好的工作便是SRNS。

    在我们场景上,目前是通过随机丢弃负样本的方式来实现采样的。采样后训练的模型预估出来的pctr与真实后验率CTR是有偏差的,所以线上使用预估分pctr时需要先用如下转换公式进行修正,然后在排序时使用。除了采样外,另外一个可以尝试的解法是在训练时通过对不同样本的Loss进行调权,也可以缓解类别不均衡带来的影响,不过调权任务比较繁重,可能一时很难调到理想的效果,预估分也难以还原。

    9.jpeg

    对于一个业务场景,往往会关注多个业务指标,除了之外,另一些重要的关注点是用户后的后续行为。对于电商场景一般是收藏商品、下单商品等用户深层次行为,对于信息流场景更多的是观看时长、点赞、评论等用户交互行为。这些转化行为是用户之后发生的,如果在样本空间上对互动进行建模,线上直接使用会产生bias,称为样本选择偏差,多目标联合建模时可以通过设计特定的模型结构来解决。

    10.png

    在得物社区场景,我们根据线上遇到和发现的一些问题,在样本层面也做过其他的探索和实践。

    • 像评论、关注、分享等这些用户转化信号一般比较稀疏,单独建模的话模型训练不够充分很难取得好的效果,与联合训练又会被更密集的信号带偏。一种有效的解法是对同类型信号进行聚合使用,同时对这些信号重采样缓解信号的影响。
    • 样本随机负样本对低活用户是不友好的,甚至会让曝光未用户逐渐流失。在负采样时需要考虑低活用户曝光未的样本,同时可以尝试在特征层面加上曝光未序列。
    • 理想样本是在剔除噪音干扰的情况下,尽可能多的保留和基于先验知识提取真实场景的有效信息。其中一个可能有收益的信息就是用户样本的Session,所以建议试试基于用户Session构建样本。

    2.3 多目标

    相比单个目标建模,对多个业务目标进行建模会遇到更多的挑战,其中比较常见的问题就是多个指标之间会有跷跷板现象。为了缓解这些问题,在业界经过多年的实践和技术发展,积累不少的优秀模型ESSM、MMOE、PLE和ESCM等等,其中比较重要和应用广泛的模型是ESSM、MMOE,它们在很多业务场景都有着不错的效果,在得物社区场景,对多目标的建模也借鉴了相关模型的思路。

    11.png

    2.3.1 模型结构

    2.3.1.1 首页双列流

    随着业务的发展,得物社区首页推荐流精排模型也一直在迭代升级中,模型个性化能力不断提升,总的来说可以划分为四个阶段。

    第一阶段是早期时候,只对用户率建模,精排层只有CTR模型。期间经过几次迭代,从开始的DeepFM结构,到结合业务特点的DLRM结构,特征交叉能力明显提升,以及增加了提取用户深度兴趣的DIN模块,都取得了不错的收益。

    • CTR模型

    12.png

    第二阶段是增加了对用户时长的单独建模,希望提升系统对用户时长的预估能力,精排层会有CTR模型和时长模型。时长模型第一版采用了比较成熟DeepFM结构,在CTR损失兑换可接受的情况下,带来大盘人均时长相对提升+3%。

    • 时长模型

    13.png

    第三阶段是对用户点赞、关注、收藏、评论和分享等互动行为与用户时长联合建模,借助互动信号更好地捕获用户兴趣点,精排层会有两个模型,包括CTR模型和时长互动双塔模型。通过对多目标分融合公式进行有效调参后,在其他指标基本持平情况下,大盘互动用户渗透率,相对提升+6%。

    • 时长互动双塔模型

    14.png

    第四阶段是用户、用户时长和用户互动等多目标统一建模,并对用户负反馈单独建模,更好地整合精排层对用户兴趣的建模能力,精排层会有两个模型,即、时长和互动等多目标模型,以及负反馈模型。相对双塔模型,多目标模型更需要在结构上能够适配更多目标,尤其需要解决CTR任务和稀疏任务的相互影响。通过在训练时基于pct_time和pct_inte节点构建损失函数,并对pctr节点进行梯度阻断,使得能够对多个目标在曝光空间上统一进行建模。线上使用ptime和pinte作为时长和互动的预估分,融合公式可以做到线上线下一致,有助于在线上拿到离线调研的收益。上线后大盘ctr相对提升+2.3%,人均时长相对提升+0.33%,互动用户渗透率相对+4.5%。负反馈模型分在机制层通过平滑降权的形式生效,大盘负反馈率相对降低16%。

    • 多目标模型

    15.png

    • 负反馈平滑降权

    16.jpeg

    • 负反馈模型

    17.png

    2.3.1.2 沉浸式视频单列流

    与首页双列流产品形态不同的是,沉浸式视频推荐流是单列流场景,用户通过不断下滑观看不同的视频。针对场景特点,最开始的建模思路是从视频完成度进行切入的,模型会预估用户会观看视频时长占视频本身时长的比例pfinish_rate,线上使用时会结合视频本身时长videoTime,并对videoTime双端进行限制缓解视频本身时长带来的bias,最后使用pfinish_rate*truncated(videoTime) 作为排序分。与首页主场景一样,在后面的迭代过程中,也增加了对用户互动行为的建模,在对互动预估分pinte和完成度预估分pfinish_rate进行融合时,不出意外也遇到跷跷板现象,通过不断实验尝试,最后采用级联排序的形式取得了收益。

    通过几个版本持续迭代优化,场景核心指标提升明显,场景访问uv人均时长相对提升+46%,曝光互动率相对提升+15%。结合视频场景特殊性,通过对业务指标的分析,最近我们在考虑对用户短播行为和长播行为进行建模,更好的捕获用户兴趣点,为用户提供更贴心的视频推荐流服务。

    • 多目标模型

    18.png

    2.3.2 多目标融合

    多目标建模除了模型本身,另一个主要的挑战就是线上如何有效地使用多个目标分?我们希望通过合适的排序目标和机制设计,让业务关注的目标都能够有收益,做到多个目标共同提升,针对这个问题在我们场景上也进行了各种不同的尝试。

    第一类比较直接的解决方案就是设计公式,对多个目标分使用公式进行融合,从而作为最终排序分。此方案的好处就是简单、明确,可以根据权重知道每个目标分是怎么对最终排序生效的。其中一个常用的技巧就是由于不同目标的预估分分布差异大,预估分绝对值的变动会影响调参结果,所以可以考虑使用单个目标分排序后的序号,将其通过合理的归一化后,再对多个目标进行融合。缺点就是不同的模型上线都需要手动调参,带来很大的工作量,并且融合公式也没有根据不同用户做到个性化融合,影响整体排序效果。在得物社区场景,我们先后设计了两版融合公式,第二版加法形式取得了更好的收益,同时参数量也有效降低。

    • 人工公式融合

    19.jpeg20.jpeg

    第二类解决方案是希望借助深度模型来端对端的生成最终排序分,避免人工调参,同时在融合时会考虑个性化。具体思路是构造一些用户侧、物品侧重要的基础特征,以及多个模型的预估分,将它们作为一个简单网络的输入,利用离线训练的模型产生最终融合分。一个关键点就是离线模型Label的构造,一般是通过对多个目标加权的方式进行聚合,权重的选择需要结合业务和线上实验的效果进行调试。缺点是精排层需要多调用一个模型,需要更多的资源,另外就是有时业务上需要做一些生态上的调整,模型融合没有公式来的快捷。

    • 独立融合模型

    21.png

    第三类也是目前正在尝试的解决方案,即个性化融合多目标模型架构。我们希望在多目标模型的基础上,通过构造融合模块,将多目标预估和多目标预估分融合放到一个完整的网络框架下。模型训练时损失函数可以分为两块,主网络损失和融合网络损失,主网络损失是为了优化模型对各个目标分的预估,融合网络损失是从整体上优化融合排序的结果,可以通过异步训练和梯度阻断的方式避免对网络相互造成干扰。理论上这种方案结合了前面两种方案的优化,同时避免了其缺点,希望经过调试后能够在我们的场景上推全这种方案,进一步整合精排模型的能力。

    22.jpeg

    • 个性化融合多目标模型

    个性.png

    2.4 新用户冷启动

    新用户冷启一直是业界的难点,主要体现在以下三点。为了解决这些问题,业界也有很多经典的工作,比如基于学习的新用户MeLU、FORM模型等等,这些方案都是希望为新用户赋予比较靠谱的初始值,通过动态学习率快速调整从而收敛,但在实际应用时往往效果不佳。

    新用户行为稀疏,对推荐结果更敏感

    训练集新老用户样本分布不均匀,新用户样本占比往往低于1%

    新用户人群和老用户人群特点差异大,由于老用户的主导,会导致模型难以捕捉到新用户人群行为模式

    我们在得物社区首页双列流场景上也对新用户冷启动做了尝试,提升新用户冷启效率。基于对业务数据的分析和判断,从可推池、召回到精排、打散整个链路与主场景独立出来进行迭代,针对新用户特殊性,在精排层面从特征到模型结构均进行了单独的设计。

    对于新用户冷启任务,个人认为如下技巧都是可以尝试的,在不同业务场景可能会有不一样的收益。

    新用户样本重采样或者Loss加权,增加新用户样本的话语权

    构造能够表征新用户人群的特征,比如新用户标识、用户首次访问时间等等

    用户人群id代替新用户id,缓解新用户id学习不充分

    从模型结构上突出新用户相关的特征,增加新用户特征的话语权

    在我们的场景上,第一版模型是基于新用户有效的时长加权CTR模型,模型会更关注用户消费时长高的内容,从而帮助模型学习到新用户的兴趣点。为了进一步提升模型对不同新用户兴趣捕获能力,我们通过在模型结构上的设计了多目标poso模型,缓解新用户行为和样本稀疏的问题。通过在模型结构层面做到个性化,为相关人群带来更好的体验,全量后新用户ctr相对+2.69%,人均推荐时长相对+3.08%,人均互动数相对+18%,新用户次留相对+1.23%。

    • 多目标poso模型

    多目标.png

    3.展望

    本文主要介绍了面对业务中不断出现的挑战,我们从特征、样本、多目标建模和新用户冷启动等方向做的一些具体解法以及取得的一些进展。除了这些已经落地的技术外,我们还在其他方向了进行了探索,包括流行度纠偏、用户深度兴趣、FeatureStore以及超大规模分布式稀疏大模型,希望在后续进一步释放算法红利,保障和促进业务的增长。

    4.引用

    [1] Chen Y , Jin J , Zhao H , et al. Asymptotically Unbiased Estimation for Delayed Feedback Modeling via Label Correction[J]. 2022.

    [2] Lee H , Im J , Jang S , et al. MeLU: Meta-Learned User Preference Estimator for Cold-Start Recommendation[J]. ACM, 2019.

    [3] Sun X, Shi T, Gao X, et al. FORM: Follow the Online Regularized Meta-Leader for Cold-Start Recommendation[C]//Proceedings of the 44th International ACM SIGIR Conference on Research and Development in Information Retrieval. 2021: 1177-1186.

    [4] Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018: 1137-1140.

    [5] Ma J, Zhao Z, Yi X, et al. Modeling task relationships in multi-task learning with multi-gate mixture-of-experts[C]//Proceedings of the 24th ACM SIGKDD international conference on knowledge discovery & data mining. 2018: 1930-1939.

    [7] Guo H, Tang R, Ye Y, et al. DeepFM: a factorization-machine based neural network for CTR prediction[J]. arXiv preprint arXiv:1703.04247, 2017.

    [8] Naumov M, Mudigere D, Shi H J M, et al. Deep learning recommendation model for personalization and recommendation systems[J]. arXiv preprint arXiv:1906.00091, 2019.

    [9] Zhang W, Qin J, Guo W, et al. Deep learning for click-through rate estimation[J]. arXiv preprint arXiv:2104.10584, 2021.

    文/召俊 Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    线下活动推荐: 得物技术沙龙「企业协作效率演进之路」(总第19期)
    时间:2023年7月16日 14:00 ~ 2023年7月16日 18:00
    地点:(上海杨浦)黄兴路221号互联宝地 C栋5楼(宁国路地铁站1号口出)

    活动亮点:在当今竞争日益激烈的商业环境中,企业协作效率成为企业团队成功的关键。越来越多的企业意识到,通过信息化建设和工具化的支持,可以大幅提升协作效率,并在行业中取得突破。本次沙龙将涵盖多个主题,这些主题将为与会者提供丰富的思考和经验,助力企业协作效率的提升。

    通过得物技术沙龙这个交流平台,您将有机会与其他企业的代表一起学习、借鉴彼此的经验和做法。共同探讨企业内部协作效率的最佳实践,驱动企业长期生存和发展。加入得物技术沙龙,与行业先驱者们一起开启协作效率的新篇章!让我们共同为协作效率的突破而努力!

    报名: 得物技术沙龙「企业协作效率演进之路」(总第19期)
    本文属得物技术原创,来源于:得物技术官网
    未经得物技术许可严禁转载,否则依法追究法律责任!

    作者:得物技术
    链接:juejin.cn/post/…

    DIYSearchEngine 是一个能够高速采集海量互联网数据的开源搜索引擎,采用 Go 语言开发。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Github 地址:https://github.com/johnlui/DIYSearchEngine

    运行方法

    首先,给自己准备一杯咖啡。

    1. 把本项目下载到本地
    2. 编译:
    3. 修改配置文件:,然后把里面的数据库和 Redis 配置改成你的
    4. 执行创建数据库
    5. 手动插入一个真实的 URL 到 pages_00 表中,只需要填充 url 和 host 两个字段
    6. 执行,静待好事发生 ☕️

    过一段时间,等字典数据表里面填充了数据之后,打开http://127.0.0.1:10086,尝试搜一下吧!🔍

    更多项目运行信息,请见 wiki

    网页直接阅读:https://lvwenhan.com/tech-epic/509.html

    作者信息:

    1. 姓名:吕文翰
    2. GitHub:johnlui
    3. 职位:住范儿 CTO

    代码版权

    本项目代码采用 MIT 协议开源。

     curl --location-trusted -u root: -H "partial_columns:true" -H "column_separator:," -H "columns:id,balance,last_access_time" -T /tmp/test.csv http://127.0.0.1:48037/api/db1/user_profile/_stream_load

    极致弹性与存算分离

    过去 Apache Doris 凭借在易用性方面的诸多设计帮助用户大幅节约了计算与存储资源成本,而面向未来的云原生架构,我们已经走出了坚实的一步。

    从降本增效的趋势出发,用户对于计算和存储资源的需求可以概括为以下几方面:

    • 计算资源弹性:面对业务计算高峰时可以快速进行资源扩展提升效率,在计算低谷时可以快速缩容以降低成本;

    • 存储成本更低:面对海量数据可以引入更为廉价的存储介质以降低成本,同时存储与计算单独设置、相互不干预;

    • 业务负载隔离:不同的业务负载可以使用独立的计算资源,避免相互资源抢占;

    • 数据管控统一:统一 Catalog、统一管理数据,可以更加便捷地分析数据。

    存算一体的架构在弹性需求不强的场景具有简单和易于维护的优势,但是在弹性需求较强的场景有一定的局限。而存算分离的架构本质是解决资源弹性的技术手段,在资源弹性方面有着更为明显的优势,但对于存储具有更高的稳定性要求,而存储的稳定性又会进一步影响到 OLAP 的稳定性以及业务的存续性,因此也引入了 Cache 管理、计算资源管理、垃圾数据回收等一系列机制。

    而在与 Apache Doris 社区广大用户的交流中,我们发现用户对于存算分离的需求可以分为以下三类:

    • 目前选择简单易用的存算一体架构,暂时没有资源弹性的需求;

    • 欠缺稳定的大规模存储,要求在 Apache Doris 原有基础上提供弹性、负载隔离以及低成本;

    • 有稳定的大规模存储,要求极致弹性架构、解决资源快速伸缩的问题,因此也需要更为彻底的存算分离架构;

    为了满足前两类用户的需求,Apache Doris 2.0 版本中提供了可以兼容升级的存算分离方案:

    第一种,计算节点。2.0 版本中我们引入了无状态的计算节点 Compute Node,专门用于数据湖分析。相对于原本存储计算一体的混合节点,Compute Node 不保存任何数据,在集群扩缩容时无需进行数据分片的负载均衡,因此在数据湖分析这种具有明显高峰的场景中可以灵活扩容、快速加入集群分摊计算压力。同时由于用户数据往往存储在 HDFS/S3 等远端存储中,执行查询时查询任务会优先调度到 Compute Node 执行,以避免内表与外表查询之间的计算资源抢占。

    参考文档:https://doris.apache.org/zh-CN/docs/dev/advanced/compute_node

    第二种,冷热分层。在存储方面,冷热数据数据往往面临不同频次的查询和响应速度要求,因此通常可以将冷数据存储在成本更低的存储介质中。在过去版本中 Apache Doris 支持对表分区进行生命周期管理,通过后台任务将热数据从 SSD 自动冷却到 HDD,但 HDD 上的数据是以多副本的方式存储的,并没有做到最大程度的成本节约,因此对于冷数据存储成本仍然有较大的优化空间。在 Apache Doris 2.0 版本中推出了冷热数据分层功能 ,冷热数据分层功能使 Apache Doris 可以将冷数据下沉到存储成本更加低廉的对象存储中,同时冷数据在对象存储上的保存方式也从多副本变为单副本,存储成本进一步降至原先的三分之一,同时也减少了因存储附加的计算资源成本和网络开销成本。通过实际测算,存储成本最高可以降低超过 70%!

    参考文档:https://doris.apache.org/zh-CN/docs/dev/advanced/cold_hot_separation

    后续计算节点会支持查询冷数据和存储节点的数据,从而实现能兼容升级的存算分离方案。

    图片 而为了满足第三类用户的需求,我们还将把 SelectDB Cloud 存算分离方案贡献回社区。这一方案在性能、功能成熟度、系统稳定性等方面经历了上百家企业生产环境的考验,后续功能合入的实际进展我们也将及时同步。

    10 倍以上性价比的日志分析方案

    从过去的实时报表和 Ad-hoc 等典型 OLAP 场景到 ELT/ETL、日志检索与分析等更多业务场景,Apache Doris 正在不断拓展应用场景的边界,而日志数据的统一存储与分析正是我们在 2.0 版本的重要突破。

    过去业界典型的日志存储分析架构难以同时兼顾 高吞吐实时写入、低成本大规模存储与高性能文本检索分析,只能在某一方面或某几方面做权衡取舍。而在 Apache Doris 2.0 版本中,我们引入了全新倒排索引、以满足字符串类型的全文检索和普通数值/日期等类型的等值、范围检索,同时进一步优化倒排索引的查询性能、使其更加契合日志数据分析的场景需求,同时结合过去在大规模数据写入和低成本存储等方面的优势,实现了更高性价比的日志分析方案。

    在相同硬件配置和数据集的测试表现上,Apache Doris 相对于 ElasticSearch 实现了日志数据写入速度提升 4 倍、存储空间降低 80%、查询性能提升 2 倍,再结合 Apache Doris 2.0 版本引入的冷热数据分层特性,整体性价比提升 10 倍以上。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    除了日志分析场景的优化以外,在复杂数据类型方面,我们增加了全新的数据类型 Map/Struct,包括支持以上类型的高效写入、存储、分析函数以及类型之间的相互嵌套,以更好满足多模态数据分析的支持。

    详细介绍:https://sigusoft.com/s/WJXKyudW8CJPqlUiAro_KQ

    更全面、更高性能的数据湖分析能力

    在 Apache Doris 1.2 版本中,我们发布了 Multi-Catalog 功能,支持了多种异构数据源的数据自动映射与同步,实现了数据湖的无缝对接。依赖 数据读取、执行引擎、查询优化器方面的诸多优化,在标准测试集场景下,Apache Doris 在湖上数据的查询性能,较 Presto/Trino 有 3-5 倍的提升。

    在 2.0 版本中,我们进一步对数据湖分析能力进行了加强,不但支持了更多的数据源,同时针对用户的实际生产环境做了诸多优化,相较于 1.2 版本,能够在真实工作负载情况下显著提升性能。

    更多数据源支持

    • 支持 Hudi Copy-on-Write 表的 Snapshot Query 以及 Merge-on-Read 表的 Read Optimized Query,后续将支持 Incremental Query 和 Time Trival。参考文档:https://doris.apache.org/zh-CN/docs/dev/lakehouse/multi-catalog/hudi

    • JDBC Catalog 新增支持 Oceanbase,目前支持包括 MySQL、PostgreSQL、Oracle、SQLServer、Doris、Clickhouse、SAP HANA、Trino/Presto、Oceanbase 等近十种关系型数据库。参考文档:https://doris.apache.org/zh-CN/docs/dev/lakehouse/multi-catalog/jdbc

    数据权限管控

    • 支持通过 Apache Range 对 Hive Catalog 进行鉴权,可以无缝对接用户现有的权限系统。同时还支持可扩展的鉴权插件,为任意 Catalog 实现自定义的鉴权方式。 参考文档:https://doris.apache.org/zh-CN/docs/dev/lakehouse/multi-catalog/hive

    性能进一步优化,最高提升数十倍

    • 优化了大量小文件场景以及宽表场景的读取性能。通过小文件全量加载、小 IO 合并、数据预读等技术,显著降低远端存储的读取开销,在此类场景下,查询性能最高提升数十倍。

    • 优化了 ORC/Parquet 文件的读取性能,相较于 1.2 版本查询性能提升一倍。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等) Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    • 支持湖上数据的本地文件缓存。可以利用本地磁盘缓存 HDFS 或对象存储等远端存储系统上的数据,通过缓存加速访问相同数据的查询。在命中本地文件缓存的情况下,通过 Apache Doris 查询湖上数据的性能可与 Apache Doris 内部表持平,该功能可以极大提升湖上热数据的查询性能。参考文档:https://doris.apache.org/zh-CN/docs/dev/lakehouse/filecache

    • 支持外表的统计信息收集。和 Apache Doris 内表一样,用户可以通过 Analyze 语句分析并收集指定外表的统计信息,结合 Nereids 全新查询优化器,能够更准确更智能地对复杂 SQL 进行查询计划的调优。以 TPC-H 标准测试数据集为例,无需手动改写 SQL 即可获得最优的查询计划并获得更好的性能表现。 参考文档:https://doris.apache.org/zh-CN/docs/dev/lakehouse/multi-catalog/

    • 优化了 JDBC Catalog 的数据写回性能。通过 PrepareStmt 和批量方式,用户通过 INSERT INTO 命令、通过 JDBC Catalog 将数据写回到 MySQL、Oracle 等关系型数据库的性能提升数十倍。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

     

     

    高并发数据服务支持

    与复杂 SQL 和大规模 ETL 作业不同,在诸如银行交易流水单号查询、保险代理人保单查询、电商历史订单查询、快递运单号查询等 Data Serving 场景,会面临大量一线业务人员及 C 端用户基于主键 ID 检索整行数据的需求,在过去此类需求往往需要引入 Apache HBase 等 KV 系统来应对点查询、Redis 作为缓存层来分担高并发带来的系统压力。

    对于基于列式存储引擎构建的 Apache Doris 而言,此类的点查询在数百列宽表上将会放大随机读取 IO,并且执行引擎对于此类简单 SQL 的解析、分发也将带来不必要的额外开销,往往需要更高效简洁的执行方式。因此在新版本中我们引入了全新的行列混合存储以及行级 Cache,使得单次读取整行数据时效率更高、大大减少磁盘访问次数,同时引入了点查询短路径优化、跳过执行引擎并直接使用快速高效的读路径来检索所需的数据,并引入了预处理语句复用执行 SQL 解析来减少 FE 开销。

    通过以上一系列优化,Apache Doris 2.0 版本在并发能力上实现了数量级的提升!在标准 YCSB 基准测试中,单台 16 Core 64G 内存 4*1T 硬盘规格的云服务器上实现了单节点 30000 QPS 的并发表现,较过去版本点查询并发能力提升超 20 倍!基于以上能力,Apache Doris 可以更好应对高并发数据服务场景的需求,替代 HBase 在此类场景中的能力,减少复杂技术栈带来的维护成本以及数据的冗余存储。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    参考文档:https://doris.apache.org/zh-CN/docs/dev/query-acceleration/hight-concurrent-point-query

    详细介绍:https://sigusoft.com/s/Ow77-kFMWXFxugFXjOPHhg

    CCR 跨集群数据同步

    为了满足用户多集群之间数据同步的需求,在过去需要定期通过 Backup/Restore 命令进行数据备份和恢复,操作较为复杂、数据同步时延高并且还需要中间存储。为了满足用户多集群的数据库表自动同步需求,在 2.0-beta 版本中我们增加了 CCR 跨集群数据同步的功能,能够在库/表级别将源集群的数据变更同步到目标集群、以提升在线服务的数据可用性并更好地实现了读写负载分离以及多机房备份。

     

    支持 Kubernetes 容器化部署

    在过去 Apache Doris 是基于 IP 通信的,在 K8s 环境部署时由于宿主机故障发生 Pod IP 漂移将导致集群不可用,在 2.0 版本中我们支持了 FQDN,使得 Apache Doris 可以在无需人工干预的情况下实现节点自愈,因此可以更好应对 K8s 环境部署以及灵活扩缩容。

    参考文档:https://doris.apache.org/zh-CN/docs/dev/install/k8s-deploy/

     

    其他升级注意事项

    • 1.2-lts 可以滚动升级到 2.0-beta,2.0-alpha 可以停机升级到 2.0-beta;

    • 查询优化器开关默认开启 enable_nereids_planner=true;

    • 系统中移除了非向量化代码,所以参数将不再生效enable_vectorized_engine;

    • 新增参数 enable_single_replica_compaction;

    • 默认使用 datev2, datetimev2, decimalv3 来创建表,不支持 datev1,datetimev1, decimalv2 创建表;

    • 在 JDBC 和 Iceberg Catalog 中默认使用decimalv3;

    • date type 新增 AGG_STATE;

    • backend 表去掉 cluster 列;

    • 为了与 BI 工具更好兼容,在 show create table 时,将 datev2 和 datetimev2 显示为 date 和 datetime。

    • 在 BE 启动脚本中增加了 max_openfiles 和 swap 的检查,所以如果系统配置不合理,be 有可能会启动失败;

    • 禁止在 localhost 访问 FE 时无密码登录;

    • 当系统中存在 Multi-Catalog 时,查询 information schema 的数据默认只显示 internal catalog 的数据;

    • 限制了表达式树的深度,默认为 200;

    • array string 返回值 单引号变双引号;

    • 对 Doris的进程名重命名为 DorisFE 和 DorisBE;

    踏上 2.0 之旅

    距离 Apache Doris 2.0-alpha 版本发布已经有一个半月之久,这一段时间内我们在加速核心功能特性开发的同时、还收获到了数百家企业对于新版本的切身体验与真实反馈,这些来自真实业务场景的反馈对于功能的打磨与进一步完善有着极大的帮助。因此 2.0-beta 版本无论在功能的完整度还是系统稳定性上,都已经具备了更佳的使用体验,欢迎所有对于 2.0 版本新特性有需求的用户部署升级。

    如果您在调研、测试以及部署升级 2.0 版本的过程中有任何问题,欢迎提交问卷信息,届时将由社区核心贡献者提供 1-1 专项支持。我们也期待 2.0 版本为更多社区用户提供实时统一的分析体验,相信 Apache Doris 2.0 版本会成为您在实时分析场景中的最理想选择。

    MKVToolNix 是一套功能强大的 mkv (Matroska) 格式制作和处理的工具,支持将多种视频、音频、字幕等格式封装成 mkv 格式。

    MKVToolNix 78.0 现已正式发布,此版本修复了大量 bug,特别是针对 GUI 的 header editor 中的崩溃以及通过拖放添加文件时 GUI 挂起的情况。

    New features and enhancements

    • MKVToolNix GUI:header editor:对于仅包含 legacy track 语言素但不包含 IETF 语言素的文件,header editor 现在将从 legacy element 派生 IETF 语言素。参见 #3557。
    • AppImage:AppImage 现在基于 AlmaLinux 8 和 Qt 6.5.1 构建。这意味着该 AppImage 兼容的最低 glibc 版本也已提升至 v2.28。此版本中最古老的 Debian 是 Debian 10“Buster”;Ubuntu 则是 18.10“Cosmic Cuttlefish”。
    • Windows 安装程序:如果安装目录中存在文件,安装程序现在将删除该文件,因为它的存在会向应用程序发出信号,使其在便携模式下运行,需要对其 base directory 进行写入访问。这修复了当用户将便携式应用程序存档提取到诸如这样的文件夹中的安装问题,还添加了针对同一问题的安装检查。参见 #3558。

    Bug fixes

    • all: Linux:如果根据系统设置初始化 locale 系统失败,例如环境变量如被设置为,但的 locale 还没有被建立,MKVToolNix 将尝试首先回退到,其次是。如果三者都不成功,将显示错误信息,并且程序将中止。这修复了程序没有捕捉到库异常的问题,该库不能很好地处理配置错误的 locale 系统。#3574 的解决方法。
    • mkvmerge:当某些轨道未复制时,按类型排序的轨道不能正常工作。#3567 修复的一部分。
    • mkvmerge:当源文件中的音轨顺序与目标文件中的音轨顺序不同时,目标文件中的音轨编号将被无序分配。现在,它们按照轨道再次出现在目标文件中的顺序依次分配。#3567 修复的一部分。
    • MKVToolNix GUI:在某些情况下,GUI 会尝试显示来自辅助线程的错误消息,这在 Qt 中是不允许的,从而导致程序挂起或彻底崩溃。#3556 和 3561 修复的一部分。
    • MKVToolNix GUI:GUI 将检查几个潜在的安装问题。对某些目录(系统的临时目录、MKVToolNix 的文件识别缓存目录等)的写入权限,如果没有,则显示适当的错误消息。#3556 和 #3561修复的一部分。
    • AppImage:修复了找不到 GUI 资源(例如图标)的问题。
    • AppImage:现在包含使用 compose key/dead keys 所需的 Qt 插件。修复 #3577。
    • ……

    详情可查看发布公告。 

    网站封面

    我们非常高兴地向大家宣布,历时 2 年开发的 LeaferJS 引擎正式面世!

    欢迎来到 LeaferJS 的世界,一个激发创造力、开启无限可能的引擎!在这里,数字化产品开发不再是一项艰难的任务,而是一个令人愉悦的探索之旅。感谢所有参与其中、提供支持的小伙伴们,正是因为你们的协助,我们才能够骄傲的向大家呈现出这款与众不同的图形渲染引擎。

    应用场景​

    LeaferJS 是一款绚丽多彩的 HTML5 Canvas 2D 图形渲染引擎,具备瞬间创建 100 万个图形的超强能力,可结合 AI 进行绘图,生成界面。同时,LeaferJS 还为跨平台开发提供了统一而丰富的交互事件,马上会支持小程序、Node.js。

    LeaferJS 提供了一项全新的服务,你可以利用它开发与绘图、UI 界面相关的任何技术和产品。它提供了开箱即用的功能,能帮助你快速开发在线图形、图像、文字等数字化产品,不论是 Photoshop、Figma、Miro、InVision、Canva、Notion 还是 Webflow 的类似产品,LeaferJS 都能满足你的需求,应用场景相当丰富!

    包括但不限于以下应用场景:

    1. 在线设计和在线白板工具
    2. 在线图形编辑器和创作工具
    3. 在线文档浏览和创作工具
    4. 数据可视化和图表绘制工具
    5. 网站和应用程序的界面开发
    6. 无代码平台的界面生成工具
    7. 制作互动游戏和动画效果

    最重要的是,LeaferJS 完全免费开源,而且易学易用,让你可以快速掌握它的强大功能。

    核心优势​

    极速创建,百万级图形​

    LeaferJS 引擎突破了行业常规,实现了百万级图形的运行能力。创建速度更是惊人, 短短的 1.5 秒内,可以创建出 100 万个可交互矩形,相比同类引擎,LeaferJS 具备了 10 倍以上的创建速度提升,甚至远远超越了 HTML5 本身。

    创建速度对比

    正如马斯克超级高铁计划将高铁速度推向新境界一样,LeaferJS 引擎突破了图形行业的速度极限,为开发者创造出惊人的图形效果提供了无限可能。

    极致性能,极低资源占用​

    LeaferJS 追求极致的性能。创建 100 万个可交互的矩形仅占用 350MB 内存,远低于同类引擎。此外,LeaferJS 的代码量极少,经过 gzip 压缩后仅为 42KB,是同类引擎中最为精简的之一。

    内存占用对比

    丰富表现力,简洁易用的 API​

    LeaferJS 引擎拥有丰富的表现力,包括各种渐变、图案填充、内外阴影、模糊、 遮罩、裁剪、路径转换等特性。我们经过反复推敲和打磨,提供了简洁易用的 API,让开发者能够用最少的代码实现功能。

    功能

    完善的文档,持续进化​

    我们为 LeaferJS 提供了易于学习和使用的文档,每个重要功能都有详细的代码示例和显示效果。我们致力于保证产品主要功能的稳定性,并已经进行了全面的自动化测试工作。虽然 LeaferJS 仍在不断进化中,但我们相信它已经具备了启动你的项目的能力。

    功能

    使命与愿景​

    我们致力于通过 LeaferJS 实现一套简洁、开放、现代化的 UI 绘图语言标准,为数字化产品开发提供跨平台、轻量化、高性能的运行时。我们希望不同的软件之间能够沟通、协作、共享绘图数据与数字界面,通过不断革新的图形技术和配套支持, 吸引更多的开发者加入使用,建立起一个开放的生态环境,沟通有无,以推动行业的快速发展,并诞生出更多有创意的技术和产品。

    我们的热情,让一切成为可能​

    LeaferJS 的诞生并非一帆风顺。在开发过程中,我们面临了诸多技术挑战,付出了巨大的代价,并多次徘徊在失败的边缘。然而,正是我们对图形行业的热爱和对使命的追求,推动我们不断向前探索,克服重重困难,战胜一个又一个挑战。最终,我们成功地将 LeaferJS 引擎带到了大家面前。

    开启创意之旅​

    现在,你可以借助 LeaferJS 引擎开启你的创意之旅了!LeaferJS 的发布不仅仅是一个引擎的诞生,更是一个激动人心的时刻。我们相信,通过 LeaferJS,你将拥有超越想象的创作能力,并为数字化产品开发带来全新的可能性。

    让我们一起开创一个充满创意和创新的未来,让 LeaferJS 成为你创造美好数字世界的重要伙伴!

    请访问我们的官方网站,了解更多关于 LeaferJS 的信息,并体验其卓越的性能。

    www.leaferjs.com

    介绍

    多智能体框架MetaGPT开源了:https://github.com/geekan/MetaGPT
    • 输入一句话需求,它就可以运行一个软件公司,输出产品文档/设计文档/任务/代码REPO
    • 它能设计一个类似今日头条的推荐系统,也能设计一个大模型训练框架

    正文

     
    在内部,它抽象了多个不同角色,包括产品经理、架构师、项目经理、工程师、QA等等。
     
    已有框架如gpt-engineer,只有单一的工程师抽象;而MetaGPT提供了软件公司的完整抽象,每个角色有了更明确的技能,之前很难由工程师完成的市场调研、竞品分析、架构设计等环节,现在都可以实现了,拥有了很好的效果。
     
    比如说当需要设计一个类似今日头条的推荐系统,它就可以在一分钟左右给我们一个比较靠谱的设计,而这只需要¥1。用人来完成这个过程耗时良久,成本高昂,ROI可能有几千上万倍
     
    当我们向内部看时,会发现内部的实现实际就是一个完整的软件公司,软件公司中由多个智能体协作,可以完成一个相对复杂的软件问题
     
     

     

    更多信息请访问:https://github.com/geekan/MetaGPT

    2023 年 6 月 29 日,KubeClipper 正式加入 CNCF Sandbox。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    CNCF,全称 Cloud Native Computing Foundation(云原生计算基金会),是 Linux 基金会旗下的子基金会。CNCF 致力于为云原生软件构建可持续生态系统‎,涉及领域包括存储、计算、编排、调度、CI/CD、DevOps、服务治理、服务网关等。

    CNCF 社区将项目分为沙盒项目(Sandbox)、孵化项目(Incubating)、毕业项目(Graduated)。著名的毕业项目有:Kubernetes、etcd、containerd、Prometheus、Helm 等。

    KubeClipper 致力于提供极简且通用的 K8S 管理工具,

    KubeClipper 基于 Kubeadm 封装,你可以通过 Web 界面、API,或命令行工具(kcctl)来管理主机节点,可以快速创建和删除 K8S 集群,并可以对已存在的 K8S 集群进行纳管、升级、配置变更、应用部署,以及扩、缩容等操作。

    KubeClipper 类似于 AutoK3S,区别是 AutoK3S 针对的是 K3S,而 KubeClipper 则面向标准 K8S 集群,提供生命周期管理服务。

    Ubuntu 23.10 将于今年 10 月发布。据称此版本将有新的“应用商店”首次亮相,其最显著的特性是优先支持 Snap 格式 (A ‘Snap-First App Store’),对 Deb 的支持则暂缓实现。

    有报道指出,新的“应用商店”基于去年由社区成员创建的非官方应用——Ubuntu Software,这是基于 Flutter 创建的 Ubuntu 桌面应用商店替代品。其界面如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    虽然它不是由 Canonical 开发(尽管 Canonical 员工贡献了代码),但 Canonical 的 Ubuntu 开发者员工表示有兴趣让它成为官方应用——最终得偿所愿。

    根据 Canonical 工程师 Oliver Grawert 的说法,Ubuntu 的下一个长期支持版本将有 2 个桌面版本可供下载:

    • 默认是基于 deb 格式的传统版本
    • 以及完全基于 Snap 格式构建的全新试验性版本

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    基于此策略,Ubuntu 工程总监表示,新的应用商店围绕 snap metadata 而设计。如果 Ubuntu 仓库和 snap 仓库中存在相同的软件,则新的应用商店将仅允许安装 snap 版本。

    他还说道,尝试将 deb 和 snap 作为同一应用程序的两个选项并不是我们的目标。这样做很难做到正确,并且限制了其他领域的设计选择。由于开发资源紧张,新应用商店对 Deb 的支持会暂缓实现。

    根据用户的体验,这款新的应用商店事实上允许安装 Deb 版本的软件,也可以作为 Snap 提供。它还可以仅搜索 Deb 软件以及更新 Deb 软件。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    在 libjpeg-turbo 3.0.0 刚完成发布之际,项目的首席开发人员 DRC 就表示,由于资金短缺,其未来的功能开发或将受到限制,可能永远不会有 libjpeg-turbo 3.1 版本。

    “我将继续修复 libjpeg-turbo 中的错误,并在 3.0.x 发行版系列中发布错误修复版本;但不会再有 libjpeg-turbo 3.1 发行版系列,除非该项目可以获得更多的通用资金。”

    libjpeg-turbo 是一个 JPEG 图像编解码器,它使用 SIMD 指令(MMX、SSE2、AVX2、Neon、AltiVec)来加速 x86、x86-64、Arm 和 PowerPC 系统上的基线 JPEG 压缩和解压缩,以及 x86、x86-64 和 Arm 系统的渐进式 JPEG 压缩。

    DRC 指出,目前 libjpeg-turbo 项目所拥有的资金严重不足。完成 3.0 beta 版本需要借用 2023 年所有预期的通用资金,修复所有 3.0 测试版之后的 bug 需要借用到 2024 年 9 月。按照这一发展趋势,那么 libjpeg-turbo 实际上将会处于一个“维护模式”。意味着其至少在接下来的 15 个月内,不会考虑任何新功能(即使是小功能),且技术支持也会受到限制。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    DRC 以维护三个开源项目为生,还有两个是 VirtualGL 和 TurboVNC。这些项目为一些企业节省了数百万美的劳动力和 IT 成本,但他形容自己的报酬水平是“比一个新手教师的工资还低”。DRC 解释称,这在美国是一个非常低的修辞基准。

    “我们这里的教育经费严重不足,就跟我们开源开发的经费严重不足一样。我通过独立的开放源码开发所赚到的钱大约是我的技能对企业雇主的价值的 20-25%,多年来我拒绝了此类雇主的无数邀请,以便继续全职从事这些 OSS 项目。我并不期望从开源开发中致富,但企业从我的工作中获得丰厚的利润,而我却被期望免费做这项工作,这也是不公平的。”

    DRC 的大部分收入来自 VirtualGL 和 TurboVNC 两个项目,而在 libjpeg-turbo 上的无偿劳动在分散他时间精力的同时,也在不断地消耗金钱成本。他透露,仅 2010-2018 年间就消耗了几十万美,直到 2018 年因 libjpeg-turbo 2.0 负债才不得不停止。

    “我在过去曾表示,独立的开源开发所需要的商业模式可能并不适合像 libjpeg-turbo 这样的关键基础设施项目。因此,我愿意被一个更大的组织收购,如果这个组织是不分操作系统和 CPU 的,并且对 libjpeg-turbo 的生存和开放都有既得利益。然而,我也不指望这样的提议会实现。在过去的 13 年里,我在 libjpeg-turbo 中建立了重要的价值–包括它的声誉、它的普遍性和它的用户社区–但它显然不是一棵摇钱树。不过,除非我能够获得足够的通用资金,以有意义的方式推进项目,否则唯一的选择就是收购(尽管不太可能)或在可预见的未来将项目置于维护模式。后者就是我们现在的情况。”

    2023 年 7 月 3 日,Waterfox 浏览器作者 Kontos 在官方博客上宣布,该浏览器已脱离广告公司 System1 ,再次转向独立。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Waterfox 是一个纯 64 位版的火狐浏览器,它使用 Firefox 官方源码,专门为 64 位 Windows 操作系统优化编译而成。

    Waterfox 支持任何官方火狐的扩展, 并在 Firefox 的基础上移除了影响用户隐私的数据收集、遥测和启动分析等功能。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    2019 – 2020 年前后,Waterfox 浏览器被广告公司  System1 收购。尽管被收购后 Kontos 仍然是 Waterfox 浏览器的首席开发人员, 但 System1 肯定对 waterfox 的开发有一定的发言权。

    此举引起了 waterfox 社区的不满,毕竟 waterfox 对比 Firefox 浏览器的最大好处就是去广告化、尊重隐私,如今被一个广告公司收购,与社区的意愿自然是背道而驰。

    如今 Kontos 与 System1 正义切割,使 Waterfox 再度转向独立。他在博客中感慨:

    我很高兴地宣布 Waterfox 再次独立了,这一变化使社区和我自己能够塑造 Waterfox浏览器的未来方向。

    在接下来的几个月中,我将努力改进浏览器,重点关注增强隐私、提高性能和扩展自定义选项的改进。

    Kontos 没有透露有关“再度独立”的更多详细信息,或与 System1 之间交易的具体细节。

    在宣布独立的同时,Waterfox 发布最新的小型版本 G5.1.9 ,相关信息可以在 changelog 中查看。

    据《华尔街日报》报道,美国政府正准备出台一系列措施,限制中国企业和个人使用美国的云计算服务,以保护美国的数据安全和技术优势。这些措施可能包括对云服务提供商的出口许可要求、对云服务用户的背景审查、对云服务内容的监管等。

    新规如果获得通过,可能会要求亚马逊和微软等美国云服务提供商需先经过政府许可,才能给中国提供 AI 芯片相关的云计算服务。

    美国商务部预计将在未来几周内实施该限制,作为 10 月份推出的半导体出口管制政策扩展的一部分。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    云计算是指通过互联网提供各种计算资源和服务的模式,包括存储、处理、分析、应用等。云计算市场规模巨大,预计到2025年将达到1.3万亿美。美国是云计算的领导者,拥有多家知名的云服务提供商,如亚马逊、微软、谷歌等。中国是云计算的快速发展者,拥有多家竞争力强劲的云服务提供商,如阿里巴巴、腾讯、华为等。

    相关链接、相关信息来源:

    https://www.reuters.com/technology/us-set-restrict-chinas-access-cloud-computing-wsj-2023-07-04/

    近日,《华尔街日报》报道了拜登政府准备进一步增强对中国区域的 AI 算力管控。除了 Nvidia A100、H100 等实体的 AI 计算芯片/显卡,美国政府还将禁止云服务厂商向中国客户提供 AI 算力的云服务。

    而作为对 AI 算力/半导体材料等贸易管控的回应,中国商务部、海关总署近日发布《关于对镓、锗相关物项实施出口管制的公告》,决定自 2023 年 8 月1日起对镓和锗两种关键半导体金属实行出口管制。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    根据声明,含锗和镓的出口贸易将需申请许可证,并向商务部报告海外买家的详细信息。其中,镓相关物项,包括金属镓(单质)、氮化镓、氧化镓、磷化镓、砷化镓、铟镓砷、硒化镓、锑化镓。锗相关物项包括金属锗、区熔锗锭、磷锗锌、外延生长衬底、二氧化锗、四氯化锗。满足上述特性的物项,未经许可,不得出口。

    砷化镓是一种含砷化合物,由于其比硅更耐热、耐湿和导电,被广泛用于高性能芯片。

    在镓和锗这两种广泛应用于新兴产业的金属原材料上,我国是全球的供应大国,其中镓产量占全球95%以上,锗产量占全球67%以上,主要供应美国、欧盟、日本和韩国等发达经济体。

    一、引言

    Excel表格在后台管理系统中使用非常广泛,多用来进行批量配置、数据导出工作。在日常开发中,我们也免不了进行Excel数据处理。

    那么,如何恰当地处理数据量庞大的Excel文件,避免内存溢出问题?本文将对比分析业界主流的Excel解析技术,并给出解决方案。

    如果这是您第一次接触Excel解析,建议您从第二章了解本文基础概念;如果您已经对POI有所了解,请跳转第三章阅读本文重点内容。

    二、基础篇-POI

    说到Excel读写,就离不开这个圈子的的老大哥——POI。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Apache POI是一款Apache软件基金会用Java编写的免费开源的跨平台的 Java API,全称Poor Obfuscation Implementation,“简洁版的模糊实现”。它支持我们用Java语言和包括Word、Excel、PowerPoint、Visio在内的所有Microsoft Office文档交互,进行数据读写和修改操作。

    (1)“糟糕”的电子表格

    在POI中,每种文档都有一个与之对应的文档格式,如97-2003版本的Excel文件(.xls),文档格式为HSSF——Horrible SpreadSheet Format,意为“糟糕的电子表格格式”。虽然Apache幽默而谦虚地将自己的API冠以“糟糕”之名,不过这确实是一款全面而强大的API。

    以下是部分“糟糕”的POI文档格式,包括Excel、Word等:

    Office文档 对应POI格式 Excel (.xls) HSSF (Horrible SpreadSheet Format) Word (.doc) HWPF (Horrible Word Processor Format) Visio (.vsd) HDGF (Horrible DiaGram Format) PowerPoint(.ppt) HSLF(Horrible Slide Layout Format)

    (2)OOXML简介

    微软在Office 2007版本推出了基于XML的技术规范:Office Open XML,简称OOXML。不同于老版本的二进制存储,在新规范下,所有Office文档都使用了XML格式书写,并使用ZIP格式进行压缩存储,大大提升了规范性,也提高了压缩率,缩小了文件体积,同时支持向后兼容。简单来说,OOXML定义了如何用一系列的XML文件来表示Office文档。

    Xlsx文件的本质是XML

    让我们看看一个采用OOML标准的Xlsx文件的构成。我们右键一个Xlsx文件,可以发现它可以被ZIP解压工具解压(或直接修改扩展名为.zip后解压),这说明:Xlsx文件是用ZIP格式压缩的。解压后,可以看到如下目录格式:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    打开其中的“/xl”目录,这是这个Excel的主要结构信息:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    其中workbook.xml存储了整个Excel工作簿的结构,包含了几张sheet表单,而每张表单结构存储在/wooksheets文件夹中。styles.xml存放单格的格式信息,/theme文件夹存放一些预定义的字体、颜色等数据。为了减少压缩体积,表单中所有的字符数据被统一存放在sharedStrings.xml中。经过分析不难发现,Xlsx文件的主体数据都以XML格式书写。

    XSSF格式

    为了支持新标准的Office文档,POI也推出了一套兼容OOXML标准的API,称作poi-ooxml。如Excel 2007文件(.xlsx)对应的POI文档格式为XSSF(XML SpreadSheet Format)。

    以下是部分OOXML文档格式:

    Office文档 对应POI格式 Excel (.xlsx) XSSF (XML SpreadSheet Format) Word (.docx) XWPF (XML Word Processor Format) Visio (.vsdx) XDGF (XML DiaGram Format) PowerPoint (.pptx) XSLF (XML Slide Layout Format)

    (3)UserModel

    在POI中为我们提供了两种解析Excel的模型,UserModel(用户模型)和EventModel(事件模型) 。两种解析模式都可以处理Excel文件,但解析方式、处理效率、内存占用量都不尽相同。最简单和实用的当属UserModel。

    UserModel & DOM解析

    用户模型定义了如下接口:

    1. Workbook-工作簿,对应一个Excel文档。根据版本不同,有HSSFWorkbook、XSSFWorkbook等类。

    2. Sheet-表单,一个Excel中的若干个表单,同样有HSSFSheet、XSSFSheet等类。

    3. Row-行,一个表单由若干行组成,同样有HSSFRow、XSSFRow等类。

    4. Cell-单格,一个行由若干单格组成,同样有HSSFCell、XSSFCell等类。

    用户模型示意

    可以看到,用户模型十分贴合Excel用户的习惯,易于理解,就像我们打开一个Excel表格一样。同时用户模型提供了丰富的API,可以支持我们完成和Excel中一样的操作,如创建表单、创建行、获取表的行数、获取行的列数、读写单格的值等。

    为什么UserModel支持我们进行如此丰富的操作?因为在UserModel中,Excel中的所有XML节点都被解析成了一棵DOM树,整棵DOM树都被加载进内存,因此可以进行方便地对每个XML节点进行随机访问

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    UserModel数据转换

    了解了用户模型,我们就可以直接使用其API进行各种Excel操作。当然,更方便的办法是使用用户模型将一个Excel文件转化成我们想要的Java数据结构,更好地进行数据处理。

    我们很容易想到关系型数据库——因为二者的实质是一样的。类比数据库的数据表,我们的思路就有了:

    1. 将一个Sheet看作表头和数据两部分,这二者分别包含表的结构和表的数据。

    2. 对表头(第一行),校验表头信息是否和实体类的定义的属性匹配。

    3. 对数据(剩余行),从上向下遍历每一个Row,将每一行转化为一个对象,每一列作为该对象的一个属性,从而得到一个对象列表,该列表包含Excel中的所有数据。

    接下来我们就可以按照我们的需求处理我们的数据了,如果想把操作后的数据写回Excel,也是一样的逻辑。

    使用UserModel

    让我们看看如何使用UserModel读取Excel文件。此处使用POI 4.0.0版本,首先引入poi和poi-ooxml依赖:

    
    

    我们要读取一个简单的Sku信息表,内容如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    如何将UserModel的信息转化为数据列表?

    我们可以通过实现反射+注解的方式定义表头到数据的映射关系,帮助我们实现UserModel到数据对象的转换。实现基本思路是: ① 自定义注解,在注解中定义列号,用来标注实体类的每个属性对应在Excel表头的第几列。 ② 在实体类定义中,根据表结构,为每个实体类的属性加上注解。 ③ 通过反射,获取实体类的每个属性对应在Excel的列号,从而到相应的列中取得该属性的值。

    以下是简单的实现,首先准备自定义注解ExcelCol,其中包含列号和表头:

    
    

    接下来,根据Sku字段定义Sku对象,并添加注解,列号分别为0,1,2,并指定表头名称:

    
    

    然后,用反射获取表头的每一个Field,并以列号为索引,存入Map中。从Excel的第二行开始(第一行是表头),遍历后面的每一行,对每一行的每个属性,根据列号拿到对应Cell的值,并为数据对象赋值。根据单格中值类型的不同,如文本/数字等,进行不同的处理。以下为了简化逻辑,只对表头出现的类型进行了处理,其他情况的处理逻辑类似。全部代码如下:

    
    

    最后,将转换完成的数据列表打印出来。运行结果如下:

    
    

    Tips:如果您的程序出现“NoClassDefFoundError”,请引入ooxml-schemas依赖:

    
    

    版本选择见下表,如POI 4.0.0对应ooxml-schemas 1.4版本:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    UserModel的局限

    以上处理逻辑对于大部分的Excel文件都很适用,但最大的缺点是内存开销大,因为所有的数据都被加载入内存。实测,以上3列的Excel文件在7万行左右就会出现OOM,而XLS文件最大行数为65535行,XLSX更是达到了行,如果将几万甚至百万级别的数据全部读入内存,内存溢出风险极高。

    那么,该如何解决传统UserModel无法处理大批量Excel的问题呢?开发者们给出了许多精彩的解决方案,请看下一章。

    三、进阶篇-内存优化的探索

    接下来介绍本文重点内容,同时解决本文所提出的问题:如何进行Excel解析的内存优化,从而处理百万行Excel文件?

    (1)EventModel

    前面我们提到,除了UserModel外,POI还提供了另一种解析Excel的模型:EventModel事件模型。不同于用户模型的DOM解析,事件模型采用了SAX的方式去解析Excel。

    EventModel & SAX解析

    SAX的全称是Simple API for XML,是一种基于事件驱动的XML解析方法。不同于DOM一次性读入XML,SAX会采用边读取边处理的方式进行XML操作。简单来讲,SAX解析器会逐行地去扫描XML文档,当遇到标签时会触发解析处理器,从而触发相应的事件Handler。我们要做的就是继承DefaultHandler类,重写一系列事件处理方法,即可对Excel文件进行相应的处理。

    下面是一个简单的SAX解析的示例,这是要解析的XML文件:一个sku表,其中包含两个sku节点,每个节点有一个id属性和三个子节点。

    
    

    对照XML结构,创建Java实体类:

    
    

    自定义事件处理类SkuHandler:

    
    

    其中,SkuHandler重写了三个事件响应方法:

    startElement()——每当扫描到新XML素时,调用此方法,传入XML标签名称qName,XML属性列表attributes;

    characters()——每当扫描到未在XML标签中的字符串时,调用此方法,传入字符数组、起始下标和长度;

    endElement()——每当扫描到XML素的结束标签时,调用此方法,传入XML标签名称qName。

    我们用一个变量tagName存储当前扫描到的节点信息,每次扫描节点发送变化时,更新tagName;

    用一个Sku实例维护当前读入内存的Sku信息,每当该Sku读取完成时,我们打印该Sku信息,并执行相应业务逻辑。这样,就可以做到一次读取一条Sku信息,边解析边处理。由于每行Sku结构相同,因此,只需要在内存维护一条Sku信息即可,避免了一次性把所有信息读入内存。

    调用SAX解析器时,使用SAXParserFactory创建解析器实例,解析输入流即可,Main方法如下:

    
    

    输出结果如下:

    
    

    以上演示了SAX解析的基础原理。EventModel的API更复杂,同样通过重写Event handler,实现SAX解析。有兴趣的读者,请参见POI官网的示例代码: https://poi.apache.org/components/spreadsheet/how-to.html

    EventModel的局限

    POI官方提供的EventModel API虽然使用SAX方式解决了DOM解析的问题,但是存在一些局限性:

    ① 属于low level API,抽象级别低,相对比较复杂,学习使用成本高。

    ② 对于HSSF和XSSF类型的处理方式不同,代码需要根据不同类型分别做兼容。

    ③ 未能完美解决内存溢出问题,内存开销仍有优化空间。

    ④ 仅用于Excel解析,不支持Excel写入。

    因此,笔者不建议使用POI原生的EventModel,至于有哪些更推荐的工具,请看下文。

    (2)SXSSF

    SXSSF简介

    SXSSF,全称Streaming XML SpreadSheet Format,是POI 3.8-beta3版本后推出的低内存占用的流式Excel API,旨在解决Excel写入时的内存问题。它是XSSF的扩展,当需要将大批量数据写入Excel中时,只需要用SXSSF替换XSSF即可。SXSSF的原理是滑动窗口——在内存中保存一定数量的行,其余行存储在磁盘。这么做的好处是内存优化,代价是失去了随机访问的能力。SXSSF可以兼容XSSF的绝大多数API,非常适合了解UserModel的开发者。

    内存优化会难以避免地带来一定限制:

    ① 在某个时间点只能访问有限数量的行,因为其余行并未被加载入内存。

    ② 不支持需要随机访问的XSSF API,如删除/移动行、克隆sheet、公式计算等。

    ③ 不支持Excel读取操作。

    ④ 正因为它是XSSF的扩展,所以不支持写入Xls文件。

    UserModel、EventModel、SXSSF对比

    到这里就介绍完了所有的POI Excel API,下表是所有这些API的功能对比,来自POI官网:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    可以看到,UserModel基于DOM解析,功能是最齐全的,支持随机访问,唯一缺点是CPU和内存效率不稳定;

    EventModel是POI提供的流式读取方案,基于SAX解析,仅支持向前访问,其余API不支持;

    SXSSF是POI提供的流式写入方案,同样仅能向前访问,支持部分XSSF API。

    (3)EasyExcel

    EasyExcel简介

    为了解决POI原生的SAX解析的问题,阿里基于POI二次开发了EasyExcel。下面是引用自EasyExcel官网的介绍:

    Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。

    如介绍所言,EasyExcel同样采用SAX方式解析,但由于重写了xlsx的SAX解析,优化了内存开销;对xls文件,在上层进一步进行了封装,降低了使用成本。API上,采用注解的方式去定义Excel实体类,使用方便;通过事件监听器的方式做Excel读取,相比于原生EventModel,API大大简化;写入数据时,EasyExcel对大批数据,通过重复多次写入的方式从而降低内存开销。

    EasyExcel最大的优势是使用简便,十分钟可以上手。由于对POI的API都做了高级封装,所以适合不想了解POI基础API的开发者。总之,EasyExcel是一款值得一试的API。

    使用EasyExcel

    引入easyexcel依赖:

    
    

    首先,用注解定义Excel实体类:

    
    

    接下来,重写AnalysisEventListener中的invoke和doAfterAllAnalysed方法,这两个方法分别在监听到单行解析完成的事件时和全部解析完成的事件时调用。每次单行解析完成时,我们打印解析结果,代码如下:

    
    

    测验一下,用它解析一个十万行的excel,该文件用UserModel读取会OOM,如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    运行结果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    (4)Xlsx-streamer

    Xlsx-streamer简介

    Xlsx-streamer是一款用于流式读取Excel的工具,同样基于POI二次开发。虽然EasyExcel可以很好地解决Excel读取的问题,但解析方式为SAX,需要通过实现监听器以事件驱动的方式进行解析。有没有其他的解析方式呢?Xlsx-streamer给出了答案。

    译自官方文档的描述:

    如果您过去曾使用 Apache POI 读取 Excel 文件,您可能会注意到它的内存效率不是很高。 阅读整个工作簿会导致严重的内存使用高峰,这会对服务器造成严重破坏。 Apache 必须读取整个工作簿的原因有很多,但其中大部分与该库允许您使用随机地址进行读写有关。 如果(且仅当)您只想以快速且内存高效的方式读取 Excel 文件的内容,您可能不需要此功能。 不幸的是,POI 库中唯一用于读取流式工作簿的东西要求您的代码使用类似 SAX 的解析器。 该 API 中缺少所有友好的类,如 Row 和 Cell。 该库充当该流式 API 的包装器,同时保留标准 POI API 的语法。 继续阅读,看看它是否适合您。 注意:这个库只支持读取 XLSX 文件。

    如介绍所言,Xlsx-streamer最大的便利之处是兼容了用户使用POI UserModel的习惯,它对所有的UserModel接口都给出了自己的流式实现,如StreamingSheet、StreamingRow等,对于熟悉UserModel的开发者来说,几乎没有学习门槛,可以直接使用UserModel访问Excel。

    Xlsx-streamer的实现原理和SXSSF相同,都是滑动窗口——限定读入内存中的数据大小,将正在解析的数据读到内存缓冲区中,形成一个临时文件,以防止大量使用内存。缓冲区的内容会随着解析的过程不断变化,当流关闭后,临时文件也将被删除。由于内存缓冲区的存在,整个流不会被完整地读入内存,从而防止了内存溢出。

    与SXSSF一样,因为内存中仅加载入部分行,故牺牲了随机访问的能力,仅能通过遍历顺序访问整表,这是不可避免的局限。换言之,如果调用StreamingSheet.getRow(int rownum)方法,该方法会获取sheet的指定行,会抛出“不支持该操作”的异常。

    Xlsx-streamer最大的优势是兼容UserModel,尤其适合那些熟悉UserModel又不想使用繁琐的EventModel的开发者。它和SXSSF一样,都通过实现UserModel接口的方式给出解决内存问题的方案,很好地填补了SXSSF不支持读取的空白,可以说它是“读取版”的SXSSF。

    使用Xlsx-streamer

    引入pom依赖:

    
    

    下面是一个使用xlsx-streamer的demo:

    
    

    如代码所示,Xlsx-streamer的使用方法为:使用StreamingReader进行参数配置和流式读取,我们可以手动配置固定的滑动窗口大小,有两个指标,分别是缓存在内存中的最大行数和缓存在内存的最大字节数,这两个指标会同时限制该滑动窗口的上限。接下来,我们可以使用UserModel的API去遍历访问读到的表格。

    使用十万行量级的excel文件实测一下,运行结果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    StAX解析

    Xlsx-streamer底层采用的解析方式,被称作StAX解析。StAX于2004年3月在JSR 173规范中引入,是JDK 6.0推出的新特性。它的全称是Streaming API for XML,流式XML解析。更准确地讲,称作“流式拉分析”。之所以称作拉分析,是因为它和“流式推分析”——SAX解析相对。

    之前我们提到,SAX解析是一种事件驱动的解析模型,每当解析到标签时都会触发相应的事件Handler,将事件“推”给响应器。在这样的推模型中,解析器是主动,响应器是被动,我们不能选择想要响应哪些事件,因此这样的解析比较不灵活。

    为了解决SAX解析的问题,StAX解析采用了“拉”的方式——由解析器遍历流时,原来的响应器变成了驱动者,主动遍历事件解析器(迭代器),从中拉取一个个事件并处理。在解析过程中,StAX支持使用peek()方法来”偷看”下一个事件,从而决定是否有必要分析下一个事件,而不必从流中读取事件。这样可以有效提高灵活性和效率。

    下面用StAX的方式再解析一下相同的XML:

    
    

    这次我们不需要监听器,把所有处理的逻辑集成在一个方法中:

    
    

    以上代码与SAX解析的逻辑是等价的,用XMLEventReader作为迭代器从流中读取事件,循环遍历事件迭代器,再根据事件类型做分类处理。有兴趣的小伙伴可以自己动手尝试一下,探索更多StAX解析的细节。

    四、结论

    EventModel、SXSSF、EasyExcel和Xlsx-streamer分别针对UserModel的内存占用问题给出了各自的解决方案,下面是对所有本文提到的Excel API的对比:

      UserModel EventModel SXSSF EasyExcel Xlsx-streamer 内存占用量 高 较低 低 低 低 全表随机访问 是 否 否 否 否 读Excel 是 是 否 是 是 读取方式 DOM SAX — SAX StAX 写Excel 是 是 是 是 否

    建议您根据自己的使用场景选择适合的API:

    1. 处理大批量Excel文件的需求,推荐选择POI UserModel、EasyExcel;

    2. 读取大批量Excel文件,推荐选择EasyExcel、Xlsx-streamer;

    3. 写入大批量Excel文件,推荐选择SXSSF、EasyExcel。

    使用以上API,一定可以满足关于Excel开发的需求。当然Excel API不止这些,还有许多同类型的API,欢迎大家多多探索和创新。

    页面链接:

    POI官网: https://poi.apache.org/

    EasyExcel官网:https://easyexcel.opensource.alibaba.com

    Xlsx-streamer Github: https://github.com/monitorjbl/excel-streaming-reader

    作者:京东保险 孙昊宇

    来源:京东云开发者社区

    Leafer UI 是基于 Leafer 开发的一套绚丽多彩的 UI 绘图框架,可结合 AI 绘图、生成界面。

    提供了常用的 UI 绘图组件,和开箱即用的功能,方便与 Figma、Sketch 等产品进行数据交换,并为跨平台开发提供了统一、丰富的交互事件,如拖拽、旋转、缩放手势等。

    目标与意义

    Leafer UI 致力于实现一套简洁、开放、现代化的 UI 绘图语言标准,表现力丰富,并提供跨平台、轻量化、高性能的运行时。

    让不同的软件之间能够沟通、协作、共享绘图数据,让数字化产品开发可以更快、更简单。

    通过不断革新的图形渲染技术、配套支持, 吸引更多的开发者加入使用,建立起一个开放的生态环境,沟通有无,互相从中受益,推动行业的快速发展,并诞生出更多有创意的技术和产品。

    我们正在坚定的向这个目标持续前进,可以通过 开发计划 了解更多信息。

    资源

    官方网站

    快速上手

    快速安装

    License

    Leafer UI 是采用 MIT 许可的开源项目,可以永久免费使用。

    本文主要记录了MySQL管理端口无法登录的排查过程,以及预防 too many connections 的一些建议。

    作者:吕虎桥

    爱可生DBA 团队成员,主要负责 DMP 平台和 MySQL 数据库的日常运维及故障处理。

    本文来源:原创投稿

    • 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

    背景描述

    MySQL 8.0.14 版本中引入了 参数,用于提供一个管理端口来处理 报错。最近一套 MySQL 8.0 实例出现 报错,尝试通过管理端口登录,但是仍然提示该报错。跟业务部门协商之后,调大了连接数,重启数据库恢复业务。为什么配置了 却没有生效呢,带着疑问做了如下测试。

    场景复现

    管理端口相关参数

    
    

    模拟故障现象

    调小 参数,模拟出现 报错。

    
    

    故障分析

    疑问

    为啥连接数没打满的情况下, 账号可以通过 33062 端口登录?

    
    

    socket 连接会忽略指定的端口,即便是指定一个不存在的端口也是可以登录的,也就是说 socket 连接并没有通过管理端口登录,所以在连接数打满的情况下,使用 socket 登录依然会报错。

    
    

    登录地址

    查看 33062 端口是监听在 ,并不是参数里边配置的 。

    
    

    查看 MySQL 官方文档发现 支持设置为 IPv4IPv6 或者 hostname。如果该值是主机名,则服务器将该名称解析为 IP 地址并绑定到该地址。如果一个主机名可以解析多个 IP 地址,如果有 IPv4 地址,服务器使用第一个 IPv4 地址,否则使用第一个 IPv6 地址,所以这里把 解析为了 。

    If admin_address is specified, its value must satisfy these requirements:

    • The value must be a single IPv4 address, IPv6 address, or host name.
    • The value cannot specify a wildcard address format (*, 0.0.0.0, or ::).
    • As of MySQL 8.0.22, the value may include a network namespace specifier.

    An IP address can be specified as an IPv4 or IPv6 address. If the value is a host name, the server resolves the name to an IP address and binds to that address. If a host name resolves to multiple IP addresses, the server uses the first IPv4 address if there are any, or the first IPv6 address otherwise.

    指定 为主机名,测试效果。

    
    

    再次尝试

    尝试使用 地址登录。

    
    

    故障解决

    设置 为 ,并添加管理账号。

    
    

    MySQL 管理端口配置总结

    1. 通过 设置为固定的 IP 地址,例如 ,避免设置为 引起的不确定因素。
    2. MySQL 部署好之后,新建可以通过 地址登录的管理员账号,例如 。

    一些优化建议

    1. 最小化权限配置,除管理员之外其他账号一律不允许配置 或者 权限。
    2. 应用端(Tomcat、JBoss 、Wildfly 等)配置数据源连接池,声明 、 属性值,控制连接数的无限增长。
    3. 及时优化 SQL,防止因性能问题引起的并发操作导致数据库连接数打满。

    关于 SQLE

    爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。

    SQLE 获取

    类型 地址 版本库 https://github.com/actiontech/sqle 文档 https://actiontech.github.io/sqle-docs/ 发布信息 https://github.com/actiontech/sqle/releases 数据审核插件开发文档 https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html

    新内容 (06/2023): 这篇博文受到 “在多语言 ASR 上微调 XLS-R” 的强烈启发,可以看作是它的改进版本。

    Wav2Vec2 是自动语音识别 (ASR) 的预训练模型,由 Alexei Baevski、Michael AuliAlex Conneau 于 2020 年 9 月 发布。其在最流行的 ASR 英语数据集之一 LibriSpeech 上展示了 Wav2Vec2 的强大性能后不久, Facebook AI 就推出了 Wav2Vec2 的两个多语言版本,称为 XLSR 和 XLM-R,能够识别多达 128 种语言的语音。XLSR 代表 跨语言语音表示 ,指的是模型学习跨多种语言有用的语音表示的能力。

    Meta AI 的最新版本,大规模多语言语音 (MMS),由 Vineel Pratap、Andros Tjandra、Bowen Shi 等人编写。将多语言语音表示提升到一个新的水平。通过发布的各种 语言识别、语音识别和文本转语音检查点,可以识别、转录和生成超过 1,100 多种口语。

    在这篇博文中,我们展示了 MMS 的适配器训练如何在短短 10-20 分钟的微调后实现惊人的低单词错误率。

    对于资源匮乏的语言,我们 强烈 建议使用 MMS 的适配器训练,而不是像 “在多语言 ASR 上微调 XLS-R” 中那样微调整个模型。

    在我们的实验中,MMS 的适配器训练不仅内存效率更高、更稳健,而且对于低资源语言也能产生更好的性能。对于中到高资源语言,微调整个检查点而不是使用适配器层仍然是有利的。

    保护世界语言多样性

    根据 https://www.ethnologue.com/ 的数据,大约 3000 种语言 (即所有“现存”语言的 40%) 由于母语人士越来越少而濒临灭绝。这种趋势只会在日益全球化的世界中持续下去。

    MMS 能够转录许多濒临灭绝的语言,例如 AriKaivi 。未来,MMS 可以通过帮助剩余的使用者创建书面记录并用母语进行交流,这在保持语言活力方面发挥至关重要的作用。

    为了适应 1000 多个不同的词汇表,MMS 使用适配器 (Adapters) – 一种仅训练一小部分模型权重的训练方法。

    适配器层就像语言桥梁一样,使模型能够在解读另一种语言时利用一种语言的知识。

    微调 MMS

    MMS 无监督检查点使用 1,400 多种语言的超过 50 万 小时的音频进行了预训练,参数范围从 3 亿到 10 亿不等。

    你可以在 🤗 Hub 上找到 3 亿个参数 (300M) 和 10 亿个参数 (1B) 模型大小的仅预训练检查点:

    注意 : 如果你想微调基本模型,可以按照 “在多语言 ASR 上微调 XLS-R” 中所示的完全相同的方式进行操作。

    与 BERT 的掩码语言建模目标 类似,MMS 通过随机遮蔽特征向量来学习上下文语音表示,然后在自监督预训练期间将其传递到 Transformer 网络。

    对于 ASR,预训练 MMS-1B 检查点 通过联合词汇输出层以监督方式对 1000 多种语言进行了进一步微调。最后一步,联合词汇输出层被丢弃,并保留特定于语言的适配器层。每个适配器层 包含约 2.5M 权重,由每个注意力块的小型线性投影层以及特定于语言的词汇输出层组成。

    已发布针对语音识别 (ASR) 进行微调的三个 MMS 检查点。它们分别包括 102、1107 和 1162 个适配器权重 (每种语言一个):

    你可以看到基本模型 (像往常一样) 保存为文件 ,但此外这些存储库还存储了许多适配器权重, 例如 针对法国的 。

    Hugging Face 文档很好地 解释了如何使用此类检查点进行推理,因此在这篇博文中,我们将重点学习如何基于任何已发布的 ASR 检查点有效地训练高性能适配器模型。

    训练自适应权重

    在机器学习中,适配器是一种用于微调预训练模型同时保持原始模型参数不变的方法。他们通过在模型的现有层之间插入小型可训练模块 (称为 适配器层) 来实现此目的,然后使模型适应特定任务,而无需进行大量的重新训练。

    适配器在语音识别,尤其是 说话人识别 方面有着悠久的历史。在说话人识别中,适配器已被有效地用于调整预先存在的模型,以识别单个说话人的特质,正如 Gales 和 Woodland (1996) 以及 Miao 等人 (2014) 的工作中所强调的那样。与训练完整模型相比,这种方法不仅大大降低了计算要求,而且使得特定于说话者的调整更好、更灵活。

    MMS 中完成的工作利用了跨不同语言的语音识别适配器的想法。对少量适配器权重进行了微调,以掌握每种目标语言独特的语音和语法特征。因此,MMS 使单个大型基础模型 (例如 mms-1b-all 模型检查点) 和 1000 多个小型适配器层 (每个 2.5M 权重 mms-1b-all) 能够理解和转录多种语言。这极大地减少了为每种语言开发不同模型的计算需求。

    棒极了!现在我们了解其动机和理论,下面让我们研究一下 mms-1b-all 🔥的适配器权重微调

    Notebook 设置

    正如之前在 “多语言 ASR 上微调 XLS-R” 博客文章中所做的那样,我们在 Common Voice 的低资源 ASR 数据集上微调模型,该数据集仅包含 ca. 4 小时经过验证的训练数据。

    就像 Wav2Vec2 或 XLS-R 一样,MMS 使用连接时序分类 (CTC) 进行微调,CTC 是一种用于训练神经网络解决序列到序列问题 (例如 ASR 和手写识别) 的算法。

    有关 CTC 算法的更多详细信息,我强烈建议阅读 Awni Hannun 的写得很好的一篇博客文章 Sequence Modeling with CTC (2017)

    在我们开始之前,让我们安装 和 。此外,我们需要 来加载音频文件,以及使用 字错误率 (WER) 指标 ( {}^1 ) 评估我们微调后的模型,因此也需要安装 。

     

    我们强烈建议你在训练时将训练检查点直接上传到 🤗 Hub。Hub 存储库内置了版本控制,因此你可以确保在训练期间不会丢失任何模型检查点。

    为此,你必须存储来自 Hugging Face 网站的身份验证令牌 (如果你还没有注册,请在 此处 注册!)

     

    准备数据、分词器、特征提取器

    ASR 模型将语音转录为文本,这意味着我们需要一个将语音信号处理为模型输入格式 (例如特征向量) 的特征提取器,以及一个将模型输出格式处理为文本的分词器。

    在🤗 Transformers 中,MMS 模型同时伴随着一个名为 Wav2Vec2FeatureExtractor 的特征提取器和一个名为 Wav2Vec2CTCTokenizer 的分词器。

    我们首先创建标记生成器,将预测的输出类解码为输出转录。

    创建

    微调的 MMS 模型,例如 mms-1b-all 已经有一个伴随模型检查点的 分词器。然而,由于我们想要在某种语言的特定低资源数据上微调模型,因此建议完全删除分词器和词汇输出层,并根据训练数据本身创建新的。

    在 CTC 上微调的类似 Wav2Vec2 的模型通过一次前向传递来转录音频文件,首先将音频输入处理为一系列经过处理的上下文表示,然后使用最终的词汇输出层将每个上下文表示分类为表示该字符的字符转录。

    该层的输出大小对应于词汇表中的标记数量,我们将从用于微调的标记数据集中提取该词汇表。因此,第一步,我们将查看所选的 Common Voice 数据集,并根据转录定义词汇表。

    对于本 notebook,我们将使用 Common Voice 的 6.1 土耳其语数据集。土耳其语对应于语言代码 。

    太好了,现在我们可以使用 🤗 Datasets 的简单 API 来下载数据了。数据集名称是 ,配置名称对应于语言代码,在我们的例子中是 。

    注意: 在下载数据集之前,你必须登录你的 Hugging Face 帐户,进入 数据集存储库页 面并单击“同意并访问存储库”来访问它

    Common Voice 有许多不同的分割,其中包括 ,它指的是未被评为“足够干净”而被认为有用的数据。在此 notebook 中,我们将仅使用拆分的 , 和 。

     

    许多 ASR 数据集仅提供每个音频数组 () 和文件 () 的目标文本 ()。实际上,Common Voice 提供了关于每个音频文件的更多信息,例如 等。为了使 notebook 尽可能通用,我们仅考虑用于微调的转录文本。

     

    让我们编写一个简短的函数来显示数据集的一些随机样本,并运行它几次以了解转录的感觉。

     
     
     

    好吧!转录看起来相当干净。翻译完转录的句子后,这种语言似乎更多地对应于书面文本,而不是嘈杂的对话。考虑到 Common Voice 是一个众包阅读语音语料库,这也解释的通。

    我们可以看到,转录文本中包含一些特殊字符,如 。没有语言模型,要将语音块分类为这些特殊字符就更难了,因为它们并不真正对应于一个特征性的声音单。例如,字母 有一个或多或少清晰的声音,而特殊字符 则没有。此外,为了理解语音信号的含义,通常不需要在转录中包含特殊字符。

    让我们简单地删除所有对单词的含义没有贡献并且不能真正用声音表示的字符,并对文本进行规范化。

     
     

    我们再看看处理后的文本标签。

     
     

    好!这看起来更好了。我们已经从转录中删除了大多数特殊字符,并将它们规范化为仅小写。

    在完成预处理之前,咨询目标语言的母语人士总是有益的,以查看文本是否可以进一步简化。 对于这篇博客文章,Merve 很友好地快速查看了一下,并指出带帽子的字符 (如 ) 在土耳其语中已经不再使用,可以用它们的无帽子等效物 (例如 ) 替换。

    这意味着我们应该将像 这样的句子替换为 。

    让我们再写一个简短的映射函数来进一步简化文本标签。记住 – 文本标签越简单,模型学习预测这些标签就越容易。

     
     

    在 CTC 中,将语音块分类为字母是很常见的,所以我们在这里也做同样的事情。让我们提取训练和测试数据中所有不同的字母,并从这组字母中构建我们的词汇表。

    我们编写一个映射函数,将所有转录连接成一个长转录,然后将字符串转换为一组字符。将参数传递 给 函数非常重要,以便映射函数可以立即访问所有转录。

     
     

    现在,我们创建训练数据集和测试数据集中所有不同字母的并集,并将结果列表转换为枚举字典。

     
     
     

    很酷,我们看到字母表中的所有字母都出现在数据集中 (这并不令人惊讶),我们还提取了特殊字符 和  。请注意,我们没有排除这些特殊字符,因为模型必须学会预测单词何时结束,否则预测将始终是一系列字母,这将使得不可能将单词彼此分开。

    人们应该始终记住,在训练模型之前,预处理是一个非常重要的步骤。例如,我们不希望我们的模型仅仅因为我们忘记规范化数据而区分 和 。 和 之间的区别根本不取决于字母的“声音”,而更多地取决于语法规则 – 例如,在句子开头使用大写字母。因此,删除大写字母和非大写字母之间的差异是明智的,这样模型在学习转录语音时就更容易了。

    为了更清楚地表明 具有自己的标记类别,我们给它一个更明显的字符 。此外,我们还添加了一个“未知”标记,以便模型以后能够处理 Common Voice 训练集中未遇到的字符。

     

    最后,我们还添加了一个对应于 CTC 的“空白标记”的填充标记。 “空白标记”是 CTC 算法的核心组成部分。欲了解更多信息,请查看 此处 的“对齐”部分。

     
     

    很酷,现在我们的词汇表已经完成,包含 37 个标记,这意味着我们将作为适配器权重的一部分添加在预训练的 MMS 检查点顶部的线性层将具有 37 的输出维度。

    由于单个 MMS 检查点可以为多种语言提供定制权重,因此分词器也可以包含多个词汇表。因此,我们需要嵌套我们的 ,以便将来可能向词汇表中添加更多语言。字典应该嵌套使用适配器权重的名称,并在分词器配置中以 的名称保存。

    让我们像原始的 检查点一样使用 ISO-639-3 语言代码。

     

    让我们定义一个空字典,我们可以在其中添加刚刚创建的词汇表

     

    注意: 如果你想使用此 notebook 将新的适配器层添加到 现有模型仓库 ,请确保 不要 创建一个空的新词汇表,而是重用已经存在的词汇表。为此,你应该取消注释以下单格,并将 替换为你要添加适配器权重的模型仓库 ID。

     

    现在让我们将词汇表保存为 json 文件。

     

    最后一步,我们使用 json 文件将词汇表加载到类的实例中 。

     

    如果想要在本 notebook 的微调模型中重用刚刚创建的分词器,强烈建议将 上传到 🤗 Hub。让我们将上传文件的仓库命名为 :

     

    并将分词器上传到 🤗 Hub。

     
     

    太好了,你可以在下面看到刚刚创建的存储库

    创建

    语音是一个连续的信号,要被计算机处理,首先必须离散化,这通常被称为 采样。采样率在这里起着重要的作用,它定义了每秒测量语音信号的数据点数。因此,采用更高的采样率采样会更好地近似 真实 语音信号,但也需要每秒更多的值。

    预训练检查点期望其输入数据与其训练数据的分布大致相同。两个不同采样率采样的相同语音信号具有非常不同的分布,例如,将采样率加倍会导致数据点数量加倍。因此,在微调 ASR 模型的预训练检查点之前,必须验证用于预训练模型的数据的采样率与用于微调模型的数据集的采样率是否匹配。 对象需要以下参数才能实例化:

    • : 语音模型以特征向量序列作为输入。虽然这个序列的长度显然会变化,但特征大小不应该变化。在 Wav2Vec2 的情况下,特征大小为 1,因为该模型是在原始语音信号上训练的 ( {}^2 )。

    • : 模型训练时使用的采样率。

    • : 对于批量推理,较短的输入需要用特定值填充

    • : 输入是否应该进行 零均值单位方差 归一化。通常,语音模型在归一化输入时表现更好

    • : 模型是否应该使用 进行批量推理。通常情况下,XLS-R 模型检查点应该 始终 使用

     

    太好了,MMS 的特征提取管道已经完全定义!

    为了提高用户友好性,特征提取器和分词器被 封装 到一个 类中,这样只需要一个 和   对象。

     

    接下来,我们可以准备数据集。

    预处理数据

    到目前为止,我们还没有看过语音信号的实际值,只看过转录。除了 ,我们的数据集还包括另外两个列名 和  。 表示音频文件的绝对路径, 表示已经加载的音频数据。MMS 期望输入格式为 16kHz 的一维数组。这意味着音频文件必须加载并重新采样。

    值得庆幸的是,当列名为 时, 会自动完成这一操作。让我们试试。

     
     

    在上面的示例中,我们可以看到音频数据以 48kHz 的采样率加载,而模型期望的是 16kHz,正如我们所见。我们可以通过使用 将音频特征设置为正确的采样率:

     

    我们再来看一下 。

     
     

    这似乎奏效了!让我们通过打印语音输入的形状、转录内容和相应的采样率来最后检查数据是否准备正确。

     
     

    很好!一切看起来都很棒 – 数据是一维数组,采样率始终对应于 16kHz,并且目标文本已标准化。

    最后,我们可以利用 将数据处理成 训练所需的格式。为此,让我们利用 Dataset 的 函数。

    首先,我们通过调用 来加载并重新采样音频数据。
    其次,我们从加载的音频文件中提取 。在我们的情况下, 只规范化数据。然而,对于其他语音模型,这一步可能包括更复杂的特征提取,例如 Log-Mel 特征提取。
    第三,我们将转录编码为标签 id。

    注意: 这个映射函数是一个很好的例子,说明了如何使用 类。在“正常”情况下,调用 会重定向到 的调用方法。然而,当将处理器封装到 上下文中时,同一个方法会重定向到 的调用方法。 欲了解更多信息,请查看 文档。

     

    让我们将数据准备功能应用到所有示例中。

     

    注意: 自动处理音频加载和重新采样。如果你希望实现自己的定制数据加载/采样,请随意使用该 列并忽略该 列。

    太棒了,现在我们准备开始训练了!

    训练

    数据已经处理好,我们准备开始设置训练流程。我们将使用 🤗 的 Trainer,为此我们基本上需要做以下几件事:

    • 定义一个数据整理器。与大多数 NLP 模型不同,MMS 的输入长度比输出长度大得多。例如,输入长度为 50000 的样本的输出长度不超过 100。鉴于输入大小较大,动态填充训练批次更为高效,这意味着所有训练样本只应填充到其批次中最长的样本,而不是整体最长的样本。因此,微调 MMS 需要一个特殊的填充数据整理器,我们将在下面定义它

    • 评估指标。在训练过程中,模型应该根据字错误率进行评估。我们应该相应地定义一个 函数

    • 加载预训练检查点。我们需要加载预训练检查点并正确配置它进行训练。

    • 定义训练配置。

    在微调模型之后,我们将正确地在测试数据上评估它,并验证它是否确实学会了正确转录语音。

    设置 Trainer

    让我们从定义数据整理器开始。数据整理器的代码是从 这个示例 中复制的。

    不详细讲述,与常见的数据整理器不同,这个数据整理器分别对待 和  ,因此对它们应用两个单独的填充函数 (再次利用 MMS 处理器的上下文管理器)。这是必要的,因为在语音识别中,输入和输出属于不同的模态,因此它们不应该被相同的填充函数处理。 与常见的数据整理器类似,标签中的填充标记用 填充,以便在计算损失时 考虑这些标记。

     
     

    接下来,定义评估指标。如前所述,ASR 中的主要指标是单词错误率 (WER),因此我们也将在本 notebook 中使用它。

     

    模型将返回一系列 logit 向量: ( mathbf{y}_1, ldots, mathbf{y}_m ) 其中 ( mathbf{y} 1 = f{ heta}(x_1, ldots, x_n)[0] ) 且  ( n >> m )。

    logit 向量 ( mathbf{y}_1 ) 包含我们前面定义的词汇表中每个单词的对数几率,因此 ( ext{len}(mathbf{y}_i) = ) 。我们对模型最可能的预测感兴趣,因此取 logits 的  。此外,我们通过将 替换为 并解码 id,同时确保连续标记 以 CTC 风格分组到同一标记 ( {}^1 ),将编码后的标签转换回原始字符串。

     

    现在,我们可以加载预训练的 检查点。分词器的 必须定义模型的 ,或者在 的情况下也是 CTC 的 空白标记 ( {}^2 )。

    由于我们只训练一小部分权重,模型不容易过拟合。因此,我们确保禁用所有 dropout 层。

    注意: 当使用本笔记本在 Common Voice 的另一种语言上训练 MMS 时,这些超参数设置可能不会很好地工作。根据你的用例,随意调整这些设置。

     
     

    注意: 预计一些权重将被重新初始化。这些权重对应于新初始化的词汇输出层。

    我们现在希望确保只有适配器权重将被训练,而模型的其余部分保持冻结。

    首先,我们重新初始化所有适配器权重,这可以通过方便的 方法完成。也可以不重新初始化适配器权重并继续微调,但在这种情况下,在训练之前应该通过 方法 加载合适的适配器权重。然而,词汇表通常仍然不会很好地匹配自定义训练数据,因此通常更容易重新初始化所有适配器层,以便它们可以轻松地进行微调。

     

    接下来,我们冻结 适配器层之外的所有权重。

     

    最后一步,我们定义与训练相关的所有参数。 对一些参数进行更多解释:

    • 通过将输入长度相似的训练样本分组到一个批次中,使训练更加高效。这可以通过大大减少通过模型传递的无用填充标记的总数,从而显著加快训练时间

    • 被选择为 1e-3,这是使用 Adam 训练的常用默认值。其他学习率可能同样有效。

    有关其他参数的更多解释,可以查看 文档。为了节省 GPU 内存,我们启用 PyTorch 的 梯度检查点,并将损失减少设置为“ mean ”。MMS 适配器微调非常快地收敛到非常好的性能,因此即使对于像 4 小时这样小的数据集,我们也只会训练 4 个周期。在训练过程中,每 200 个训练步骤将异步上传一个检查点到 hub。它允许你在模型仍在训练时也可以使用演示小部件玩耍。

    注意: 如果不想将模型检查点上传到 hub,只需将 即可。

     

    现在,所有实例都可以传递给 Trainer,我们准备开始训练!

     

    ( {}^1 ) 为了使模型独立于说话人速率,在 CTC 中,相同的连续标记简单地分组为单个标记。然而,在解码时不应该对编码的标签进行分组,因为它们不对应于模型的预测标记,这就是为什么必须传递 参数。如果我们不传递这个参数,像 这样的单词会被错误地编码,并解码为 。

    ( {}^2 ) 空白标记允许模型通过强制在两个 l 之间插入空白标记来预测一个词,例如 。我们模型的 CTC 符合预测 将是 。

    训练

    训练时间应该少于 30 分钟,具体取决于所使用的 GPU。

     
    训练损失 训练步数 验证损失 Wer 4.905 100 0.215 0.280 0.290 200 0.167 0.232 0.2659 300 0.161 0.229 0.2398 400 0.156 0.223

    训练损失和验证 WER 都很好地下降。

    我们看到,仅微调 的适配器层 100 步就大大超过了 这里 显示的微调整个 检查点。

    从 官方论文 和这个快速比较中可以清楚地看出, 具有更高的将知识转移到低资源语言的能力,应该优先于 。此外,训练也更节省内存,因为只训练了一小部分层。

    适配器权重将作为模型检查点的一部分上传,但我们也希望确保单独保存它们,以便它们可以轻松地上下线。

    让我们将所有适配器层保存到训练输出目录中,以便它能够正确上传到 Hub。

     

    最后,你可以将训练结果上传到🤗 Hub。

     

    适配器权重训练的主要优点之一是“基础”模型 (约占模型权重的 99%) 保持不变,只需共享一个小的 2.5M 适配器检查点 即可使用训练好的检查点。

    这使得训练额外的适配器层并将它们添加到你的仓库变得非常简单。

    你可以通过简单地重新运行此脚本并将你想要训练的语言更改为另一种语言来轻松实现,例如 表示瑞典语。此外,你应该确保词汇表不会被完全覆盖,而是新语言词汇表应该像上面注释掉的单格中所述那样 附加 到现有词汇表中。

    为了演示如何加载不同的适配器层,我还训练并上传了一个瑞典语适配器层,其 iso 语言代码为 ,如 此处 所示

    你可以像往常一样使用 加载微调后的检查点,但应确保在方法中添加 ,以便加载正确的适配器。你还应该为分词器正确设置目标语言。

    让我们看看如何首先加载土耳其检查点。

     

    让我们检查模型是否可以正确转录土耳其语

     

    让我们处理音频,运行前向传递并预测 ids

     

    最后,我们可以解码该示例。

     

    输出:

     

    这看起来几乎完全正确,只是第一个单词中应该添加两个空格。 现在,通过调用 并将分词器更改为瑞典语,可以非常简单地将适配器更改为瑞典语。

     

    我们再次从普通语音加载瑞典语测试集

     

    并转录一个样本:

     

    输出:

     

    太好了,这看起来像是一个完美的转录!

    我们在这篇博客文章中展示了 MMS 适配器权重微调不仅在低资源语言上提供了最先进的性能,而且还显著缩短了训练时间,并允许轻松构建定制的适配器权重集合。

    相关帖子和附加链接列在这里:

    • 官方论文

    • 原始 cobebase

    • 官方演示

    • Transformers 文档

    • 相关 XLS-R 博客文章

    • Hub 上的模型


    英文链接: https://hf.co/blog/mms_adapters

    作者: Patrick von Platen

    译者: innovation64

    审校/排版: zhongdongy (阿东)

     

    一、问题系统介绍

    1. 监听商品变更MQ消息,查询商品最新的信息,调用BulkProcessor批量更新ES集群中的商品字段信息;

    2. 由于商品数据非常多,所以将商品数据存储到ES集群上,整个ES集群共划分了256个分片,并根据商品的三级类目ID进行分片路由。

    比如一个SKU的商品名称发生变化,我们就会收到这个SKU的变更MQ消息,然后再去查询商品接口,将商品的最新名称查询回来,再根据这个SKU的三级分类ID进行路由,找到对应的ES集群分片,然后更新商品名称字段信息。

    由于商品变更MQ消息量巨大,为了提升更新ES的性能,防止出现MQ消息积压问题,所以本系统使用了BulkProcessor进行批量异步更新。

    ES客户端版本如下:

    
    

    BulkProcessor配置伪代码如下:

    
    

    二、问题怎么发现的

    1. 618大促开始后,由于商品变更MQ消息非常频繁,MQ消息每天的消息量更是达到了日常的数倍,而且好多商品还变更了三级类目ID;

    2. 系统在更新这些三级类目ID发生变化的SKU商品信息时,根据修改后的三级类目ID路由后的分片更新商品信息时发生了错误,并且重试了5次,依然没有成功;

    3. 因为在新路由的分片上没有这个商品的索引信息,这些更新请求永远也不会执行成功,系统的日志文件中也记录了大量的异常重试日志。

    4. 商品变更MQ消息也开始出现了积压报警,MQ消息的消费速度明显赶不上生产速度。

    5. 观察MQ消息消费者的UMP监控数据,发现消费性能很平稳,没有明显波动,但是调用次数会在系统消费MQ一段时间后出现断崖式下降,由原来的每分钟几万调用量逐渐下降到个位数。

    6. 在重启应用后,系统又开始消费,UMP监控调用次数恢复到正常水平,但是系统运行一段时间后,还是会出现消费暂停问题,仿佛所有消费线程都被暂停了一样。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    三、排查问题的详细过程

    首先找一台暂停消费MQ消息的容器,查看应用进程ID,使用jstack命令dump应用进程的整个线程堆栈信息,将导出的线程堆栈信息打包上传到 https://fastthread.io/ 进行线程状态分析。分析报告如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    通过分析报告发现有124个处于BLOCKED状态的线程,然后可以查看各线程的详细堆栈信息,堆栈信息如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    连续查看多个线程的详细堆栈信息,MQ消费线程都是在waiting to lock <0x00000005eb781b10> (a org.elasticsearch.action.bulk.BulkProcessor),然后根据0x00000005eb781b10去搜索发现,这个对象锁正在被另外一个线程占用,占用线程堆栈信息如下:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    这个线程状态此时正处于WAITING状态,通过线程名称发现,该线程应该是ES客户端内部线程。正是该线程抢占了业务线程的锁,然后又在等待其他条件触发该线程执行,所以导致了所有的MQ消费业务线程一直无法获取BulkProcessor内部的锁,导致出现了消费暂停问题。

    但是这个线程elasticsearch[scheduler][T#1]为啥不能执行? 它是什么时候启动的? 又有什么作用?

    就需要我们对BulkProcessor进行深入分析,由于BulkProcessor是通过builder模块进行创建的,所以深入builder源码,了解一下BulkProcessor的创建过程。

    
    

    内部创建了一个时间调度执行线程池,线程命名规则和上述持有锁的线程名称相似,具体代码如下:

    
    

    最后在build方法内部执行了BulkProcessor的内部有参构造方法,在构造方法内部启动了一个周期性执行的flushing任务,代码如下

    
    
    
    
    
    

    通过源代码发现,该flush任务就是在创建BulkProcessor对象时设置的固定时间flush逻辑,当setFlushInterval方法参数生效,就会启动一个后台定时flush任务。flush间隔,由setFlushInterval方法参数定义。该flush任务在运行期间,也会抢占BulkProcessor对象锁,抢到锁后,才会执行execute方法。具体的方法调用关系源代码如下:

    
    

    而上述代码中的add方法,则是由MQ消费业务线程去调用,在该方法上同样有一个synchronized关键字,所以消费MQ业务线程会和flush任务执行线程直接会存在锁竞争关系。具体MQ消费业务线程调用伪代码如下:

    
    

    通过以上对线程堆栈分析,发现所有的业务线程都在等待elasticsearch[scheduler][T#1]线程释放BulkProcessor对象锁,但是该线程确一直没有释放该对象锁,从而出现了业务线程的死锁问题。

    结合应用日志文件中出现的大量异常重试日志,可能与BulkProcessor的异常重试策略有关,然后进一步了解BulkProcessor的异常重试代码逻辑。由于业务线程中提交BulkRequest请求都统一提交到了BulkRequestHandler对象中的execute方法内部进行处理,代码如下:

    
    

    BulkRequestHandler通过构造方法初始化了一个Retry任务对象,该对象中也传入了一个Scheduler,且该对象和flush任务中传入的是同一个线程池,该线程池内部只维护了一个固定线程。而execute方法首先会先根据Semaphore来控制并发执行数量,该并发数量在构建BulkProcessor时通过参数指定,通过上述配置发现该值配置为1。所以每次只允许一个线程执行该方法。即MQ消费业务线程和flush任务线程,同一时间只能有一个线程可以执行。然后下面在了解一下重试任务是如何执行的,具体看如下代码:

    
    

    RetryHandler内部会执行提交bulkRequest请求,同时也会监听bulkRequest执行异常状态,然后执行任务重试逻辑,重试代码如下:

    
    

    RetryHandler将执行失败的bulk请求重新交给了内部scheduler线程池去执行,通过以上代码了解,该线程池内部只维护了一个固定线程,同时该线程池可能还会被另一个flush任务去占用执行。所以如果重试逻辑正在执行的时候,此时线程池内的唯一线程正在执行flush任务,则会阻塞重试逻辑执行,重试逻辑不能执行完成,则不会释放Semaphore,但是由于并发数量配置的是1,所以flush任务线程需要等待其他线程释放一个Semaphore许可后才能继续执行。所以此处形成了循环等待,导致Semaphore和BulkProcessor对象锁都无法释放,从而使得所有的MQ消费业务线程都阻塞在获取BulkProcessor锁之前。

    同时,在GitHub的ES客户端源码客户端上也能搜索到类似问题,例如: https://github.com/elastic/elasticsearch/issues/47599 ,所以更加印证了之前的猜想,就是因为bulk的不断重试从而引发了BulkProcessor内部的死锁问题。

    四、如何解决问题

    既然前边已经了解到了问题产生的原因,所以就有了如下几种解决方案:

    1.升级ES客户端版本到7.6正式版,后续版本通过将异常重试任务线程池和flush任务线程池进行了物理隔离,从而避免了线程池的竞争,但是需要考虑版本兼容性。

    2.由于该死锁问题是由大量异常重试逻辑引起的,可以在不影响业务逻辑的情况取消重试逻辑,该方案可以不需要升级客户端版本,但是需要评估业务影响,执行失败的请求可以通过其他其他方式进行业务重试。

    如有疏漏不妥之处,欢迎指正!

    作者:京东零售 曹志飞

    来源:京东云开发者社区

    一、问题发现

    在一次开发中在sp中使用以后,使用语句作为的参数后,发现执行第二遍call会导致数据库crash,于是开始动手调查问题发生的原因。

    注:本次使用的 MySQL 数据库版本为最新的debug版本。

    SQL语句示例:

     

    二、问题调查过程

    1、首先查看错误堆栈信息,可以看到函数的不等于引起的,打印堆栈看了一下,此时的,明显不是

     

    2、要想获取sp参数的实际item,应该调用方法,但是也许作者本来就不想让支持sp参数,因此这里的写法是对的。但是本来代码不应该运行到这里,因为本来应该直接报错。

     

    3、接着继续调查,查看第一次报错的地方的代码,找到,看到了第一次报错的地方的代码,因此代码运行应该在这里报错。但是为何第二次执行会运行到而不是在就直接报错返回呢?仔细查看下面的代码,发现下面的代码有1个地方有错误。

     

    三、问题解决方案

    通过以上代码解析后作如下修改,正确给赋值,这样就可以保证每次的时候如果遇到报错再次运行还会重新执行。

     

    现在重新执行call sp,没有问题了。

     

    四、问题总结

    本次只是解决了 的问题,但是如果想让 支持 sp 的参数,即的参数的话,代码里面还要做相应修改,包括 这里面生成的会在这句执行完以后被 cleanup 掉,等到下一句 prepare 想再次使用它的时候会因为找不到该item发生问题,这个是重构 支持 sp 参数需要注意的点。

    Enjoy GreatSQL :)

    关于 GreatSQL

    GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

    相关链接: GreatSQL社区 Gitee GitHub Bilibili

    GreatSQL社区:

    image

    社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

    社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

    社区2022年度勋章获奖名单: https://greatsql.cn/thread-184-1-1.html

    (对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

    技术交流群:

    微信&:

    微信群:添加GreatSQL社区助手(微信号: )好友,待社区助手拉您进群。

    在研发质量管理中,「提高代码/测试质量」更重要,还是「提升故障响应能力」更重要?

    LigaAI 最近和一些朋友探讨了这个问题。一种观点认为提升研发质量应该从代码质量抓起——擒贼先擒王,从源头减少故障发生才是根本之道;

    另一种声音则指出,生产故障几乎不可能通过预防完全避免,因为「未知」是无法预测的,因此加强监测与反馈机制,快速识别、快速修复才是真正的有效之治。

    从管理指标的角度来看,「提升代码质量」意味着研发团队要尽可能提高 MTBF(平均无故障时间),延长系统可持续运行时间,而「提升响应能力」要求尽可能减少 MTTR(平均恢复时间),将系统不可用时间降到最短以最小化故障影响。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    温馨提示:研发团队应当先全面讨论系统「服务时间」「可用时间」和「不可用时间」的定义、事件覆盖范围以及故障等级,并在组织内部建立统一的理解,以确保资源和精力花在最重要的事件上。

    尽管在实际工作中,「提高 MTBF」和「减少 MTTR」总是齐驱并进,但在不同发展阶段明确二者的优先级,将有助于研发团队高效专注、有的放矢地实现研发效能管理目标。

    MTBF 和 MTTR 将如何影响研发效能?我们先从研发质量管理的三个维度说起。

    01 研发质量管理的「RAM」

    在管理实践中,我们常用「RAM」评估软件交付性能。这里的「RAM」当然不是 Random Access Memory,而是三个用于描述系统服务质量高低的关键维度——可靠性、可用性和可维护性。

    1. 可靠性 Reliability

    可靠性是指系统无故障运行的能力——哪怕出现软硬件故障、人为错误等问题,系统仍能正常提供正确服务而不发生服务中断的概率。

    它与故障率、容错率、避错力、冗余度等紧密相关。常见的软件可靠性度量指标包括可靠度、失效率、MTBF 和 MTTF 等等。

    2. 可用性 Availability

    可用性是指在一定时间内,系统能够持续且正确提供符合期望水准的服务而不发生故障和中断的概率,通常用 SLA(Service Level Agreement,服务级别协议)来表示。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    系统可用性(或称可用度)可以用系统可用时间占总服务时间的百分比计算得出,即

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3. 可维护性 Maintainability

    可维护性包含可修复性和可改进性两个方面。前者是指在系统发生故障后,不同人员高效修复故障,使之恢复正常运行状态的难易程度,而后者表示当需求或环境变化时,系统接受功能改进或增加新功能的可能性。

    可靠性和可用性都可以展示系统的持续服务能力。区别在于,可用性更加关注系统服务的总体持续时间,而可靠性侧重于描述系统的抗故障能力。《分布式系统原理与范型》为区分可靠性和可用性提供了一个非常直观的例子:

    如果系统在每小时崩溃 1 ms,那么它的可用性就超过 99.9999%,但是它还是高度不可靠。与之类似,如果一个系统从来不崩溃,但是每年要停机两星期,那么它是高度可靠的,但是可用性只有 96%。

    02 如何确定 MTBF 和 MTTR 的优先级?

    对于不同组织或者同一组织的不同发展阶段,提升研发质量的有效手段很可能截然不同。那么,是否存在某种范式,可以帮助研发团队科学精准地确定 MTBF 和 MTTR 的管理优先级?

    前面提到,可用性的计算公式可表示为系统可用时间占总服务时间的比重,即 MTBF / (MTBF + MTTR)。简单变形后,便可以获得以下关系式:

    ① MTBF = 可用性 * MTTR / (1 – 可用性)

    ② MTTR = MTBF / 可用性 – MTBF

    对于已知的 MTBF 或 MTTR 值,研发团队可以结合系统可用性增长目标,计算出团队故障恢复能力或系统平均无故障时间的所处水平,并了解量化指标的预期增量。

    举个例子。已知研发团队恢复一个故障的平均耗时为一个小时,如果系统每 9 小时出现一次故障,其可用性就为 90%。如果想将系统的可用性提高至 99%,那么故障频率应降低至每 99 小时(即 4.13 天)一次。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    同样的,对于故障频率为每周一次的系统而言,如果研发团队能在 1.7 个小时(等价于 102 分钟)内让系统恢复正常工作,则其可用性便能达到 99%。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    根据系统的故障频率以及研发团队的故障恢复水平,管理者可以将可用性提升目标翻译成 MTBF 或 MTTR 的优化目标,将抽象指标具象化,并综合目标实现难度、资源可用情况等明确首要优化对象,精准提升效能。

    03 MTTR vs MTBF,谁更胜一筹?

    Chad Fowler 认为,对大多数组织或系统而言,优化 MTTR 比增加 MTBF 更加有效。DORA 指标同样将 MTTR 视为影响研发效能和软件交付性能的四大关键指标之一。

    一部分原因是软件系统不同于物理设备,其故障偶发性强,因而 MTBF 管理的不可控性较高。而恢复故障的工作流程清晰,操作步骤明确,可干预程度高;研发团队可以对各环节展开精细化管理,轻松、高效地达成 MTTR 优化目标。

    研发团队可以使用敏捷开发方法、自动化监测和预警工具、自动化部署工具、灰度发布、A/B 测试等,缩短 MTTD、MTTA、MTTI、MTTR(Mean Time To Repair)等时间,以快速识别、定位和修复故障,快速上线。

    不仅如此,Sidu Ponnappa 还指出,MTTR 是弥合业务与技术理解鸿沟的关键。它可以帮助企业更好地理解技术团队与研发工作,还可以帮助技术领导者识别系统的薄弱环节以及需要关注的对象,是衡量组织弹性、团队结构和整体健康状况的有力指标。想要改进 MTTR,研发团队必须构建正确的知识,改进质量控制实践,并重视内外部的沟通。

    # LigaAI 总结

    可靠性、可用性和可维护性是评估研发质量的三大维度,其中可用性可以用 MTBF / (MTBF + MTTR) 计算得出。

    在研发管理实践中,优化 MTTR,提高故障响应能力更具指导意义。研发团队可以结合敏捷开发方法、自动化工具等,建立高度自动化的监测、反馈、测试、部署流程,实现高速提效。


    LigaAI@OSCHINA还将分享更多研发效能度量、研发管理实践等干货内容,欢迎关注我们。

    LigaAI 助力开发者扬帆远航,体验新一代智能研发协作,一起变大变强!

    从自研走向开源的 TinyVue 组件库

    TinyVue 的开源征程

    OpenTiny 提供企业级的 Web 应用前端开发套件,包括 TinyVue/TinyNG 组件库、TinyPro 管理系统模板、TinyCLI 命令行工具以及 TinyTheme 主题配置系统等。这些前端开发的基础设施和技术已在华为内部积累和沉淀多年,其中 TinyVue 组件库更是历经九年的磨练,从最初的封闭自研逐步走向社区开源。

    TinyVue 九年的开源征程大致分为三个阶段:第一阶段走完全自研的线路,当时称为 HAE 前端框架;第二阶段开始引入开源的 Vue 框架,更名为 AUI 组件库;第三阶段对架构进行重新设计,并逐步演变为现在开源的 TinyVue 组件库。本文将围绕 TinyVue 三个阶段的技术发展历程,深入代码细节讲解不同阶段的核心竞争力。

    全文包含以下章节:

    • 完全自研的 HAE 前端框架
      • 实现数据的双向绑定
      • 实现面向对象的 JS 库
      • 配置式开发的注册表
    • 迁移到 Vue 的 AUI 组件库
      • 封装成 Vue 组件
      • 后端服务适配器
      • 标签式与配置式
    • 全新架构的 TinyVue 组件库
      • 开发组件库面临的问题
      • 面向逻辑编程与无渲染组件
      • 跨端跨技术栈TODO组件示例

    完全自研的 HAE 前端框架

    时间回到2014年,彼时的我刚加入公共技术平台部,参与 HAE 前端框架的研发。HAE 的全称是 Huawei Application Engine,即华为应用引擎。当时我们部门负责集团 IT 系统的基础设施建设,在规划 HAE 时我们对行业和技术趋势进行了分析,并得出结论:云计算、大数据牵引 IT 架构变化,并带来商业模式转变和产品变革,而云计算和大数据需要新的 IT 基础架构的支撑。

    基于这个背景,我们提出 IT 2.0 架构的目标:利用互联网技术打造面向未来的更高效、敏捷的下一代 IT。作为云开发平台,HAE 需要支持全面的云化:云端开发、云端测试、云端部署、云端运营,以及应用实施的云化。其中,云端开发由 Web IDE 负责实现,这个 IDE 为用户提供基于配置的前端开发能力,因此需要支持可配置的 HAE 前端框架。

    基于配置的开发模式,用户可通过可视化界面来配置前端应用开发中的各种选项,比如定义系统生命周期、配置页面路由、设置组件的属性等。相比之下,传统的开发模式需要用户手写代码来实现这些功能。当时业界还没有能满足这种需求的前端开发框架,走完全自研的路是历史必然的选择。

    实现数据的双向绑定

    在2014年,主流的前端技术仍以 jQuery 为主。传统的 jQuery 开发方式是通过手动操作 DOM 素来更新和响应数据的变化。开发者需要编写大量的代码来处理数据和 DOM 之间的同步。这种单向的数据流和手动操作的方式,在处理复杂应用的数据和视图之间的同步时,可能会导致代码冗余、维护困难以及出错的可能性增加。

    当时刚刚兴起的 AngularJS 带来了数据双向绑定的概念。数据双向绑定可以自动将数据模型和视图保持同步,当数据发生变化时,视图会自动更新,反之亦然。这种机制减少了开发者在手动处理数据和 DOM 同步方面的工作量。通过AngularJS 开发者只需要关注数据的变化,而不必显式地更新 DOM 素。这使得开发过程更加简洁、高效,并减少了出错的可能性。

    在 HAE 前端框架的研发初期,为了引入数据双向绑定功能,我们在原本基于 jQuery 的架构上融合了 AngularJS 框架。然而,经过几个月的尝试,我们发现这种融合方式存在两个严重问题:首先,当页面绑定数据量较大时,性能显著下降。其次,框架同时运行两套生命周期,导致两者难以协调相互同步。因此,我们决定移除 AngularJS 框架,但又不想放弃已经使用的数据双向绑定的特性。

    在此情形下,我们深入研究 AngularJS 的数据双向绑定。它采用脏读(Dirty Checking)机制,该机制通过定期检查数据模型的变化来保持视图与模型之间的同步。当数据发生变化时,AngularJS 会遍历整个作用域(Scope)树来检查是否有任何绑定的值发生了改变。当绑定的数据量较大时,这个过程会消耗大量的计算资源和时间。

    用什么方案替换 AngularJS 的数据双向绑定,并且还要保证性能优于脏读机制?当时我们把目光投向 ES5 的 函数,借助它的 getter 和 setter 方法实现了数据双向绑定。这个方案比 Vue 框架早了整整一年,直到2015年10月,Vue 1.0 才正式发布。

    接下来,我们通过代码来展现该方案的技术细节,以下是 AngularJS 数据双向绑定的使用示例:

    
    

    我们的替换方案就是要实现上面示例中的 变量,该变量拥有一个可以双向绑定的 属性。从以下 HTML 代码片段:

    
    

    可以得知 input 输入框的值绑定了 属性,而另一段代码:

    
    

    则表明 P 标签也绑定了 属性,当执行以下语句:

    
    

    之后 的值就被修改了。此时,与 双向绑定的 input 输入框的值和 P 标签的内容也同步被修改为 。

    要实现 变量,就必须实现一个 类, 变量就是 类的一个实例。这个类有一个添加属性的方法,假设方法名为 ,并且还有一个监听属性的方法,假设方法名为 。

    我们来看如何实现这两个方法(为突出核心片段,以下代码有删减):

    
    

    上述代码因篇幅关系并不包含数据绑定的功能,仅实现为 添加属性以及设置监听回调函数,并且考虑了多个监听回调函数的执行顺序及异常处理的情况。借助 ,我们不再需要遍历整个作用域(Scope)树来检查是否有任何绑定的值发生了改变。一旦某个值发生变化,就会立即触发绑定的监听回调函数,从而解决脏读机制的性能问题。

    实现面向对象的 JS 库

    同样在2014年,具有面向对象编程特性的 TypeScript 仍处于早期阶段,微软在当年4月份发布了 TypeScript 1.0 版本。HAE 前端框架在研发初期没有选择不成熟的 TypeScript 方案,而是利用 JavaScript 原型链机制来实现面向对象的设计模式,即通过共享原型对象的属性和方法,实现对象之间的继承和多态性。

    然而,使用 JavaScript 原型链来实现面向对象设计存在两个问题:首先,原型链的使用方式与传统的面向对象编程语言(例如 Java 和 C++)有明显的区别,在当时前端开发人员大多是由 Java 后端转行做前端,因此需要花费较高的学习成本来适应原型链的概念和用法。其次,JavaScript 本身没有提供显式的私有属性和方法的支持,我们一般通过在属性或方法前添加下划线等约定性命名,来暗示这是一个私有成员。而在实际开发过程中,用户往往会直接访问和使用这些私有成员,这导致在后续框架的升级过程中必须考虑向下兼容这些私有成员,从而增加了框架的开发成本。

    为了解决上述问题,我们自研了 jClass 库,这个库用 JavaScript 模拟实现了面向对象编程语言的基本特性。jClass 不仅支持真正意义上的私有成员,还支持保护成员、多重继承、方法重载、特性混入、静态常量、类工厂和类事件等,此外还内置自研的 Promise 异步执行对象,提供动态加载类外部依赖模块的功能等。

    接下来,我们通过代码来展现 jClass 面向对象的特性,以下是基本使用示例:

    
    

    我们再来看 jClass 如何继承多个父类,在上述代码后面添加如下代码:

    
    

    jClass 的类工厂与类继承有相似之处,而类事件则为类方法的调用、类属性的修改提供监听能力,两者的使用示例如下:

    
    

    基于 jClass 面向对象的特性,我们就可以用面向对象的设计模式来开发 HAE 组件库,以下就是定义和扩展组件的示例:

    
    

    上述代码只演示了 jClass 部分特性,因篇幅关系没有展示其实现的细节。从2014年10月开始,jClass 陆续支撑 120 多个组件的研发,累积 30 多万行的代码。经过四年的发展,作为 HAE 前端框架的基石,jClass 在华为内部 IT 各个领域 1000 多个项目中得到广泛应用。通过这些项目的不断磨练,jClass 在功能和性能上已经达到了企业级的要求。

    配置式开发的注册表

    一个前端框架需要支撑生命周期,主要目的是在 Web 应用的不同阶段提供可控的执行环境和钩子函数,以便开发者可以在适当的时机执行特定的逻辑和操作。通过生命周期的支持,前端框架能够更好地管理 Web 应用的初始化、渲染、更新和销毁等过程,提供更灵活的控制和扩展能力。

    在 HAE 前端框架中,存在三个不同层次的生命周期:系统生命周期、页面生命周期和组件生命周期。

    • 系统生命周期:系统生命周期指的是整个前端应用的生命周期,它包含了应用的启动、初始化、运行和关闭等阶段。系统生命周期提供了应用级别的钩子函数,例如应用初始化前后的钩子、应用销毁前后的钩子等。通过系统生命周期的支持,开发者可以在应用级别执行一些全局的操作,例如加载配置、注册插件、处理全局错误等。

    • 页面生命周期:页面生命周期指的是单个页面的生命周期,它描述了页面从加载到卸载的整个过程。页面生命周期包含了页面的创建、渲染、更新和销毁等阶段。在页面生命周期中,HAE 前端框架提供了一系列钩子函数,例如页面加载前后的钩子、页面渲染前后的钩子、页面更新前后的钩子等。通过页面生命周期的支持,开发者可以在页面级别执行一些与页面相关的逻辑,例如获取数据、处理路由、初始化页面状态等。

    • 组件生命周期:组件生命周期指的是单个组件的生命周期,它描述了组件从创建到销毁的整个过程。组件生命周期包含了组件的实例化、挂载到 DOM、更新和卸载等阶段。组件生命周期的钩子函数与页面生命周期类似,通过组件生命周期的支持,开发者可以在组件级别执行一些与组件相关的逻辑,例如初始化状态、处理用户交互、与外部组件通信等。

    总的来说,系统生命周期、页面生命周期和组件生命周期在粒度和范围上有所不同。系统生命周期操作整个 Web 应用,页面生命周期操作单个页面,而组件生命周期操作单个组件。通过这些不同层次的生命周期,HAE 前端框架能够提供更精细和灵活的控制,使开发者能够在合适的时机执行相关操作,实现更高效、可靠和可扩展的前端应用。

    基于配置的开发模式,HAE 前端框架要让用户通过配置的方式,而不是通过手写代码来定义生命周期的钩子函数。为此,我们引入 Windows 注册表的概念,将框架内置的默认配置信息保存在一个 JSON 对象中,并命名为 。同时,每个应用也可以根据自身需求创建应用的 ,系统在启动前会合并这两个文件,从而按照用户期望的方式配置生命周期的钩子函数。

    以下是框架内置的注册表中,有关系统生命周期的定义:

    
    

    假设用户自定义的应用注册表内容如下:

    
    

    可以看到用户在 、、 和 阶段不做调整,但是在 阶段禁用了 服务,同时在 服务后面插入了 服务。

    生命周期的钩子函数在哪里体现?其实答案就在服务里面,以 服务为例,下面是该服务的定义:

    
    

    以上代码需要包含在 阶段加载的模块中。除了调用 方法定义服务之外,还可以通过 jClass 定义类的方式定义服务,代码示例如下:

    
    

    上面的 Hae 变量就是加强版的 jClass。我们再来看一下框架内置的注册表中,有关页面生命周期的定义:

    
    

    系统生命周期各个服务多以开关的形式定义,而页面生命周期各个服务多以名称的形式定义,以 服务为例,其定义如下:

    
    

    最后再简单介绍一下组件的生命周期,借助 jClass 面向对象的特性,组件的生命周期各阶段钩子函数在组件的基类 中定义的,代码示例如下:

    
    

    可以看到组件基类的编译模板阶段和渲染模板阶段都有默认的实现,由于这两个阶段一般需要读取后端数据等延迟操作,因此要返回 异步对象。这个异步对象是 HAE 框架参照 jQuery 的 Deferred 异步回调重新实现的,主要解决 Deferred 异步性能慢的问题。


    迁移到 Vue 的 AUI 组件库

    时间来到2017年,以 Vue 为代表的现代前端工程化开发模式带来了许多改进和变革。与以 jQuery 为代表的传统开发模式相比,这些改进和变革体现在以下方面:

    • 声明式编程:Vue 采用了声明式编程的思想,开发者可以通过声明式的模板语法编写组件的结构和行为,而无需直接操作 DOM。这简化了开发流程并提高了开发效率。

    • 组件化开发:Vue 鼓励组件化开发,将 UI 拆分为独立的组件,每个组件具有自己的状态和行为。这样可以实现组件的复用性、可维护性和扩展性,提高了代码的可读性和可维护性。

    • 响应式数据绑定:Vue 采用了响应式数据绑定的机制,将数据与视图自动保持同步。当数据发生变化时,自动更新相关的视图部分,大大简化了状态管理的复杂性。

    • 自动化流程:前端工程化引入了自动化工具,例如构建工具(例如 Webpack)、任务运行器(例如 npm)和自动化测试工具,大大简化了开发过程中的重复性任务和手动操作。通过自动化流程,开发者可以自动编译、打包、压缩和优化代码,自动执行测试和部署等,提高了开发效率和一致性。

    • 模块化开发:前端工程化鼓励使用模块化开发的方式,将代码拆分为独立的模块,每个模块负责特定的功能。这样可以提高代码的可维护性和复用性,减少了代码之间的耦合性,使团队协作更加高效。

    • 规范化与标准化:前端工程化倡导遵循一系列的规范和标准,包括代码风格、目录结构、命名约定等。这样可以提高团队协作的一致性,减少沟通和集成的成本,提高项目的可读性和可维护性。

    • 静态类型检查和测试:前端工程化鼓励使用静态类型检查工具(例如 TypeScript)和自动化测试工具(例如 Mocha)来提高代码质量和稳定性。通过静态类型检查和自动化测试,可以提前捕获潜在的错误和问题,减少Bug的产生和排查的时间。

    考虑到人力成本、学习曲线和竞争力等因素,HAE 前端框架需要向现代前端开源框架与工程化方向演进。由于 HAE 属于自研框架,仅在华为内部使用,新进的开发人员需要投入时间学习和掌握该框架,这对他们的技术能力要求较高。然而,如果选择采用开源框架,庞大的社区支持和广泛的文档资源,使得开发人员可以更快速地上手和开发。同时,采用开源框架也使得 HAE 框架能够紧跟业界趋势。开源框架通常由全球的开发者社区共同维护和更新,能够及时跟进最新的前端技术和最佳实践。这有助于提升 HAE 框架自身的竞争力,使其具备更好的适应性和可扩展性。

    早在2016年10月上海 QCon 大会上,Vue 框架的作者尤雨溪首次亮相,登台推广他的开源框架,那也是我们初次接触 Vue。当时 React 作为另一个主流的开源框架也备受业界关注,我们需要在 Vue 和 React 之间做出选择。随后,在2017年6月我们远赴波兰的佛罗茨瓦夫参加 Vue 首届全球开发者大会,那次我们有幸与尤雨溪本人进行了交流。回来后,我们提交了 Vue 与 React 的对比分析报告,向上级汇报了我们的技术选型意向,最终我们决定选择 Vue。

    封装成 Vue 组件

    要全面迁移到 Vue 框架,抛弃已使用 jQuery 开发的 30 万行代码,在有限的时间和人力下是一个巨大的挑战。为了找到折中的解决方案,我们采取这样的迁移策略:将 HAE 前端框架的系统和页面生命周期进行剥离,只保留与 HAE 组件相关的代码,然后将底层架构替换为 Vue,并引入所有前端工程化相关的能力,最后成功实现了让用户以 Vue 的方式来使用我们的组件。这样的迁移策略在保证项目进展的同时,也能够逐步融入 Vue 的优势和工程化的便利性。

    为了让用户以 Vue 的方式来使用 jQuery 开发的组件,我们需要在 Vue 组件的生命周期中动态创建 HAE 组件。当时,我们正在研究 Webix 组件库,它底层使用的是纯 JavaScript 技术实现的,没有依赖于其他框架或库,是一个独立的前端组件库。Webix 可以无缝地集成到各种不同的平台和框架中,包括 Vue、React、Angular 等。这使得开发人员能够在现有的项目中轻松地引入和使用 Webix 组件,而无需进行大规模的重构。以下是 Webix 官方提供的与 Vue 集成的示例(原文链接):

    
    

    上述示例代码定义了一个名为 的 Vue 组件,在该组件生命周期的 阶段,通过调用 方法动态创建了一个 Webix 组件,然后监听该组件的 事件并抛出 Vue 的 事件,并且利用 Vue 的 监听其 属性,一旦它发生变化则调用 Webix 的 方法重新设置 Webix 组件的值,从而实现数据的双向绑定。由于 HAE 组件也支持动态创建,按照这个思路,我们很快写出 HAE 版本的 Vue 组件:

    
    

    以上的迁移策略毕竟是折中的临时方案,并没有充分发挥 Vue 的模板和虚拟 DOM 优势,相当于用 Vue 套了一层壳。虽然该方案也提供了数据双向绑定功能,但不会绑定数组的每个素,并不是真正的基于数据驱动的组件。这个临时方案的好处在于为我们赢得了时间,以最快速度引入开源的 Vue 框架以及前端工程化的理念,使得业务开发能够尽早受益于前端变革所带来的降本增效。

    经过近半年的研发,HAE 组件库成功迁移到 Vue 框架,并于2017年12月正式发布。在2018年,为统一用户体验遵循 Aurora 主题规范,我们对组件库进行升级改造,并改名为 AUI。在支撑了制造、采购、供应、财经等领域的大型项目后,到了2019年 AUI 进入成熟稳定期,我们才有时间去思考如何将 jQuery 的 30 万行代码重构为 Vue 的代码。

    后端服务适配器

    在 HAE 框架中,组件能够自动连接后端服务以获取数据,无需开发人员编写请求代码或处理返回数据的格式。例如人员联想框组件,其功能是根据输入的工号返回相应的姓名。该组件已经预先定义了与后端服务进行通信所需的接口和数据格式,因此开发人员只需要在页面中引入该组件即可直接使用。

    这样的设计使得开发人员能够更专注于页面的搭建和功能的实现,而无需关注与后端服务的具体通信细节。HAE 框架会自动处理请求和响应,并确保数据以一致的格式返回给开发人员。通过这种自动连接后端服务的方式,开发人员能够节省大量编写请求代码和数据处理逻辑的时间,加快开发速度,同时减少了潜在的错误和重复劳动。

    HAE 框架的后端服务是配套的,组件设计当初没有考虑连接不同的后端服务。升级到 AUI 组件库之后,业务的多样化场景使得我们必须引入适配器来实现对接不同后端服务的需求。适配器作为一个中间层,其目的和作用如下:

    • 解耦前后端:适配器充当前后端之间的中间层,将前端组件与后端服务解耦。通过适配器,前端组件不需要直接了解或依赖于后端服务的具体接口和数据格式。这种解耦使得前端和后端能够独立地进行开发和演进,而不会相互影响。

    • 统一接口:不同的后端服务可能具有不同的接口和数据格式,这给前端组件的开发带来了困难。适配器的作用是将不同后端服务的接口和数据格式转化为统一的接口和数据格式,使得前端组件可以一致地与适配器进行交互,而不需要关心底层后端服务的差异。

    • 灵活性和扩展性:通过适配器,前端组件可以轻松地切换和扩展后端服务。如果需要替换后端服务或新增其他后端服务,只需添加或修改适配器,而不需要修改前端组件的代码。这种灵活性和扩展性使得系统能够适应不同的后端服务需求和变化。

    • 隐藏复杂性:适配器可以处理后端服务的复杂性和特殊情况,将这些复杂性隐藏在适配器内部。前端组件只需与适配器进行交互,无需关注后端服务的复杂逻辑和细节。这种抽象和封装使得前端组件的开发更加简洁和高效。

    以 AUI 内置的 Jalor 和 HAE 两个后端服务适配器为例,对于相同的业务服务,我们来看一下这两个后端服务接口的差异,以下是 Jalor 部分接口的访问地址:

    
    

    以下是对应 HAE 接口的访问地址:

    
    

    这些相同的业务服务不仅接口访问地址不同,就连请求的参数格式以及返回的数据格式都有差异。适配器就是为开发人员提供统一的 API 来连接这些有差异的服务。在具体实现上,我们首先创建一个核心层接口 ,以下是该接口的示例代码:

    
    

    然后我们为每一个后端服务创建一个适配器,以下是 Jalor 适配器 的示例代码:

    
    

    以上面的 方法为例,Jalor 服务的实现代码如下:

    
    

    而 HAE 服务适配器 对应的 方法的实现代码如下:

    
    

    两者主要区别在于 参数以及 数据格式。有了统一的 API 接口,开发人员只需按以下方式调用 方法就能获取地区的数据,不需要区分数据来自是 Jalor 服务还是 HAE 服务:

    
    

    标签式与配置式

    AUI 组件继承了 HAE 框架的特点,即天然支持配置式开发。如何理解这个配置式开发?我们用前面 章节里的代码来讲解:

    
    

    代码中的 变量是 option 配置项的缩写,变量的值为一个 对象,该对象描述了创建 HAE 的 组件所需的配置信息。这些配置信息在 HAE 框架中通过 Web IDE 的可视化设置面板来收集,这就是配置式开发的由来。相比之下,如果我们用 Vue 常规的标签方式声明 AUI 的 组件,则代码示例如下:

    
    

    由于 AUI 组件天然支持配置式开发,除了上面的标签式声明,AUI 还提供与上述代码等价的配置式声明:

    
    

    可见配置式声明沿用 HAE 的方式,将所有配置信息都放在 变量里。以下是这两种声明方式的详细差异:

    标签式声明 配置式声明 用法 使用一个或多个具有特定功能的标签来定义组件,每个标签都有自己的属性和配置 使用单个标签,并通过传递一个包含所有配置信息的 JSON 对象来定义组件 优点 直观易懂,易于理解组件的结构和配置。开发人员可以直接在模板中进行修改和调整 配置信息集中在一个对象中,便于整体管理和维护,可以使用变量和动态表达式来动态生成配置信息,灵活性更高 缺点 如果组件的结构复杂或标签较多,标签式声明可能会显得冗长和混乱 对于不熟悉配置结构和属性的开发人员来说,可能需要花费一些时间去理解和编写配置对象 开发效率 在开发初期可能更快速,因为可以直接在模板中进行编辑和调试 在组件结构复杂或需要动态生成配置信息时,可以减少重复的标签代码,提高代码复用性和维护性 业务场景 更适用于静态页面,开发人员更关注组件的结构和外观 更适用于动态页面,开发人员更关注组件的数据和行为

    如果将两者放在特定的业务领域比较,比如低代码平台,则配置式声明的优势更加明显,理由如下:

    • 简化 DSL 开发流程:配置式声明将组件的配置信息集中在一个对象中,低代码 DSL 开发人员可以通过修改对象的属性值来自定义组件的行为和外观。这种方式避免生成繁琐的标签嵌套和属性设置,简化了 DSL 的开发流程。
    • 提高配置的可复用性:配置式声明可以将组件的配置信息抽象为一个可重复使用的对象,可以在多个组件实例中共享和复用。低代码平台开发人员可以定义一个通用的配置对象,然后在不同的场景中根据需要进行定制,减少了重复的代码编写和配置调整。
    • 动态生成配置信息:配置式声明允许低代码平台开发人员使用变量、动态表达式和逻辑控制来低代码组件配置面板生成的配置信息。这样可以根据不同的条件和数据来动态调整组件的配置,增强了组件配置面板的灵活性和适应性。
    • 可视化配置界面:配置式声明通常与可视化配置界面相结合,低代码平台的使用人员可以通过低代码的可视化界面直接修改物料组件的属性值。这种方式使得配置更直观、易于理解,提高了开发效率。
    • 适应复杂业务场景:在复杂的业务场景中,组件的配置信息可能会非常繁琐和复杂。通过配置式声明,低代码物料组件的开发人员可以更方便地管理和维护大量的配置属性,减少了出错的可能性。

    全新架构的 TinyVue 组件库

    时间来到2019年,如前面提到的,AUI 进入成熟稳定期,我们有了时间去思考如何将 jQuery 的 30 万行代码重构为 Vue 的代码。同年5月16日,美国商务部将华为列入出口管制“实体名单”,我们面临前所未有的困难,保证业务连续性成为我们首要任务。我们要做最坏的打算,如果有一天所有的主流前端框架 Angular、React、Vue 都不能再继续使用,那么重构后的 Vue 代码又将何去何从?

    因此,我们组件的核心代码要与主流前端框架解耦,这就要求我们不仅仅要重构代码,还要重新设计架构。经过不断的打磨和完善,拥有全新架构的 TinyVue 组件库逐渐浮出水面,以下就是 TinyVue 组件的架构图:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    在这个架构下,TinyVue 组件有统一的 API 接口,开发人员只需写一份代码,组件就能支持不同终端的展现,比如 PC 端和 Mobile 端,而且还支持不同的 UX 交互规范。借助 React 框架的 或者 Vue 框架的 可以实现组件的核心逻辑代码与前端框架解耦,甚至实现一套组件库代码,同时支持 Vue 的不同版本。

    接下来,我们先分析开发组件库面临的问题,再来探讨面向逻辑编程与无渲染组件,最后以实现一个 TODO 组件为例,来阐述我们的解决方案,通过示例代码展现我们架构的四个特性:跨技术栈、跨技术栈版本、跨终端和跨 UX 规范。

    其中,跨技术栈版本这个特性,已经为华为内部 IT 带来巨大的收益。由于 Vue 框架最新的 3.0 版本不能完全向下兼容 2.0 版本,而 2.0 版本又将于2023年12月31日到达生命周期终止(EOL)。于是华为内部 IT 所有基于 Vue 2.0 的应用都必须在这个日期之前升级到 3.0 版本,这涉及到几千万行代码的迁移整改,正因为我们的组件库同时支持 Vue 2.0 和 3.0,使得这个迁移整改的成本大大降低。

    开发组件库面临的问题

    目前业界的前端 UI 组件库,一般按其前端框架 Angular、React 和 Vue 的不同来分类,比如 React 组件库,Angular 组件库、Vue 组件库,也可以按面向的终端,比如 PC、Mobile 等不同来分类,比如 PC 组件库、Mobile 组件库、小程序组件库等。两种分类交叉后,又可分为 React PC 组件库、React Mobile 组件库、Angular PC 组件库、Angular Mobile 组件库、Vue PC 组件库、Vue Mobile 组件库等。

    比如阿里的 Ant Design 分为 PC 端:、、,Mobile 端:(官方实现)(社区实现)。

    另外,由于前端框架 Angular、React 和 Vue 的大版本不能向下兼容,导致不同版本对应不同的组件库。以 Vue 为例,Vue 2.0 和 Vue 3.0 版本不能兼容,因此 Vue 2.0 的 UI 组件库跟 Vue 3.0 的 UI 组件库代码是不同的,即同一个技术栈也有不同版本的 UI 组件库。

    比如阿里的 Ant Design of Vue 其 1.x 版本 for Vue 2.0,而 3.x 版本 for Vue 3.0。再比如饿了么的 Element 组件库,Element UI for Vue 2.0,而 Element Plus for Vue 3.0。

    我们将上面不同分类的 UI 组件库汇总在一张图里,然后站在组件库使用者的角度上看,如果要开发一个应用,那么先要从以下组件库中挑选一个,然后再学习和掌握该组件库,可见当前多端多技术栈的组件库给使用者带来沉重的学习负担。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    这些 UI 组件库由于前端框架不同、面向终端不同,常规的解决方案是:不同的开发人员来开发和维护不同的组件库,比如需要懂 Vue 的开发人员来开发和维护 Vue 组件库,需要懂 PC 端交互的开发人员来开发和维护 PC 组件库等等。

    很明显,这种解决方案首先需要不同技术栈的开发人员,而市面上大多数开发人员只精通一种技术栈,其他技术栈则只是了解而已。这样每个技术栈就得独立安排一组人员进行开发和维护,成本自然比单一技术栈要高得多。另外,由于同一技术栈的版本升级导致的不兼容,也让该技术栈的开发人员必须开发和维护不同版本的代码,使得成本进一步攀升。

    面对上述组件开发和维护成本高的问题,业界还有一种解决方案,即以原生 JavaScript 或 Web Component 技术为基础,构建一套与任何开发框架都无关的组件库,然后再根据当前开发框架流行的程度,去适配不同的前端框架。比如 Webix 用一套代码适配任何前端框架,既提供原生 JavaScript 版本的组件库,也提供 Angular、React 和 Vue 版本的组件库。

    这种解决方案,其实开发难度更大、维护成本更高,因为这相当于先要自研一套前端框架,类似于我们以前的 HAE 框架,然后再用不同的前端框架进行套壳封装。显然,套壳封装势必影响组件的性能,而且封闭自研的框架其学习门槛、人力成本要高于主流的开源框架。

    面向逻辑编程与无渲染组件

    当前主流的前端框架为 Angular、React 和 Vue,它们提供两种不同的开发范式:一种是面向生命周期编程,另一种是面向业务逻辑编程。基于这些前端框架开发应用,页面上的每个部分都是一个 UI 组件或者实例,而这些实例都是由 JavaScript 创造出来的,都具有创建、挂载、更新、销毁的生命周期。

    所谓面向生命周期编程,是指基于前端框架开发一个 UI 组件时,按照该框架定义的生命周期,将 UI 组件的相关逻辑代码注册到指定的生命周期钩子函数里。以 Vue 框架的生命周期为例,一个 UI 组件的逻辑代码可能被拆分到 beforeCreate、created、beforeMount、mounted、beforeUnmount、unmounted 等钩子函数里。

    所谓面向逻辑编程,是指在前端开发的过程中,尤其在开发大型应用时,为解决面向生命周期编程所引发的问题,提出新的开发范式。以一个文件浏览器的 UI 组件为例,这个组件具备以下功能:

    • 追踪当前文件夹的状态,展示其内容
    • 处理文件夹的相关操作 (打开、关闭和刷新)
    • 支持创建新文件夹
    • 可以切换到只展示收藏的文件夹
    • 可以开启对隐藏文件夹的展示
    • 处理当前工作目录中的变更

    假设这个组件按照面向生命周期的方式开发,如果为相同功能的逻辑代码标上一种颜色,那将会是下图左边所示。可以看到,处理相同功能的逻辑代码被强制拆分在了不同的选项中,位于文件的不同部分。在一个几百行的大组件中,要读懂代码中一个功能的逻辑,需要在文件中反复上下滚动。另外,如果我们想要将一个功能的逻辑代码抽取重构到一个可复用的函数中,需要从文件的多个不同部分找到所需的正确片段。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    如果用面向逻辑编程重构这个组件,将会变成上图右边所示。可以看到,与同一个功能相关的逻辑代码被归为了一组:我们无需再为了一个功能的逻辑代码在不同的选项块间来回滚动切换。此外,我们可以很轻松地将这一组代码移动到一个外部文件中,不再需要为了抽象而重新组织代码,从而大大降低重构成本。

    早在2018年10月,React 推出了 ,这是一个重要的里程碑,对前端开发人员乃至社区生态都产生了深远的影响,它改变了前端开发的传统模式,使得函数式组件成为构建复杂 UI 的首选方式。到了2019年初,Vue 在研发 3.0 版本的过程中也参考了 React 的 ,并且为 Vue 2.0 版本添加了类似功能的 。

    当时我们正在规划新的组件架构,在了解 Vue 的 后,意识到这个 API 的重要性,它就是我们一直寻找的面向逻辑编程。同时,我们也发现业界有一种新的设计模式 —— 无渲染组件,当我们尝试将两者结合在一起,之前面临的问题随即迎刃而解。

    无渲染组件其实是一种设计模式。假设我们开发一个 Vue 组件,无渲染组件是指这个组件本身并没有自己的模板(template)以及样式。它装载的是各种业务逻辑和状态,是一个将功能和样式拆开并针对功能去做封装的设计模式。这种设计模式的优势在于:

    • 逻辑与 UI 分离:将逻辑和 UI 分离,使得代码更易于理解和维护。通过将逻辑处理和数据转换等任务抽象成无渲染组件,可以将关注点分离,提高代码的可读性和可维护性。

    • 提高可重用性:组件的逻辑可以在多个场景中重用。这些组件不依赖于特定的 UI 组件或前端框架,可以独立于界面进行测试和使用,从而提高代码的可重用性和可测试性。

    • 符合单一职责原则:这种设计鼓励遵循单一职责原则,每个组件只负责特定的逻辑或数据处理任务。这样的设计使得代码更加模块化、可扩展和可维护,减少了组件之间的耦合度。

    • 更好的可测试性:由于无渲染组件独立于 UI 进行测试,可以更容易地编写单测试和集成测试。测试可以专注于组件的逻辑和数据转换,而无需关注界面的渲染和交互细节,提高了测试的效率和可靠性。

    • 提高开发效率:开发人员可以更加专注于业务逻辑和数据处理,而无需关心具体的 UI 渲染细节。这样可以提高开发效率,减少重复的代码编写,同时也为团队协作提供了更好的可能性。

    比如下图的示例,两个组件 和 都有相似的功能,即提供 Tags 标签录入、删除已有标签两种能力。虽然它们的外观截然不同,但是录入标签和删除标签的业务逻辑是相同的,是可以复用的。无渲染组件的设计模式将组件的逻辑和行为与其外观展现分离。当组件的逻辑足够复杂并与它的外观展现解耦时,这种模式非常有效。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    单纯使用面向逻辑的开发范式,仅仅只能让相同的业务逻辑从原本散落到生命周期各个阶段的部分汇聚到一起。无渲染组件的设计模式的实现方式有很多种,比如 React 中可以使用 HOC 高阶函数,Vue 中可以使用 scopedSlot 作用域插槽,但当组件业务逻辑日趋复杂时,高阶函数和作用域插槽会让代码变得难以理解和维护。

    要实现组件的核心逻辑代码与前端框架解耦,实现跨端跨技术栈,需要同时结合面向逻辑的开发范式与无渲染组件的设计模式。首先,按照面向逻辑的开发范式,通过 React 的 ,或者 Vue 的 ,将与前端框架无关的业务逻辑和状态拆离成相对独立的代码。接着,再使用无渲染组件的设计模式,将组件不同终端的外观展现,统一连接到已经拆离相对独立的业务逻辑。

    跨端跨技术栈TODO组件示例

    接下来,我们以开发一个 TODO 组件为例,讲解基于新架构的组件如何实现跨端跨技术栈。假设该组件 PC 端的展示效果如下图所示:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    对应 Mobile 端的展示效果如下图所示:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    该组件的功能如下:

    • 添加待办事项:在输入框输入待办事项信息,右边的 Add 按钮后,下面待办事项列表将新增一项刚输入的事项信息。
    • 删除待办事项:在待办事项列表里,选择其中一个事项,右边的X按钮后,该待办事项将从列表里清除。
    • 移动端展示:当屏幕宽度缩小时,组件将自动切换成如下 Mobile 的展示形式,功能仍然保持不变,即输入内容直接按回车键添加事项, X 删除事项。

    这个 TODO 组件的实现分为 Vue 版本和 React 版本,即支持两个不同的技术栈。以上特性都复用一套 TODO 组件的逻辑代码。这套 TODO 组件的逻辑代码以柯里化函数形式编写。柯里化(英文叫 Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。举一个简单的例子:

    
    

    本来应该一次传入两个参数的 函数,柯里化函数变成先传入 x 参数,返回一个包含 y 参数的函数,最终执行两次函数调用后返回相同的结果。一般而言,柯里化函数都是返回函数的函数。

    回到 TODO 组件,按照无渲染组件的设计模式,首先写出不包含渲染实现代码,只包含纯业务逻辑代码的函数,以 TODO 组件的添加和删除两个功能为例,如下两个柯里化函数:

    
    

    可以看到这两个组件的逻辑函数,没有外部依赖,与技术栈无关。这两个逻辑函数会被组件的 Vue 和 React 的 Renderless 函数调用。其中 Vue 的 Renderless 函数部分代码如下:

    
    

    React 的 Renderless 函数部分代码如下,这与 Vue 非常类似:

    
    

    可以看到,TODO 组件的两个逻辑函数 和 都有被调用,分别返回两个函数并赋值给 对象的两个同名属性。而这个技术栈适配层代码里的 Renderless 函数,不包含组件逻辑,只用来抹平不同技术栈的差异,其内部按照面向业务逻辑编程的方式,分别调用 React 框架的 与 Vue 框架的 ,这里要保证组件逻辑 和 的输入输出统一。

    上述 Vue 和 React 适配层的 Renderless 函数会被与技术栈强相关的 Vue 和 React 组件模板代码所引用,只有这样才能充分利用各主流前端框架的能力,避免重复造框架的轮子。以下是 Vue 页面引用 Vue 适配层 Renderless 函数的代码:

    
    

    React 页面引用 React 适配层 Renderless 函数,代码如下所示:

    
    

    至此已完成 TODO 组件支持跨技术栈、复用逻辑代码。根据无渲染组件的设计模式,前面已经分离组件逻辑,现在还要支持组件不同的外观。TODO 组件要支持 PC 端和 Mobile 两种外观展示,即组件结构支持 PC 端和 Mobile 端。所以我们在 Vue 里要拆分为两个页面文件,分别是 和 ,其中 文件里的 template 组件结构如下:

    
    

    而 文件里的 template 组件结构如下:

    
    

    由上可见,PC 端和 Mobile 的组件结构虽然不一样,但是都引用相同的接口,这些接口就是 TODO 组件逻辑函数输出的内容。

    同理,React 也分为两个页面文件,分别是 和 ,其中 文件里的 template 组件结构如下:

    
    

    而 文件里的 template 组件结构如下:

    
    

    由上可见,Vue 和 React 的 PC 端及 Mobile 端的结构基本一样,主要是 Vue 和 React 的语法区别,因此同时开发和维护 Vue 和 React 组件结构的成本并不高。以下是 TODO 组件示例的全景图:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    回顾一下我们开发这个 TODO 组件的步骤,主要分为三步:

    • 按无渲染组件的设计模式,首先要将组件的逻辑分离成与技术栈无关的柯里化函数。
    • 在定义组件的时候,借助面向逻辑编程的 API,比如 React 框架的 、Vue 框架的 ,将组件外观与组件逻辑完全解耦。
    • 按不同终端编写对应的组件模板,再利用前端框架提供的动态组件,实现动态切换不同组件模板,从而满足不同外观的展示需求。

    总结

    虽然在 HAE 自研阶段,我们实现的数据双向绑定、面向对象的 JS 库、配置式开发的注册表等特性,随着前端技术的高速发展现在已经失去存在的意义,但是在 AUI 阶段探索的新思路新架构,经过大量的业务落地验证,再次推动前端领域的创新。TinyVue 继承了 HAE、AUI 的基因,所有的新技术都从业务中来,到业务中去。而且,在这个过程中,我们通过不断吸收、融合开源社区的最佳实践和创新,不断提升自身的核心竞争力。

    开源文化在不仅在前端技术,甚至整个软件行业都已得到广泛接受和普及,我们也在开源项目中受益匪浅,TinyVue 从自研走向开源也是顺应了这一开源文化的趋势。目前 TinyVue 已于2023年初正式开源(https://opentiny.design/)。我们希望通过开源,让华为内外的开发者可以共同协作改进和完善我们的组件库,共享华为沉淀多年的知识和经验。我们希望通过开源,与社区用户共同探索和实验新的技术、框架和模式,推动前端领域的创新。我们希望通过开源,为开发者提供更多选择和灵活性,让整个前端社区都能受益。

    欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official一起参与共建~

    OpenTiny 官网:https://opentiny.design/

    OpenTiny 代码仓库:https://github.com/opentiny/

    欢迎进入 OpenTiny 代码仓库 Star🌟TinyVue、TinyNG、TinyCLI~

    随着业务的发展,实时场景在各个⾏业中变得越来越重要。⽆论是⾦融、电商还是物流,实时数据处理都成为了其中的关键环节。Flink 凭借其强⼤的流处理特性、窗⼝操作以及对各种数据源的⽀持,成为实时场景下的⾸选开发⼯具。

    FlinkSQL 通过 SQL 语⾔⾯向数据开发提供了更友好的交互⽅式,但是其开发⽅式和离线开发 SparkSQL 仍然存在较⼤的差异。袋鼠云实时开发平台StreamWorks,⼀直致⼒于降低 FlinkSQL 的开发门槛,让更多的数据开发掌握实时开发能⼒,普及实时计算的应⽤。

    本文将为大家简单介绍在袋鼠云实时开发平台开发 FlinkSQL 任务的四种⽅式。

    脚本模式

    该模式是最基础的开发⽅式,数据开发人员在平台 IDE 中通过 FlinkSQL 代码,完成 Flink 表定义和业务逻辑加⼯。代码如下:

    
    

    脚本模式的优缺点

    优点:灵活性⾼。

    缺点:Flink表定义逻辑复杂,如果不熟悉数据源插件,很难记住需要维护哪些参数;如果该任务涉及多张表,代码块中存在⼤段表定义代码,不⽅便排查业务逻辑。

    向导模式

    基于脚本模式存在的缺点,袋鼠云实时开发平台将 Flink 表定义逻辑抽象成了可视化配置的功能,引导数据开发⼈员通过⻚⾯配置化的⽅式完成 Flink 表定义,让数据开发更专注在业务逻辑的加⼯。

    file

    向导模式是在开发⻚⾯的配置项中根据⻚⾯引导,完成 Flink 表的源表、维表、结果表的映射,然后在 IDE 中直接引⽤,读写对应的 Flink 表,完成逻辑开发。

    · 平台默认提供各类数据源的源表、维表、结果表常⽤配置项;

    · 对于各种⾼级参数,平台也提供了维护⾃定义参数的 key/value ⽅式来满⾜灵活性要求。

    Catalog 模式

    在向导模式中,我们可以借助配置化的⽅式快速完成表映射,但同时也存在⼀个问题,这些映射表只能在当前任务中被引⽤,⽆法在不同的任务中复⽤。

    但是在真实的实时数仓建设过程中,我们常会遇到下⾯这种场景:某⼀个 dws 层级的 kafka topic,会在多个 ads 任务中被作为源表使⽤。⽽在每个 ads 任务开发过程中,都需要为同⼀个 dws topic 做⼀次相同的 Flink 映射。

    为了解决这种重复映射的开发⼯作,我们可以借助 Flink Catalog 功能,将映射表的数据信息进⾏持久化存储,这样就可以在不同的任务中重复引⽤。具体使⽤⽅法如下(以平台的 DT Catalog 为例):

    Catalog ⽬录维护

    · 先在 DT Catalog 下创建⼀个名为 stream_warehouse 的 catalog

    · 然后在该 catalog 下根据数仓层级或者业务域创建不同的 database

    file

    Flink 映射表创建

    · ⽅式⼀:在⽬录中 hover database,根据引导通过配置化⽅式完成 Flink 表映射

    file

    · ⽅式⼆:在 IDE 中,通过 Create DDL 完成创建,注意要指定对应的 catalog.database 路径

    
    

    FlinkSQL 任务开发

    完成上面两个步骤,⼀张数据持久化存储的 Flink 映射表就创建好了。我们在开发任务的时候,就可以直接通过 catalog.database.table 的⽅式,引⽤我们需要的表。

    
    

    Demo 模式

    学会了上⾯三种开发⽅式后,如果你还对 FlinkSQL 的开发逻辑⽐较陌⽣,那么建议你可以通过袋鼠云实时开发平台的代码模版中⼼去完成⼀个完整的任务开发。

    在模版中⼼,我们提供了⼆⼗余种常⻅的业务场景及其对应的 FlinkSQL 代码逻辑,如各类窗⼝的写法、各类 Join 的写法等等,你可以根据真实的业务场景去套⽤模版,快速地完成任务开发。

    file file

    总结

    每种开发模式没有绝对的好坏之分,需要根据不同企业的实时计算场景和阶段,采⽤不同的开发模式,才能真正达到降本增效的目的。

    · 当企业刚接触实时计算,数据开发⼈员对 FlinkSQL 熟悉度较低时,DEMO 模式是最好的选择;

    · 当企业已经上⼿实时计算,但是任务量还不⼤时,脚本模式或者向导模式是不错的选择;

    · 当企业实时计算达到⼀定规模,需要进⾏类似离线数仓的管理⽅式时,Catalog 模式是最优的选择。

    《数栈产品白皮书》:https://www.dtstack.com/resources/1004?src=szsm

    《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001?src=szsm 想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=szkyzg

    同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术qun」,交流最新开源技术信息,qun号码:,项目地址:https://github.com/DTStack

    1、引言

    开发者在编码效率和快速迭代中的痛点场景包括:

    1. 修改代码后,需要频繁重启应用,导致开发效率低下;

    2. 实时调试时,不能立即看到代码修改的结果;

    3. 大型项目中,重启的时间成本较高。

    针对这些问题,本文将深入探讨如何利用Spring Loaded热更新技术提高开发效率,减少编译和重启时间。分析Spring Loaded的热更新原理,以及实际应用过程中所需的操作和注意事项。

    2、框架简介

    Spring Loaded is a JVM agent for reloading class file changes whilst a JVM is running. It transforms classes at loadtime to make them amenable to later reloading. Unlike ‘hot code replace’ which only allows simple changes once a JVM is running (e.g. changes to method bodies), Spring Loaded allows you to add/modify/delete methods/fields/constructors. The annotations on types/methods/fields/constructors can also be modified and it is possible to add/remove/change values in enum types.

    Spring Loaded 是一个 JVM 代理,可以在 JVM 运行时重新加载类文件的更改。它会在加载时转换类,以便稍后重新加载。与“热代码替换”只允许在 JVM 运行时进行简单更改(例如更改方法体)不同,Spring Loaded 允许您添加/修改/删除方法/字段/构造函数。还可以修改类型/方法/字段/构造函数上的注解,并且可以添加/删除/更改枚举类型中的值。

    3、如何使用

    3.1 下载Agent插件

    
    

    3.2 引入Agent插件

    在jvm的启动命令中添加以下参数

    
    

    3.3 修改并重新编译

    修改代码后执行Build->Recompile命令,可以看到在class reloaded完成后,程序的运行逻辑发生了变化

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4、原理分析

    4.1 代码编译分析

    先来看一段源代码,这是一个RpcService类,定义了target字段、targetStatic静态字段和say方法,现在我们编译它。

    
    

    SpringLoaded对类编译后添加了一些跟踪记录字段,添加方法拦截判断。

    
    

    我们可以在代码运行时,使用getDeclaredField、getDeclaredMethod等函数在运行时获取类成员、方法信息,此时可以看到增强后的类多了如下字段和方法。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    在编译后的代码中,我们可以看到RpcService类包含了一些新的字段和方法,这些都是Spring Loaded框架增加的。

    •r$type是一个静态变量,其类型为ReloadableType。这个字段用于表示当前类的可重载类型,它包含了当前类的最新字节码和其他相关信息。

    • r$get、r$set方法是用于获取实例字段的值的方法,处理字段的拦截和替换。
    • ___clinit___方法是用于执行类的静态初始化块的方法。
    • init()方法是用于处理类的构造函数的方法。
    • 在say()方法中增加了一个代码片段用于判断类是否发生了变更,如果变更了,则调用最新的可重载类型中的say()方法获取结果。否则,继续执行原有的方法体。在方法体中,也增加了一个代码片段用于判断本地变量是否需要拦截,如果需要,则使用r$get()方法获取非静态变量traget的值,并用它替换原有的变量值。

    4.2 运行过程分析

    1、在应用程序启动时,Spring Loaded在目标类路径中查找所有的类,并在ClassPreProcessor中使用自定义类加载器加载这些类,重新定义后存入TypeRegistry,用于缓存、变更对比和依赖关系维护。

    2、注册一个文件变化监听器FileChangeListener,当一个类文件被修改后,Spring Loaded会检测到这个变化,并重新加载该类文件。

    3、当一个类被重新加载时,Spring Loaded会尝试对比类的签名和继承关系没有改变,如果新的类定义与之前的类定义兼容,那么Spring Loaded会更新应用程序中的对象引用,以指向新的类定义。

    5、总结

    Spring-loaded 使用 Java 的 Instrumentation API 在 JVM 启动时指定 Agent,使它能够在目标类加载之前进行拦截,并将目标类的字节码通过 ASM 库解析成抽象语法树(AST),然后对 AST 进行修改。修改的内容包括增加、删除、替换方法,修改方法体,添加字段等,最终替换目标类,改变其逻辑,实现对代码的热更新。

    6、扩展内容

    • Jrebel也可以实现类似热更新功能,并且它更高效、稳定。jrebel官网
    • Spring-boot-devtools也可以提升开发速度,但是它的方案更像是热重启。Spring Boot Devtools Restarter 原理
    • 如何自己实现一个热更新功能呢?思路大同小异,实现各有千秋。如何自己实现一个热加载?如何定义自己的类加载器?

    作者:京东零售 程啸

    来源:京东云开发者社区

    6月13日OpenAI在Chat Completions API中添加了新的函数调用(Function Calling)能力,帮助开发者通过API方式实现类似于ChatGPT插件的数据交互能力。

    本文在作者上一篇文章《私有框架代码生成实践》的基础上,依旧使用自然语言低代码搭建场景作为案例,将嵌入向量搜索(Embedding)获取私有知识库的方式,替换为函数调用方式,以我们更熟悉的结构化数据结构、关系型数据库的方式进行知识库管理。同时函数调用能力的灵活性和可扩展性,也可以帮助用户使用自然语言搭建更加复杂的页面内容、进行更丰富的交互操作。

    一、 什么是函数调用

    函数调用(Function Calling)是OpenAI在6月13日发布的新能力。根据官方博客描述,函数调用能力可以让模型输出一个请求调用函数的消息,其中包含所需调用的函数信息、以及调用函数时所携带的参数信息。这是一种将GPT能力与外部工具/API连接起来的新方式。

    支持函数调用的新模型,可以根据用户的输入自行判断何时需要调用哪些函数,并且可以根据目标函数的描述生成符合要求的请求参数。

    开发人员可以使用函数调用能力,通过GPT实现:

    • 在进行自然语言交流时,通过调用外部工具回答问题(类似于ChatGPT插件);
    • 将自然语言转换为调用API时使用的参数,或者查询数据库时使用的条件;
    • 从文本中提取结构化数据。等

    二、 如何使用函数调用

    函数调用能力可以通过聊天API(Chat Completion)使用。为了实现函数调用能力,OpenAI对聊天API进行了修改,增加了新的请求参数、响应类型以及消息角色,应用开发者需要:

    1. 在请求参数中向聊天API传递信息,描述应用所提供的可调用函数的信息。
    2. 解析聊天API响应的消息类型,若模型决定需要调用函数,则根据模型返回的函数信息和函数传参调用函数,并获得返回结果。
    3. 将函数返回的结果添加到消息列表中,并再次调用聊天API。

    1. 添加请求参数, 描述所支持的函数信息

    聊天API中新增了两个请求体参数:

    当前应用可调用的函数的列表。函数信息中包含了函数的名称、自然语言描述、以及函数所支持传入的参数信息。

    参数的格式如下:

    
    

    参数支持以数组形式录入多组函数信息,其中:

    • :函数名称。后续模型会在需要调用函数时返回此名称。

    • :函数功能描述。模型通过该描述理解函数能力,并判断是否需要调用该函数。

    • :函数所需的参数。以对象的形式描述函数所需的参数,其中对象的key即为参数名。

      • :参数类型。支持JSON Schema协议。
      • :参数描述。
    • :必填参数的参数名列表。

    控制模型应该如何响应函数调换。支持几种输入:

    1. :模型不调用函数,直接返回内容。没有提供可调用函数时的默认值。
    2. :模型根据用户输入自行决定是否调用函数以及调用哪个函数。提供可调用函数时的默认值。
    3. :强制模型调用指定的函数。

    2. 识别响应参数, 描述需要调用的函数信息

    聊天API在响应内容的可选项()中提供了两个响应参数:

    响应内容结束的原因。

    可能的原因包括:

    • :已返回完整消息。
    • :已达到令牌限制或由参数设置的上限。
    • :模型决定需要调用一个函数。
    • :内容触发了拦截策略,忽略返回内容。
    • :API响应仍在执行。

    其中,若返回则表示模型需要调用函数。此时参数会额外返回函数信息以及函数参数信息。

    若响应内容结束的原因是模型需要调用函数,则参数中会增加一个用于描述函数信息的参数,其格式如下:

    • :函数名称。
    • :函数参数信息。JSON字符串格式。

    3. 添加对话角色, 向消息列表中添加函数返回值

    在函数执行完成后,可以将函数的返回内容追加到消息列表中,并携带完整的消息列表再次请求聊天API,以获得GPT的后续响应。

    在消息列表中,角色的可选值除了原有的系统()、用户()、助理()外,新增了函数()类型,用来标识该消息时函数调用的返回内容。

    注意:向消息列表中追加函数调用响应消息前,还需要首先将上一步模型返回的消息追加到消息列表中,以保证消息列表中的上下文完整。

    完整使用代码

    
    

    三、 低代码自然语言搭建案例

    在作者的上一篇文章中,使用嵌入向量搜索提供的“检索-提问解决方案”进行低代码私有协议的访问。在本文中,将使用函数调用方式进行替代。

    同时,基于函数调用的能力,也探索了一些更加复杂的页面搭建能力和低代码平台功能。

    1. 私有协议访问

    基于我们的低代码平台私有协议,在进行CMS类型页面的搭建时,我们将协议的知识划分为几个层级,并分别提供函数供GPT按需调用,以实现私有协议的访问。

    系统描述信息

    
    

    函数信息描述

    
    

    备注:尽管GPT模型支持函数的循环调用,但出于减少API调用频次和节省Token消耗的目的,我们建议在查询私有协议信息的函数中,使用关键词数组的形式进行批量查询。

    函数内容

    
    

    调用示例

    一次完整调用的消息列表:

    为了便于阅读,已经调整了消息列表中消息内容的缩进排版,并且将表示函数调用参数的JSON字符串解析为对象形式。

    
    

    2. 页面搭建能力扩展: 页面上下文跳转场景

    在进行低代码页面搭建时,有时会需要在页面配置中加入一些上下文信息。

    例如需要在页面中添加一个按钮,用户按钮时跳转至另一个页面。此时我们可以通过一个函数,允许模型获取相关的页面列表。

    关于按钮、跳转操作等协议内容可以通过上一章节中的方法获取:

    
    

    函数信息描述

    
    

    函数内容

    
    

    调用示例

    一次完整调用的消息列表:

    为了便于阅读,已经调整了消息列表中消息内容的缩进排版,并且将GPT返回的配置信息和表示函数调用参数的JSON字符串解析为对象形式。

    
    

    3. 低代码平台能力扩展: 搭建窗口可视区域调整

    在进行自然语言低代码搭建时,我们希望让搭建窗口的可视区域自动滚动到发生变化的区域,此时可以通过系统角色要求在进行页面配置变动时调用页面滚动方法,自动滚动至发生配置变化的素位置。

    系统描述信息

    在系统描述信息中添加相关描述:

    
    

    函数信息描述

    
    

    函数内容

    
    

    四、 总结

    OpenAI提供的函数调用功能为使用GPT能力的应用提供了更丰富的可能性。应用开发者可以通过函数调用功能,让用户通过自然语言交互,获取实时数据、结构化数据,同时也可以与应用进行各类交互。本文中描述的几个案例场景仅为抛砖引玉,欢迎大家多多讨论,尝试更多应用场景。

    作者:京东零售 牛晓光

    来源:京东云开发者社区

    rust FFI 是rust与其他语言互调的桥梁,通过FFI rust 可以有效继承 C 语言的历史资产。本期通过几个例子来聊聊rust与C 语言交互的具体步骤。

    场景一 调用C代码

    创建工程

    
    

    Cargo.toml 配置

    
    

    编写一个简单的c程序sample.c

    
    

    main.rs

    
    

    build.rs

    
    

    代码目录树

    
    
    
    

    场景二 使用bindgen 通过头文件绑定c语言动态链接库

    修改Cargo.toml,新增bindgen依赖

    
    

    新增 sample.h 头文件

    
    

    新增 wrapper.h 头文件 wrapper.h 文件将包括所有各种头文件,这些头文件包含我们想要绑定的结构和函数的声明

    
    

    改写build.rs 编译 sample.c 生成动态链接库sample.so;通过bindgen生成rust binding c 的代码并输出到 bindings 目录

    
    

    修改main.rs include 宏引入sample 动态链接库的binding。以前我们自己手写的C函数绑定就不需要了,看看bindings/sample_bindings.rs 的内容与我们手写的函数绑定是等效的

    
    

    代码目录树

    
    

    ffi_sample 工程的完整代码位置,读者可以clone https://github.com/jiashiwen/wenpanrust,直接运行即可

    
    

    场景三 封装一个c编写的库

    secp256k1是一个椭圆曲线计算的 clib,这玩意儿在密码学和隐私计算方面的常用算法,下面我们从工程方面看看封装secp256k1如何操作

    
    

    cargo.toml

    
    

    git 引入 submodule

    
    

    工程下新建bindings目录用来存放绑定文件,该目录与src平级

    wrapper.h

    
    

    build.rs

    
    

    cargo build 通过

    编写测试 lib.rs

    
    

    运行测试 cargo test 报错

    
    

    报错显示找不到编译 secp256k1 相对应的库。

    手动编译secp256k1

    
    

    编译完成后,测试通过

    其实 secp256k1 有对应的 rust wrapper,我们这里只是展示一下封装的过程。

    wrapper_secp256k1 工程的完整代码位置,有兴趣的朋友可以clone https://github.com/jiashiwen/wenpanrust。通过以下操作查看运行结果:

    • clone 项目

      
      
    • update submodule

      
      
    • 编译 secp256k1

      
      
    • run test

      
      

    参考资料

    Rust FFI (C vs Rust)学习杂记.pdf
    bindgen官方文档
    Rust FFI 编程 – bindgen 使用示例

    作者:京东科技 贾世闻

    来源:京东云开发者社区

    在股票交易市场,涨幅是一个基础的量价指标,可以衡量资金对个股的拉升力度,是监控主力异动的重要指标。通过关注涨幅,可以了解到资金青睐哪些个股,市场关注哪些板块。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    本教程主要提供一种基于 DolphinDB 流数据处理框架,实时计算 1 分钟、5 分钟和10 分钟涨幅榜的低延时解决方案。

    1. 应用场景描述

    1.1 数据源

    本教程基于上交所 2021 年某日的快照数据进行代码调试,在 DolphinDB 中存储的表结构为:

    字段名称
    数据类型
    数据说明 securityID SYMBOL 证券代码 dateTime TIMESTAMP 日期时间 preClosePx DOUBLE 昨收价 openPx DOUBLE 开始价 highPx DOUBLE 最高价 lowPx DOUBLE 最低价 lastPx DOUBLE 最新价 …… …… ……

    1.2 计算指标

    本教程示例代码计算了 1 分钟,5 分钟,10 分钟涨幅榜。

    涨幅计算公式: (lastPx – prevLastPx) / prevLastPx * 100 %

    指标名称
    含义 factor_1min 1 分钟涨幅,
    prevLastPx 为 1 分钟前的股票价格 factor_5min 5 分钟涨幅,
    prevLastPx 为 5 分钟前的股票价格 factor_10min 10 分钟涨幅,
    prevLastPx 为 10 分钟前的股票价格

    关于涨幅的计算细节,不同的开发者会有不同的处理方法。本教程的处理方式如下:

    • 当前 X 分钟数据存在时,prevLastPx 取前 X 分钟数据的价格。
      • 比如 1 分钟涨幅,09:31:00 的时候,存在 09:30:00 的数据,则 prevLastPx 为 09:30:00 的 lastPx
    • 当前 X 分钟数据不存在时,prevLastPx 取 X 分钟前的一个临近时间对应数据的 lastPx
      • 比如 5 分钟涨幅,假设 11:30:00 的数据是上午的最后一条数据,11:30:01~12:59:59 这段时间内没有数据产生。13:03:00 的时候,没有前 5 分钟的 12:58:00 的数据,则 prevLastPx 为 12:58:00 的上一条数据,即 11:30:00 的 lastPx
    • 当窗口不满 X 分钟时,prevLastPx 取窗口内第一条数据的价格。
      • 比如 10 分钟涨幅,假设 09:30:00 时,只有 09:25:00~09:30:00 的数据,没有前 10 分钟的 09:20:00 的数据,也没有 10 分钟前的临近时间的数据,则 prevLastPx 为窗口第一条数据,即 09:25:00 的 lastPx
    • 09:30:00 以后开始输出计算结果
    • 上游过滤数据,只计算上交所主板 A 股(股票代码 60 开头) 09:25:00 以后的股票涨幅(09:25:00 以后 lastPx 不为 0)

    1.3 实时计算方案

    本教程通过 createReactiveStateEngine 函数创建响应式状态引擎实时计算股票涨幅,通过 createCrossSectionalEngine 函数创建横截面引擎对股票截面上的涨幅进行排序生成涨幅榜。

    本教程实现的处理流程如下图所示:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    处理流程图说明:

    • 实时数据:为了测试方便,本教程选择从数据库内取出某一天的快照数据,通过 replay 函数指定速率回放,以此模拟实时数据。
    • snapshotStreamTable 是 DolphinDB 中的流数据表,用于接收实时数据源的数据并发布给流计算引擎进行实时计算。
    • subscribeTable 订阅流数据表,将 snapshotStreamTable 中的增量数据根据股票代码 SecurityID 过滤出沪市主板 A 股的数据,并添加到流计算引擎中计算涨幅。
    • 响应式状态引擎结合内置的 tmfirst, tmove 函数实时计算涨幅。
    • 横截面引擎结合内置的 rank 函数实时计算排名。
    • 计算结果表是 DolphinDB 中的共享键值表,用于维护涨幅榜的截面,其数据可以被外部消费者消费。
    • Grafana 查询引擎输出的计算结果,以实现动态展示涨幅榜的效果。

    2. 代码开发

    本教程代码开发工具采用 DolphinDB GUI,所有代码均可在 DolphinDB GUI 客户端开发工具执行。

    2.1 创建存储历史数据的库表

     
    • 分区原则:建议落在1个最小分区的数据在内存的大小约 150MB~500MB。
      • 比如:上交所 2021年12月01日的股票快照数据为 行 194 列,加载到内存的大小约 7.3 GB。所以采用组合分区的方法,第一层按天分区,第二层对股票代码按 HASH 分 30 个分区,每个分区的全部数据加载到内存后约占用 7.3*1024 30 = 249MB 内存空间。
    • 创建数据库时,选择 DolphinDB 的 TSDB 存储引擎进行数据的存储。
    • 创建数据表时,按照分区方法,指定  和  为分区字段。在对大数据集查询时,必须指定  和  的过滤条件,可以起到分区剪枝的作用。
    • DolphinDB 默认数据存储的压缩算法为 lz4,对于时间、日期类型的数据,建议指定采用 delta 压缩算法存储,提高存储的压缩比。

    2.2 导入上交所历史快照数据

     
    • 测试只使用了 2021年12月01日上交所 30 只股票 10:30:00 前的数据,共 32972 条数据,内存占用约 30 M
    • 历史数据对象为 csv 文本数据,磁盘空间占用 23 MB
    • loadTextEx 函数可以直接将数据文件加载到数据库中。其中系统会对数据文件中的数据执行 transform 参数指定的函数,再将得到的结果保存到数据库中,本教程中将 csv 中的十档量价数据转化为了 array vector 进行存储

    数据导入完成后,可以执行以下查询语句确认数据是否导入成功:

     

    执行完后,返回如下信息,说明数据成功导入:

    TradeDate count 2021.12.01 32,972

    2.3 清理环境并创建相关流数据表

     

    根据 1.3 章节的流程图,可以看出需要清理的有:正在进行的回放任务、一个订阅(subscribeTable)、两个引擎(响应式状态引擎和横截面引擎)、两张共享表(输入输出表)。

    需要创建的表有:一张共享流表(和数据库 dbName 中名为 tbName 的分布式表结构相同,用于接收实时数据)、一张共享键值表(用于维护股票涨幅排名的截面数据)。

    2.4 注册流计算引擎和订阅流数据表

    (1)订阅流表 snapshotStreamTable,过滤出沪市主板 A 股 09:25:00 以后的数据

     
    • 参数 batchSize 和 throttle 能指定触发 handler 的规则。batchSize 未指定或为非正数,则每一批次的消息都会触发 handler 处理增量数据;否则未处理的数据需要积攒到 batchSize 条时,handler 才会统一处理消息。如果 batchSize 条件一直未达到,那么继上次处理消息的 throttle 秒之后也会触发 handler 处理消息。
    • 本教程代码没有指定 batchSize 和 throttle 是因为示例数据的数据量比较小,共 30 只上交股票,其中主板 A 股只有 26 只。所以每批数据触发一次 handler 处理也不会产生计算压力。
    • 当接入实时数据之后,可以用  观察订阅状态,如果发现 queueDepth 一直增加,表示订阅队列产生堵塞。此时可以考虑配置并调整 batchSize 和 throttle 参数。

    (2)注册响应式状态引擎 calChange,计算涨幅

     
    • @state 用于标识状态函数,表示在响应式状态引擎中需要访问灌入引擎的历史数据。其中  和  是涉及状态的函数。
    • 采用了引擎串联,即响应式状态引擎的输出直接输入下一个横截面引擎。因为 , 所以需要先执行下面 (3) 的代码创建横截面引擎后,才能顺利执行上述代码创建响应式状态引擎

    (3)注册响应式状态引擎 crossSectionalEngine,计算排名

     
    • schemaTB 是横截面引擎的输入表结构(对应响应式状态引擎的输出表结构)。参数 dummyTable 只是为了指定输入表结构,和表里是否有数据无关。
    • 横截面引擎支持多种触发计算的规则,包括
      • “perBatch” 每插入一批数据触发一次计算
      • “perRow” 每一行数据都会触发一次计算
      • “interval” (根据系统时间)每隔 triggeringInterval 的时间,引擎内若存在未计算数据,触发一次计算
      • “keyCount” 当前时间戳记录数达到 triggeringInterval,或有更新时间戳的数据到达时,触发一次计算
    • 本例中,触发计算的规则采取的是 ,即每插入一次数据触发一次对截面的排名统计。

    2.5 Grafana 实时展示涨幅榜

    Grafana 配置 DolphinDB 数据源及监控 DolphinDB 数据表中数据的教程:Grafana 连接 DolphinDB 数据源

    本教程监控 1 分钟、5 分钟、10 分钟的涨幅榜。

    Grafana 中的 Query 代码:

    • 1 min 涨幅榜
     
    • 5 min 涨幅榜
     
    • 10 min 涨幅榜
     

    2.6 历史数据回放

     

    执行完后,返回如下信息:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    如果 endTime 和 errorMsg 为空,说明任务正在正常运行中。

    3. 结果展示

    3.1 节点内的计算结果表

    计算结果表 ,可以通过 DolphinDB 所有 API 查询接口实时查询。

    下图是通过 DolphinDB GUI 实时查看该表的结果:

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3.2 Grafana实时监控结果

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    4. 性能测试

    本教程测试了单次响应计算和连续响应计算两种场景。测试数据为 2021 年某天的上交所主板 A 股 1650 只股票的数据。

    4.1 单次响应计算性能测试

    单次响应计算时间为从第 1 个响应式状态引擎收到输入至第 2 个横截面引擎输出结果所经历的时间。

    测试了单只股票响应一次计算(单条数据触发一次计算)和 1650 只股票响应一次计算(一批数据触发一次计算)的性能。统计了 10 次的总耗时,取平均值作为单次的耗时。测试使用的服务器 CPU 为 Intel(R) Xeon(R) Silver 4216 CPU @ 2.10GHz。单线程情况下,测试结果如下:

    股票个数 耗时(单位:ms) 1 0.20 1650 3.45

    4.2 连续响应计算性能测试

    以 2021 年某天的上交所主板 A 股 1650 只股票的 658 万条快照数据为测试数据,将所有测试数据全量灌入第 1 个响应式状态引擎触发计算。引擎流水线的计算总耗时是 17 秒,最大处理的能力是 38 万条每秒。

    开发者可以增加计算的并行度,提高系统的处理能力。

    5. 总结

    DolphinDB 内置的流数据框架支持流数据的发布,订阅,预处理,实时内存计算,复杂指标的滚动窗口计算、滑动窗口计算、累计窗口计算等,是一个运行高效、使用便捷的流数据处理框架。

    本教程基于 DolphinDB 流数据处理框架,提供了一种实时计算涨幅榜的低延时解决方案,旨在提高开发人员在使用 DolphinDB 内置的流数据框架开发流计算业务场景时的开发效率、降低开发难度,更好地挖掘 DolphinDB 在复杂实时流计算场景中的价值。

    附件

    业务代码

    01.创建存储快照数据的库表并导入数据.txt

    02.清理环境并创建相关流数据表.txt

    03.注册流计算引擎和订阅流数据表.txt

    04.历史数据回放.txt

    05.性能测试.txt

    示例数据

    snapshot_30stocks.zip

    我们在追求怎样的编码未来?

    无处不在的视频渗透、井喷式的流量增长、多的场景技术需求、用户对视频体验的“不将就”……音视频行业的快速发展却伴随着“编码标准升级速度缓慢”、“硬件红利见底”、“编码复杂度带来的成本问题”等众多挑战。

    视频编码还“卷”得动吗?

    究竟怎样的视频编码技术,才能满足既要又要的体验与成本平衡?

    面向机器视觉的视频编码、虚拟现实视频、智能化应用视频……前浪翻滚而来,视频编码的“未来式”如何展开?

    本文由IMMENSE、「阿里云视频云」视频编码服务端负责人陈高星和LiveVideoStack策划、采访而成。

    需求很多,矛盾更多

    技术迭代速度凝固了吗?摩尔定律走到尽头了吗?

    视频编解码技术约10年提升50%压缩率,但这“十年磨一剑”的升级速度,早就跟不上视频信息量膨胀的速度。

    新编码标准带来的编码复杂度增加,远高于CPU处理能力的增强,随之面临编码技术难以“普惠”的难题。

    随着视频在更多应用场景的扩展探索,单一编码标准已难覆盖多种视频应用需求……

    显然,一边是AR、VR时代的到来,以及4K、8K的高分辨率,60-120fps高帧率,10-12bit宽色域,让视频本身的信息量数倍膨胀;一边,是资源堆叠置换压缩效率,和“摩尔定律”的进步已经走到了“尽头”。加之,视频的“超低延时”对编码速度的要求,这一切,让视频体验、带宽、计算成本、编码速度之间的 “矛盾” 越发明显。

    于是,我们始终面临更高清、更实时、更高效的编码需求,也面临技术与需求之间的诸多“矛盾”。

    在这些似乎难以平衡的“矛盾”背景下,也衍生出许多值得进一步探讨的问题:

    ➤ 现有的编码标准在哪些方面关注不够?

    ➤ 如何先用好现有的编码标准?

    ➤ 现有的视频编码技术覆盖不到的维度有哪些?

    ➤ 除了码率和质量,视频编码是否需要关注更多的目标?

    ➤ 如何打破资源堆叠置换视频压缩效率提升的技术思维惯性?

    ……

    从需求、矛盾、问题中,可引出深一层的认知:编码优化的目标不再仅仅考虑传统的主客观质量、复杂度、时延等维度,还有与AI处理能力的友好性、多平台下性能的适配性等。

    问题的提出总是伴随着解题思路和技术方向的选择。

    于是,推动着编解码架构从传统向更智能、更兼容的方向演进。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    终极目标,有些偏倚

    在优化编解码时,我们究竟需要追求什么?

    当2015年阿里云视频云向业界提出了“窄带高清”的概念,并在2016年正式推出窄带高清技术品牌并产品化,这种既“降低码率”又“提高清晰度”的兼顾之方,几乎成为了业界的通用解法。

    但是,不断演化之下到当前,业内开始流行一种“内卷”,即,过度追求”某客观指标数据”的优化。

    然而,以“人”为中心的视频化视角,在最终的用户体验上,视频都应是更关注主观体验的。相反的是,在实际研发过程中,特别是编码器的优化上,通常都是依赖如:PSNR、SSIM、VMAF-NEG这样的“有源客观指标”。

    诚然,在大部分情况下,客观质量的提升都能一定程度反映到主观质量的提升上,特别是当样本数足够大,且客观质量提升较大时,客观指标和主观感受能呈现一致性。

    不过在窄带高清的优化实践中,也存在一些主客观优化“不一致”的情况。

    比如:H.265标准中的SAO工具,用于改善振铃效应,但随之会降低VMAF和VMAF-NEG分数;

    X265编码器里的PSY工具,在主观质量上能增加高频细节,但是对于客观指标都是不友好的;

    又比如:JND和ROI技术,在挖掘视觉失真冗余的过程中,也不可避免地会造成有源客观指标的下降;

    阿里云自研的码控算法,会对容易出现“块效应”等主观问题的区域分配更多码率以保护主观质量,但这也会导致客观质量下降;

    还有,前处理增强中的各种修复生成技术,会直接对源进行修改,这类技术对于旨在评价“与源差异大小”的有源客观指标,都是不太友好的。

    此外,针对单一客观指标的“过度优化”,也有可能造成单一客观指标与主观体验相悖的情况……

    因此,单项客观指标的数值或高或低,都不应是视频编码优化追求的“终极目标”。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    细微之处,方见视界

    我们的编解码视界里,可以有哪些精妙解法?

    在上述技术理念和智能编码架构的支撑下,“窄带高清2.0”从人眼视觉模型出发,将编码器的优化目标从“保真度更高”调整为“主观体验更好”。

    这可以从视觉编码和细节修复两个视角来看。

    在视觉编码维度,“窄带高清2.0”采用基于场景和内容的帧类型决策和块级码率分配,模式决策采用面向主观友好的算法。

    在内容自适应编码部分,考虑到人眼感知的视频空间域的亮度、对比度以及时域失真是不连续的,通过基于恰可察觉失真(JND)自适应编码技术,丢弃视觉冗余信息,在主观质量不发生明显降低的情况下,可以大幅节省带宽;同时,通过ROI码控技术调整码率分配策略,进一步提升人眼感兴趣区域的清晰度。

    在细节修复维度,“窄带高清2.0”采用基于生成对抗网络(GAN) 的细节修复生成技术,在修复因编码压缩引起的马赛克效应和边缘毛刺的同时, “脑补” 生成一些自然的纹理细节,使得画面纹理细节更丰富、更自然、更有质感。

    更关键的是,应对垂直细分场景,我们的模型会对场景特征会实现更为智能的纹理生成。

    比如:对于演唱会场景,曾为百视TV专属打造了Idol人像定制模版,针对优化人像区域的细节修复生成效果,将Idol的“怼脸直拍”,通过直播清晰还原送到观众屏幕前。

    再比如:在NBA篮球比赛场景,AI修复模型加强了篮球场地板纹理、球员近景特写、球场边界线、地面广告字母、球衣上数字、篮球网等篮球体育赛事特有素的修复生成,大大提升画面清晰度和整体视觉生动力表现。

    也正是,唯有细微之处,方能见技术之极。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    绕不开的“成本、成本、成本”

    成本和体验的“非零和博弈”, 编解码怎么摆平?

    正如“清晰度”和“带宽”是“窄带高清”需要平衡的天平两端,在当前“降本增效”的大环境之下,“体验”和“成本”的“非零和博弈”,一定是绕不开的话题。

    成本(计算复杂度),体验(质量),这两者虽然是“trade-off”的权衡关系,但在某种程度上,也可以单方面优化提升。

    比如,通过算法优化,在复杂度不变的情况下,将编码器的R-D曲线朝着更有性价比的方向优化;同时,通过高性价比的自适应快速算法的设计,也可以将质量的提升转化为成本的收益;又或者,通过底层优化并与计算平台的充分结合,挖掘异构编码的潜力,可以进一步在质量不变的情况下降低计算成本。

    当然,在“让高压缩率算法和AI真正普惠”的路上,阿里云视频云所做的不仅于此。

    与视频编码类似,在视频处理领域,深度学习从效果上已经远超传统方法,同时还在不断地快速进化,但深度学习对计算资源的高消耗,成为阻碍其在实际应用中广泛使用的主要原因。

    阿里云视频云深度自研编码内核,包括s264、s265,落地100+算法,支持直播、点播、RTC场景,相对于开源,全场景20%+压缩率领先。

    同时,我们引入AI辅助的编码决策,在码率分配和模式决策上提升内容自适应能力,极致挖掘视觉冗余,同等主观下,码率节省50%。

    软硬结合,是激活成功教程编码天花板之技吗?

    在算法层面和软件层面塑造的有限差异之上,要想塑造成本优势,必须将软件、算法与操作系统、硬件、乃至芯片,全线联动。

    此基础上,基于自研倚天710芯片,视频云与倚天团队联合投入ARM视频编码优化,深度重构了视频编码数据结构、并行框架,重新调优了快速算法策略,从软件、汇编、硬件层面跨层深度优化,塑造极致性能。

    同时,我们与平头哥深度合作,共建 “软硬结合” 自研芯片竞争力,通过算法、加速库、驱动、固件一体化设计,不断探索创新音视频技术,加强在更多视频应用、更多终端设备上的普适性,从而带来更节省、更低耗、更高清、更实时的硬核编码力,赋能千行百业的视频化需求。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    没有想象,就没有进化

    苹果的VisonPro,透射出编码的未来吗?

    回顾文章开头的“矛盾”与问题,面对激增的海量视频数据、多的视频内容形式,以及加速扩大的行业应用范围,视频编码如何“进化”的答案,也隐藏在行业的急速迭代之中。

    如何实现更高压缩效率并匹配多样的细分场景? AI codec能实现比传统压缩标准更高的压缩效率,并能够在一些垂直场景有落地的机会,例如:业界已有基于深度学习的图像压缩,落地于卫星图像的压缩传输;

    面对未来视频数据的消费场景不再单纯局限于人眼视觉,服务于机器视觉的视频编码也将迎来巨大应用市场。阿里云视频云团队已与高校深度合作,布局“面向人-机视觉的全新编码范例:高层语义与低层信号相结合的图像编码方案”;

    而对于近期大热的苹果VisionPro的推出,作为视频行业工作者,十分乐见VR生态能在苹果的带领下,真正打出一片市场。因此,一些相关的沉浸式编码标准如MIV,点云编码,动态网格编码等技术,也将逐步投入研究……

    未来已来,智能编码架构的“进化”,将会带来怎样的“新生”?

    敬请关注7月28日

    LiveVideoStackCon2023上海站

    阿里云视频云专场

    阿里云智能高级算法专家带来演讲

    《“多”维演进:智能化编码架构的研究与实践》

    共探“智能”编码技术的深度进化

    🔗链接立即报名专场:https://alibaba-cloud.livevideostack.cn/ticket

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Bee,开发JavaWeb数据库应用首选。既想得到NoSQL的性能, 又想拥有关系型数据库事务的能力,用ORM Bee,即可轻松解决.

    Java ORM Bee 不但支持 JDBC 类型的数据库,还支持 Mongodb, 也支持 Android, 鸿蒙.

    Hibernate/MyBatis+ plus +Sharding JDBC + Jpa+ Spring data+ GraphQL+ App ORM (Android, 鸿蒙)= Bee

    最新功能介绍:

    V2.1.7(2023.07.01·LTS版)

    1.增加可运行sql格式化(需要配置:bee.osql.showSql.sqlFormat=true)
    2.二级缓存支持过期时间随机设置, 解决缓存雪崩问题
    3.DdlViaExcel.createTable通过excel sheet页里的信息创建数据库表,可只创建部分
    4.支持Spring boot 3.0,动态配置
    5.完善Sharding ThreadPool,可以自定义配置Sharding操作执行线程数的大小
    6.完善Android多线程操作获取SQLiteDatabase的问题

    使用实例:

     
     

    一行代码,即可完成某个表的分片配置:

     

     

    Bee 2.1.7 maven 风格依赖:

     

    Bee 2.1.7  Gradle 风格依赖:

     

     

    上期发布:

    https://www.oschina.net/news//bee-2-1-6-released

     

    开发微服务更方便:

    实例: https://my.oschina.net/u//blog/

    Spring Cloud 微服务使用数据库更方便:Bee + Spring Boot; 轻松支持多数据源,Sharding, Mongodb.

    更快的开发 Spring Cloud 微服务的新组合,Bee 整合 Spring Boot, 让你瞬间拥有两样快速开发利器!

    Bee,互联网新时代的 Java ORM 工具,更快、更简单、更自动,开发速度快,运行快,更智能

    Spring Boot 是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,
    从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot 可以帮助我们进行快速应用开发

     

    Mongodb ORM (Bee) 详细功能列表

    更多实例,请参考 Bee-exam 实例工程:

    https://gitee.com/automvc/bee-exam

    ———————————————————————

    Bee,互联网新时代的 Java ORM 框架,支持 Sharding;JDBC,Android,HarmonyOS;支持多种关系型数据库,还支持 NoSQL 的 Cassandra,Mongodb 等;更快、更简单、更自动,开发速度快,运行快,更智能!

    支持多种关系型数据库:MySQL,MariaDB,Oracle,H2,SQLite,PostgreSQL,SQL Server,Access 等。

    Java ORM Bee, 开发JavaWeb,可任意切换数据库,从Mongodb -> MySQL , MySQL –>Mongodb ;  
    MySQL,MariaDB,Oracle,H2,SQLite,PostgreSQL,SQL Server。。。从其中一种切到另一种,随意!
    多种数据库可同时使用(如同时使用Mysql,Oracle,SQL Server)。

     

    下期功能预告:

    你还想添加什么功能,请到评论区告诉我们

    项目首页:

    https://gitee.com/automvc/bee

    https://github.com/automvc/bee

    https://gitee.com/automvc/bee-springboot

    项目简介

        本项目为文件文档在线预览开源解决方案,项目使用流行的 Spring Boot 搭建,易上手和部署,部署好后可以独立提供预览服务,使用 http 接口访问,不需要和应用集成,具有跨系统跨语言使用的特性。提供 Windows / Linux 版本发行包、自定义配置文件、和一键启动 / 停止脚本等,极大方便部署使用,同时官方提供 Docker 镜像,方便容器环境中部署使用。

    • 官网站点:https://kkview.cn
    • 在线体验:https://file.kkview.cn

    由于本项目现在完全由开源社区主导维护和迭代,也意味着所有的服务器费用需要社区来支持,所以我们推出了付费的知识社区。

    • kk 开源社区:https://sigusoft.com/09ZHSXbsQ

    本社区用于发布最新的 kkFileView 发行包,以及解答使用 kkFIleView 遇到的任何问题,创建付费社区旨在推动以 kkFileView 为首的一系列 kk 开源项目的健康、可持续发展。欢迎加入我们的社区,支持我们开源。

    本次 v4.3.0 更新内容:

    新增功能:

    • 新增dcm等医疗数位影像预

    • 新增drawio绘图预览

    • 新增开启缓存的情况下重新生成的命令 &forceUpdatedCache=true

    • 新增dwg CAD文件预览

    • 新增PDF文件支持密码功能

    • 新增PDF文件生成图片的dpi自定义配置

    • 新增删除转换后OFFICECADTIFF、压缩包源文件配置 默认开启 节约磁盘空间

    • 新增前端解析xlsx方法

    • 新增pages,eps, iges , igs, dwt, dng, ifc, dwfx, stl, cf2, plt等格式支持

    ​​​​​​优化:

    • 调整生成的PDF文件 文件名称添加文件后缀 防止生成同名文件

    • 调整SQL文件预览方式

    • 优化OFD预览兼容性

    • 美化TXT文本 分页框的显示

    • 升级LinuxDocker版内置officeLibreOffice-7.5.3版本

    • 升级Windows版内置officeLibreOffice-7.5.3 Portable版本

    • 其他功能优化

    修复:

    • 修复反代情况下压缩包获取路径错误

    • 修复预览图片的url中如果包含&会导致.click报错

    • 修复OFD预览部分已知问题

    • 修复预览压缩包时,如果的是文件目录(树节点),页面会报错

    • 其他已知问题修复

    最近新增支持的预览类型:

    Excel文件纯前端渲染效果:
    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    流程图bpmn文件预览效果:
    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    3D模型文件预览效果:
    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    dcm医疗数位影像文件预览效果:
    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    drawio流程图预览效果:
    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    更多预览文件支持请至在线体验:https://file.kkview.cn 查看

    kkFileView 支持预览的文件类型列表:

    1. 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx,xlam, xla ,pages 等 Office 办公文档

    2. 支持 wps, dps, et, ett, wpt 等国产 WPS Office 办公文档

    3. 支持 odt, ods, ots, odp, otp, six, ott, fodt, fods 等OpenOffice、LibreOffice 办公文档

    4. 支持 vsd, vsdx 等 Visio 流程图文件

    5. 支持 wmf, emf 等 Windows 系统图像文件

    6. 支持 psd ,eps 等 Photoshop 软件模型文件

    7. 支持 pdf ,ofd, rtf 等文档

    8. 支持 xmind 软件模型文件

    9. 支持 bpmn 工作流文件

    10. 支持 eml 邮件文件

    11. 支持 epub 图书文档

    12. 支持 obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim 等 3D 模型文件

    13. 支持 dwg, dxf, dwf, iges , igs, dwt, dng, ifc, dwfx, stl, cf2, plt 等 CAD 模型文件

    14. 支持 txt, xml(渲染), md(渲染), java, php, py, js, css 等所有纯文本

    15. 支持 zip, rar, jar, tar, gzip, 7z 等压缩包

    16. 支持 jpg, jpeg, png, gif, bmp, ico, jfif, webp 等图片预览(翻转,缩放,镜像)

    17. 支持 tif, tiff 图信息模型文件

    18. 支持 tga 图像格式文件

    19. 支持 svg 矢量图像格式文件

    20. 支持 mp3,wav,mp4,flv 等音视频格式文件

    21. 支持 avi, mov, rm, webm, ts, rm, mkv, mpeg, ogg, mpg, rmvb, wmv, 3gp, ts, swf 等视频格式转码预览

    22. 支持 dcm 等医疗数位影像预览

    23. 支持 drawio 绘图预览

    发行版下载:

    kkFileView-4.3.0.zip (Windows版)
    kkFileView-4.3.0.tar.gz (Linux或MacOS版)
    kkFileView-4.3.0-docker.tar (Docker离线文件版)

    以上安装包请加入 kk开源社区 获取

    为什么使用

    桌面软件(办公方向 个人工具),仍然是未来十几年 PC 端需求之一,提高工作效率

    electron 技术是流行趋势,、百度翻译、阿里网盘、迅雷、有道云笔记 ……

    简单

    只需懂 JavaScript

    开源

    gitee:https://gitee.com/dromara/electron-egg 3500+

    github:https://github.com/dromara/electron-egg 900+

    WECOM-SDK 是开源的企业微信开放 API 的 Java 实现,是目前开源实现中最完整的Java实现。经过近三年的迭代,目前已经实现了企业微信通讯录管理、上下游、客户管理、微信客服、素材管理、消息推送、企微机器人、身份验证、应用管理、OA办公相关接口,开发人员不需要很高的学习成本就能快速优雅地接入企业微信。

    本次更新主要完善了企业支付,对回调进行了优化,并增加了统一回调的最佳实践实例。

    仓库地址

    gitee: https://gitee.com/felord/wecom-sdk

    github: https://github.com/NotFound403/wecom-sdk

    特性

    • 支持多企业微信同时配置作业

    • 集成方便,适用于各种Java生态

    • 目前实现企业微信接口200多个,能满足大部分企业微信业务场景的需求

    • 全参数封装,入参、出参高度语义化封装,再也不担心组织参数、解析参数的问题

    • 实现统一回调,所有回调事件可集中异步处理,开发者只需要关心业务逻辑的开发

    • 由 SDK 接管 AccessToken 生命周期,开发者无需关心 Token 的管理。

    Maven 中央仓库坐标

    • 普通版本

     <dependency>  <groupId>cn.felord</groupId>  <artifactId>wecom-sdk</artifactId>  <version>1.1.1</version> </dependency>
    • 响应式版本

     <dependency>  <groupId>cn.felord</groupId>  <artifactId>rx-wecom-sdk</artifactId>  <version>1.1.1</version> </dependency>

    采用技术栈

    • Retrofit2

    • Rxjava3

    • Okhttp4

    • Jackson2

    • XStream

    🚀1.1.1 更新

    • 实现企业支付-对外收款账户管理API

    • 优化了回调处理、完善了部分回调事件

    • 优化了应用管理-应用详情API

    • 增加回调最佳实践实例

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    MyCms 是一款基于 Laravel 开发的开源免费的开源多语言商城 CMS 企业建站系统。

    MyCms 基于 Apache2.0 开源协议发布,免费且可商业使用,欢迎持续关注我们。

    v4.5 更新内容

    fix:自媒体账号列表操作按钮
    fix:修正动态设置网站语言
    opt:自定义页面选择模板页面
    opt:文章分类增加自定义模板选择
    opt:文章增加自定义模板选择
    opt:权限路由节点读取优化
    opt:优化上级权限节点
    dev:新增公众号服务器接入
    dev:公众号菜单设置
    dev:公众号回复设置
    dev:公众号素材管理
    dev:公众号用户标签
    dev:公众号用户列表
    dev:公众号渠道码
    dev:新增拖拽排序菜单
    dev:增加后台基类删除前置方法
    dev:快捷复制服务器地址

    更新功能截图

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    后台部分页面截图

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    站点地址

    • 官方网站 : https://www.mycms.net.cn/

    • 使用手册:https://www.mycms.net.cn/shouce

    • 二次开发:https://www.mycms.net.cn/dev

    • API 文档:https://www.mycms.net.cn/api-doc

    • 模板下载:https://www.mycms.net.cn/muban

    • 演示后台 : https://demo.mycms.net.cn/system/login

    • 演示后台:admin /admin

    优秀案例

    • 在线计算网 : https://www.zaixianjisuan.com/
    • 程序员导航 : https://nav.mycms.net.cn/
    • 火马活码:https://www.huomahuoma.com/
    • 编程宝典:https://www.bianchengbaodian.com

    版本名称 说明 地址 ThinkPhp3.2+Layui混编专业版 采用ThinkPhp3.2、Layui、MySQL等框架研发的混编专业版本 https://gitee.com/rxthinkcmf/RXThinkCMF_TP3.2 ThinkPhp3.2+Layui混编旗舰版 采用ThinkPhp3.2、Layui、MySQL等框架研发的混编旗舰版本 https://gitee.com/rxthinkcmf/RXThinkCMF_TP3.2_PRO ThinkPhp5.1+Layui混编专业版 采用ThinkPhp5.1、Layui、MySQL等框架研发的混编专业版本 https://gitee.com/rxthinkcmf/RXThinkCMF_TP5.1 ThinkPhp5.1+Layui混编旗舰版 采用ThinkPhp5.1、Layui、MySQL等框架研发的混编旗舰版本 https://gitee.com/rxthinkcmf/RXThinkCMF_TP5.1_PRO ThinkPhp6.x+Layui混编专业版 采用ThinkPhp6.x、Layui、MySQL等框架研发的混编专业版本 https://gitee.com/rxthinkcmf/RXThinkCMF_TP6 ThinkPhp6.x+Layui混编旗舰版 采用ThinkPhp6.x、Layui、MySQL等框架研发的混编旗舰版本 https://gitee.com/rxthinkcmf/RXThinkCMF_TP6_PRO Laravel5.8+Layui混编专业版 采用Laravel5.8、Layui、MySQL等框架研发的混编专业版本 https://gitee.com/rxthinkcmf/RXThinkCMF_LV5.8 Laravel5.8+Layui混编旗舰版 采用Laravel5.8、Layui、MySQL等框架研发的混编旗舰版本 https://gitee.com/rxthinkcmf/RXThinkCMF_LV5.8_PRO Laravel9.x+Layui混编专业版 采用Laravel9、Layui、MySQL等框架研发的混编专业版本 https://gitee.com/rxthinkcmf/RXThinkCMF_LV9 Laravel9.x+Layui混编旗舰版 采用Laravel9、Layui、MySQL等框架研发的混编旗舰版本 https://gitee.com/rxthinkcmf/RXThinkCMF_LV9_PRO ThinkPhp3.2+Vue+ElementUI旗舰版 采用ThinkPhp3.2、Vue、ElementUI等框架研发前后端分离版本 https://gitee.com/rxthinkcmf/RXThinkCMF_EVTP3.2_PRO ThinkPhp3.2+Vue+AntDesign旗舰版 采用ThinkPhp3.2、Vue、AntDesign等框架研发前后端分离版本 https://gitee.com/rxthinkcmf/RXThinkCMF_AVTP3.2_PRO ThinkPhp5.1+Vue+ElementUI旗舰版 采用ThinkPhp5.1、Vue、ElementUI等框架研发前后端分离版本 https://gitee.com/rxthinkcmf/RXThinkCMF_EVTP5.1_PRO ThinkPhp5.1+Vue+AntDesign旗舰版 采用ThinkPhp5.1、Vue、AntDesign等框架研发前后端分离版本 https://gitee.com/rxthinkcmf/RXThinkCMF_AVTP5.1_PRO ThinkPhp6.x+Vue+ElementUI旗舰版 采用ThinkPhp6.x、Vue、ElementUI等框架研发前后端分离版本 https://gitee.com/rxthinkcmf/RXThinkCMF_EVTP6_PRO ThinkPhp6.x+Vue+AntDesign旗舰版 采用ThinkPhp6.x、Vue、AntDesign等框架研发前后端分离版本 https://gitee.com/rxthinkcmf/RXThinkCMF_AVTP6_PRO Laravel8.x+Vue+ElementUI旗舰版 采用Laravel8.x、Vue、ElementUI等框架研发前后端分离版本 https://gitee.com/rxthinkcmf/RXThinkCMF_EVL8_PRO Laravel8.x+Vue+AntDesign旗舰版 采用Laravel8.x、Vue、AntDesign等框架研发前后端分离版本 https://gitee.com/rxthinkcmf/RXThinkCMF_AVL8_PRO Laravel9.x+Vue+ElementUI旗舰版 采用Laravel9.x、Vue、ElementUI等框架研发前后端分离版本 https://gitee.com/rxthinkcmf/RXThinkCMF_EVL9_PRO Laravel9.x+Vue+AntDesign旗舰版 采用Laravel9.x、Vue、AntDesign等框架研发前后端分离版本 https://gitee.com/rxthinkcmf/RXThinkCMF_AVL9_PRO

    Firefox 115 已正式发布。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)

    发布说明显示,Firefox 115 是最后一个支持 Windows 7 和 Windows 8,以及 macOS 10.12, 10.13 和 10.14 的版本。

    同样的,对于上述系统,Firefox 115 也是一个长期支持版本 (ESR),将一直支持到 2024 年 9 月,之后不再提供安全更新。按照 Firefox 的更新政策,它会自动为这些系统推送 Firefox 115 ESR 版更新。

    主要更新内容

    • 支持迁移来自 Chromium 浏览器的支付方式

    • 在运行 Linux 发行版的英特尔 GPU 上,启用硬件视频解码

    • 标签管理器下拉菜单现在有关闭按钮,可以更快速地关闭标签

    • 重新设计并简化了从其他浏览器导入数据的用户界面

    • 在不支持 H264 视频解码的设备上,可以回滚到思科的 OpenH264 插件进行播放

    • 在 Firefox 标题栏可见时,Windows 放大镜现在能正确跟随文本光标

    • 使用入门款或者 USB Wi-Fi 驱动、禁用操作系统地理定位的 Windows 用户现在可以根据具体情况批准地理定位,而不会造成整个系统的网络不稳定。

    Syncthing 是一个免费开源的工具,它能在你的各个网络计算机间同Idea激活2023.2.6步文件 / 文件夹,它的同步数据是直接从一个系统中直接传输到另一个系统的,并且它是安全且私密的。

    Syncthing v1.23.6 现已发布,具体更新内容如下:

    Bug 修复

    • #7638:favicon 无法在 Firefox 和衍生浏览器中工作
    • #8899:从 LDAP 绑定 DN 中省略 %s 会将损坏的绑定 DN 字符串发送到 LDAP 服务器
    • #8920:不应允许不受信任的设备成为 introducer
    • #8960:relaysrv 和 discosrv docker 镜像已经一年多没有更新了

    Other issues

    • #8691 : 为 syncthing/discosrv 容器添加 arm64 架构
    • #8897:v1.23.5-rc.1 / v1.23.5:缺少 sha1sum.txt.asc 和 sha256sum.txt.asc
    • #8898:v1.23.5-rc.1:缺少 i386、armel、armhf 的 .debs

    更新说明:https://github.com/syncthing/syncthing/releases/tag/v1.23.6

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资Idea激活2023.2.6讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    Idea激活2023.2.6(IntelliJ IDEA 2023.2 EAP 6 发布:AI 助手等)关注公众号

    低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

    持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

    转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

    2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/132395.html

    (0)
    上一篇 2024年 7月 19日
    下一篇 2024年 7月 19日

    相关推荐

    关注微信