Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

GoLand 的下一个主要版本 GoLand 2023.1 正式发布,新版本引入了漏洞检查器和更好的 gRPC 代码导航,并使重命名重构可用于接收器。

开发者现在可以用非标准库包运行 Scratch 文件,使用正则表达式来创建你自己的搜索和替换检查,并快速地将原始字符串文字转换成双引号文字等。

漏洞检查器

  • GoLand 现在可以突出显示 go.mod 中存在已知漏洞的软件包
  • 有一个快速修复方法可以将依赖更新到没有漏洞的版本。
  • GoLand 还可以在编辑器中直接突出显示有已知漏洞的软件包的方法调用
  • 关于已知漏洞的更多信息也可以在新的依赖检查器工具窗口中找到。

gRPC导航

现在可以从 Go 代码中导航并访问消息、服务和方法的声明,以及它们在 .proto 文件中的 Go 实现。

Scratch 文件

现在可以运行具有非标准库 Go 依赖的 Scratch 文件。

重命名重构

当你重新命名一个结构中的类型参数时,重命名重构现在会建议相应地改变接收器。

Intentions 和快速修复

  • 我们有一个新的 intention 操作,可以让你快速地将原始的字符串文字(由反斜线包围的字符串)转换成双引号的字符串,反之亦然。
  • 简化了整数与字符串的转换: 你现在只需用 1 次 quick-fix 就可以做到这一点,而以前需要 2 次。
  • GoLand 现在有了检查和快速修复功能,可以帮助您检测和删除 Go 指令中的前导空格
  • 现在可以预览更多的 intention 操作和快速修复方法。

性能改进

  • 通过在智能模式下执行 Scanning files to index 过程,改善了 IDE 的启动体验。
  • GoLand 现在建议将特定文件夹添加到 Microsoft Defender 的排除列表中

编辑器

  • 更新了 Code Vision 功能,因此 GoLand 现在可以显示某个接口的实现数量及其方法规范。
  • 现在可以使用正则表达式来创建你自己的搜索和替换检查
  • GoLand 的 Go Playground 集成中的共享 URL 现在包括版本参数,如果你选择 dev 或以前的版本。你也可以禁用要求你允许在 Playground 中分享代码的弹出窗口
  • 现在有一个特殊的设置,允许你控制粘贴内容的位置。
  • 一个新的设置允许你配置 IDE,使其仅在你选择代码时以小圆点形式显示空白处。
  • 更新了 Typo 检查,使它不再检查哈希值和特殊值的拼写,也不把它们报告为拼写错误。
  • 为函数调用引入了一个新的 Find Usages 组 —— Call 组。
  • ……

更多详情可查看:https://blog.jetbrains.com/go/2023/04/03/goland-2023-1/

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

本文要点:
  • 一种优雅解决 MySQL 驱动中虚引用导致 GC 耗时较长问题的解决方法
  • 虚引用的作用与使用场景
  • MySQL 驱动源码中的虚引用分析

背景

​ 在之前文章中写过 MySQL JDBC 驱动中的虚引用导致 JVM GC 耗时较长的问题(可以看这里),在驱动代码(mysql-connector-java 5.1.38版本)中 NonRegisteringDriver 类有个虚引用集合 connectionPhantomRefs 用于存储所有的数据库连接,NonRegisteringDriver.trackConnection 方法负责把新创建的连接放入集合,虚引用随着时间积累越来越多,导致 GC 时处理虚引用的耗时较长,影响了服务的吞吐量:



​ 尝试减少数据库连接的生成速度,来降低虚引用的数量,但是效果并不理想。最终的解决方案是通过反射获取虚引用集合,利用定时任务来定期清理集合,避免 GC 处理虚引用耗时较长。


​ 利用定时任务清理虚引用效果立竿见影,每日几亿请求的服务 mixed GC 耗时只有 10 – 30 毫秒左右,系统也很稳定,线上运行将近一年没有任何问题。

优化——由暴力激活成功教程到优雅配置

​ 最近又有同事遇到相同的问题,使用的 mysql-connector-java 版本与我们使用的版本一致,查看最新版本(8.0.32)的代码发现对数据库连接的虚引用有新的处理方式,不像老版本(5.1.38)中每一个连接都会生成虚引用,而是可以通过参数来控制是否需要生成。类 的相关代码如下:


​ mysql-connector-java 的维护者应该是注意到了虚引用对 GC 的影响,所以优化了代码,让用户可以自定义虚引用的生成。

​ 有了这个配置,就可以在启动参数上设置属性:


​ 或者在代码里设置属性:


​ 当 com.mysql.cj.disableAbandonedConnectionCleanup=true 时,生成数据库连接时就不会生成虚引用,对 GC 就没有任何影响了。

​ 建议还是使用第一种方式,通过启动参数配置更灵活一点。

什么是虚引用

​ 有些读者看到这里知道 mysql-connector-java 生成的虚引用对 GC 有一些副作用,但是还不太了解虚引用到底是什么,有什么作用,这里我们在虚引用上做一点点拓展。

​ Java 虚引用(Phantom Reference)是Java中一种特殊的引用类型,它是最弱的一种引用。与其他引用不同,虚引用并不会影响对象的生命周期,也不会影响对象的垃圾回收。虚引用主要用于在对象被回收时收到系统通知,以便在回收时执行一些必要的清理工作。

​ 上述虚引用的定义还是比较难理解,我们用代码来辅助理解:

​ 先来生成一个虚引用:


​ 虚引用的构造方法需要两个入参,第一个就是关联的对象、第二个是虚引用队列 ReferenceQueue。虚引用需要和 ReferenceQueue 配合使用,当对象 Object o 被垃圾回收时,与 Object o 关联的虚引用就会被放入到 ReferenceQueue 中。通过从 ReferenceQueue 中是否存在虚引用来判断对象是否被回收。

​ 我们再来理解上面对虚引用的定义,虚引用不会影响对象的生命周期,也不会影响对象的垃圾回收。如果上述代码里的phantomReference 是一个普通的对象,那么在执行 System.gc() 时 Object o 一定不会被回收掉,因为普通对象持有 Object o 的强引用,还不会被作为垃圾。这里的 phantomReference 是一个虚引用的话 Object o 就会被直接回收掉。然后会将关联的虚引用放到队列里,这就是虚引用关联对象被回收时会收到系统通知的机制。

​ 一些实践能力很强的读者会复制上述代码去运行,发现垃圾回收之后队列里并没有虚引用。这是因为 Object o 还在栈里,属于是 GC Root 的一种,不会被垃圾回收。我们可以这样改写:


​ 不在 main 方法里实例化关联对象 Object o,而是利用一个 buildReference 方法来实例化,这样在执行垃圾回收的时候,Object o 已经出栈了,不再是 GC Root,会被当做垃圾来回收。这样就能从虚引用队列里取出关联的虚引用进行后续处理。

关联对象真的被回收了吗

​ 执行完垃圾回收之后,我们确实能从虚引用队列里获取到虚引用了,我们可以思考一下,与该虚引用关联的对象真的已经被回收了吗?

​ 使用一个小实验来探索答案:


​ 代码里生成一个虚引用,关联对象是一个大小为 2M 的数组,执行垃圾回收之后尝试再实例化一个大小为 4M 的数组。如果我们从虚引用队列里获取到虚引用的时候关联对象已经被回收,那么就能正常申请到 4M 的数组。(设置堆内存大小为 5M -Xmx5m -Xms5m)

​ 执行代码输出如下:


​ 从输出可以看到,申请 4M 内存的时候内存溢出,那么问题的答案就很明显了,关联对象并没有被真正的回收,内存也没有被释放。

​ 再做一点小小的改造,实例化新数组的之前将虚引用直接置为 null,这样关联对象就能被真正的回收掉,也能申请足够的内存:


如果我们使用了虚引用,但是没有及时清理虚引用的话可能会导致内存泄露

虚引用的使用场景——mysql-connector-java 虚引用源码分析

​ 读到这里相信你已经了解了虚引用的一些基本情况,那么它的使用场景在哪里呢?

​ 最典型的场景就是最开始写到的 mysql-connector-java 里处理 MySQL 连接的兜底逻辑。用虚引用来包装 MySQL 连接,如果一个连接对象被回收的时候,会从虚引用队列里收到通知,如果有些连接没有被正确关闭的话,就会在回收之前进行连接关闭的操作。

​ 从 mysql-connector-java 的 AbandonedConnectionCleanupThread 类代码中可以发现并没有使用原生的 PhantomReference 对象,而是使用的是包装过的 ConnectionFinalizerPhantomReference,增加了一个属性 NetworkResources,这是为了方便从虚引用队列中的虚引用上获取到需要处理的资源。包装类中还有一个 finalizeResources 方法,用来关闭网络连接:


​ AbandonedConnectionCleanupThread 实现了 Runnable 接口,在 run 方法里循环读取虚引用队列 referenceQueue 里的虚引用,然后调用 finalizeResource 方法来进行后置的处理,避免连接泄露:


​ 如果你希望在某些对象被回收的时候做一些后置工作,可以参考 mysql-connector-java 中的一些实现逻辑。

总结

​ 本文简述了一种优雅解决 MySQL 驱动中虚引用导致 GC 耗时较长问题的解决方法、也根据自己的理解讲述了虚引用的作用、结合 MySQL 驱动的源码描述了虚引用的使用场景,希望对你能有所帮助。

公众号:DailyHappy

一位后端写码师,一位黑暗料理制造者。

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

4月8日上午,在鹤壁举行的信息技术自主创新高峰论坛上,龙芯中科正式发布了新款高性能服务器处理器———龙芯 3D5000。

Goland激活2023.1.1(GoLand 2023.1 发布)

龙芯 3D5000 采用龙芯自主指令系统龙架构 (LoongArch),无需国外授权,具备超强算力、性能卓越的特点,可满足通用计算、大型数据中心、云计算中心的计算需求。

据介绍,龙芯 3D5000 通过芯粒(chiplet)技术将两个 3C5000 的硅片封装在一起,是一款面向服务器市场的 32 核 CPU 产品。

具体架构上,龙芯 3D5000 内部集成了 32 个高性能 LA464 内核,频率 2.0GHz,支持动态频率及电压调节,片内 64MB L3 共享缓存,8 通道 DDR4-3200 ECC 内存,5 个 HT 3.0 高速接口,实现了双路、四路 CPU 扩展支持。

龙芯 3D5000 采用 LGA-4129 封装,TDP 功耗为 300W,不过典型功耗只有 150W,算下来每个 CPU 大约是 5W 功耗左右。性能方面,龙芯 3D5000 的 SPEC 2006 分数超过 425,浮点部分采用了双 256bit 向量单,双精度浮点性能可达 1TFLOPS(1万亿次),是典型 ARM 核心性能的 4 倍。

Goland激活2023.1.1(GoLand 2023.1 发布)

龙芯 3D5000 片内还集成了安全可信模块,可以取代外置可信芯片。龙芯 3D5000 还支持国密算法,内嵌独立安全模块,高性能加密解密效率可达 5Gbps 以上,足以替代高性能密码机。

Goland激活2023.1.1(GoLand 2023.1 发布)

大家好,我是 Kagol,OpenTiny 开源社区运营,TinyVue 跨端、跨框架组件库核心贡献者,专注于前端组件库建设和开源社区运营。

前面给大家介绍了 OpenTiny 快速创建 Vue Admin 后台管理系统和一套代码同时在 Vue2 Vue3 中使用。

  • 一个 OpenTiny,Vue2 Vue3 都支持!
  • 🎊这个 OpenTiny 开源项目的 CLI 可太牛了,两行命令创建一个美观大气的 Vue Admin 后台管理系统,有手就会,连我的设计师朋友都学会啦啦

本文将给大家介绍 OpenTiny 的一些特色组件。

业界组件库有的组件,OpenTiny 也都有,业界组件库没有的组件,OpenTiny 也有。

从组件数量来说,OpenTiny 比业界主流的 Element Plus 和 Ant Design 都多,足足有70个组件。

有不少是业界组件库都没有的特色组件。

IpAddress IP 输入框

IpAddress 组件是一个很有“云服务特色”的组件,我们可以用它来很方便地输入 IP 地址。

它主要支持以下特性:

  • 输入满 3 位自动跳到下一段号码
  • 只读态
  • 禁用态
  • 设置尺寸
  • 自定义分隔符

看着非常简单,但是很实用!欢迎体验👏

image.png

IpAddress 组件:https://opentiny.design/tiny-vue/zh-CN/os-theme/components/ip-address

Fullscreen 全屏

Fullscreen 全屏组件看着功能也很简单,却非常实用。

它主要分成两种模式:

  • pageOnly 普通全屏,只在浏览器窗口内的全屏
  • teleport 沉浸式全屏,充盈整个电脑屏幕的全屏

除此之外,Fullscreen 还支持以下特性:

  • 同时支持组件式和函数式两种使用方式
  • 按 ESC 退出全屏
  • 设置 zIndex 层级

普通全屏

pageonly.png

沉浸式全屏

teleport.png

Fullscreen 组件:https://opentiny.design/tiny-vue/zh-CN/os-theme/components/fullscreen

Split 面板分割

Split 面板分割也是一个很有用的布局组件,常用于将一片区域,分割为可以拖拽调整宽度或高度的两部分区域。

主要支持以下特性:

  • 横向和纵向两种分割类型
  • 设置宽高阈值
  • 自定义分隔器
  • 嵌套使用

image.png

支持纵向分割

image.png

值得一提的是,Split 还支持嵌套使用,从而给页面动态布局调整带来了更多可能和灵活性。

image.png

Split 组件:https://opentiny.design/tiny-vue/zh-CN/os-theme/components/split

Calendar 日历

Calendar 组件是按照日历形式展示数据的容器。

主要支持以下特性:

  • 年/月两种显示模式
  • 自定义日期单格
  • 添加日程事件
  • 自定义工具栏

image.png

Calendar 组件:https://opentiny.design/tiny-vue/zh-CN/os-theme/components/calendar

Crop 图片裁切

Crop 组件主要用于图像裁切,基于 cropperjs,支持非常丰富的功能。

  • 可预览
  • 支持 JPG 和 PNG 格式
  • 浏览图像可以手动调整选择头像区域

crop.png

Crop 组件:https://opentiny.design/tiny-vue/zh-CN/os-theme/components/crop

说得再多,不如亲自体验下,OpenTiny 的更多特色组件,等你来探索!

https://opentiny.design/tiny-vue

联系我们

如果你对我们 OpenTiny 的开源项目感兴趣,欢迎添加小助手微信:opentiny-official,拉你进群,一起交流前端技术,一起玩开源。

OpenTiny 官网:https://opentiny.design/

OpenTiny 仓库:https://github.com/opentiny/

Vue 组件库:https://github.com/opentiny/tiny-vue(欢迎 Star 🌟)

Angular 组件库:https://github.com/opentiny/ng(欢迎 Star 🌟)

CLI 工具:https://github.com/opentiny/tiny-cli(欢迎 Star 🌟)

往期文章推荐

  • 历史性的时刻!OpenTiny 跨端、跨框架组件库正式升级 TypeScript,10 万行代码重获新生!
  • 一个 OpenTiny,Vue2 Vue3 都支持!
  • 🎊这个 OpenTiny 开源项目的 CLI 可太牛了,两行命令创建一个美观大气的 Vue Admin 后台管理系统,有手就会,连我的设计师朋友都学会啦啦
  • 老板:你为什么要选择 Vue?

WGCLOUD 是一款集成度较高的分布式运维监控平台,具有集群监控,易部署、易上手使用、轻量、高效、自动化等特点,server 端基于 springboot 开发,agent 端使用 go 编写。核心模块包括:主机系统信息监控,CPU 监控,CPU 温度监控,内存监控,网络流量监控,磁盘 IO 监控,磁盘空间监测,系统负载监控,硬盘 smart 健康检测,应用进程监控,端口监控,docker 监控,日志文件监控,文件防篡改保护,数据可视化监控,自动生成拓扑图、大屏可视化,数通设备监测,服务接口监测,设备账号管理,web ssh ,指令下发,告警信息(邮件、钉钉、微信等)推送 

码云仓库:https://gitee.com/wanghouhou/wgcloud

GITHUB 仓库:https://github.com/tianshiyeben/wgcloud

WGCLOUD 唯一官网:http://www.wgstart.com

WGCLOUD 支持监测的操作系统平台

支持监测 Linux 系列:Debian、RedHat、CentOS、Ubuntu、Fedora、麒麟、统信 (UOS)、龙芯 (mips) 等
支持监测 Windows 系列:Windows Server 2008 R2,2012,2016,2019,2022,Windows 7,Windows 8,Windows 10,Windows 11
支持监测 Unix 系列:solaris,FreeBSD,OpenBSD
支持监测 MacOS 系列:macOS amd64,macOS arm64
其他支持:ARM,Android(安卓),riscv64,s390x,树莓派等

WGCLOUD-v3.4.6 更新说明  2023-04-08 发布

1.新增,进程、端口、docker的监控间隔时间,支持单独配置,修改agent配置文件配置项

2.新增,第三个大屏展板

3.新增,监测主机用户的登录信息

4.新增,进程监控,支持采集进程所有者

5.新增,进程监控,支持自动恢复指令或者脚本,系统在检测到进程下线后触发,agent会自动执行用户设置的恢复指令

6.新增,数据源监测支持监控达梦数据库

7.新增,对系统中涉及到的密码加密处理

8.优化,磁盘、文件防篡改监控时间改为15分钟扫描一次,原来是30分钟

9.优化,docker容器监测

10.优化,数通SNMP监测,可以不用填写进出口流量的OID了,系统将会自动获取设备的所有接口流量和速率

11.新增,设备账号管理模块

12.bug修复,端口监控,当IP和Telnet IP都在主机列表IP时,偶尔出现数据监控的问题

13.一些已知的bug修复,优化UI,代码结构优化

 

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

Kodi 是由 Kodi 基金会开发的开源媒体播放器(前身为 XBMC,从 14.0 版本开始更名为 Kodi),Kodi 可以运行在多种操作系统和硬件平台。 它可以让用户播放本地或网络存储设备中的视频、音乐、播客及各种常见的媒体文件。

该软件最初是为计划运行在 Xbox 上的,XBMC 的名称也由此而来。后来才有了 Android、Linux、BSD、macOS、iOS 和 Windows 操作系统的原生版。

Goland激活2023.1.1(GoLand 2023.1 发布)

Kodi 团队证实,他们的用户论坛发生了数据泄漏,影响了超过 40 万用户的个人数据,其中包括姓名、电子邮件地址、IP 地址和密码,以及用户通过消息系统发送的信息。

Kodi 团队通过调查发现,Kodi 用户论坛(MyBB)管理控制台在今年 2 月 16 日和 2 月 21 日被两次访问。这些泄漏的数据是用论坛管理团队中一个受信任但目前不活跃的成员的账户访问的,也正因如此,Kodi 团队在此期间并没有发现什么异常。

之所以最后还是发现了数据泄露,是因为团队成员在其他互联网论坛上发现 Kodi 论坛的用户数据在被出售时才意识到这个问题。

目前 Kodi 已经禁用了此次数据泄露中所使用的账户,并对团队基础设施进行了初步审查。虽然论坛上的密码是以加密格式存储的,但该团队表示,他们必须假设所有密码都已泄露。

Kodi 团队正在调查如何最好地执行全局密码重置,以及如何最好地保证服务器主机和相关软件的完整性。目前论坛服务器已经下线了,这也会影响 Kodi pastebin 和 wiki 站点。为了彻底调查和修复问题,他们暂时也没有办法给出论坛服务器重新上线的时间表。

为了保障用户信息安全,建议在任何其他网站上使用了相同用户名和密码的用户尽快去重置一下密码,避免被撞库。

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Next.js 13.3 近日正式发布,新版本添加了多个社区用户要求的受欢迎的功能,并会在下一个次要版本中将 App Router 标记为稳定,Next.js 13.3 具体更新内容包括:

基于文件的 Metadata API

在 Next.js 13.2 中,Next.js 公布了一个新的 Metadata API,允许用户通过从布局或页面导出 Metadata 对象来定义数据(例如 HTML 素中的 、和 标签)。

 

除了基于配置的数据外,Metadata API 现在还支持新的文件约定,开发者可以方便地自定义页面以改进 SEO 和在 Web 上共享:

动态 OG 图像生成

六个月前,Next.js 发布了 @vercel/og 和 Satori 库,它们允许您使用 JSX、HTML 和 CSS 动态生成图像。

自发布以来,随着 Vercel 客户的广泛采用和超过 900,000 次下载,Next.js 很高兴能够将动态生成的图像引入所有 Next.js 应用程序,而无需外部包。

现在可以从 导入 生成图像:

 

App Router 的静态导出

Next.js App Router 现在完全支持静态导出。开发者可以从静态网站或单页应用程序(SPA)开始,然后再选择性地升级,以使用需要服务器的Next.js功能。

在运行 时,Next.js会在每个路由中生成一个HTML文件。通过将严格的SPA分解成单独的HTML文件,Next.js可以避免在客户端加载不必要的JavaScript代码,减少包的大小,实现更快的页面加载。

 

并行路由和拦截

Next.js 13.3 引入了新的动态约定,允许开发者实现高级路由案例: 并行路由和拦截路由。这些功能使你能够在同一个视图中显示一个以上的页面,比如复杂的仪表盘等。

通过并行路由,你可以在同一个视图中同时呈现一个或多个可以独立浏览的页面。它还可以用来有条件地渲染页面。

并行路由是使用命名的 “slots” 创建的。Slots 是用 约定进行定义的。

拦截路由允许您在当前布局中加载新路由,同时 “屏蔽” 浏览器 URL。 当保持当前页面的上下文很重要时,这很有用。

拦截路由可以使用 约定进行定义,类似于相对路径 . 开发者还可以使用 约定创建相对于 目录的路径。

其他

  • Next.js 主页和展示页面已经更新了新的设计
  • 的快速刷新
  • 针对 的 Tailwind CSS
  • 改进的样式表加载
  • ……

更多详情可查看:https://github.com/vercel/next.js/releases/tag/v13.3.0

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Netty 4.1.91.Final 现已发布。Netty 是一个异步事件驱动的网络应用框架,主要用于可维护的高性能协议服务器和客户端的快速开发。

这是一个错误修复版本,包含了对本地 SSL 实现的一个重要修复,以及修复了一个可能导致状态机出现问题的错误。

具体更新内容包括:

  • 修复当 Chanel 在聚合过程中被关闭时,引发的 PrematureChannelClosureException 异常
  • 如果服务器在使用 Socks5 时返回 NO_AUTH,则无需密码即可连接
  • 使用 sun.net.dns 的可选分辨率
  • 引入可用于将错误传播到所有活跃 stream 的 Http2MultiplexActiveStreamsException
  • 重置 stream 时使用正确的错误提醒信息
  • 在 HttpContentDecoder 上添加 snappy 支持
  • 在通知调用方握手完成之前不会解包多个记录
  • 修复 io.netty.channel.unix.Errors 中的 Handle EHOSTUNREACH 错误

下载地址 | 发布公告

Haxe 是开源的高级严格类型编程语言,具有快速且经过优化的交叉编译器。

Haxe 可以构建目标平台是 JavaScript、C++、C#、Java、JVM、Python、Lua、PHP、Flash 的跨平台应用程序,并支持访问每个平台的原生功能。Haxe 有自己的 VM(HashLink 和 NekoVM),同时支持在解释模式下运行。用 Haxe 编写的代码可以编译为 Haxe 支持的任何目标平台语言。

Goland激活2023.1.1(GoLand 2023.1 发布)

Haxe 4.3 主要变化:

  • 支持类型参数的默认值
  • 支持 abstract 关键字引用摘要
  • 在表达式级别支持静态变量
  • 支持 ?.  安全导航操作符
  • 添加 ?? 空合并运算符
  • 支持数字分隔符
  • 支持数字文字后缀
  • 添加 -w 编译器选项以配置警告
  • 添加新的错误报告模式
  • 支持自定义数据和定义

此版本还包含其他新功能、优化、改进和错误修复,点此查看详情。

下载地址

GoEdge 是一款可以帮你快速构建 CDN & WAF 平台的工具,支持 HTTP、HTTPS、Websocket、TCP、TLS、UDP、PROXY Protocol、IPv6、WAF 等特性,支持多个第三方 DNS 服务

Goland激活2023.1.1(GoLand 2023.1 发布)

 

在经历3年研发、1500+社群用户深度使用、5000个commits之后,GoEdge决定发布1.0.0版本。GoEdge v1.0.0版本主要大幅优化攻击拦截功能、更新免费版IP库、批量上传SSL证书。

EdgeAdmin – 管理系统

  • 网站服务
    • 优化创建网站服务界面:简化界面,减少必填项
    • 当HTTP和HTTPS端口冲突时提示用户;避免用户同时在HTTP和HTTPS设置中使用同样的端口
    • 集群服务设置增加“支持低版本HTTP”选项,可以选择不支持HTTP/1.0及以下版本的HTTP协议
  • 缓存
    • 修复在未初始化缓存设置时添加缓存条件产生的panic错误,但此错误不会影响系统正常运行
  • 访问日志
    • 访问日志数据库节点详情中密码使用星号(*)代替,以提升安全性
  • SSL证书
    • SSL证书内容输入框支持拖动文件上传
    • SSL证书支持批量上传,此功能可以在”证书管理“中找到
    • 在创建服务和修改服务设置时自动根据填写的域名匹配对应的证书
    • 创建服务和修改服务时也可以批量上传证书
    • 选择证书时可以通过用户筛选
    • 上传证书时可以选择所属用户
  • 边缘节点
    • 优化节点列表显示,包括统计项宽度、连接数更加可读、带宽使用两位小数、隐藏和显示更多IP
    • 创建节点时自动从节点名称中提取节点IP,比如节点名称可以为“CDN节点192.168.2.100”,则自动提取“192.168.2.100”作为节点默认IP
    • 生成节点DNS解析时区分节点是否已安装;如果节点未完成安装,则不会解析,避免在安装过程中,用户通过域名解析访问到未安装的节点
  • SSH认证
    • 创建SSH认证私钥时校验私钥内容;避免填入错误的私钥
    • SSH认证添加私钥时可以从私钥文件中直接拖入内容
  • 管理员
    • 管理员列表页增加关键词搜索支持
    • 管理员列表在有弱密码的管理员下增加弱密码标识,只有超级管理员才能看到此标识
    • 首页看板可以提示有需要修改的弱密码管理员
  • 日志审计
    • 日志审计增加日志级别筛选
  • 管理系统
    • 如果管理系统同时设置了HTTP和HTTPS端口,那么访问HTTP登录页时自动跳转到HTTPS地址
    • 增强Cookie安全性,可以防止Cookie被截取后异地登录
  • MySQL
    • 自动安装MySQL时自动生成所需的动态库软链接,以适应一些比较新的系统
    • 自动安装mysql时调整innodb_sort_buffer_size、innodb_buffer_pool_size参数值

EdgeAPI – API节点

  • 数据库
    • 使用sql.json取代以往的sql.go作为数据库结构存储文件
    • 优化服务列表查询方法,避免因MySQL参数设置而导致查询失败
    • 在API节点启动时,如果无法连接到本地MySQL数据库,则尝试启动固定位置上的MySQL,避免有些用户不知道如何启动MySQL
  • 域名解析
    • 修复无法同时对相同对象执行多次DNS解析任务的问题
    • DNS解析发生变化时立即触发同步任务,即让域名解析生效更快
  • 配置
    • 优化节点配置生成,合并证书数据,减少配置文件尺寸
    • 增加RPC消息最大尺寸到512MB,避免大的配置信息无法传输
    • 增加命令用来快速查询节点Token,方便用户在忘记EdgeAdmin、EdgeUser、EdgeAPI令牌时令牌时快速查询
  • 流量带宽
    • 合并部分流量查询和带宽查询,提升查询速度
  • 消息提醒
    • 修复发送站内消息时将标题作为内容的Bug
    • 优化证书到期提醒等相关消息,可以在提示信息中看到域名相关信息
  • IP名单
    • 修复删除IP名单中IP时状态设置错误的问题,此问题可能会导致节点在从IP名单中删除单个IP时消耗大量的CPU

EdgeNode – 边缘节点

  • WAF
    • 在GET302和CAPTCHA验证中不记录特殊URL的访问日志,避免生成大量无效的访问日志
    • 优化IP名单上传程序,自动去重,并可以批量上传
    • 优化WAF黑名单处理,即使WAF不开启也仍然有效,并自动结合本地防火墙进行拦截
    • nftables规则使用REJECT代替DROP
  • URL跳转没有选择状态码时,对搜索引擎访问默认值设置为301,以提升SEO效果
  • 源站返回分片内容时提示访问用户内容不支持低版本HTTP协议
  • 增加网站服务加载和删除调试日志,这些日志不会上传到API节点
  • 限制单个服务每次上传的域名统计数不超过20个,避免大量的域名统计对API节点数据库造成很大的压力
  • 修复在高并发下修改服务配置可能导致服务崩溃(panic)的问题
  • 重启服务时自动保存未上传的带宽统计信息,以便在下次启动的时候恢复
  • 增加RPC消息最大尺寸到512MB,避免大的配置信息无法传输
  • 不提示单个端口Reload信息,防止不重要的日志过多
  • 节点启动时自动调整相关内核参数,如net.core.somaxconn、net.ipv4.tcp_fin_timeout等

EdgeCommon – 通用库

  • 修复IP查询结果显示时可能不显示县级单位的问题

完整变更说明:https://goedge.cn/docs/Releases/Index.md
下载:https://goedge.cn/downloads

智能制造一体化管理系统 [SpringBoot2 – 快速开发平台],适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模块、动态表单、知识库、公告模块、企业论坛、云售后模块、生产模块、系统模块化同步模块等多种复杂业务功能。

有一些小伙伴很好奇最近更新的内容和智能制造有什么关系?

:目前 Skyeye 整体在做重构,优先从底层的一些功能开始,所以现在大家看到的和智能制造的联系不是很大,也希望大家能够理解,一个大型的智能制造对底层的依赖性也是非常高的。

智能制造一体化 v3.9.9 发布 ,更新内容如下:

  • 已完成测试的组件:输入框,下拉框,文本框,上传组件,枚举卡槽,文字分割线,编码规则,附件上传,数据字典卡槽,团队模板,部门信息,用户选择,往来单位,凭证,账户,账套
  • 已托管到表单布局的功能:角色管理,桌面管理,前台服务配置,编码管理,联系人管理 (新增 / 编辑),CRM 客户管理,CRM 客户合同 (新增 / 编辑),CRM 客户商机 (新增 / 编辑),CRM 客户跟单 (新增 / 编辑),IFS 财务账户,IFS 账套管理,IFS 会计科目,IFS 收支项目,IFS 明细账,工序管理
  • 考勤模块:请假申请、加班申请、销假申请、出差申请、考勤班次等功能后端修改为低代码平台完成,待托管到表单布局
  • 招聘模块:人员需求申请、转岗申请、面试者管理等功能后端修改为低代码平台完成,待托管到表单布局
  • 修改若干问题

erp: https://gitee.com/doc_wei01/erp-pro

OA: https://gitee.com/doc_wei01/skyeye

报表:https://gitee.com/doc_wei01/skyeye-report  有问题可以联系作者,详情请看开发计划。

效果图

效果图 效果图

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

作者:京东科技 孙凯

一、前言

Goland激活2023.1.1(GoLand 2023.1 发布)



 

对前端开发者来说,Vite 应该不算陌生了,它是一款基于 nobundle 和 bundleless 思想诞生的前端开发与构建工具,官网对它的概括和期待只有一句话:“下一代的前端工具链”。

Vite 最早的版本由尤雨溪发布于3年前,经历了3年多的发展,Vite 也已逐渐迭代成熟,它的稳定性、扩展性、周边生态足以在生产环境中支撑各种业务场景的落地。但是关于Vite的优劣势分析我们就戛然而止,不在深入展开了,这不是本文的重点。

本文的重点在于探究 Vite 如何实现兼容低版本浏览器,这一切还得从那个阳光明媚的午后说起🤔。

二、那个午后

本着尝鲜的态度,我在某一个项目中用了 Vite,当时还是3.x.x的版本,跟着文档配置,从项目启动到项目构建,一路都很“德芙”(纵享丝滑),在经历了 Vite 带来的短暂新鲜感后,就一直沉浸在业务模块的开发中了,因为在 Vite 刚发布后的那段时间曾看过相关原理解析,是基于浏览器原生的模块化能力按需构建BALABALA等,所以后来 Vite 的这种新鲜感对我而言并没有保持多久。

但直到有天下午我开始打包提测,审查页面素后发现构建产物居然跟以往 webpack 的产物竟然有点不一样,在好奇心的驱使下,于是我开始尝试解谜。

三、跟webpack构建产物到底哪里不一样?

1. 准备工作

为了能更好的对比两者产物究竟有什么区别,我们首先要确保我们的业务代码基本一致,不一致的地方仅仅是使用不同工具( vite 和 webpack)进行构建,这样才能排除最大干扰因素。

于是我们分别使用最新版的 Vite 和 webpack 初始化了两个页面,为了做作区分,两个页面的仅标题和标题背景不一致,他们在浏览器中渲染后的分别长这个样子:



Goland激活2023.1.1(GoLand 2023.1 发布)



 

2. 构建工具版本说明


Vite:v4.1.4

webpack:v5.75.0

3. 构建工具配置项说明


Vite (非常简单,啥也没有)


webpack(太多了,也比较常规,就不在这里贴出来全部配置项了,仅在这里配置好跟 Vite 一样的需要兼容到最低的浏览器版本)

至此,准备工作完毕,让我们看看两者的构建产物吧。

4. 构建产物



Goland激活2023.1.1(GoLand 2023.1 发布)



 

从产物的命名中,我们就能多少看出些许区别,webpack的产物比较简单,中规中矩,而 Vite 的 JS 文件不但比 webpack 多,而且部分文件命名中还多了一个单词:legacy,百度翻译对它的解释是:遗产;遗赠财物;遗留;后遗症;(计算机系统或产品)已停产的,通过翻译,或许你可以猜出来,名字中带 legacy 的文件大概率就是浏览器的兼容文件,那么事实到底是不是这样呢?

如果你足够细心,其实你应该可以从上面 Vite 的配置项代码中嗅到一丝端倪,在 Vite 的配置文件中,有一个名为 @vitejs/plugin-legacy 的插件,它的名字也包含 legacy,Vite 官网中对这个插件的解释是这样的:

传统浏览器可以通过插件 @vitejs/plugin-legacy 来支持,它将自动生成传统版本的 chunk 及与其相对应 ES 语言特性方面的 polyfill。兼容版的 chunk 只会在不支持原生 ESM 的浏览器中进行按需加载。

也就是说,这个插件它不但提供了低版本浏览器的兼容能力,还提供了检测是否支持原生 ESM 的能力。那么这个插件都做了哪些事?

主要是以下三点:

1.
为最每个生成的 ESM 模块化方式的 chunk 也对应生成一个 legacy chunk,同时使用 @babel/preset-env 转换(没错,Vite 的内部集成了 Babel),生成一个 SystemJS 模块,关于 SystemJS 可以看这里查看,它在浏览器中实现了模块化,用来加载有依赖关系的各个 chunk。
2.
生成 polyfill 包,包含 SystemJS 的运行时,同时包含由要兼容的目标浏览器版本和代码中的高级语法产生的 polyfill。
3.
生成 <script nomodule> 标签,并注入到 HTML 文件中,用来在不兼容 ESM 的老旧浏览器中加载 polyfill 和 legacy chunk。

如此可见,Vite 兼容低版本浏览器的能力就是来自于 @babel/preset-env 无疑了,都是生成 polyfill 和语法转换, 但是这不就和 webpack 一样了么,事实是 Vite 又帮我们多做了一层,那就是上面反复提到的原生浏览器模块化能力 ESM。

5. Vite 的原生模块化能力

我们看看 Vite 打包后HTML中的内容,内容较多,我分开讲,先看 head 标签中的内容


代码的前两行加载了入口 JS (index-a712caef.js,记住这个文件名,后面会用到)和 CSS,JS资源使用了 ESM 的模块化方式加载,等等,嗯?JS 居然使用了 ESM ?如果当前浏览器不兼容 ESM,那这段 JS岂不是永远不会执行?

其实这就是 ESM 模块化的能力之一,对于携带 type=”module” 这个属性的 script 标签,不支持 ESM 的浏览器不会执行内部代码,所以报错也就不存在了,与之对应的 script 上还有 nomodule 这个属性,支持ESM的浏览器会忽略携带这个属性的 script,可以防止某些兼容逻辑在高版本浏览器执行,这两个属性组合使用就是为了决定浏览器在面对未知版本浏览器时的代码执行策略,我们画个简易流程图理解一下:



Goland激活2023.1.1(GoLand 2023.1 发布)



 

继续往下看。

接下来的两段内联 script 标签中的内容很关键,我们先看第一段代码,这段代码暂且命名为代码A


期初我看上面这段代码的时候,我就想:这写的都是些个什么东西!前三行都是高级ES语法,部分浏览器根本不兼容好嘛,这都能写上去,真不怕报错和白屏?

其实要注意 script 标签上 type=”module” 这个属性,ESM模块化的好处之一就是,它在处理报错信息的时候,不像普通 script 一样会把错误抛到模块外部,内部出错也不会阻塞后续逻辑的执行和页面渲染,接下来我们验证一下这个观点,直接上代码:


执行结果如下:



Goland激活2023.1.1(GoLand 2023.1 发布)



 

先不管代码结果的输出顺序,我们在这只看输出结果,与上述结论一致的,即错误影响了内部模块,并中断了后续的代码逻辑,而外部不受影响。

在 Vite 生成的 HTML 中这样做的好处就是为了检测浏览器对相关语法的支持程度,如果模块中的语法不支持,就会停止执行;如果支持,那么同时打上一个标记,也就是上述示例代码A的倒数第二行——通过在 window 上设置全局变量(因为ESM模块中的变量影响不到外部)window.__vite_is_modern_browser = true来标识当前浏览器是否为一个“现代浏览器”,是否支持的某些语法特性(import.meta、动态导入、异步生成器),这样可以使 Vite 后续更准确的判断该加载那些 JS。

于是接下来我们就看到了下面这段代码:


它内部判断了 window.__vite_is_modern_browser 这个全局标识是否存在,如果存在,说明上一个模块中的代码执行没有问题,直接退出;如果不存在,说明当前浏览器不是一个“现代浏览器”,那就该加载和执行兼容文件了,于是可以看到这段代码的后半段,Vite 使用 SystemJs 加载了带有 legacy 标记的文件。

到了这里还没有结束, 虽然 Vite 在个别情况下加载了兼容文件,但如果你仔细看上述代码,会发现整个加载逻辑是放在拥有 type=”module” 这个属性的 script 中的,在前面已经阐述过了, type=”module” 在低版本浏览器是不会执行的,换句话说就是,低版本浏览器的兼容文件并不会被加载。于是 Vite 为了低版本浏览器能正常执行业务逻辑,又做了如下操作——

以下代码来自 VIte 打包后 body 标签中的内容:


可以看到,在低版本浏览器中 Vite 使用了带有 nomodule 属性的 script 标签,先加载了 polyfills 文件,确保后续代码中使用的API能正确执行,再通过 SystemJs 加载入口文件执行后续逻辑,至此, Vite 兼容旧版本浏览器的逻辑算是基本讲述完毕了。

6. “魔鬼藏在细节中”

纵观Vite的整个加载流程,粗一看没有什么大问题,但是经不起推敲,我们再来捋一捋,看看还发生了什么。

第一步,Vite 在页面最开始加载了 CSS 和 JS,加载 JS 的方式是使用 ESM

第二步,Vite 判断了现代浏览器的兼容性,如果是现代浏览器,则不执行 nomodule 中的代码,也不会使用 SystemJs 加载 legacy 文件,反之亦然。

第三部,Vite 对低版本浏览器使用 nomodule 的 script 标签,加载和执行 legacy 文件。



等等,你有没有发现,第一步和第二步有些问题?

我们前面已经说过了,在第二步中,Vite 根据 window.__vite_is_modern_browser 处理了是否加载 legacy 文件的逻辑,但是这里的代码是包裹在 type=”module” 这个属性的 script 中的!问题就出现在这里!

我们想象一个场景:总有那么一部分浏览器支持 ESM 的同时,又不支持 import.meta.url; import(“_”).catch(() => 1); async function* g() { } 这三种语法之一,这是必然的,因为语法诞生的时间不一致。

这也就导致了一个 Vite 的行为:在支持 ESM、同时不支持高级上述三种语法任意一种的时候,window.__vite_is_modern_browser 为 false,Vite 通过 SystemJs 加载了 legacy 文件,但也因为当前浏览器支持 ESM,致使 Vite 在第一步中通过 ESM 加载的 JS 是重复加载!

也就是说,Vite 在这种情况下同时加载了原生模块化的文件和兼容文件

但更值得思考的还在后面:不管是原生模块化的文件,还是兼容文件,他们对页面的处理逻辑是一致的,因为文件的同时加载,这会不会导致页面执行两次相同的逻辑?

答案是:不会。

Vite 是知道这种情况的,并且已经处理过了,它处理的手段你肯定会觉得很眼熟,就在整个 ESM 文件入口的前几行(也就是本文构建产物中的 index-a712caef.js )——


它声明了一个函数,函数内部包含了高版本的语法,Vite 充分利用了 JS 语法边解析边执行的特性:如果当前环境不支持高版本语法,那就在语法解析阶段报错就好了,直接暴力阻止后续逻辑的执行,因为使用了原生模块化的能力,反正错误也不会抛给外面,对页面没有什么影响!

怎么样,这才是完整的 Vite 兼容方案,不得不说,真是有很多细节值得学习和思考。

对于重复加载 ESM 文件, @vitejs/plugin-legacy 是承认缺点存在的,这个插件在 README 中原文是这样解释的:


大概意思就是:它认为主流浏览器对这三种语法是广泛认可的,换句话也就是说,Vite 的目标其实还是绝大部分现代浏览器,太过低端的已经不考虑了。。。

最后放出 @vitejs/plugin-legacy 的 README 地址: https://github.com/vitejs/vite/tree/main/packages/plugin-legacy#readme

四、总结

不啰嗦,直接上加载过程完整的流程图,一百句话也不如一张图直观。

最后,实名感谢各位小伙伴的观看,如果能点个赞就更好了 🙌



Goland激活2023.1.1(GoLand 2023.1 发布)

 

Mirrorful是一个简单、开源的设计系统框架。安装 Mirrorful 可以为你的项目生成颜色和其他设计标记,然后将这些设计标记直接导入你的应用程序。

Goland激活2023.1.1(GoLand 2023.1 发布)

  • 以真实的来源开始新的项目
  • 直观地修改主题
  • 生成颜色
  • 主题模板
  • 轻量级 Headless 组件库
  • Eslint 规则
  • Figma 整合

开始

Mirrorful 是一个 NPM 包,旨在作为开发依赖项安装。

 npm install mirrorful -D

或者

 yarn add mirrorful -D

近日,一个名为 Money Message 的勒索软件组织声称,他们已经成功入侵了 PC 制造商微星(MSI)的系统,访问了微星的 CTMS 和 ERP 数据库,窃取了该公司的源代码、密钥,以及微星产品中使用的 BIOS 固件等,数据总量达到 1.5TB。

Goland激活2023.1.1(GoLand 2023.1 发布)

Money Message 在暗网上发布了被盗文件的截图,并要求微星支付 400 万美来赎回这些数据,否则将在本周公开这些被盗数据。

微星是我国台湾地区的一家 PC 制造商,主要生产高端的 PC 主板、GPU、笔记本、显示器和其他 PC 周边产品,深受电竞玩家的喜爱。而在事件发生后,微星则是在官网发布了一个简短声明,证实遭到了网络攻击:

MSI 的部分信息系统最近遭受了网络攻击。 信息部门发现网络异常后,及时启动相关防御机制并采取恢复措施,并将事件报告政府执法部门和网络安全部门。 目前,受影响的系统已逐步恢复正常运行,对金融业务无重大影响。

MSI 敦促用户仅从官方网站获取固件/BIOS 更新,并且不要使用来自官方网站以外来源的文件。

不过,这则简短的声明并没有透露任何细节,因此我们也不清楚这 1.5TB 的数据中是否包含微星的用户数据,以及勒索软件组织所声称的源代码和密钥等信息,也尚不清楚 Money Message 究竟是以什么方式入侵的微星,亦或是 MSI 是否有意支付这笔 400 万美的赎金。

网络安全公司 Cyble 表示,Money Message 似乎是上个月才刚刚出现的新兴勒索软件组织,虽然才成立不久,但目前已知受影响的企业已经超过五个,该组织以 Windows 和 Linux 电脑为目标,窃取用户数据,传播勒索软件。

树莓派基金会近日为正式学习编程的用户,推出网页端代码编辑器。该编辑器目前处于测试阶段,感兴趣的用户可以访问 editor.raspberrypi.org 页面免费体验。

Goland激活2023.1.1(GoLand 2023.1 发布)

该编辑器目前设计为仅支持 Python,但该组织表示即将支持 HTML、JavaScript 和 CSS 等其它语言。

该界面由三个窗格组成:项目中的文件列表、代码编辑器和当您“运行”按钮时运行代码结果的输出窗口。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

使用该编辑器需要创建免费账号,之后系统会将你所有的项目保存在云端,你可以随时重新加载它们。你还能以 .zip 文件格式下载源代码。

注:本文使用New Bing(GPT4.0)演示

让他扮演一个Java软件开发者

第一步:我们让ChatGPT扮演一个Java软件开发者的角色

  • 提示词插件:地址:ChatGPT BingChat GPT3 Prompt Generator App (Streamlit) – a Hugging Face Space by Kaludi

Java Software Developer Java软件开发者


Goland激活2023.1.1(GoLand 2023.1 发布)

准备一个不太好的Java代码示例

第二步:我们准备一个写得不太好的Java代码示例

  • Bad Java Example:

Goland激活2023.1.1(GoLand 2023.1 发布)

让他优化这段代码

第三步:让newBing(ChatGPT)优化这段代码

  • 并且要求「整理成比较优雅的代码结构,比如自动拆分子函数、降低if和循环嵌套,甚至实现部分设计模式。」

Goland激活2023.1.1(GoLand 2023.1 发布)


让他写个单测

第四步:我们最后让他收下尾——写个单测吧

Goland激活2023.1.1(GoLand 2023.1 发布)


最后,数据安全是最大的问题,不要乱贴数据到 ChatGPT,尤其是涉及后端核心存储账户密码、公司核心业务数据、部门核心战略规划等。因为首先,ChatGPT会使用你的问答语料进行训练;其次,你无法预料在什么Prompt提示词下,LLM模型会讲你无意中泄露的信息回答出去。

瑕不掩瑜,ChatGPT为代表的LLM模型,在充当我们无所不知的老师、充当不知疲倦的通用Util代码编写者这些角色时能极大的提高我们的开发效率,尤其在数据分析、前端、单测、重构等领域。

就像文章第一步写的一样,ChatGPT就像是一个百变身份,你可以让他扮演任何角色,而每一个角色都能在这个角色范围内帮助我们获得更美好的生活。

更有意思的用法期待大家的发掘。

摘要:Laplace 用于 Laplace 分布的概率统计与随机采样。

本文分享自华为云社区《Laplace分布算子开发经验分享》,作者:李长安。

1、任务解析

详细描述:

Laplace 用于 Laplace 分布的概率统计与随机采样, 此任务的目标是在 Paddle 框架中,基于现有概率分布方案进行扩展,新增 Laplace API,调用路径为:paddle.distribution.Laplace 。类签名及各个方法签名,请通过调研 Paddle 及业界实现惯例进行设计。要求代码风格及设计思路与已有概率分布保持一致。

实际上说了一大堆,就是一件事:实现Laplace分布算子,那么首先我们需要知道什么是 Laplace 分布,在概率论和统计学中,拉普拉斯分布是一种连续概率分布。由于它可以看作是两个不同位置的指数分布背靠背拼在一起,所以它也叫双指数分布。与正态分布对比,正态分布是用相对于μ平均值的差的平方来表示,而拉普拉斯概率密度用相对于差的绝对值来表示。如下面的代码所示,Laplace 分布的图像和正态分布实际上是有点类似的,所以它的公式也与正态分布的公式类似的。


Goland激活2023.1.1(GoLand 2023.1 发布)

2、设计文档撰写

设计文档是我们API设计思路的体现,是整个开发工作中必要的部分。通过上述任务简介,我们可以知道此API的开发主要为Laplace分布的开发,需要包含一些相应的方法。首先我们需要弄清楚Laplace分布的数学原理,这里建议去维基百科查看Laplace分布的数学原理,弄明白数学原理。此外,我们可以参考Numpy、Scipy、Pytorch、Tensorflow的代码实现,进行设计文档的撰写。

首先,我们应该知道Laplace分布的概率密度函数公式、累积分布函数、逆累积分布函数,并且根据公式开发出代码,公式如下所示:

Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)

参考Numpy、Scipy、Pytorch、Tensorflow的代码实现,我们这里可以很容易的实现公式对应的代码,其实现方案如下3.1小节所示。

2.1 API 实现方案

该 API 实现于 paddle.distribution.Laplace。

基于paddle.distribution API基类进行开发。

class API 中的具体实现(部分方法已完成开发,故直接使用源代码),该api有两个参数:位置参数self.loc, 尺度参数self.scale。包含以下方法:

  • mean 计算均值:

  • stddev 计算标准差:

  • variance 计算方差:

  • sample 随机采样(参考pytorch复用重参数化采样结果):

  • rsample 重参数化采样:

其中 u = paddle.uniform(shape=shape, min=eps – 1, max=1); eps根据dtype决定;

  • prob 概率密度(包含传参value):

直接继承父类实现

  • log_prob 对数概率密度(value):

  • entropy 熵计算:

  • cdf 累积分布函数(value):

  • icdf 逆累积分布函数(value):

  • kl_divergence 两个Laplace分布之间的kl散度(other–Laplace类的一个实例):

参考文献:https://openaccess.thecvf.com/content/CVPR2021/supplemental/Meyer_An_Alternative_Probabilistic_CVPR_2021_supplemental.pdf

同时在paddle/distribution/kl.py 中注册_kl_laplace_laplace函数,使用时可直接调用kl_divergence计算laplace分布之间的kl散度。

2.2 测试和验收的考量

在我们开发完对应的代码后,我们应该如何证明我们所开发出来的代码是正确的呢?这时候就需要单测试的代码来证明我们的代码是正确的。那么什么是单测试呢?单测试的用例其实是一个“输入数据”和“预计输出”的集合。你需要跟你输入数据,根据逻辑功能给出预计输出,这里所说的根据逻辑功能是指,通过需求文档就能给出的预计输出。而非我们通过已经实现的代码去推导出的预计输出。这也是最容易被忽视的一点。你要去做单测试,然后还要通过代码去推断出预计输出,如果你的代码逻辑本来就实现错了,给出的预计输出也是错的,那么你的单测试将没有意义。实际上,这部分可以说是整个工作中最重要的部分也是比较难的部分,我们需要想出预计输出,并且如何通过已经实现的代码去推导出预计输出,只有单测试通过了,我们的开发任务才算基本完成了。

根据api类各个方法及特性传参的不同,把单测分成三个部分:测试分布的特性(无需额外参数)、测试分布的概率密度函数(需要传值)以及测试KL散度(需要传入一个实例)。

1、测试Lapalce分布的特性

  • 测试方法:该部分主要测试分布的均值、方差、熵等特征。类TestLaplace继承unittest.TestCase,分别实现方法setUp(初始化),test_mean(mean单测),test_variance(variance单测),test_stddev(stddev单测),test_entropy(entropy单测),test_sample(sample单测)。
    • 均值、方差、标准差通过Numpy计算相应值,对比Laplace类中相应property的返回值,若一致即正确;
    • 采样方法除验证其返回的数据类型及数据形状是否合法外,还需证明采样结果符合laplace分布。验证策略如下:随机采样30000个laplace分布下的样本值,计算采样样本的均值和方差,并比较同分布下scipy.stats.laplace返回的均值与方差,检查是否在合理误差范围内;同时通过Kolmogorov-Smirnov test进一步验证采样是否属于laplace分布,若计算所得ks值小于0.02,则拒绝不一致假设,两者属于同一分布;
    • 熵计算通过对比scipy.stats.laplace.entropy的值是否与类方法返回值一致验证结果的正确性。
  • 测试用例:单测需要覆盖单一维度的Laplace分布和多维度分布情况,因此使用两种初始化参数
    • ‘one-dim’: loc=parameterize.xrand((2, )), scale=parameterize.xrand((2, ));
    • ‘multi-dim’: loc=parameterize.xrand((5, 5)), scale=parameterize.xrand((5, 5))。

2、测试Lapalce分布的概率密度函数

  • 测试方法:该部分主要测试分布各种概率密度函数。类TestLaplacePDF继承unittest.TestCase,分别实现方法setUp(初始化),test_prob(prob单测),test_log_prob(log_prob单测),test_cdf(cdf单测),test_icdf(icdf)。以上分布在scipy.stats.laplace中均有实现,因此给定某个输入value,对比相同参数下Laplace分布的scipy实现以及paddle实现的结果,若误差在容忍度范围内则证明实现正确。
  • 测试用例:为不失一般性,测试使用多维位置参数和尺度参数初始化Laplace类,并覆盖int型输入及float型输入。
    • ‘value-float’: loc=np.array([0.2, 0.3]), scale=np.array([2, 3]), value=np.array([2., 5.]); * ‘value-int’: loc=np.array([0.2, 0.3]), scale=np.array([2, 3]), value=np.array([2, 5]);
    • ‘value-multi-dim’: loc=np.array([0.2, 0.3]), scale=np.array([2, 3]), value=np.array([[4., 6], [8, 2]])。

3、测试Lapalce分布之间的KL散度

  • 测试方法:该部分测试两个Laplace分布之间的KL散度。类TestLaplaceAndLaplaceKL继承unittest.TestCase,分别实现setUp(初始化),test_kl_divergence(kl_divergence)。在scipy中scipy.stats.entropy可用来计算两个分布之间的散度。因此对比两个Laplace分布在paddle.distribution.kl_divergence下和在scipy.stats.laplace下计算的散度,若结果在误差范围内,则证明该方法实现正确。
  • 测试用例:分布1:loc=np.array([0.0]), scale=np.array([1.0]), 分布2: loc=np.array([1.0]), scale=np.array([0.5])

3、代码开发

代码的开发主要参考Pytorch,此处涉及到单测试代码的开发,kl散度注册等代码,需要仔细阅读PaddlePaddle中其他分布代码的实现形式。


4、总结

目前,该API已经锁定贡献。回顾API的开发过程,实际上该API的开发并不难,主要的问题在于如何进行单测试,证明开发的API是正确的,并且还有一些相关的细节点,比如KL散度的注册等。还有就是最开始走了弯路,参照了Normal的开发风格,将API写成了2.0风格的,影响了一些时间,并且在最后的单测中,发现了Uniform实现方式的一些Bug,此处Debug花费了一些时间,整体来看,花时间的部分是在单测部分。

 

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

摘要:本文主要通过实例讲解如何通过gs_cpuwatcher.sh 脚本寻找CPU占用高语句。

本文分享自华为云社区《GaussDB(DWS) gs_cpuwatcher.sh 脚本如何寻找CPU占用高语句》,作者:fighttingman。

【工具名称】

gs_cpuwatcher

【功能描述】

1.寻找集群内节点占用CPU高的语句

【使用场景】

  1. CPU sys使用率高
  2. 业务整体慢

【参数说明】

【使用方法】

  1. 直接后台执行命令

nohup sh gs_cpuwatcher.sh > cpuwatcher.log 2>&1 &

执行之前注意事项:

  • 使用omm用户(线下)或者Ruby用户(线上)执行
  • 将脚本放到一个磁盘空间充足的目录执行,防止把磁盘空间占满,脚本监控会产生日志,占用磁盘空间,磁盘空间最好大于20G
  • 监控完之后kill这个监控进程,防止忘记这个脚本造成监控日志一直上涨,脚本默认保留3天的日志
  • 脚本只有在进程的cpu使用率大于100(多核累加和)的时候才会进行查询cpu高的语句
Goland激活2023.1.1(GoLand 2023.1 发布)

【最佳实践&结果分析】

执行监控命令之后,检查当前目录生成的监控日志

Goland激活2023.1.1(GoLand 2023.1 发布)

查看日志cpu_watch_xxx.log日志,里边有记录占用CPU高的语句

Goland激活2023.1.1(GoLand 2023.1 发布)

日志里边记录了cpu占用高的语句,例如上图中select * from pg_class a, pg_class,脚本默认截取sql的前50个字符,可以对截取字符串进行修改,需要修改脚本

Goland激活2023.1.1(GoLand 2023.1 发布)

字段解释:

  1. dur :执行时长
  2. start:sql的起始时间
  3. state_change:sql状态改变时间
  4. usename:用户名称
  5. datname:连的数据库名称
  6. query_id:sql的唯一标识id
  7. pid:线程id
  8. client_addr:客户端连的ip
  9. state:sql的执行状态
  10. lwtid:线程小号
  11. wait_status:等待视图中的等待状态字段
  12. substr:sql字段

 

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

文章作者:

Paula Ramos,英特尔 AI 软件布道师,美国

武卓,英特尔 AI 软件布道师,中国

Samet Akcay,英特尔人工智能研究工程师/科学家

Goland激活2023.1.1(GoLand 2023.1 发布)

在上篇文章《 开发者实战 | 如何应用Anomalib在数据集不平衡的情况下检测缺陷?-上篇》中,我们介绍了深度学习异常检测库 Anomalib(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib)。简而言之,当您想进行自动缺陷检测,但数据集不平衡时,Anomalib 是一个很好的工具。

希望您已经通过入门 notebook (复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/tree/main/notebooks/000_getting_started)访问并亲自试用了这个开源项目。如果没有,请不要担心,这篇博文将教您如何结合自己的数据集使用 Anomalib。

在这个示例中,我们将介绍一个令人振奋的 Dobot 机器人工业用例,其中的机械臂用于教育、工业和智能用例中。如果您没有可用的 Dobot 机器人,您可以简单地修改 notebook,避开、注释或改变机器人代码,使其为您所用。

Goland激活2023.1.1(GoLand 2023.1 发布)

图 1:使用教育机器人进行基于 Anomalib 的缺陷检测。

让我们开始吧

为了解 Anomalib 的工作原理,我们将看一个检查彩色立方体的生产线(图 1)。其中一些立方体会有洞或缺陷,需要从传送带上取下。由于这些缺陷在生产线上并不常见,我们将为我们的 AI 模型拍摄一些图像。

安装:

按照以下步骤使用源文件安装 Anomalib:

1. 使用 Python 3.8 版本创建运行Anomalib + Dobot DLL 的环境

对于 Windows,使用以下代码:


向右滑动查看完整代码

对于 Ubuntu:


向右滑动查看完整代码

2. 从 GitHub 存储库中安装 Anomalib 及 OpenVINO™ 要求(在这篇博文中,我们将不使用 pip 安装命令):


向右滑动查看完整代码

3. 安装 Jupyter Lab 或 Jupyter Notebook:

https://jupyter.org/install


向右滑动查看完整代码

4. 然后连接您的 USB 摄像头,使用简单的摄像头应用验证它在正常工作。然后,关闭该应用。

可选:如果您可以访问 Dobot,请实施以下步骤:

1.    安装 Dobot 要求(更多信息请参考 Dobot 文档,复制到浏览器打开:https://en.dobot.cn/products/education/magician.html)。

2.    检查 Dobot 的所有连接状态,并使用 Dobot Studio 验证它在正常工作。

3.    将通风配件安装在 Dobot 上,并使用 Dobot Studio 验证它在正常工作。

4.    在 Dobot Studio(图 2)中,“Home”按钮,找到:

·       校准坐标:立方体阵列的左上角初始位置。

·       位置坐标:机械臂应将立方体放在传送带上方的位置。

·       异常坐标:释放异常立方体的位置。

·       然后在 notebook 中替换这些坐标。有关该步骤的更多说明,请参考自述文件(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/tree/feature/notebooks/usecases/dobot/notebooks/500_use_cases/dobot)

5. 如需使用机器人运行 notebook,从这里下载 Dobot API 和驱动程序文件(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/releases/download/dobot/dobot_api.zip),并将它们添加到存储库 Anomalib 文件夹的 notebooks/500_uses_cases/dobot 中。

Goland激活2023.1.1(GoLand 2023.1 发布)

图 2:Dobot Studio 界面。

注:如果没有机器人,您可以转到另一个 notebook,如 501b notebook(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/blob/main/notebooks/500_use_cases/501_dobot/501b_Training_a_model_with_cubes_from_a_robotic_arm.ipynb),通过这个链接下载数据集(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/releases/download/dobot/cubes.zip),并在那里尝试训练和推理。

Notebook 的数据采集和推理

下面,我们需要使用正常的数据集创建文件夹。在这个示例中,我们创建了一个彩色立方体的数据集,并为异常情况添加一个黑色圆圈贴纸,以模拟盒子上的洞或缺陷(图 3)。对于数据采集和推理,我们将使用 501a notebook(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/blob/main/notebooks/500_use_cases/501_dobot/501a_Dataset_creation_and_Inference_with_a_robotic_arm.ipynb)

Goland激活2023.1.1(GoLand 2023.1 发布)

图 3:用于第一轮训练的数据集。

在采集数据时,请务必将 acquisition 变量设置 为 True  来运行notebook,并为没有异常的数据定义“正常”文件夹,为异常图像定义“异常”文件夹。数据集将直接在 Anomalib 克隆的文件夹中创建,所以我们将看到 Anomalib/dataset/cubes 文件夹。

如果您没有机器人,您可以修改代码以保存图像或使用下载的数据集进行训练。

推理:

对于推理,acquisition 变量应该是 False,我们不会保存任何图像。我们将读取采集到的视频帧,使用 OpenVINO 运行推理,并决定放置立方体的位置:对于正常立方体,放置在传送带上;对于异常立方体,放置在传送带外。

我们需要识别采集标记 — 采集模式为 True,推理模式为 False。在采集模式下,要注意是创建正常还是异常文件夹。例如,在采集模式下,notebook 会将每张图像保存在 anomalib/datasets/cubes/{FOLDER} 中,以便进一步训练(复制到浏览器打开:https://gist.github.com/paularamo/f20c4efe98ec00756f76d65b20f21fb0)。在推理模式下,notebook 不会保存图像;它将运行推理并显示结果。

让我们开始吧

对于训练,我们将使用 501b notebook(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/blob/main/notebooks/500_use_cases/501_dobot/501b_Training_a_model_with_cubes_from_a_robotic_arm.ipynb)。在这个 notebook 中,我们将使用 PyTorch Lighting,并使用“Padim”模型进行训练。这种模型有几个优点:我们不需要 GPU,只用 CPU 就可以完成训练过程,而且训练速度也很快。

现在,让我们深入了解一下训练 notebook!

导入:

在这一部分,我们将解释用于该示例的软件包。我们还将从 Anomalib 库中调用需要使用的软件包(复制到浏览器打开:https://gist.githubusercontent.com/paularamo/536ed17333cfe05ddad36f/raw/2d645c778c059b9c52ecad0df83f326f3fe8aa16/anomalib_imports.py)

配置:

有两种方法来配置 Anomalib 模块,一种是使用配置文件,另一种是使用 API。最简单的方法是通过 API 查看该库的功能。如果您希望在您的生产系统中实施 Anomalib,请使用配置文件(YAML 文件)(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/blob/main/notebooks/500_use_cases/501_dobot/cubes_config.yaml),它是核心训练与测试进程,包含数据集、模型、试验和回调管理(图 4)

在接下来的部分,我们将描述如何使用 API 配置您的训练。

Goland激活2023.1.1(GoLand 2023.1 发布)

图 4:训练和验证模块。

数据集管理器:

通过 API,我们可以修改数据集模块。我们将准备数据集路径、格式、图像大小、批量大小和任务类型(复制到浏览器打开:https://gist.github.com/paularamo/46fdfe6bcfa27e5e027a7f4c3a0dc5bd)。然后,我们使用以下代码将数据加载到管道中。


向右滑动查看完整代码

模型管理器:

对于异常检测模型,我们使用 Padim(复制到浏览器打开:https://gist.githubusercontent.com/paularamo/536ed17333cfe05ddad36f/raw/2d645c778c059b9c52ecad0df83f326f3fe8aa16/anomalib_imports.py),您也可以使用其他 Anomalib 模型,如:CFlow、CS-Flow、DFKDE、DFM、DRAEM、FastFlow、Ganomaly Patchcore、Reverse Distillation 和 STFPM。此外,我们使用 API 设置了模型管理器;使用 anomalib.models (复制到浏览器打开:https://gist.github.com/paularamo/24457a4eaeb98f15d5b39bc62b513d26)导入 Padim。

回调(Callbacks)管理器:

为了适当地训练模型,我们需要添加一些其他的“非基础”逻辑,如保存权重、尽早终止、以异常分数为基准以及将输入/输出图像可视化。为了实现这些,我们使用回调Callbacks。Anomalib 有自己的Callbacks,并支持 PyTorch Lightning 的本地callbacks。通过该代码,我们将创建在训练期间执行的回调列表(复制到浏览器打开:https://gist.github.com/paularamo/581d6c99504e673a8147e)

训练:

在设置数据模块、模型和callbacks之后,我们可以训练模型了。训练模型所需的最后一个组件是 pytorch_lightning Trainer 对象,它可处理训练、测试和预测管道。此处,查看 notebook 中的 Trainer 对象示例(复制到浏览器打开:https://gist.github.com/paularamo/ed41798c869aec9b8d127c24https://gist.github.com/paularamo/ed41798c869aec9b8d127c24)

验证:

我们使用 OpenVINO 推理进行验证。在之前的导入部分,我们导入了 anomalib.deploy 模块中的 OpenVINOInferencer。现在,我们将用它来运行推理并检查结果。首先,我们需要检查 OpenVINO 模型是否在结果文件夹中(复制到浏览器打开:https://gist.github.com/paularamo/7d89abf6a6e1bf48c406ecefc2)

预测结果:

为了实施推理,我们需要从 OpenVINOinference(我们可在其中设置 OpenVINO 模型及其数据)中调用 predict 方法,并确定需要使用的设备:


向右滑动查看完整代码

预测包含与结果有关的各种信息:原始图像、预测分数、异常图、热图图像、预测掩码和分割结果(图 5)。根据您要选择的任务类型,您可能需要更多信息。

Goland激活2023.1.1(GoLand 2023.1 发布)

图 5:预测结果

最后,我们采用 Dobot 机器人的缺陷检测用例基本是这样的(图 6)

Goland激活2023.1.1(GoLand 2023.1 发布)

图 6:运行 Anomalib 模型推理的教育机器人

使用您自己的数据集的技巧和建议

数据集转换:

如果您想提高模型的准确性,您可以在您的训练管道中应用数据转换。您应该在 config.yaml 的 dataset.transform_config 部分提供增强配置文件的路径(复制到浏览器打开:https://albumentations.ai/docs/examples/serialization/)。这意味着您需要有一个用于 Anomalib 设置的 config.yaml 文件,以及一个可供 Anomalib config yaml 文件使用的单独 albumentations_config.yaml 文件。

在这个讨论帖中(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/discussions/737),您可以学习如何将数据转换添加到您的实际训练管道。

强大的模型:

异常检测库并非无所不能,在碰到麻烦的数据集时也可能会失效。好消息是:您可以尝试 13 个不同的模型,并能对每个实验的结果进行基准测试。您可以将基准测试入口点脚本用于其中(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/blob/main/tools/benchmarking/benchmark.py),并将配置文件用于基准测试目的(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/blob/main/tools/benchmarking/benchmark_params.yaml)。这将帮助您为实际用例选择最佳模型。

如需更多指南,请查看“操作指南”(复制到浏览器打开:https://openvinotoolkit.github.io/anomalib/how_to_guides/index.html)

下一步

如果您正在使用 Dobot,并希望通过该 notebook 看到更多探讨其使用场景的文章,请将您的意见或问题添加到这篇博文中。如果您在 Anomalib 安装过程中遇到任何问题或错误,请在我们的GitHub 存储库(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib)中提交。

我们期待看到您使用 Anomalib 库提出更多办法。

祝您开心,欢迎您在我们的讨论频道(复制到浏览器打开:https://github.com/openvinotoolkit/anomalib/discussions)分享您的结果!

通知和免责声明


英特尔技术可能需要启用硬件、软件或激活服务。

没有任何产品或组件是绝对安全的。

具体成本和结果可能不同。

英特尔并不控制或审计第三方数据。请您审查该内容,咨询其他来源,并确认提及数据是否准确。

英特尔未做出任何明示和默示的保证,包括但不限于,关于适销性、适合特定目的及不侵权的默示保证,以及在履约过程、交易过程或贸易惯例中引起的任何保证。

本文件不构成对任何知识产权的授权,包括明示的、暗示的,也无论是基于禁止反言的原则或其他。

©英特尔公司版权所有。英特尔、英特尔标识和其他英特尔标志是英特尔公司或其子公司在美国和/或其他国家(地区)的商标。其他的名称和品牌可能是其他所有者的资产。

关于我们

01


Paula Ramos 自 21 世纪初以来一直在哥伦比亚开发新型集成工程技术,主要涉及计算机视觉、机器人和机器学习在农业领域的应用。在攻读博士和研究生学位期间,她部署了多个低成本的智能边缘和物联网计算技术,这些技术可供农民等不具备计算机视觉系统专业知识的人员操作。她的发明可在严苛和紧急的条件下运行,如没有照明控制的农业和户外环境,也可从容应对高太阳辐射条件、甚至极端高温条件。目前,她是英特尔的 AI 软件布道师,负责开发能够理解和重新创造周围视觉世界以满足现实需求的智能系统/机器。


02


Samet Akcay 是人工智能研究工程师/科学家。他的主要研究兴趣包括实时图像分类、检测、异常检测,以及基于深度/机器学习算法的无监督特征学习。他最近与人联合开发了开源的 Anomalib,这是该领域最大的异常检测库之一。Samet 拥有英国杜伦大学计算机科学系的博士学位,并获得了美国宾夕法尼亚州立大学电气工程系 Robust Machine Intelligence Lab 的硕士学位。他在顶级的计算机视觉和机器/深度学习会议和期刊上发表了 30 多篇学术论文。


03


武卓是英特尔的 AI 软件布道师,专注于 OpenVINO 工具套件的研究。她的工作职责涵盖了从深度学习技术到 5G 无线通信技术的领域。她在计算机视觉、机器学习、边缘计算、物联网系统和无线通信物理层算法等方面做出了卓越贡献。她为汽车、银行、保险等不同行业的企业客户提供基于机器学习和深度学习的端到端解决方案; 4G-LTE 和 5G 无线通信系统方面进行了广泛研究,并曾任职于中国贝尔实验室,期间申请了多项专利。她在上海大学担任副教授时,曾作为主要研究人员主导过多个研究项目。

–END–


👇欢迎在留言区与我们互动哦,

小程序 留言区 即可参与


留言区


 阅读原文 立即体验OpenVINO 2022.3

摘要:StampedLock是一种在读取共享变量的过程中,允许后面的一个线程获取写锁对共享变量进行写操作,使用乐观读避免数据不一致的问题,并且在读多写少的高并发环境下,比ReadWriteLock更快的一种锁。

本文分享自华为云社区《一文彻底理解并发编程中非常重要的票据锁——StampedLock》,作者:冰 河 。

什么是StampedLock?

ReadWriteLock锁允许多个线程同时读取共享变量,但是在读取共享变量的时候,不允许另外的线程多共享变量进行写操作,更多的适合于读多写少的环境中。那么,在读多写少的环境中,有没有一种比ReadWriteLock更快的锁呢?

答案当然是有!那就是我们今天要介绍的主角——JDK1.8中新增的StampedLock!没错,就是它!

StampedLock与ReadWriteLock相比,在读的过程中也允许后面的一个线程获取写锁对共享变量进行写操作,为了避免读取的数据不一致,使用StampedLock读取共享变量时,需要对共享变量进行是否有写入的检验操作,并且这种读是一种乐观读。

总之,StampedLock是一种在读取共享变量的过程中,允许后面的一个线程获取写锁对共享变量进行写操作,使用乐观读避免数据不一致的问题,并且在读多写少的高并发环境下,比ReadWriteLock更快的一种锁。

StampedLock三种锁模式

这里,我们可以简单对比下StampedLock与ReadWriteLock,ReadWriteLock支持两种锁模式:一种是读锁,另一种是写锁,并且ReadWriteLock允许多个线程同时读共享变量,在读时,不允许写,在写时,不允许读,读和写是互斥的,所以,ReadWriteLock中的读锁,更多的是指悲观读锁。

StampedLock支持三种锁模式:写锁、读锁(这里的读锁指的是悲观读锁)和乐观读(很多资料和书籍写的是乐观读锁,这里我个人觉得更准确的是乐观读,为啥呢?我们继续往下看啊)。其中,写锁和读锁与ReadWriteLock中的语义类似,允许多个线程同时获取读锁,但是只允许一个线程获取写锁,写锁和读锁也是互斥的。

另一个与ReadWriteLock不同的地方在于:StampedLock在获取读锁或者写锁成功后,都会返回一个Long类型的变量,之后在释放锁时,需要传入这个Long类型的变量。例如,下面的伪代码所示的逻辑演示了StampedLock如何获取锁和释放锁。


StampedLock支持乐观读,这是它比ReadWriteLock性能要好的关键所在。 ReadWriteLock在读取共享变量时,所有对共享变量的写操作都会被阻塞。而StampedLock提供的乐观读,在多个线程读取共享变量时,允许一个线程对共享变量进行写操作。

我们再来看一下JDK官方给出的StampedLock示例,如下所示。


在上述代码中,如果在执行乐观读操作时,另外的线程对共享变量进行了写操作,则会把乐观读升级为悲观读锁,如下代码片段所示。


这种将乐观读升级为悲观读锁的方式相比一直使用乐观读的方式更加合理,如果不升级为悲观读锁,则程序会在一个循环中反复执行乐观读操作,直到乐观读操作期间没有线程执行写操作,而在循环中不断的执行乐观读会消耗大量的CPU资源,升级为悲观读锁是更加合理的一种方式。

StampedLock实现思想

StampedLock内部是基于CLH锁实现的,CLH是一种自旋锁,能够保证没有“饥饿现象”的发生,并且能够保证FIFO(先进先出)的服务顺序。

在CLH中,锁维护一个等待线程队列,所有申请锁,但是没有成功的线程都会存入这个队列中,每一个节点代表一个线程,保存一个标记位(locked),用于判断当前线程是否已经释放锁,当locked标记位为true时, 表示获取到锁,当locked标记位为false时,表示成功释放了锁。

当一个线程试图获得锁时,取得等待队列的尾部节点作为其前序节点,并使用类似如下代码判断前序节点是否已经成功释放锁:


只要前序节点(pred)没有释放锁,则表示当前线程还不能继续执行,因此会自旋等待;反之,如果前序线程已经释放锁,则当前线程可以继续执行。

释放锁时,也遵循这个逻辑,线程会将自身节点的locked位置标记为false,后续等待的线程就能继续执行了,也就是已经释放了锁。

StampedLock的实现思想总体来说,还是比较简单的,这里就不展开讲了。

StampedLock的注意事项

在读多写少的高并发环境下,StampedLock的性能确实不错,但是它不能够完全取代ReadWriteLock。在使用的时候,也需要特别注意以下几个方面。

StampedLock不支持重入

没错,StampedLock是不支持重入的,也就是说,在使用StampedLock时,不能嵌套使用,这点在使用时要特别注意。

StampedLock不支持条件变量

第二个需要注意的是就是StampedLock不支持条件变量,无论是读锁还是写锁,都不支持条件变量。

StampedLock使用不当会导致CPU飙升

这点也是最重要的一点,在使用时需要特别注意:如果某个线程阻塞在StampedLock的readLock()或者writeLock()方法上时,此时调用阻塞线程的interrupt()方法中断线程,会导致CPU飙升到100%。例如,下面的代码所示。


运行上面的程序,会导致thread02线程所在的CPU飙升到100%。

这里,有很多小伙伴不太明白为啥LockSupport.park();会导致thread01会永远阻塞。这里,冰河为你画了一张线程的生命周期图,如下所示。

Goland激活2023.1.1(GoLand 2023.1 发布)

这下明白了吧?在线程的生命周期中,有几个重要的状态需要说明一下。

  • NEW:初始状态,线程被构建,但是还没有调用start()方法。
  • RUNNABLE:可运行状态,可运行状态可以包括:运行中状态和就绪状态。
  • BLOCKED:阻塞状态,处于这个状态的线程需要等待其他线程释放锁或者等待进入synchronized。
  • WAITING:表示等待状态,处于该状态的线程需要等待其他线程对其进行通知或中断等操作,进而进入下一个状态。
  • TIME_WAITING:超时等待状态。可以在一定的时间自行返回。
  • TERMINATED:终止状态,当前线程执行完毕。

看完这个线程的生命周期图,知道为啥调用LockSupport.park();会使thread02阻塞了吧?

所以,在使用StampedLock时,一定要注意避免线程所在的CPU飙升的问题。那如何避免呢?

那就是使用StampedLock的readLock()方法或者读锁和使用writeLock()方法获取写锁时,一定不要调用线程的中断方法来中断线程,如果不可避免的要中断线程的话,一定要用StampedLock的readLockInterruptibly()方法获取可中断的读锁和使用StampedLock的writeLockInterruptibly()方法获取可中断的悲观写锁。

最后,对于StampedLock的使用,JDK官方给出的StampedLock示例本身就是一个最佳实践了,小伙伴们可以多看看JDK官方给出的StampedLock示例,多多体会下StampedLock的使用方式和背后原理与核心思想。

 

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

摘要:本案例我们利用视频字幕识别中的文字检测与识别模型,增加预训练Bert进行纠错

本文分享自华为云社区《Bert特调OCR》,作者:杜甫盖房子。

做这个项目的初衷是发现图比较糊/检测框比较长的时候,OCR会有一些错误识别,所以想对识别结果进行纠错。一个很自然的想法是利用语义信息进行纠错,其实在OCR训练时加入语义信息也有不少工作,感兴趣的朋友可以了解一下,为了更大程度复用已有的项目,我们决定保留现有OCR单,在之后加入独立语义纠错模块进行纠错。

本案例我们利用视频字幕识别中的文字检测与识别模型,增加预训练Bert进行纠错,最终效果如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

我们使用进行开发,如果还没有安装,可以参考ModelBox端云协同AI开发套件(Windows)设备注册篇、ModelBox端云协同AI开发套件(Windows)SDK安装篇完成设备注册与安装。

技能开发

这个应用对应的版本已经做成模板放在华为云OBS中,可以用sdk中的工具下载,接下来我们给出该应用在中的完整开发过程:

1)下载模板

执行可看到当前公开的技能模板:


结果中的doc_ocr_db_crnn_bert即为文档识别应用模板,下载模板:


工具的参数中, 代表,即列出当前已有的模板名称; 代表,即下载对应名称的模板。下载下来的模板资源,将存放在核心库的目录下。

2)创建工程

 sdk目录下使用创建工程


工具的参数中, 表示创建事务的类别,包括工程(server)、Python功能单(Python)、推理功能单(infer)等; 代表,即创建事务的名称; 代表,表示将使用后面参数值代表的模板创建工程,而不是创建空的工程。

目录下将创建出工程,工程内容如下所示:


3)查看流程图

工程目录下存放流程图,默认的流程图与工程同名,将流程图可视化:

Goland激活2023.1.1(GoLand 2023.1 发布)

图示中,灰色部分为预置功能单,其余颜色为我们实现的功能单,其中绿色为一般通用功能单,红色为推理功能单,蓝色为条件功能单,黄色为展开归拢功能单。HTTP接收图解码后做预处理,接着是文字检测,模型后处理得到检测框,经过条件功能判断,检测到文字的图送入展开功能单,切图进行文字识别,文字识别结果送入bert预处理单判断是否需要进行纠错,如需纠错则再展开并行进行语义推理,不需要纠错的就直接进行结果绘制并返回。而未检测到文字的帧则直接返回。

4)核心逻辑

本应用核心逻辑中的文字检测与识别可以参考【ModelBox OCR实战营】视频字幕识别中的相关介绍,本文重点介绍文字纠错部分。

首先查看纠错预处理功能单:


预处理单对通过函数对OCR结果进行判断,只对大于3个字的中文字符进行纠错:


通过函数定位需要纠错的字符,只对OCR置信度小于阈值的字符进行纠错:


如有需要纠错的字符,则将该句编码,进行语义推理。

语义推理后,通过对推理结果进行解码,在功能单中使用函数计算语义推理结果与OCR结果的字符相似度:


其中,decompose_text函数将单个汉字编码为笔划级别的IDS,如:

华: ⿱⿰⿰丿丨⿻乚丿⿻一丨


计算语义推理结果字符与原OCR结果字符相似度之后,综合语义推理置信度与相似度判断是否接收纠错结果:


5)三方依赖库

本应用依赖pyclipper、Shapely、pillow等工具包,ModelBox应用不需要手动安装三方依赖库,只需要配置在,应用在编译时会自动安装。

技能运行

在项目目录下执行运行应用,为了方便观察纠错结果,我们将日志切换为info:


另起终端,进入项目目录下,运行脚本进行测试:


可以在技能运行日志中观察到接受的纠错结果:


同时,在目录下可以看到应用返回的结果图片:

Goland激活2023.1.1(GoLand 2023.1 发布)

 

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

Goland激活2023.1.1(GoLand 2023.1 发布)

准确的讲,Redis 事务包含两种模式 : 事务模式Lua 脚本

先说结论:

Redis 的事务模式具备如下特点:

  • 保证隔离性;
  • 无法保证持久性;
  • 具备了一定的原子性,但不支持回滚;
  • 一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis 的事务可以保证一致性。

但 Lua 脚本更具备实用场景,它是另一种形式的事务,他具备一定的原子性,但脚本报错的情况下,事务并不会回滚。Lua 脚本可以保证隔离性,而且可以完美的支持后面的步骤依赖前面步骤的结果

Lua 脚本模式的身影几乎无处不在,比如分布式锁、延迟队列、抢红包等场景。

1 事务原理

Redis 的事务包含如下命令:

序号 命令及描述 1 MULTI 标记一个事务块的开始。 2 EXEC 执行所有事务块内的命令。 3 DISCARD 取消事务,放弃执行事务块内的所有命令。 4 WATCH key [key …] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 5 UNWATCH 取消 WATCH 命令对所有 key 的监视。

事务包含三个阶段:

  1. 事务开启,使用 MULTI , 该命令标志着执行该命令的客户端从非事务状态切换至事务状态 ;
  2. 命令入队,MULTI 开启事务之后,客户端的命令并不会被立即执行,而是放入一个事务队列 ;
  3. 执行事务或者丢弃。如果收到 EXEC 的命令,事务队列里的命令将会被执行 ,如果是 DISCARD 则事务被丢弃。

下面展示一个事务的例子。


这里有一个疑问?在开启事务的时候,Redis key 可以被修改吗?

img

在事务执行 EXEC 命令之前 ,Redis key 依然可以被修改

在事务开启之前,我们可以 watch 命令监听 Redis key 。在事务执行之前,我们修改 key 值 ,事务执行失败,返回 nil

img

通过上面的例子,watch 命令可以实现类似乐观锁的效果

2 事务的ACID

2.1 原子性

原子性是指:一个事务中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

第一个例子:

在执行 EXEC 命令前,客户端发送的操作命令错误,比如:语法错误或者使用了不存在的命令。


在这个例子中,我们使用了不存在的命令,导致入队失败,整个事务都将无法执行 。

第二个例子:

事务操作入队时,命令和操作的数据类型不匹配 ,入队列正常,但执行 EXEC 命令异常 。


这个例子里,Redis 在执行 EXEC 命令时,如果出现了错误,Redis 不会终止其它命令的执行,事务也不会因为某个命令执行失败而回滚 。

综上,我对 Redis 事务原子性的理解如下:

  1. 命令入队时报错, 会放弃事务执行,保证原子性;
  2. 命令入队时正常,执行 EXEC 命令后报错,不保证原子性;

也就是:Redis 事务在特定条件下,才具备一定的原子性

2.2 隔离性

数据库的隔离性是指:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

事务隔离分为不同级别 ,分别是:

  • 未提交读(read uncommitted)
  • 提交读(read committed)
  • 可重复读(repeatable read)
  • 串行化(serializable)

首先,需要明确一点:Redis 并没有事务隔离级别的概念。这里我们讨论 Redis 的隔离性是指:并发场景下,事务之间是否可以做到互不干扰

我们可以将事务执行可以分为 EXEC 命令执行前EXEC 命令执行后两个阶段,分开讨论。

  1. EXEC 命令执行前

在事务原理这一小节,我们发现在事务执行之前 ,Redis key 依然可以被修改。此时,可以使用 WATCH 机制来实现乐观锁的效果。

  1. EXEC 命令执行后

因为 Redis 是单线程执行操作命令, EXEC 命令执行后,Redis 会保证命令队列中的所有命令执行完 。 这样就可以保证事务的隔离性。

2.3 持久性

数据库的持久性是指 :事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

Redis 的数据是否持久化取决于 Redis 的持久化配置模式 。

  1. 没有配置 RDB 或者 AOF ,事务的持久性无法保证;
  2. 使用了 RDB模式,在一个事务执行后,下一次的 RDB 快照还未执行前,如果发生了实例宕机,事务的持久性同样无法保证;
  3. 使用了 AOF 模式;AOF 模式的三种配置选项 no 、everysec 都会存在数据丢失的情况 。always 可以保证事务的持久性,但因为性能太差,在生产环境一般不推荐使用。

综上,redis 事务的持久性是无法保证的

2.4 一致性

一致性的概念一直很让人困惑,在我搜寻的资料里,有两类不同的定义。

  1. 维基百科

我们先看下维基百科上一致性的定义:

Consistency ensures that a transaction can only bring the database from one valid state to another, maintaining database invariants: any data written to the database must be valid according to all defined rules, including constraints, cascades, triggers, and any combination thereof. This prevents database corruption by an illegal transaction, but does not guarantee that a transaction is correct. Referential integrity guarantees the primary key – foreign key relationship.

在这段文字里,一致性的核心是“约束”,“any data written to the database must be valid according to all defined rules ”。

如何理解约束?这里引用知乎问题 如何理解数据库的内部一致性和外部一致性,蚂蚁金服 OceanBase 研发专家韩富晟回答的一段话:

“约束”由数据库的使用者告诉数据库,使用者要求数据一定符合这样或者那样的约束。当数据发生修改时,数据库会检查数据是否还符合约束条件,如果约束条件不再被满足,那么修改操作不会发生。

关系数据库最常见的两类约束是“唯一性约束”和“完整性约束”,表格中定义的主键和唯一键都保证了指定的数据项绝不会出现重复,表格之间定义的参照完整性也保证了同一个属性在不同表格中的一致性。

“ Consistency in ACID ”是如此的好用,以至于已经融化在大部分使用者的血液里了,使用者会在表格设计的时候自觉的加上需要的约束条件,数据库也会严格的执行这个约束条件。

所以事务的一致性和预先定义的约束有关,保证了约束即保证了一致性

我们细细品一品这句话: This prevents database corruption by an illegal transaction, but does not guarantee that a transaction is correct

写到这里可能大家还是有点模糊,我们举经典转账的案例。

我们开启一个事务,张三和李四账号上的初始余额都是1000,并且余额字段没有任何约束。张三给李四转账1200。张三的余额更新为 -200 , 李四的余额更新为2200。

从应用层面来看,这个事务明显不合法,因为现实场景中,用户余额不可能小于 0 , 但是它完全遵循数据库的约束,所以从数据库层面来看,这个事务依然保证了一致性。

Redis 的事务一致性是指:Redis 事务在执行过程中符合数据库的约束,没有包含非法或者无效的错误数据。

我们分三种异常场景分别讨论:

  1. 执行 EXEC 命令前,客户端发送的操作命令错误,事务终止,数据保持一致性;
  2. 执行 EXEC 命令后,命令和操作的数据类型不匹配,错误的命令会报错,但事务不会因为错误的命令而终止,而是会继续执行。正确的命令正常执行,错误的命令报错,从这个角度来看,数据也可以保持一致性;
  3. 执行事务的过程中,Redis 服务宕机。这里需要考虑服务配置的持久化模式。
    • 无持久化的内存模式:服务重启之后,数据库没有保持数据,因此数据都是保持一致性的;
    • RDB / AOF 模式: 服务重启后,Redis 通过 RDB / AOF 文件恢复数据,数据库会还原到一致的状态。

综上所述,在一致性的核心是约束的语意下,Redis 的事务可以保证一致性

  1. 《设计数据密集型应用》

这本书是分布式系统入门的神书。在事务这一章节有一段关于 ACID 的解释:

img

Atomicity, isolation, and durability are properties of the database,whereas consistency (in the ACID sense) is a property of the application. The application may rely on the database’s atomicity and isolation properties in order to achieve consistency, but it’s not up to the database alone. Thus, the letter C doesn’t really belong in ACID.

原子性,隔离性和持久性是数据库的属性,而一致性(在 ACID 意义上)是应用程序的属性。应用可能依赖数据库的原子性和隔离属性来实现一致性,但这并不仅取决于数据库。因此,字母 C 不属于 ACID 。

很多时候,我们一直在纠结的一致性,其实就是指符合现实世界的一致性,现实世界的一致性才是事务追求的最终目标。

为了实现现实世界的一致性,需要满足如下几点:

  1. 保证原子性,持久性和隔离性,如果这些特征都无法保证,那么事务的一致性也无法保证;
  2. 数据库本身的约束,比如字符串长度不能超过列的限制或者唯一性约束;
  3. 业务层面同样需要进行保障 。

2.5 事务特点

我们通常称 Redis 为内存数据库 , 不同于传统的关系数据库,为了提供了更高的性能,更快的写入速度,在设计和实现层面做了一些平衡,并不能完全支持事务的 ACID。

Redis 的事务具备如下特点:

  • 保证隔离性;
  • 无法保证持久性;
  • 具备了一定的原子性,但不支持回滚;
  • 一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis 的事务可以保证一致性。

从工程角度来看,假设事务操作中每个步骤需要依赖上一个步骤返回的结果,则需要通过 watch 来实现乐观锁 。

3 Lua 脚本

3.1 简介

Goland激活2023.1.1(GoLand 2023.1 发布)

Lua 由标准 C 编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。Lua 脚本可以很容易的被 C/C ++ 代码调用,也可以反过来调用 C/C++ 的函数,这使得 Lua 在应用程序中可以被广泛应用。

Lua 脚本在游戏领域大放异彩,大家耳熟能详的《大话西游II》,《魔兽世界》都大量使用 Lua 脚本。Java 后端工程师接触过的 api 网关,比如 OpenrestyKong 都可以看到 Lua 脚本的身影。

从 Redis 2.6.0 版本开始, Redis内置的 Lua 解释器,可以实现在 Redis 中运行 Lua 脚本。

使用 Lua 脚本的好处 :

  • 减少网络开销。将多个请求通过脚本的形式一次发送,减少网络时延。
  • 原子操作。Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
  • 复用。客户端发送的脚本会永久存在 Redis 中,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。

Redis Lua 脚本常用命令:

序号 命令及描述 1 EVAL script numkeys key [key …] arg [arg …] 执行 Lua 脚本。 2 EVALSHA sha1 numkeys key [key …] arg [arg …] 执行 Lua 脚本。 3 SCRIPT EXISTS script [script …] 查看指定的脚本是否已经被保存在缓存当中。 4 SCRIPT FLUSH 从脚本缓存中移除所有脚本。 5 SCRIPT KILL 杀死当前正在运行的 Lua 脚本。 6 SCRIPT LOAD script 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。

3.2 EVAL 命令

命令格式:


说明:

  • 是第一个参数,为 Lua 5.1脚本;
  • 第二个参数指定后续参数有几个 key;
  • ,是要操作的键,可以指定多个,在 Lua 脚本中通过, 获取;
  • ,参数,在 Lua 脚本中通过, 获取。

简单实例:


下面演示下 Lua 如何调用 Redis 命令 ,通过来执行了 Redis 命令 。


3.3 EVALSHA 命令

使用 EVAL 命令每次请求都需要传输 Lua 脚本 ,若 Lua 脚本过长,不仅会消耗网络带宽,而且也会对 Redis 的性能造成一定的影响。

思路是先将 Lua 脚本先缓存起来 , 返回给客户端 Lua 脚本的 sha1 摘要。 客户端存储脚本的 sha1 摘要 ,每次请求执行 EVALSHA 命令即可。

img

EVALSHA 命令基本语法如下:


实例如下:


4 事务 VS Lua 脚本

从定义上来说, Redis 中的脚本本身就是一种事务, 所以任何在事务里可以完成的事, 在脚本里面也能完成。 并且一般来说, 使用脚本要来得更简单,并且速度更快

因为脚本功能是 Redis 2.6 才引入的, 而事务功能则更早之前就存在了, 所以 Redis 才会同时存在两种处理事务的方法。

不过我们并不打算在短时间内就移除事务功能, 因为事务提供了一种即使不使用脚本, 也可以避免竞争条件的方法, 而且事务本身的实现并不复杂。

— https://redis.io/

Lua 脚本是另一种形式的事务,他具备一定的原子性,但脚本报错的情况下,事务并不会回滚。Lua 脚本可以保证隔离性,而且可以完美的支持后面的步骤依赖前面步骤的结果

Lua 脚本模式的身影几乎无处不在,比如分布式锁、延迟队列、抢红包等场景。

不过在编写 Lua 脚本时,要注意如下两点:

  1. 为了避免 Redis 阻塞,Lua 脚本业务逻辑不能过于复杂和耗时;
  2. 仔细检查和测试 Lua 脚本 ,因为执行 Lua 脚本具备一定的原子性,不支持回滚。

作者:京东零售  吴迪

前言

在实际项目开发中无论 M 端、PC 端,或多或少都有一个 utils 文件目录去管理项目中用到的一些常用的工具方法,比如:时间处理、价格处理、解析url参数、加载脚本等,其中很多是重复、基础、或基于某种业务场景的工具,存在项目间冗余的痛点以及工具方法规范不统一的问题。
 
  • 在实际开发过程中,经常使用一些开源工具库,如 lodash,以方便、快捷的进行项目开发。但是当 npm上没有自己中意或符合自身业务的工具时,我们不得不自己动手,此时拥有自己的、基于业务的工具库就显得尤为重要。
  • 我们所熟知的Vue、React等诸多知名前端框架,或公司提供的一些类库,它们是如何开发、构建、打包出来的,本文将带领你了解到如何从0到1构建基于自身业务的前端工具库。
 

构建工具库主流方案

1. WEBPACK

  • webpack 提供了构建和打包不同模块化规则的库,只是需要自己去搭建开发底层架构。
  • vue-cli,基于 webpack , vue-cli 脚手架工具可以快速初始化一个 vue 应用,它也可以初始化一个构建库。

2. ROLLUP

  • rollup 是一个专门针对JavaScript模块打包器,可以将应用或库的小块代码编译成更复杂的功能代码。
  • Vue、React 等许多流行前端框架的构建和打包都能看到 rollup 的身影。
 

为什么采用 ROLLUP 而不是 WEBPACK

  • webpack 主要职能是开发应用,而 rollup 主要针对的就是 js 库的开发,如果你要开发 js 库,那 webpack 的繁琐配置和打包后的文件体积就不太适用了,通过webpack打包构建出来的源代码增加了很多工具函数以外的模块依赖代码。
  • rollup 只是把业务代码转码成目标 js ,小巧且轻便。rollup对于代码的Tree-shaking和ES6模块有着算法优势上的支持,如果只想构建一个简单的库,并且是基于ES6开发的,加上其简洁的API,rollup得到更多开发者的青睐。
 

工具库底层架构设计

构建工具库底层架构大概需要哪些功能的支持:

Goland激活2023.1.1(GoLand 2023.1 发布)



 

架构依赖需知

在对底层架构设计的基础上,首先需要把用到的依赖库简单熟悉一下:

rollup 全家桶


 rollup(工具库打包构建核心包)

 rollup-plugin-livereload(rollup 插件,热更新,方便本地 debugger 开发)

 rollup-plugin-serve(rollup 插件,本地服务代理,方便在本地 html 中调试工具)

 rollup-plugin-terser(rollup 插件,代码压缩混淆)

 rollup-plugin-visualizer(rollup 插件,可视化并分析 Rollup bundle,以查看模块占用)

 @rollup/plugin-babel(rollup 插件,rollup 的 babel 插件,ES6 转 ES5)

 @rollup/plugin-commonjs(rollup 插件,用来将 CommonJS 模块转换为 ES6,这样它们就可以包含在 Rollup 包中)

 @rollup/plugin-json(rollup 插件,它将.json 文件转换为 ES6 模块)

 @rollup/plugin-node-resolve(rollup 插件,它使用节点解析算法定位模块,用于在节点模块中使用第三方 node_modules 包)

 @rollup/plugin-typescript(rollup 插件,对 typescript 的支持,将 typescript 进行 tsc 转为 js)

 

typescript 相关


 typescript(使用 ts 开发工具库)

 tslib(TypeScript 的运行库,它包含了 TypeScript 所有的帮助函数)

 @typescript-eslint/eslint-plugin(TypeScript 的 eslint 插件,约束 ts 书写规范)

 @typescript-eslint/parser(ESLint 解析器,它利用 TypeScript ESTree 来允许 ESLint 检测 TypeScript 源代码)

 

文档相关


 typedoc(TypeScript 项目的文档生成器)

 gulp(使用 gulp 构建文档系统)

 gulp-typedoc(Gulp 插件来执行 TypeDoc 工具)

 browser-sync(文档系统热更新)

 

单测试相关


 jest(一款优雅、简洁的 JavaScript 测试框架)

 @types/jest(Jest 的类型定义)

 ts-jest(一个支持源映射的 Jest 转换器,允许您使用 Jest 来测试用 TypeScript 编写的项目)

 @babel/preset-typescript(TypeScript 的 Babel 预设)

 

其他依赖


 eslint(代码规范约束)

 @babel/core(@rollup/plugin-babel 依赖的 babel 解析插件)

 @babel/plugin-transform-runtime(babel 转译依赖)

 @babel/preset-env(babel 转译依赖)

 chalk(控制台字符样式)

 rimraf(UNIX 命令 rm -rf 用于 node)

 cross-env(跨平台设置 node 环境变量)



底层架构搭建

1. 初始化项目

新建一个文件夹 utils-demo,执行 npm init,过程会询问构建项目的基本信息,按需填写即可:


2. 组织工具库业务开发 SRC 目录结构

创建工具库业务开发 src 文件目录,明确怎样规划工具库包,里面放置的是工具库开发需要的业务代码:



Goland激活2023.1.1(GoLand 2023.1 发布)

 

3. 安装项目依赖

要对 typescript 代码进行解析支持需要安装对 ts 支持的依赖,以及对开发的工具的一些依赖包:


这里遇到一个坑,关于最新 chalk5.0.0 不支持在 nodejs 中 require()导入,所以锁定包版本 chalk@^4.1.2

要对 typescript 进行解析和编译还需要配置 tsconfig.json,该文件中指定了用来编译这个项目的根文件和编译选项,在项目根目录,使用 tsc –init 命令快速生成 tsconfig.json 文件(前提全局安装 typescript)


初始化 tsconfig 完成之后,根目录自动生成 tsconfig.json 文件,需要对其进行简单的配置,以适用于 ts 项目,其中具体含义可以参考tsconfig.json官网

4. 组织项目打包构建 SCRIPTS 目录结构

1) 根目录创建项目打包构建 scripts 脚本文件目录,里面放置的是有关于项目打包构建需要的文件:



Goland激活2023.1.1(GoLand 2023.1 发布)

生成rollup配置项函数核心代码:


2) rollup 在打包构建的过程中需要进行 babel 的转译,需要在根目录添加.babelrc 文件告知 babel:


3) 此时距离打包构建工具库只差一步之遥,配置打包脚本命令,在 package.json 中配置命令:


4) 执行 yarn build,根目录会构建出一个 lib 文件夹,里面有打包构建的文件,还多了一个 stats.html,这个是可视化并分析 Rollup bundle,用来查看工具模块占用空间:

Goland激活2023.1.1(GoLand 2023.1 发布)



 

架构搭建优化

项目搭建到这里,不知机智的你能否发现问题:

1) 只要添加了一个工具,就要在入口文件导出需要打包构建的工具,在多人开发提交代码的时候将引来冲突的产生:

Goland激活2023.1.1(GoLand 2023.1 发布)



2) 使用工具库的时候,按需引用的颗粒度太细了,不能满足一些要求颗粒度粗的朋友,比如:


我想使用该包里面 date 相关工具,要这样吗?

能不能这样?



在一些使用 script 脚本引入的场景下,就仅仅需要 date 相关的工具,要这样吗?

能不能这样?


这样仅仅使用 date 里面的工具,就没有必要将所有的工具都引入了

解决方案:

1) 针对第一个代码冲突的问题,可以根据 src > modules 下目录结构自动生成入口文件 index.ts



Goland激活2023.1.1(GoLand 2023.1 发布)



 

自动构建入口文件核心代码:


2) 针对颗粒度的问题,可以将 modules 下各种类型工具文件夹下面也自动生成入口文件,除了全部导出,再追加 import * as 模块类名称 类型的导出

Goland激活2023.1.1(GoLand 2023.1 发布)

至此,基本上解决了工具库打包的问题,但是架构中还缺少本地开发调试的环境,下面为大家介绍如何架构中添加本地开发调试的系统。

 

本地开发调试系统

首先要明确要加入本地开发调试系统的支持,需要做到以下:


 跨平台(window不支持NODE_ENV=xxx)设置环境变量,根据环境配置不同的 rollup 配置项

 引入本地开发需要的 html 静态服务器环境,并能做到热更新

1) 跨平台设置环境变量很简单,使用 cross-env 指定 node 的环境


2) 配置 package.json 命令


3) 根据最开始架构设计的模块,在项目根目录新建 debugger 文件夹,里面存放的是工具调试的 html 静态页面



Goland激活2023.1.1(GoLand 2023.1 发布)

4) 接下来就是配置 scripts > rollup.config.js ,将 NODE_ENV=development 环境加入 rollup 配置,修改生成rollup配置项函数核心代码:


5) 执行 yarn dev 之后浏览器会新打开窗口,输入刚添加的工具链接,并且它是热更新的:

Goland激活2023.1.1(GoLand 2023.1 发布)



 

工具库文档系统

一个完备的工具库需要有一个文档来展示开发的工具函数,它可能需要具备以下几点支持:


 支持工具库中方法的可视化预览

 支持修改工具的时候,具备热更新机制
 

typedoc(TypeScript 项目的文档生成器)能完美支持 typescript 开发工具库的文档生成器的支持,它的核心原理就是读取源代码,根据工具的注释、ts的类型规范等,自动生成文档页面

关于热更新机制的支持,第一个自然想到 browser-sync(文档系统热更新)

由于文档系统的预览功能有很多插件组合来实现的,可以借助 gulp (基于流的自动化构建工具),typedoc正好有对应的 gulp-typedocGulp 插件来执行 TypeDoc 工具插件

Goland激活2023.1.1(GoLand 2023.1 发布)



构建完成后打开文档系统,并且它是热更新的,修改工具方法后自动更新文档:

Goland激活2023.1.1(GoLand 2023.1 发布)



 

单测试

为确保用户使用的工具代码的安全性、正确性以及可靠性,工具库的单测试必不可少。单测试选用的是 Facebook 出品的 Jest 测试框架,它对于 TypeScript 有很好的支持。

1. 环境搭建

1) 首先全局安装 jest 使用 init 来初始化 jest 配置项


执行完之后根目录会自动生成jest.config.ts 文件,里面设置了单测试的配置规则,package.json 里面也多了一个 script 指令 test。

2) 关于jest.config.js文件配置项具体含义可以查看官网,要想完成 jest 对于 TypeScript 的测试,还需要安装一些依赖:


3) jest 还需要借助 .babelrc 去解析 TypeScript 文件,再进行测试,编辑 .babelrc 文件,添加依赖包 @babel/preset-typescript:


2. 单测试文件的编写

1) 通过以上环节,jest 单测试环境基本搭建完毕,接下来在__tests__下编写测试用例



Goland激活2023.1.1(GoLand 2023.1 发布)

2) 执行 yarn test

可以看到关于 debounce 防抖工具函数的测试情况显示在了控制台:


 stmts 是语句覆盖率(statement coverage):是不是每个语句都执行了?

 Branch 分支覆盖率(branch coverage):是不是每个 if 代码块都执行了?

 Funcs 函数覆盖率(function coverage):是不是每个函数都调用了?

 Lines 行覆盖率(line coverage):是不是每一行都执行了?

Goland激活2023.1.1(GoLand 2023.1 发布)



3) 同时还会发现项目根目录多了一个 coverage 文件夹,里面就是 jest 生成的测试报告:

Goland激活2023.1.1(GoLand 2023.1 发布)



3. 单测试文件的编写引发的思考

每次修改单测试都要执行 yarn test 去查看测试结果,怎么解决?

jest提供了 watch 指令,只需要配置 scripts 脚本就可以做到,单测试的热更新。


以后会写很多工具的测试用例,每次 test 都将所有工具都进行了测试,能否只测试自己写的工具?

jest 也提供了测试单个文件的方法,这样 jest 只会对防抖函数进行测试(前提全局安装了 jest)。


 
 

工具库包的发布

至此工具库距离开发者使用仅一步之遥,就是发布到npm上,发包前需要在 package.json 中声明库的一些入口,关键词等信息。


登陆npm,你会看到自己的 packages 里面有了刚刚发布的工具库包:

Goland激活2023.1.1(GoLand 2023.1 发布)



 

写在最后

以上就是作者整理的从0到1构建基于自身业务的前端工具库的全过程,希望能给阅读本文的开发人员带来一些新的想法与尝试。

在此基础上已经成功在京东npm源发布了应用于京东汽车前端的工具库@jdcar/car-utils,并在各个业务线及系统得到落地。

当然,架构优化之路也还远未结束,比如:打包构建的速度、本地开发按需构建、工具库脚手架化等,后续我们也会基于自身业务以及一些新技术,持续深入优化,在性能上进一步提升,在功能上进一步丰富。本文或存在一些浅显不足之处,也欢迎大家评论指点。

 

参考资料

[1] rollup 英文文档(https://rollupjs.org/guide/en/#quick-start

[2] rollup 中文文档(https://rollupjs.org/guide/zh/#introduction

[3] Rollup.js 实战学习笔记(https://chenshenhai.github.io/rollupjs-note/

[4] Rollup 打包工具的使用(https://juejin.cn/post/

[5] TypeScript、Rollup 搭建工具库(https://juejin.cn/post/0

[6] 使用 rollup.js 封装各项目共用的工具包(https://juejin.cn/post/

[7] 如何开发一个基于 TypeScript 的工具库并自动生成文档(https://juejin.cn/post/

[8] 一款优雅、简洁的 JavaScript 测试框架(https://jestjs.io/zh-Hans/

作者:京东科技 周明亮

AST 基础与功能

在前端里面有一个很重要的概念,也是最原子化的内容,就是 AST ,几乎所有的框架,都是基于 AST 进行改造运行,比如:React / Vue /Taro 等等。 多端的运行使用,都离不开 AST 这个概念。

在大家理解相关原理和背景后,我们可以通过手写简单的编译器,简单实现一个 Javascript 的代码编译器,编译后在浏览器端正常运行。


通过实现一个自定义的编译器,我们发现我们自己也能写出很多新的框架。最终目标都是通过编译转换,翻译为浏览器识别的 Javascript + CSS + HTML。

没错!翻译翻译~

Goland激活2023.1.1(GoLand 2023.1 发布)

 

当然我们也可以以这个为基础,去实现跨端的框架,直接翻译为机器码,跑到各种硬件上。当然一个人肯定比较困难,你会遇到各种各样的问题需要解决,不过没关系,只要你有好的想法,拉上一群人,你就能实现。

大家记得点赞,评论,收藏,一键三连啊~

分析器

说到这个代码语义化操作前,我们先说说分析器,其实就是编译原理。当你写了一段代码,要想让机器知道,你写了啥。

那机器肯定是要开始扫描,扫描每一个关键词,每一个符号,我们将进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer),通过它的扫描可以将字符序列转换为单词(Token)序列的过程。

扫描到了关键词,我们怎么才能把它按照规则,转换为机器认识的特定规则呢?比如你扫描到:


机器怎么知道要创建一个 变量 a 并且等于 1 呢?

所以,这时候就引入一个概念:语法分析器(Syntactic analysis,Parser)。通过语法分析器,不断的调用词法分析器,进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。

在JS的世界里,这个扫描后得到的数据结构 抽象语法树 【AST】。可能很多人听过这个概念,但是具体没有深入了解。机缘巧合,刚好我需要用到这个玩意,今天就简单聊聊。

抽象语法树 AST

AST  Abstract Syntax Tree 的缩写,也就是:抽象语法树。在代码的世界里,它叫这个。在语言的世界里面,他叫语法分析树。

语言世界,举个栗子:


语法分析树:
主语:我,人称代词。
谓语:写,动词。
宾语:文章,名词。

长一点的可能会有:主谓宾定状补。是不是发现好熟悉,想当年大家学语文和英语,那是一定要进行语法分析,方便你理解句子要表达的含义。

PS:对我来说,语法老难了!!!哈哈哈,大家是不是找到感觉了~

接下来我们讲讲代码里面的抽象语法树。


那我们用来进行语法分析,能够得到什么内容了?这时候我们可以借助已有的工具,将他们进行分析,进行一个初级入门。

其实我们也可以完全自己进行分析,不过这样就不容易入门,定义的语法规则很多,如果只是看,很容易就被劝退了。而通过辅助工具,我们可以很快接受相关的概念。

常用的工具有很多,比如:Recast 、Babel、Acorn 等等

也可以使用在线 AST 解析:AST Explorer,左上角菜单可以切换到各种解析工具,并且支持各类编程语言的解析,强大好用,可以用来学习,帮助你理解 AST。

Goland激活2023.1.1(GoLand 2023.1 发布)

 

为了帮助大家理解,我们一点点的进行解析,并且去掉了部分属性,留下主干部分,完整的可以通过在线工具查看。【不同解析器,对于根节点或者部分属性稍有区别,但是本质是一样的。


接下来,我们一个一个节点看,首先是第一个节点 Program


Program 是代码程序的根节点,通过它进行节点一层一层的遍历操作。 上面我们看出它有两个节点,一个是变量声明节点,另外一个是函数声明节点。

如果我们再定义一个变量或者函数,这时候 body 就又会产生一个节点。我们要扫描代码文件时,我们就是基于 body 进行层层的节点扫描,直到把所有的节点扫描完成。


上面对应的代码,就是 const me = “我” ,这个节点告诉我们。 声明一个变量,使用类型是:VariableDeclaration, 他的唯一标识名是:me,初始化值:“我”

后续的函数分析,也是一样的。


这个节点,清楚的告诉我们,这个函数名是什么,他里面有哪些内容,入参是什么,调用了什么函数对象。

我们发现,通过语法分析器的解析,我们可以把代码,变成一个对象。这个对象将代码分割为原子化的内容,很容易能够帮助机器或者我们去理解它的组成。

这个就是分析器的作用,我们不再是一大段一大段的看代码逻辑,而是一小段一小段的看节点。

有了这个我们可以干什么呢?

AST 在 JS 中的用途

1. 自定义语法分析器,写一个新的框架。

通过对现有的 AST 理解,我们可以依葫芦画瓢,写出自定义的语法分析器,转成自定义的抽象语法树,再进行解析转为浏览器可识别的 Javascript 语言,或者其他硬件上能识别的语言。

比如:React / Vue 等等框架。其实这些框架,就是自定义了一套语法分析器,用他们特定的语言,进行转换,翻译翻译,生成相关的DOM节点,操作函数等等 JS 函数。

2. 利用已有语法分析器,实现多端运行。

通过已有的 AST,我们将代码进行翻译翻译,实现跨平台多端运行。我们将得到代码进行语法解析,通过遍历所有的节点,我们将他们进行改造,使得它能够运行在其他的平台上。

比如:Taro / uni-app 等等框架。我们只要写一次代码,框架通过分析转换,就可以运行到 H5 / 小程序等等相关的客户端。

3. 进行代码改造,预编译增强处理。

依旧是通过已有的 AST,我们将代码进行分析。再进行代码混淆,代码模块化处理,自动进行模块引入,低版本兼容处理。

比如:Webpack / Vite 等等打包工具。我们写完代码,通过他们的处理,进行增强编译,增强代码的健壮性。

AST 的应用实践

我们在进行框架的改造或者适配时,我们可能才会用到这个。常规的方法,可能有两种:

  • 按照特定的写法,通过正则表达式,直接进行大段代码替换。
  • / mingliang start */ const a = 1 / mingliang end */

如,我们找到这段代码注释,直接通过 code.replace(/mingliang/g, ‘xxxx’) 类似这种方式替换。

  • 通过引入运行,改造相关的变量,再重新写入。

我们可能先 let config = require(a.js) 运行这个文件,我们就得到了这个 config 这个变量值。

之后我们改写变量 config.a = 2,

最后,重新通过 fs.writeSync(‘a.js’, ‘return ‘ + JSON.stringify(config, null, 2)) 写入。

现在,我们就可以掌握新的方法,进行代码改造。

作者:京东科技 胡骏

引言

岁月如梭,十载流年

前端技术,蓬勃向前

HTML,CSS,JavaScript

演绎出璀璨夺目的技术画卷


回到十年前,前端技术就像一名戴着厚重眼镜的书呆子,总是小心翼翼,被各种各样的浏览器兼容性问题欺负(就像在小学被欺负一样)。

Goland激活2023.1.1(GoLand 2023.1 发布)

但随着时间的推移,这个书呆子开始锻炼,变得越来越强壮,终于能够对抗那些讨厌的兼容性问题

Goland激活2023.1.1(GoLand 2023.1 发布)

进入中学时期,前端技术遇到了那个改变它一生的朋友——jQuery。在jQuery的帮助下,前端技术变得更加自信,能够在各种浏览器之间轻松穿梭(就像找到了武林秘籍,功力大增)。

Goland激活2023.1.1(GoLand 2023.1 发布)

随后,前端技术开始追求更高的境界。它遇到了三位美丽的姑娘:Angular、React和Vue。这三位姑娘带给了前端技术无尽的魅力,让它迅速崛起,成为了技术江湖中的一股新兴力量。

Goland激活2023.1.1(GoLand 2023.1 发布)

如今,前端技术已经变得越来越强大,像一个熟练掌握各种武功的高手。它的发展速度之快,令人瞠目结舌,仿佛在短短十年内成为了武林盟主。它带领着一群忠诚的拜金党(程序员),在技术江湖中闯荡,创造了一个又一个的传奇。

Goland激活2023.1.1(GoLand 2023.1 发布)

而现在,前端技术正在为未来的挑战做准备,它还能带给我们多少惊喜,以及如何抵抗那些不断涌现的挑战者?让我们一起拭目以待,看这场武林大戏如何演绎。

一、历程

前端技术开发在过去的十年里经历了从HTML、CSS到JavaScript的演变。在这个历程中,前端工程师的角色也发生了变化,他们不再只是单纯的代码开发者,还需要与设计师、产品经理、运营人员等其他团队成员协作,共同完成网站的开发。

Goland激活2023.1.1(GoLand 2023.1 发布)

• _2010年以前,_前端工程师主要负责网站的静态页面开发,如网页设计、图片处理等。在这个阶段,前端工程师的技能主要包括HTML、CSS和JavaScript等基本技术。

• _2010年,_JavaScript成为了前端开发的主要语言。随着JavaScript的普及和发展,越来越多的前端工程师开始关注JavaScript的应用和开发。

• _2011年,_jQuery成为了前端开发的主流库,并且HTML5和CSS3开始受到重视。这也是前端开发变得更加动态和交互性的开始。

• _2012年,_响应式设计和移动设备优先的设计理念开始流行,前端开发在移动端上崭露头角。

• _2013年,_Angular引入了模块化和数据绑定的概念,Bootstrap实现了响应式框架,前端开发变得更加简单和高效。

• _2014年,_React发布,革新出组件化的思想,前端开发变得更加灵活和可维护。

• _2015年,_ES6发布,带来了诸如箭头函数、模板字符串和解构赋值等语言的改进,使JavaScript变得更加易用和现代化。同年,Vue的发布迅速获得了广泛应用。

• _2016年,_前端工具链的发展得到了加速,例如Webpack和Babel等工具的普及使得前端工程化得到了广泛推广。

• _2017年,_JavaScript库和框架更加多样,Angular、React和Vue等都在不断地演进和优化。PWA技术的普及使得网页更接近原生应用的用户体验。

• _2018年,_JavaScript框架的选择更加复杂,同时CSS预处理器(例如Sass和Less)和CSS-in-JS的技术也逐渐成熟。

• _2019年,_前端技术继续保持快速发展的趋势,更加注重用户体验和开发效率。例如,React Hooks和Vue 3等技术的推出使得前端代码更简洁并可维护。

• _2020年,_因新冠疫情影响,居家办公及远程工作成为新趋势。虚拟会议和在线教育等普及推动了前端技术的发展,也更加重视了访问性和用户体验。

• _2021年,_新技术和工具不断推陈出新。Web Assembly使得前端代码获得更高的效率,而预渲染和静态站点生成等技术让前端应用可以获得更快的加载速度。

• _2022年,_VR(虚拟现实)和AR(增强现实)技术的不断发展,前端开发者需要开发出更加适合VR/AR场景的应用程序。

• _2023年至今,_AI(人工智能)技术的突破性进展,前端技术将在AI 技术的加持下得到更广泛的应用,从而带来更智能和更高效的前端开发体验。

二、HTML5和CSS3的普及

HTML5和CSS3,这两个神秘代码世界的统治者,它们的名字听起来像是一对科学家的昵称,但它们的影响力却是无与伦比的:让我们的网页从普通变得绚丽多彩。

Goland激活2023.1.1(GoLand 2023.1 发布)

作为一名网页开发者,我们经常需要面对一些令人头疼的问题:浏览器兼容性、页面加载速度缓慢等。但是,当HTML5和CSS3出现在我们的视野中时,一切都变得不一样了。

HTML5是一种用于网页开发的语言,它具有更强的多媒体功能,比如说可以轻松地嵌入音频和视频。它还具有更强的语义,使我们可以更容易地描述页面内容。

而CSS3则是一种用于美化网页的语言,它提供了更多的样式选项,比如说可以实现圆角、阴影等效果。它还支持响应式设计,可以让我们的网页在不同的设备上都能得到最佳的展示效果。

用HTML5和CSS3开发的网页不仅美观,而且更快。我们不再需要使用大量的JavaScript代码来实现一些简单的功能,因为HTML5和CSS3已经帮我们完成了这些工作。

不仅如此,HTML5和CSS3还使得网页开发变得更有趣。我们可以创造出各种各样的动画效果,比如说滚动、旋转等,而不需要依赖任何第三方工具。这不仅让我们的网页更具吸引力,也使我们的用户更容易理解和使用。

Goland激活2023.1.1(GoLand 2023.1 发布)

HTML5就像一个网页的“建造师”,它负责把网页的框架建造出来,而CSS3则是一个“装饰师”,它负责把网页的外观和感觉打造出来。这对搭档携手合作,把一栋美丽的大厦(网站)拔地而起。

三、JavaScript框架的崛起

JavaScript框架,从这个词语中我们就能感受到它的强大和威力,如同统治世界的巨龙,横行天下,让所有的开发者都震撼不已。

Goland激活2023.1.1(GoLand 2023.1 发布)

在过去的十年里,我们见证了许多JavaScript框架的诞生和发展。最早的Angular和Backbone逐渐被React和Vue等框架所取代。这些框架不仅简化了开发者的工作流程,还引入了组件化的开发思想,提升了Web应用的可维护性和可扩展性。

另外,JavaScript框架也推动了Web前端技术的进步,引入了许多新的概念和理念,如组件化、数据驱动等等,使得Web前端开发变得更加简单而清晰。

3.1 React:让你的用户界面如此简单

React,这是一个神奇的JavaScript框架,它可以让你的用户界面变得如此简单,以至于你会想:“这就是魔法吗?”

React的核心思想是组件化,它把用户界面拆分成许多小的组件,每个组件都可以独立运行,并且可以方便地复用。这样,你就可以更加简单高效地开发出高质量的用户界面。

Goland激活2023.1.1(GoLand 2023.1 发布)

React的另一个优秀特性是Virtual DOM,它可以帮助你更快速地渲染用户界面,并且不会影响用户体验。这就像是一个超级快速的缓存,让你的用户界面飞快地呈现在用户面前。

React还提供了一些非常实用的功能,比如说React Router,它可以帮助你管理路由,让用户界面更加流畅;而React Redux可以帮助你管理应用状态,让你的代码更加整洁。

此外,React是一个非常活跃的开源项目,它的开发者们一直在不断改进和完善,值得每一个前端开发者去学习和使用。

3.2 Vue:充满了年轻的活力和智慧

Vue是另一个JavaScript框架,可以让你快速构建网页,就像是一个魔术师,把一堆杂乱无章的东西变成了一个美丽的魔术。

Vue的核心思想是数据驱动+组件化。这听起来很高大上,但其实就像是你在做一道数学题,先把问题分解成若干小问题,再一步步解决。

Vue有一个很酷的特性:双向绑定。这听起来很神秘,但实际上就像是你和你的好朋友之间的对话,你说了什么,他就知道了。

Goland激活2023.1.1(GoLand 2023.1 发布)

学习和使用Vue的过程中,你会发现开发变得更加简单和有趣,就像是在做一道神奇的拼图,一步步把图片拼出来,比如说它有很多组件,就像是一个工具箱,你可以随时随地使用。组件的好处在于,它可以把复杂的功能分解成若干个简单的部分,这样就可以很容易地管理和维护你的代码。

同时,Vue有很多很多的插件,可以让你的开发体验更加顺畅。插件的好处在于,它可以帮助你实现一些复杂的功能,这样就不必自己写一坨代码。

Vue还有一个很棒的社区,可以帮助你解决一些棘手的问题,也方便了你与其他开发者交流经验,编码世界有了朋友,永远不会孤单。

3.3 谨慎:利剑具有两面性

JavaScript框架是一个非常重要的工具,就像一把利剑帮助开发者切开困难,让开发者更加简便高效地开发前端应用,也推动了前端技术的进步,并抵达成功的彼岸。

Goland激活2023.1.1(GoLand 2023.1 发布)

但是,请记住,刀刃朝向你,也有可能伤到自己,因此请开发者在使用JavaScript框架时要谨慎小心。

四、Node.js和前后端分离

首先,让我们回顾一下过去,那时候前后端是紧密结合在一起的,像一对结婚多年的夫妇。它们有着许多共同的爱好,但是有时它们也会产生冲突,就像夫妇间的争吵一样,前后端争吵也是不可避免。

Goland激活2023.1.1(GoLand 2023.1 发布)

但是,随着技术的发展,我们发现了一个新的解决方案:前后端分离。就像夫妇分居一样,前后端也可以分开,以避免冲突,Node.js就是这个分离的功臣。

Node.js可以帮助前端和后端分开,各自独立工作。前端可以专注于用户界面的开发,后端可以专注于数据的处理,就像夫妇分别在各自的工作岗位上工作一样,前后端也可以分别在各自的领域里工作。

Node.js的出现让JavaScript可以在服务器端运行,为前后端分离的架构模式提供了可能。前后端分离使开发者可以更加专注于前端应用的开发,提高开发效率。同时,Node.js的诞生也带来了诸如npm、yarn等包管理器的出现,开发者可以轻松地引入和管理第三方库。

4.1 npm:被忽视的少年

首先,让我们了解一下npm的历史。它曾经是一个年轻的少年,总是被忽视。但是随着它长大,它变得越来越强大,并且成为了Node.js开发的重要组成部分。

以前,如果我们想要安装一个库,需要手动下载,并且手动安装它。这是一件非常繁琐的事情,而且很容易出错。但是,随着npm的出现,一切都变得更简单了。只需要运行一条命令(如:),就可以轻松地安装任何库。

npm还提供了一个巨大的软件仓库,其中包含了数以千计的库和工具。它就像一个图书馆,你可以随心所欲地查阅和使用。

Goland激活2023.1.1(GoLand 2023.1 发布)

但是,npm不仅仅是一个简单的安装工具。它还像一个管家,辅助我们管理依赖关系,并帮助我们发布代码和维护代码库。它还有许多其他功能,例如构建工具,测试工具等。因此,如果你想充分利用npm,请不要仅仅停留在它的基础功能上。

4.2 yarn:少年的替身

首先,让我们了解一下yarn的由来。它的诞生是为了解决npm的一些问题,就像是一个少年的替身,它试图取代npm并成为新的领导者。

yarn可以帮助我们快速安装依赖包,并管理依赖关系,像一个组织者可以帮助我们维护代码库,以此节省时间并提高开发效率。

yarn还提供了一个更好的版本控制系统,可以帮助我们管理依赖项的版本。如果你在多个项目中使用相同的依赖项,可以确保所有项目使用相同的版本,从而避免了版本冲突,譬如一个和平协调员。

Goland激活2023.1.1(GoLand 2023.1 发布)

除了管理依赖关系和解决依赖冲突外,yarn还可以帮助我们更快地进行安装,因为它可以在本地缓存安装过的依赖项。这意味着,如果你在多个项目中使用相同的依赖项,它们将不会再次下载,从而减少了安装时间。

此外,yarn支持并行安装,这意味着它可以同时安装多个依赖项,从而加快安装速度。这是一个非常有用的功能,特别是当你需要安装大量依赖项时。

yarn也有一个很棒的社区,可以帮助你解决任何问题。如果你在使用yarn时遇到问题,可以在社区中寻求帮助。这是一个非常有价值的资源,可以帮助你更快地解决问题。

五、构建工具和自动化

构建工具和自动化是现代软件开发的重要组成部分,就像给你的代码加上糖衣一样,帮助我们提高开发效率,并且可以让我们更专注于代码本身。

Grunt、Gulp、Webpack等工具的出现,使得开发者可以方便地实现代码压缩、合并、优化以及模块化等功能。而随着CI/CD的普及,自动化测试和部署变得更加便捷,大大提高了软件开发的质量和开发速度。

5.1 Grunt:猪叫的声音?

Grunt,这不是一个军人,也不是一个猪叫的声音。实际上,它是个非常酷的JavaScript任务运行器,可以帮助你自动化各种任务,如代码构建,单测试和文件合并。它的目的是让你的工作变得更轻松、更有效率,而且不需要你不停地敲代码。

Goland激活2023.1.1(GoLand 2023.1 发布)

想象一下,每次你修改了一个文件,你就需要手动编译、压缩、合并、测试等等。这听起来很枯燥,对吧?但是,如果有一个工具能帮你自动完成这些任务,那该有多好!这就是Grunt的作用。

Grunt的核心思想是使用插件(plugins)来完成各种任务。有数以百计的插件可以帮助你实现从编译Sass到压缩JavaScript的各种任务。插件是通过npm安装的。Grunt有许多内置任务,例如:文件压缩,CSS预处理,JavaScript检查等。此外,还有大量第三方插件,也可以助你完成更多任务。

Grunt的配置文件是,用于定义任务和任务的配置。Grunt使用JavaScript代码配置任务,因此对JavaScript基础知识的了解是使用Grunt的必备条件。

Grunt的任务可以在命令行中通过运行以下命令执行:。如果你想要实时监控文件的变化,并在文件变化时自动执行任务,你可以使用命令。

如果你是一个JavaScript开发者,那么Grunt是一个不可或缺的工具。它可以让你的工作变得更快捷、更高效,让你有更多的时间去做其他有趣的事情,比如喝咖啡、写文章或者是找对象。

5.2 Gulp:古老的咒语?

让我们来说说Gulp的名字。它的名字听起来有点像一个古老的魔法咒语,你想:“Gulp!” 然后你的代码就会变得更快、更简洁、更酷。不过,实际上Gulp并不是魔法,而是非常实用的构建工具。

Goland激活2023.1.1(GoLand 2023.1 发布)

Gulp的工作原理很简单:它通过创建一系列的任务,来自动完成你的工作流程。比如说,你可以创建一个任务,来自动编译你的Sass文件,或者压缩你的JavaScript文件。这样,你就不需要手动执行这些步骤了,Gulp会帮你完成。

Gulp还有一个非常酷的功能:它可以实时监控你的文件,并在你修改了文件后立即执行相应的任务。这样,你就可以实时看到更改的内容,而不需要手动重新执行。

Gulp如何使用呢?首先,你需要安装Node.js和npm,因为Gulp是基于Node.js的。其次,安装Gulp的命令行工具,只需在终端中运行以下命令即可:。接下来,你需要在项目目录中创建一个文件,这是npm的配置文件,用于管理项目依赖。你可以通过运行以下命令来创建一个文件:。然后,你需要安装Gulp,只需在项目目录中运行以下命令即可:。最后,创建一个文件,这是Gulp的配置文件,用于编写你的任务。

现在,你已经准备好使用Gulp了。开始编写你的任务,并运行以下命令来执行吧:。

5.3 Webpack:订制的包包?

Webpack可以帮你把代码压缩成小而美的包,就像私人订制的收纳柜,它可以装下你所有的包包,并且把它们整齐地放在一起,使你的“奢侈”更加有序!

但是,如果你犯了错误,它就像一个恶魔般出现在你面前,吼叫着告诉你:“Error: This is error!”所以,请小心使用Webpack。

不过,只要你已经掌握了Webpack的使用方法,那么它将成为你的最佳伙伴,因为它可以为你节省大量的时间,并且让你的代码变得更加整洁。

Goland激活2023.1.1(GoLand 2023.1 发布)

你可以告诉Webpack:“嘿,Webpack!帮我处理图片和字体!” 然后Webpack就会用它的魔力,将它们变成小小的Data URL或文件。你不会相信,Webpack的魔力是如此的强大,它甚至可以帮你处理模块依赖。

那么,如何使用Webpack呢?首先,你需要安装它(就像是奢侈品店要先开门才能买包)。安装很简单,只需要在终端中输入:;然后,创建一个配置文件(就像是奢侈品店的导览图,告诉你每样包包在哪里)。配置文件一般命名为,内容如下:。接下来,只需要在终端中输入打包命令:;最后,引用打包后的文件就可以了(背起新包包,开启一场冒险之旅)。

六、PWA和Web性能优化

在这个快节奏的数字化时代,越来越多的用户转向使用移动设备和Web应用程序。

PWA成为了一个重要的技术趋势,它的全称是“Progressive Web App”,翻译成中文就是“渐进式Web应用程序”。简单来说,PWA是一个既可以在浏览器上运行的Web应用程序,同时也可以像原生应用一样在离线时使用。它的最大优点就是可靠性,因为PWA可以像原生应用一样缓存数据和资源,这意味着它可以在离线时运行,而不会像普通的Web应用程序一样无法使用。

此外,Web性能优化也成为了开发者关注的重点。我们需要知道一个简单的事实,那就是用户喜欢快速的网站。如果你的网站速度太慢,那就会让你的用户感觉像一头正在沙漠里跑步的骆驼一样疲惫不堪,感到痛苦和沮丧,这会让他们不得不离开,去寻找新的绿洲。

Goland激活2023.1.1(GoLand 2023.1 发布)

所以,为了确保你的网站速度足够快,你需要采取一些优化措施。以下是一些可以提高Web应用性能的技巧:

  1. 使用CDN(内容分发网络):CDN是一组分布在世界各地的服务器,它们可以缓存你的网站内容,并将其分发到全球各地的用户。这可以大大加快你的网站加载速度,因为用户可以从离他们最近的服务器获取内容。

  2. 压缩文件大小:压缩你的HTML、CSS和JavaScript文件可以减少它们的大小,从而加快它们的加载速度。你可以使用像Gzip这样的压缩算法来实现这一点。

  3. 使用缓存:缓存是一种将网站数据存储的技术。例如浏览器缓存:在响应头中设置缓存策略来控制缓存时间;以及服务器端缓存:使用Memcached或Redis等缓存服务器,以减少响应时间。这样一来,当用户再次访问你的网站时,它们可以从缓存中加载数据,而不必重新下载,大大加快你的网站加载速度。

  4. 减少HTTP请求:有一个叫做“夹心饼干法则”的说法。这个法则认为,在一次HTTP请求中,中间的响应部分应该像夹心饼干一样短,而请求和响应头和尾应该像饼干的两端一样长。这听起来很有趣,但其实它也是有道理的,因为请求和响应头和尾中包含的信息比较少,而响应中间部分则包含了网页的实际内容,因此应该尽可能地减少其大小。你可以通过将HTML和CSS以及JavaScript文件合并成一个文件,或者通过使用CSS Sprites将多个图像合并成一个文件来减少HTTP请求的数量。

  5. 使用响应式图片:图片是网站加载速度最慢的资源之一。为了提高网站加载速度,你可以使用响应式图片,这些图片可以根据用户的设备屏幕大小来动态地调整大小。这样一来,用户只会下载他们所需的图像大小,而不是下载整个大图像。

  6. 使用懒加载技术:懒加载是一种延迟加载技术,它可以延迟加载页面上的图像、视频和其他资源,直到它们真正需要时才出现。这可以减少页面的初始加载时间,因为只有当用户滚动到需要加载的部分时,它们才会被加载。

Goland激活2023.1.1(GoLand 2023.1 发布)

你知道吗,Google Chrome浏览器可以使用一个名为“Lighthouse”的工具来检查网站的PWA和性能方面的指标。但你可能不知道的是,这个工具还有一个有趣的功能,就是可以为你的网站生成一份“独家报告”,这样你就可以像读报纸一样轻松地查看网站的PWA和性能状况了。但是,要牢记的是,优化Web应用性能是一个不断发展的过程,需要持续监测和调整以确保最佳体验。

七、Web组件和跨平台框架

Web组件和跨平台框架是现代Web开发中的两个热门话题,它们就像是现代Web开发的两座巨大城堡,吸引着无数开发者前来探索和征服。

首先,我们来谈谈Web组件。Web组件是一种现代的Web开发技术,它允许开发者将Web应用程序分解成可重用的组件,这些组件可以在不同的Web应用程序中共享和重用。比如,你可以将一个搜索框组件用于多个Web页面,而不必每次都重新编写。

Web组件的好处不仅在于可重用性,还在于它们的灵活性。你可以根据需要自定义Web组件,为你的Web应用程序添加新的功能和样式。

Goland激活2023.1.1(GoLand 2023.1 发布)

但是,Web组件并不是“银弹”,它们在某些方面仍然有限制。比如,Web组件难以处理动态数据,因为它们是静态的。此外,Web组件也不是完美的跨平台解决方案,因为它们可能无法兼容不同的Web浏览器和设备。

这就引出了我们的下一个话题:跨平台框架。跨平台框架是一种可以在多个平台上运行的软件框架,包括Web、移动和桌面应用程序。它们允许开发者编写一次代码,然后在不同的平台上运行,无需进行任何额外的修改。

跨平台框架的好处显而易见:它们可以大大减少开发时间和开发成本。但是,跨平台框架并非完美无缺。它们可能会受到不同平台的限制,从而无法充分利用每个平台的功能和性能。此外,跨平台框架还可能会导致性能问题和代码质量问题。

现在,我们来看看如何将这两种技术结合起来。使用Web组件和跨平台框架可以让你搭建你的虚拟王国,充分利用Web组件的可重用性和灵活性,同时充分利用跨平台框架的跨平台能力和效率。

Goland激活2023.1.1(GoLand 2023.1 发布)

当然,这并不是说将Web组件和跨平台框架混合在一起就是万无一失的。你需要仔细考虑你的应用场景,确保使用这两种技术的方式是最优的。

比如,你可以使用Web组件来构建你的用户界面,然后使用跨平台框架来将Web应用程序转换为移动应用程序。这样,你就可以在多个平台上运行相同的代码,而且用户体验也会更加一致。

或者,你可以使用跨平台框架来编写你的应用程序逻辑,然后使用Web组件来定制你的用户界面。这样,你可以在不同的Web应用程序中重用你的用户界面,而且你的应用程序逻辑也可以在多个平台上运行。

再者,你也可以将这两种技术都使用在同一个应用程序中。这样,你可以充分利用Web组件的可重用性和灵活性,同时充分利用跨平台框架的跨平台能力和效率。只要你能合理地使用这些技术,就可以打造出更好的Web应用程序。

Web组件和跨平台框架都是非常有前途的技术,它们可以为现代Web开发带来很多好处,为我们带来更加灵活、高效和强大的Web开发工具和平台。无论是Web组件还是跨平台框架,它们都是我们构建虚拟王国的重要基石。

八、前端安全问题

在当今数字化时代,前端安全已成为互联网世界中的重要一环。不管是个人用户,还是企业机构,前端安全都需要被高度重视。尽管我们已经发展出了各种各样的安全技术和防御手段,但是前端安全问题仍然是一个不断增长的挑战。

8.1 XSS攻击:你的网站很容易被攻击

你听说过XSS攻击吗?这种攻击方式是通过篡改网页的HTML并在用户浏览器中注入恶意代码的一种攻击方式。这些恶意代码通常是JavaScript脚本,它们可以被用来窃取用户的敏感信息,如用户名、密码、银行账户信息等等。

如果你的网站存在XSS漏洞,那么恶意攻击者就可以在你的网站上注入一些不良代码,这些代码可能会窃取用户的登录凭证或者其他敏感信息。所以,尽管你的网站已经被SSL加密保护,你的用户仍然面临着被XSS攻击的风险。

Goland激活2023.1.1(GoLand 2023.1 发布)

如何防御XSS攻击呢?其实非常简单,你只需要在所有的输入框中过滤掉所有的HTML标签和JavaScript脚本即可。但是,如果你认为这么做会影响用户体验,那么你可以考虑使用HTML的特殊字符转义功能来替换这些标签和脚本。

8.2 CSRF攻击:请勿相信恶意链接

现在让我们来谈谈CSRF攻击。这种攻击方式是通过篡改用户的HTTP请求来伪造用户的身份,从而进行一些非法的操作。这种攻击方式通常是通过欺骗用户一个恶意链接来实现的。一旦用户了这个链接,攻击者就可以获得用户的凭证,然后模拟用户的请求,从而执行一些非法的操作。

假设,你的网站有一个删除账户的功能,攻击者就可以利用CSRF攻击来让用户误删除自己的账户。这听起来非常可怕,但是不要担心,我们可以通过一些简单的方法来防御这种攻击。

首先,我们可以在所有的表单提交中添加一个随机的Token值。这个Token值可以通过后台生成,然后在前端将其嵌入到表单中。当用户提交表单时,我们可以检查这个Token值是否匹配,如果不匹配,则拒绝这个请求。这样就可以简单的避免CSRF攻击了。

8.3 CSP策略:请勿允许不信任的资源

CSP策略是一种非常有用的前端安全措施。CSP策略可以帮助我们限制网页中可加载的资源,从而减少被攻击的风险。例如,我们可以限制只允许加载来自指定域名的JavaScript文件,这样就可以避免恶意代码的注入。

但是,如果你不小心将不信任的资源允许加载到你的网页中,那么你的网站就可能面临被攻击的风险。假设你的网站允许用户上传文件,并在网页中显示这些文件,如果你没有限制文件的类型和内容,那么攻击者就可能上传恶意文件,并在用户浏览器中注入恶意代码。

Goland激活2023.1.1(GoLand 2023.1 发布)

所以,如果你想保证你的网站的安全性,那么你应该始终谨慎地过滤用户上传的文件,只允许加载来自可信任来源的资源。

我们可以认识到,前端安全是一项非常重要的技术挑战。如果你是一位前端开发人员,那么应该始终将前端安全作为开发过程中的一个重要考虑因素。只有这样,我们才能够为用户提供安全可靠的Web服务。

九、前端工程师的多化技能

作为一名前端工程师,一定是个充满多化技能的大神。不仅仅要会写代码,还要会与设计师沟通,管理版本控制,解决兼容性,甚至还要有点艺术细胞。

Goland激活2023.1.1(GoLand 2023.1 发布)

  1. 代码技能:前端工程师最基本的技能,也是最重要的技能。不仅需要掌握 HTML、CSS、JavaScript,还需要掌握一些前端框架和库,比如 React、Vue、Angular 等。当然,这些都不是问题,对于一名优秀的前端工程师来说,这只是小菜一碟。

  2. 与设计师沟通:设计师们总是有各种奇怪的想法,然后她们会告诉你:“我要实现这个效果,你帮我写一下”。但是,很快会发现这个效果并不现实,于是你需要与设计师进行沟通,告诉她们这个效果无法实现。当然,你不能用技术术语来向她们解释,否则她们会摆出一副“我听不懂”的表情。所以,你需要用她们喜欢听的语言,比如“我理解你的设计需求,并深刻认识到其对于网站效果的重要性。不过,由于技术和浏览器的限制,我们需要寻找其他的可行方案来实现类似的效果,以保证网站的性能和可访问性,我会尽最大的努力提供最佳的解决方案。”

  3. 管理版本控制:代码管理是一个很重要的问题,特别是当你和其他人合作的时候。你需要使用Git进行版本控制,这样才能确保代码的稳定性和可靠性。当然,你也需要了解一些Git的命令,比如 commit、push、pull 等等。不过,如果你不小心把代码弄挂了,那也不用担心,只要跟团队的其他成员说“我不小心把代码弄挂了”,他们就会告诉你怎么做了。

  4. 解决兼容性:不同的浏览器之间有很多不兼容,而前端工程师需要解决这些问题。比如,IE浏览器总是出现各种奇怪的bug,但是你不能告诉用户:“你用的是IE,这不是我的问题”。相反,你需要找到问题的根源,然后解决它。这是一个非常重要的技能,因为它涉及到用户体验和网站的稳定性。

  5. 有点艺术细胞:前端工程师不仅仅是一个代码的机器,还需要有一点艺术细胞。毕竟,好的界面设计是网站的关键之一。所以需要了解一些基本的设计原则,比如颜色搭配、排版等等。当然并不需要成为一个设计师,但是需要知道如何运用这些原则来改进网站的设计。

  6. 学习新技能:前端工程师是一个不断学习的过程。每天都有新的技术和框架出现,并且要不断学习并掌握这些技能。但是,并不需要成为一个全栈工程师,只要掌握所需要的技能,然后专注于自己的领域即可。当然,这也意味着要学会如何筛选有用的信息,因为不可能学习完所有的技术和框架。

  7. 解决问题:前端工程师是一个解决问题的岗位。当网站出现问题时,需要迅速找到问题的根源,并解决它。但是,也不一定要独自解决所有的问题,可以向同事寻求帮助,或者参加一些开发者社区来寻找解决方案。最终要记住的是,解决问题是前端工程师最重要的技能之一。

  8. 与团队合作:前端工程师需要和设计师、后端工程师、测试人员等等进行合作,以确保网站的成功。在与团队合作中,要学会如何与不同的人合作,并且尽力避免出现冲突。

Goland激活2023.1.1(GoLand 2023.1 发布)

前端工程师需要掌握很多不同的技能,但这并不意味着要成为一个万能的人。相反,只需要专注于自己的领域在不断地技术学习过程中成长。

十、AI与前端技术结合

回顾过去,畅想未来,立足当下,来讲个故事吧。

在一个遥远的星球上,有一个叫做前端技术的孤独王国。这个王国的居民们都是非常优秀的程序员,他们用HTML、CSS和JavaScript这三种神奇的武器来构建网站,为用户带来无尽的愉悦。然而,这个王国有一个问题,那就是他们一直无法征服一个名为AI的神秘国度。

终于有一天,一个勇敢的前端战士——HTML骑士,决定向AI国度发起挑战。他带着两个小伙伴:CSS猎人和JavaScript法师,踏上了一段充满挑战的探险之旅。

Goland激活2023.1.1(GoLand 2023.1 发布)

他们沿着神秘的网络海洋航行,一路上遇到了各种令人捧腹大笑的趣事。先是在一个叫做布局的洲际,他们被一群叫做“浮动”的怪兽困扰,CSS猎人拔出了他的弹性盒子弓箭,一箭穿心,解决了怪兽。接下来,他们来到了一个充满奇特生物的动画之地,JavaScript法师用他的神奇魔法,让这些生物如同表演马戏团一般,给他们带来了一场场精彩绝伦的表演。

然后,他们终于来到了AI国度的边境。在那里,他们遇到了一个脾气古怪的巨人,他叫做机器学习。这个巨人用一种叫做数学的强大力量来支配着这片土地。HTML骑士认为,要征服这个国度,就必须挑战巨人,并将他的力量与前端技术融合。

Goland激活2023.1.1(GoLand 2023.1 发布)

于是,在他们与巨人大战三百回合后,JavaScript法师从中意外领悟了神奇魔法,召唤出一个叫做TensorFlow.js的强大法宝。这个法宝让前端技术也能够掌握机器学习的力量。HTML骑士和CSS猎人纷纷表示赞叹,他们觉得自己终于找到了一种将AI与前端技术结合的方法。

在这之后,他们三人一起用TensorFlow.js建立了一个名为“智能前端”的新城堡。这座城堡里,前端技术与AI融合得天衣无缝,为用户带来前所未有的体验。

城堡的大门上,HTML骑士精心设计了一个智能问答系统。这个系统可以回答用户关于前端技术的各种问题,让新手程序员们感叹不已。而这一切,都得益于TensorFlow.js和机器学习的神奇力量。

城堡的内部,CSS猎人则利用AI技术打造了一套全新的自适应布局。这套布局能够根据用户的喜好和设备自动调整,让每个访问者都能享受到最佳的浏览体验。他还研发了一种名为“智能配色”的神奇法术,能够根据用户的喜好自动调整网页的颜色搭配,让网站变得更加美观大方。

Goland激活2023.1.1(GoLand 2023.1 发布)

而在城堡的核心区域,JavaScript法师则运用AI技术开发了一系列令人惊叹的交互功能。比如,他创造了一种可以根据用户行为自动优化的推荐算法,将用户感兴趣的内容精准推送。此外,他还设计了一款智能聊天机器人,可以与用户进行即时互动,解答他们的疑问。

在“智能前端”城堡的建设过程中,他们三人不仅发挥出了各自的特长,还不断地学习AI技术,将其与前端技术相互融合。这让他们的作品充满了趣味与智慧,吸引了无数程序员和用户前来参观。

在这段充满挑战的探险之旅中,HTML骑士、CSS猎人和JavaScript法师用他们的智慧和勇气,成功地将AI技术引入前端领域。他们的故事传遍了整个网络世界,成为了程序员们争相传颂的佳话。

Goland激活2023.1.1(GoLand 2023.1 发布)

如今,前端技术和AI的结合已经成为了一种趋势,越来越多的开发者开始探索这个领域的无限可能。而在这个探索过程中,他们总是能从HTML骑士、CSS猎人和JavaScript法师的故事中汲取勇气与智慧,勇往直前,为未来的网络世界描绘出一个更加美好、充满创意和智慧的蓝图。

有人说,前端技术与AI的结合就像一场狂欢。程序员们欢笑着跳动,发挥着自己的想象力,创造出一个又一个令人叹为观止的作品。在这场狂欢中,每个人都是舞者,每个人都是艺术家,每个人都在为这个美丽的网络世界贡献着自己的力量。

如同那个遥远的星球上,那个欢呼雀跃的前端王国,如今我们所生活的这个网络世界也充满了欢声笑语。而在这片欢乐的土地上,那些勇敢的前端战士们正携手AI,共同书写着属于他们的传奇!

Goland激活2023.1.1(GoLand 2023.1 发布)

随着技术的不断发展,我们相信前端技术与AI的结合将会走得更远,创造出更多不可思议的奇迹。也许有一天,我们的网络世界将变得如同童话般美好,充满智慧的光辉。而在那个时候,我们将不禁想起那个勇敢的HTML骑士、CSS猎人和JavaScript法师,怀念他们当年那段充满挑战的探险之旅,为他们的勇气与智慧而感慨不已。

在探险的道路上,我们将一路欢笑并肩前行,勇敢地追求那个梦寐以求的未来。也许在某个不经意的瞬间,我们会发现,那个童话般的前端王国,其实就在我们心中,等待着我们去探索、去发现、去唤醒它,让它绽放出最耀眼的光芒。

后记

前端技术的演进从未停歇,仍然充满了机遇与挑战……

让我们一起期待下一个十年,见证前端技术的更多精彩!

作者:京东零售 王雷

1、Redis集群方案比较

• 哨兵模式

Goland激活2023.1.1(GoLand 2023.1 发布)

 

在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般。

特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。

• 高可用集群模式

Goland激活2023.1.1(GoLand 2023.1 发布)

 



redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。

需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单。

 

2、Redis高可用集群搭建

• redis集群搭建

redis集群需要至少三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用三台机器部署6个redis实例,每台机器一主一从,搭建集群的步骤如下:


3、Java操作redis集群

借助redis的java客户端jedis可以操作以上集群,引用jedis版本的maven坐标如下:


Java编写访问redis集群的代码非常简单,如下所示:


集群的Spring Boot整合Redis连接代码见示例项目:redis-sentinel-cluster

1、引入相关依赖:


springboot项目核心配置:


访问代码:


4、Redis集群原理分析

Redis Cluster 将所有数据划分为 16384 个 slots(槽位),每个节点负责其中一部分槽位。槽位的信息存储于每个节点中。

当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个 key 时,可以直接定位到目标节点。同时因为槽位的信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的校验调整。

• 槽位定位算法

Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。

HASH_SLOT = CRC16(key) mod 16384

• 跳转重定位

当客户端向一个错误的节点发出了指令,该节点会发现指令的 key 所在的槽位并不归自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有 key 将使用新的槽位映射表。

Goland激活2023.1.1(GoLand 2023.1 发布)

 

• Redis集群节点间的通信机制

redis cluster节点间采取gossip协议进行通信

维护集群的数据(集群节点信息,主从角色,节点数量,各节点共享的数据等)有两种方式:集中式和gossip

• 集中式

优点在于数据的更新和读取,时效性非常好,一旦数据出现变更立即就会更新到集中式的存储中,其他节点读取的时候立即就可以立即感知到;不足在于所有的数据的更新压力全部集中在一个地方,可能导致数据的存储压力。 很多中间件都会借助zookeeper集中式存储数据。

• gossip:

Goland激活2023.1.1(GoLand 2023.1 发布)

 



gossip协议包含多种消息,包括ping,pong,meet,fail等等。

1)meet:某个节点发送meet给新加入的节点,让新节点加入集群中,然后新节点就会开始与其他节点进行通信;

2)ping:每个节点都会频繁给其他节点发送ping,其中包含自己的状态还有自己维护的集群数据,互相通过ping交换数据(类似自己感知到的集群节点增加和移除,hash slot信息等);

3)pong: 对ping和meet消息的返回,包含自己的状态和其他信息,也可以用于信息广播和更新;

4)fail: 某个节点判断另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了。

gossip协议的优点在于数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有节点上去更新,有一定的延时,降低了压力;缺点在于数据更新有延时可能导致集群的一些操作会有一些滞后。

gossip通信的10000端口

每个节点都有一个专门用于节点间gossip通信的端口,就是自己提供服务的端口号+10000,比如7001,那么用于节点间通信的就是17001端口。 每个节点每隔一段时间都会往另外几个节点发送ping消息,同时其他几点接收到ping消息之后返回pong消息。

• 网络抖动

真实世界的机房网络往往并不是风平浪静的,它们经常会发生各种各样的小问题。比如网络抖动就是非常常见的一种现象,突然之间部分连接变得不可访问,然后很快又恢复正常。

为解决这种问题,Redis Cluster 提供了一种选项cluster-node-timeout,表示当某个节点持续 timeout 的时间失联时,才可以认定该节点出现故障,需要进行主从切换。如果没有这个选项,网络抖动会导致主从频繁切换 (数据的重新复制)。

Redis集群选举原理分析

当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的master可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:

1)slave发现自己的master变为FAIL

2)将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST 信息

3)其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack

4)尝试failover的slave收集master返回的FAILOVER_AUTH_ACK

5)slave收到超过半数master的ack后变成新Master(这里解释了集群为什么至少需要三个主节点,如果只有两个,当其中一个挂了,只剩一个主节点是不能选举成功的)

6)slave广播Pong消息通知其他集群节点。

 

从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票

延迟计算公式:

DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms

SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave将会首先发起选举(理论上)。

 

集群脑裂数据丢失问题

redis集群没有过半机制会有脑裂问题,网络分区导致脑裂后多个主节点对外提供写服务,一旦网络分区恢复,会将其中一个主节点变为从节点,这时会有大量数据丢失。

规避方法可以在redis配置里加上参数(这种方法不可能百分百避免数据丢失,参考集群leader选举机制):


*注意:这个配置在一定程度上会影响集群的可用性,比如slave要是少于1个,这个集群就算leader正常也不能提供服务了,需要具体场景权衡选择。

集群是否完整才能对外提供服务

当redis.conf的配置
cluster-require-full-coverage为no时,表示当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,集群仍然可用,如果为yes则集群不可用。

Redis集群为什么至少需要三个master节点,并且推荐节点数为奇数?

因为新master的选举需要大于半数的集群master节点同意才能选举成功,如果只有两个master节点,当其中一个挂了,是达不到选举新master的条件的。

奇数个master节点可以在满足选举该条件的基础上节省一个节点,比如三个master节点和四个master节点的集群相比,大家如果都挂了一个master节点都能选举新master节点,如果都挂了两个master节点都没法选举新master节点了,所以奇数的master节点更多的是从节省机器资源角度出发说的。

 

Redis集群对批量操作命令的支持

对于类似mset,mget这样的多个key的原生批量操作命令,redis集群只支持所有key落在同一slot的情况,如果有多个key一定要用mset命令在redis集群上操作,则可以在key的前面加上{XX},这样参数数据分片hash计算的只会是大括号里的值,这样能确保不同的key能落到同一slot里去,示例如下:


假设name和age计算的hash slot值不一样,但是这条命令在集群下执行,redis只会用大括号里的 user1 做hash slot计算,所以算出来的slot值肯定相同,最后都能落在同一slot。

 

哨兵leader选举流程

当一个master服务器被某sentinel视为下线状态后,该sentinel会与其他sentinel协商选出sentinel的leader进行故障转移工作。每个发现master服务器进入下线的sentinel都可以要求其他sentinel选自己为sentinel的leader,选举是先到先得。同时每个sentinel每次选举都会自增配置纪(选举周期),每个纪中只会选择一个sentinel的leader。如果所有超过一半的sentinel选举某sentinel作为leader。之后该sentinel进行故障转移操作,从存活的slave中选举出新的master,这个选举过程跟集群的master选举很类似。

哨兵集群只有一个哨兵节点,redis的主从也能正常运行以及选举master,如果master挂了,那唯一的那个哨兵节点就是哨兵leader了,可以正常选举新master。

不过为了高可用一般都推荐至少部署三个哨兵节点。为什么推荐奇数个哨兵节点原理跟集群奇数个master节点类似。

作者:京东科技 高飞

前言

本文旨在通过部署微前端项目的实践过程中沉淀出一套部署方案,针对项目分别部署在不同的服务器上的场景就一些重点步骤、碰到的问题做了一些总结。

部署顺序

因为线上部署主应用时需要用到子应用的线上可访问地址,因此部署顺序应该是先部署子应用,保证子应用能够线上可访问后,再将子应用的线上可访问地址配置到主应用,最后再将主应用部署到线上环境。

部署分支

线上环境部署统一用master分支的代码

应用构建打包

主应用构建打包

主应用 csd-tech-main-app基于 ant-design-pro,需要在config目录中配置微前端项目的访问地址。

在config目录下配置config.test.ts用于测试环境的打包配置,生产环境打包配置放在在config.prod.ts中。由于本次部署是在本地机器测试部署,因此子应用访问地址都用localhost,如果部署到测试环境,或者生产环境,可以换成对应的访问地址。

测试环境打包配置:


生产环境打包配置:


然后,我们需要在微应用注册信息中,将我们加载微应用的地址换成我们配置的地址,代码实现如下:


最后,我们在 package.json 中,通过不同的命令区分不同环境,代码实现如下:


在配置完成后,我们在命令行运行如下命令,将主应用构建打包:


 

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置根目录下的 html 目录下,并重命名为 csd-tech-main-app,目录结构如下(见下图)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

到这里,我们的主应用就构建打包好了,接下来我们介绍各个微应用构建打包过程。

调度系统(dlink)微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:


 

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名为 datalink ,目录结构如下(见下图)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

数据迁移系统(datax)微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:


 

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名名为datax ,目录结构如下(见下图)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

标签系统微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:


 

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名名为label-system ,目录结构如下(见下图)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

Nginx 服务器部署方案

在将我们的主应用和微应用全部打包完成后,我们将介绍如何使用 Nginx 完成微前端架构的部署。

Nginx 部署方案是可以作为生产方案使用的。

 

配置时有三点注意事项:

•搭建nginx服务之前,保证所用到的端口是空闲

•子应用和主应用的 nginx 配置基本上是一致的,唯一不同的是子应用需要配置允许跨域访问。这是因为我们的微前端架构需要通过 ajax 请求子应用资源,所以需要配置跨域,通过 同源策略 的限制。

•子应用和主应用所用到接口地址都需要在 nginx 配置代理

 

本地测试nginx服务配置如下:


 

在配置完成后,我们需要重启一下 nginx 服务。

 

输入nginx启动命令启动nginx

 

在浏览器中访问主应用测试地址 localhost:8000 ,登录后如下图:

Goland激活2023.1.1(GoLand 2023.1 发布)

 



 

在浏览器中访问datalink子应用测试地址 localhost:8888 ,登录后如下图:

Goland激活2023.1.1(GoLand 2023.1 发布)

 


在浏览器中访问datax子应用测试地址 localhost:9528 , 登录后如下图:

Goland激活2023.1.1(GoLand 2023.1 发布)

 


在浏览器中访问标签系统子应用测试地址 localhost:8080 , 登录后如下图:

Goland激活2023.1.1(GoLand 2023.1 发布)

 


至此,nginx 服务部署大功告成!

 

扩展

如果需要把服务部署到真实服务器,只需要把所有的 localhost 都换成真实注册的域名即可,其他配置都可以复用!

Goland激活2023.1.1(GoLand 2023.1 发布)

这周有个让人眼前一亮的图像识别模型 segment-anything,它能精细地框出所有可见物体,它标记出的物体边界线清晰可见。如此出色的模型,自然获得了不少人的赞赏,开源没几天,就拿下了 18k+ 的 star,而上周开源不到 48 小时获得 35k+ star 的推特推荐算法,本周也成功突破 50k+ 关卡。

依旧是 AI 热度不减的一周,本周的 AI 专场收录了一个离线生图工具,以及一个自托管 AI 编程助手。此外,还有 Meta 开源出来的重构版构建系统 buck2 也是大受欢迎,还有随着各类 AI 工具火起来的向量数据库,weaviate 也小小地展露了下头角。

还有比较少见的工具类应用,一款极简的输入法 rime-ice 也值得一看。

以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准: | | ,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 ,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知 🌝

  • 本文目录
    • 1. 本周特推
      • 1.1 AI 专场
      • 1.2 Meta 开源构建系统:buck2
    • 2. GitHub Trending 周榜
      • 2.1 嵌入式数据库:chroma
      • 2.2 万物皆可分:segment-anything
      • 2.3 流处理:arroyo
      • 2.4 极简输入法:rime-ice
      • 2.5 向量数据库:weaviate
    • 3. HelloGitHub 热评
      • 3.1 GIF 录屏工具:ScreenToGif
      • 3.2 Nginx 可视化管理平台:nginx-proxy-manager
    • 4. 往期回顾

1. 本周特推

1.1 AI 专场

在这波 AI 热度消退之前,热点趋势的特推部分会增加一个模块来分享新的 AI 应用。

macOS 跑 SD:MochiDiffusion

主语言:Swift

MochiDiffusion 内置 Apple 的 Core ML Stable Diffusion 框架,以实现在搭载 Apple 芯片上用极低的内存占用发挥出模型最优性能。部分特性:

  • 可离线生图
  • 高性能,极低的内存占用
  • 图转图,Image2Image
  • 自定义 Stable Diffusion Core ML 模型
  • 无需担心损坏模型

GitHub 地址→https://github.com/godly-devotion/MochiDiffusion

Goland激活2023.1.1(GoLand 2023.1 发布)

自托管 AI 编程助手:tabby

主语言:Python、TypeScript

自托管的 AI 编程助手,可作为 Copilot 的替代品。特性:

  • 无需数据库和云服务;
  • 具有可视化、配置模型和 MLOps 的 Web 界面;
  • 接入 OpenAPI;
  • 消费级别的 GPU 支持(用不同方法优化的 FP-16 权重加载)

GitHub 地址→https://github.com/TabbyML/tabby

Goland激活2023.1.1(GoLand 2023.1 发布)

1.2 Meta 开源构建系统:buck2

主语言:Rust

Meta 开源的大规模构建系统 buck2 继承于 buck1,但是不同于 buck1 采用 Java 编写,buck2 由 Rust 编写而成。重构 buck1 的想法源自想要提供更快速、更高效的构建服务,buck2 有以下特性:

  • 解耦特定语言规则,buck2 的核心构建系统没有任何特定的语言规则,这意味着它有更好的可扩展性。buck2 核心部分用 Rust 编写,语言规则部分(例如:如何构建 C++)由 Starklark 编写;
  • 构建系统由单一增量依赖图提供支持,由此消减多类 bug 并增加并发性;
  • 规则 API 的设计主要为提供先进的性能特性,以及动态依赖特征;
  • 集成远程执行,能在远程机器执行操作,它采用了同 Bazel 一样的 API,并已经用 Buildbarn 和 EngFlow 进行远程执行测试;
  • 集成虚拟文件系统,不用整仓检测,按需获取文件即可;

GitHub 地址→https://github.com/facebook/buck2

Goland激活2023.1.1(GoLand 2023.1 发布)

2. GitHub Trending 周榜

2.1 嵌入式数据库:chroma

本周 star 增长数:1,200+主语言:Python、TypeScript

Chroma 是一个用于 Python / JavaScript LLM 应用程序的嵌入式数据库,它具有内存快速访问的优势。它只有 4 个核心函数:


GitHub 地址→https://github.com/chroma-core/chroma

Goland激活2023.1.1(GoLand 2023.1 发布)

2.2 万物皆可分:segment-anything

本周 star 增长数:18,000+主语言:Jupyter Notebook

这个代码库提供了使用 SegmentAnything 模型(SAM)进行推理的代码,SAM 是一种输入诸如点、框等 prompt 生成高质量目标 mask 的模型,它有非常出彩的标记效果。btw,项目开源不到一周已经有 18k+ star。

GitHub 地址→https://github.com/facebookresearch/segment-anything

Goland激活2023.1.1(GoLand 2023.1 发布)

2.3 流处理:arroyo

本周 star 增长数:700+主语言:Rust、TypeScript

arroyo 是一个 Rust 编写的分布式流处理引擎,旨在高效地对流数据进行状态计算。与传统的批处理不同,流处理引擎可以处理有界和无界数据源,一旦结果可用就立即输出。

GitHub 地址→https://github.com/ArroyoSystems/arroyo

Goland激活2023.1.1(GoLand 2023.1 发布)

2.4 极简输入法:rime-ice

本周 star 增长数 1,850+主语言:Go、Lua

雾凇拼音一个极简风的输入法,支持简体、全拼、双拼。值得一提的事,作者自己维护了一个词库:

  • 字表
  • 基础词库
  • 搜狗流行词
  • 扩展词库,小词库
  • 扩展词库,大词库

GitHub 地址→https://github.com/iDvel/rime-ice

Goland激活2023.1.1(GoLand 2023.1 发布)

2.5 向量数据库:weaviate

本周 star 增长数:500+主语言:Go

Weaviate 是一个开源的向量数据库,可以存储对象和向量,允许将向量搜索与结构化过滤相结合,并具有云原生数据库的容错性和可扩展性,可通过 GraphQL、REST 和各种语言客户端进行访问。

GitHub 地址→https://github.com/weaviate/weaviate

Goland激活2023.1.1(GoLand 2023.1 发布)

3. HelloGitHub 热评

在这个章节,我们将会分享下本周 HelloGitHub 网站上的热评项目,HG 开源项目评价体系刚上线不久,期待你的评价 :D

3.1 GIF 录屏工具:ScreenToGif

主语言:C#

一款 Windows 上的免费 GIF 录屏工具,易安装、好上手,支持录制指定区域画面,且可以将视频导出为 gif 等文件格式。

HG 评价地址→https://hellogithub.com/repository/b49e4c9dd1834dc1b9f3352c89ef0239

Goland激活2023.1.1(GoLand 2023.1 发布)

3.2 Nginx 可视化管理平台:nginx-proxy-manager

主语言:JavaScript

它开箱即用,支持 Docker 一键部署,可以让用户通过 Web 界面在线配置、管理 Nginx 服务,支持转发、重定向、SSL 证书、高级配置等功能。

HG 评价地址→https://hellogithub.com/repository/43d04968e8ed4bdfae28023b1c

Goland激活2023.1.1(GoLand 2023.1 发布)

4. 往期回顾

往期回顾:

  • Python 霸榜的一周,又有什么新 AI 力作呢?「GitHub 热点速览」
  • 开源不到 48 小时获 35k star 的推荐算法「GitHub 热点速览」

以上为 2023 年第 14 个工作周的 GitHub Trending 🎉如果你 Pick 其他好玩、实用的 GitHub 项目,来 HelloGitHub 和大家一起分享下哟 🌝

技术原理

关于技术实现,用到的材料主要有XR806开发板、两个9g的舵机,以及一个红外光传感器。

工作机制非常简单,如图所示:

3cb0afb6-279e-4159-8e22-1d76d47f11fd-image.png

上电后舵机复位到初始状态,任何开始工作,由一号舵机把待分类的棋子推移到检测区域,由红外传感器判断棋子的颜色,白色返回值为1,黑色则为0。

硬件模型制作

这一部分看似工作量大,但其实是参考了网上一些开源的例程,只不过加以了尺寸改动。

实现方法可以用3d打印或者激光切割亚克力,我选择了后者因为时间相对简短。使用的建模软件为Solidworks2019,亚克力板厚度后3mm,画好零件后,搭建好装配体确认尺寸无误后转为dxf格式即可用CNC机床切割。(我是用了学校的CNC,网上切也很便宜哈)

d9774e8f-fa4b-429e-a658-a273a1264c1c-image.png

电路部分

使用的开发板为XR806,一款iot产品开发板,他最大的特点就是适配的轻鸿蒙,使用起来能有不错的体验。

需要驱动的设备就是两个舵机及一个红外传感器。

舵机就是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。

以180度角度伺服为例,那么对应的控制关系是这样的:

0.5ms————–0度;

1.0ms————45度;

1.5ms————90度;

2.0ms———–135度;

2.5ms———–180度;

拆开看看:

减速齿轮
89dda2e6-8f6a-471b-a407-e08a66754ed8-image.png

驱动电路
78ee477b-0387-4d07-b2d3-d193180debd9-image.png

因为片子上的字眼实在太小,令人“望眼欲穿”,本来还想查查有没有技术文档研究一下,只能放弃先了。刚好鸿蒙也适配了pwm的接口驱动xr806,所以我们只要修改freq频率和duty占空比两个选项如下即可。


关于其他基础操作姿势可以参考我之前的一篇呼吸灯的demo帖子。还有一点值得一提的是关于这种舵机的输入信号口我是用806上的接口直接驱动的,并没有再拉高,内部是否需要或者有没有额外的驱动由于没有舵机内部电路的原理图也暂时无从得知,但总感觉在调节duty占空这一参数时舵机时而会不听使唤(占空比调制不准确),希望有大佬指点。

红外传感器原理则相对简单,一个红外发射管和一个红外接收管。模块通电后红外发射管向前方不断发射一定频率的红外线,

通过板载了一个电压比较器LM3932fda6b2c-d912-4005-a337-31fc2df8aa74-image.png

比较输出和输入的信号做出相应反馈,体现到我手里这块小板子上就是接收到红外信号为1,没有接收到(遇到黑色物体)则为0。所以读取判断值的代码相对简单:


整体代码部分

openHarmony用的是gn和ninja编译,由很多种上手学习方式,如果说gn对标的是gcc脚本构建生成器,ninja就对应的是makefile构建系统文档了。

BUILD.gn


main.c


最后在编译选项中加上即可


总结
到此基本功能是实现了,但有很多缺陷如我没有直观地体现出来分类后各种棋子的数量,也并没有给他加上控制开始和停止的操作。(没有一个对是否仍有棋子未被分类的判断机制)这些后续可以通过增加显示屏、替换红外传感器为压感贴片或者使用摄像头去学习判等等···最遗憾的是这个小demo暂时还没有发挥出XR806及鸿蒙的一些特征,如联网、连蓝牙。仅仅是个突发奇想的点子,希望能起到抛砖引玉的作用。后面我也会继续尝试给他加上其他功能。

再贴上一些前置学习内容:
官方文档:https://xr806.docs.aw-ol.com/

XR806开发板引脚功能表:https://bbs.aw-ol.com/topic/496/资料释放-xr806鸿蒙开发板引脚功能表

SDK获取到编译烧录:https://bbs.aw-ol.com/topic/499/xr806鸿蒙开发实战1-实操下载xr806鸿蒙代码并编译烧写

鸿蒙的外设接口:文件接口的头文件在:


源码在:


带有iot字样的接口就是鸿蒙的接口。

端口复用


可以看到关于pwm的相关端口配置


项目中所用到的引脚

一号舵机信号线———PA20

二号舵机信号线———PA19

红外传感信号线———PA13

用面包板引出开发板上的电源跟地供外设共用。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

当下,酝酿能量的超级边缘。

最近,我们在谈视频化狂飙、谈AIGC颠覆、谈算力动能不足,很少谈及边缘。但“边缘”恰恰与这一切相关,且越发密不可分,它是未来技术发展的极大影响因子。

“到2025年,超过70%的组织将为其⾄少⼀个边缘计算系统,部署超⼤规模云边缘解决⽅案,并会结合其云部署。这比例远⾼于2022年的不到15%。”

这是Gartner在最近发布的 Competitive Landscape : Hyperscale Edge Solution Providers 报告中,给出的大胆又直接的判断。

Goland激活2023.1.1(GoLand 2023.1 发布)

Gartner视角中的“边缘”价值

“边缘是物和⼈与⽹络数字世界连接的物理位置,它是数字化转型,以及⼈、物和企业之间新交互的关键推动因素。”Gartner的描述,极度契合当下的边缘之力。

由边缘发展而来的边缘计算,正在呈现快速发展之势,它满⾜了对靠近边缘处理数据的⽇益增⻓的需求。它还通过解决延迟、带宽、⾃主性和隐私要求,来补充数字业务⽤例的云计算,这就顺势揭开了“边缘”的意义和能力。

提到云计算,固有印象一定是中心云。而边缘计算和中心云计算是相辅相成的,非相互竞争或排斥。下图显示,两种计算可以通过不同的⽅式解决不同的需求,从⽽创造新的价值。

Goland激活2023.1.1(GoLand 2023.1 发布)

中心云和边缘的关系

从中心到边缘,与Gartner所观察的一致,我们发现:

l “边缘”是趋于简单的解决路径

超⼤规模边缘正在成为在当今IT现代化和数字计划中,实现边缘计算以及解决数据主权需求的越来越简单的⽅法,因为用户在当今组织中的分布和普及程度越来越⾼。

l “边缘”是公共云的最强助力

公共云功能得到当今超⼤规模边缘的补充,许多情况下,它在利⽤云到边缘模型的同时,也提供与公共云区域相同的功能。

在此之上,涉及一个概念,分布式云。

分布式云是⼀种新兴技术趋势,推动云外⽅法。分布式云满⾜了客户让云计算资源更接近数据和业务活动发⽣的物理位置的需求,同时保留了公共云的集中管理能⼒。

Goland激活2023.1.1(GoLand 2023.1 发布)

分布式云连续体

从中心云到分布式云,从云计算到边缘计算,成就了边缘云的存在,可以说是一种最具亲和力的云计算存在形态,而其酝酿的价值一定在超大规模之上来发挥。

正如Gartner所述,“5G为通信服务提供商提供了⽀持新的边缘计算⽤例的机会,而超⼤规模云提供商正在竞相成为电信边缘基础设施的领先者。”

6家“全球超大规模边缘供应商”

Gartner提到,“随着超级边缘(也称为超⼤规模边缘)变得⼴泛可⽤,它们将在短期内与单个超⼤规模企业及其特许经营权相关联。这将产⽣对‘多重超⼤规模’边缘架构和采用模型的需求,类似于在云世界中的多云采⽤模型。”

在5G代开的连接通道之下,更打开了一种可以称之为“超级边缘”的边缘解决方案和产品新世界。

与传统边缘不同,超级边缘构建在超⼤规模云提供商提供的平台上,作为其分布式云解决⽅案的⼀部分。5G的⾼速、低延迟连接将许多功能卸载到这些超级边缘,⽽不是依赖集中式云数据中⼼来处理某些超级计算和分布式⼯作负载,这便解决了传统边缘一直面临的延时挑战,尤其可以应对云游戏和高性能计算的应用场景。

供应商使⽤不同的⽅法来开发新产品以满⾜这些新的边缘计算要求。然⽽,所有超⼤规模云提供商都基于相同的原则开发他们的产品,Gartner称之为“从云到边缘”的⽅法。

通过从云到边缘的⽅法,超⼤规模云提供商将公共云架构分发到边缘,从⽽实现中心和边缘之间的⼀致性。

Goland激活2023.1.1(GoLand 2023.1 发布)

从云端到边缘的方法

此次最新报告中,从全球范围内,Gartner指出了6家最具代表性的“全球超大规模边缘供应商”,分别为:阿里云、AWS、谷歌云、IBM、微软天青、甲骨文,这6家各具声色,为边缘云赛道带来独特价值。

报告中指出,阿里云的云内容分发⽹络 (CDN) 业务,提供在阿⾥云的云边缘节点服务 (ENS) 上运⾏的标准边缘计算服务。带有CDN的ENS,提供了⽐以前的解决⽅案更⾼的收益,以及横向服务扩展、运营和维护以及为客户提供的按需付费选项。

正如Gartner所描述,阿里云基于CDN节点构建的全球化边缘基础设施,通过500+节点结合算网融合技术,实现全球覆盖,聚焦在音视频、云游戏、云渲染、边缘组网、云网融合五类场景化解决方案。未来,更多的全球节点还会转变为边缘计算(ENS)模式,带来更大的覆盖与价值。

与此同时,Gartner也指出,AWS的边缘产品组合通过多种选项部署到边缘,为客户提供⼀种混合体验;Google分布式云(GDC)可以跨多个位置运⾏,包括⾕歌的⽹络边缘、运营商边缘、客户边缘和客户数据中⼼;IBM Cloud Satellite是IBM的出云解决⽅案,满⾜⾏业对以软件为中⼼的未来需求,以越来越灵活的⽅式将云服务扩展到不同的环境;微软⽀持多种边缘集成技术,包括连接、管理、安全和云原⽣开发,并给予边缘高度多样化的需求,且特别关注垂直合作伙伴关系的建立;Oracle构建了OCI分布式云,并提供⼀套包含五个分布式云产品的套件,向全球客户提供其分布式云服务。

从产品、功能的成熟度、市场的吸引力、市场的独特主张,Gartner提出的这6大全球超大规模边缘供应商,着力不同,呈现强劲的发展势头。

Goland激活2023.1.1(GoLand 2023.1 发布)

在全球释放“超级边缘”的能量

在全球构建超级边缘之力,绝非一件简单的事。

阿里云实现了国内31个省的全面覆盖,也就是说,用户在中国大陆的这些区域内都能获得充沛的算力支撑。在云计算基础设施服务方面,阿里云边缘云基于统一的飞天底座,提供一云多芯、一云多态的云计算架构,从中心向边缘辐射,让算力无限延伸。

作为中国最大、技术领先、全球覆盖的边缘云计算平台,阿里云边缘云在海外部署了60多个节点,覆盖海外30多个国家,以亚太区域为核心,在欧美、中东非等区域均能提供算力支持。

在边缘节点算力建设上,阿里云在全球提供500多个强有力的全节点,具备边缘云多态计算、融合存储、融合网络等所有云能力,通过合计170万核的通用算力CPU核,和400P FLOPS的异构算力核,以满足更多边缘创新场景的算力刚需。

Goland激活2023.1.1(GoLand 2023.1 发布)

伴随全球业务发展,阿里云先后在韩国、泰国、德国、印尼、菲律宾和沙特新增了七座数据中心,面向广大的海外用户提供云服务。同时,边缘云小型轻量和快速交付的特性,使得其相较中心云而言,部署更为灵活、分布更为广泛。

在网络传输层,就近用户侧部署边缘云,可有利于优化异地运营商的网络接入;通过专属网络连接边缘云与中心云,则有利于为上层业务开展屏蔽边缘云与中心云之间的复杂网络环境。

在业务应用层,将中心化的云服务延展为云边协同的服务,不仅可以通过边缘算力和存储满足数据本地贮存的需求,还可以通过应用本地下沉、边缘就近访问等技术手段提升业务体验,对传统中心云的服务形成恰到好处的补充。

实践数据显示,在全球互联网用户增长最快、网络等基建水平相对落后的新兴市场国家,采用边缘云就近用户提供服务,可以将异地用户的业务访问时延缩短50%以上,从而有力应对“长距离传输”和“最后一公里接入”为业务开展带来的挑战。

随着互联网出海进度的加快,中国企业席卷全球的脚步由国内延伸至欧美、东南亚、印度,进而扩展至更广阔的拉美、中东和非洲市场。在视频直播、游戏、在线教育等领域,国内出海企业已日渐占据了海外市场的半壁江山。

得益于国内边缘云的商业化积累和与出海企业的长期深入合作,阿里云率先将边缘云的场景化服务能力由国内延伸至海外,致力于在更广阔的地域为出海企业提供与国内一致的技术支持和服务体验,助力企业业务全球版图的扩张。

Goland激活2023.1.1(GoLand 2023.1 发布)

写在最后

在全球,阿里云边缘云构建了泛在融合的算力网络,打造“一点接入、即取即用”的算力服务,为新兴企业、新兴场景注入真正落地的动力之源。

如今,全球都沸腾在AIGC的风潮里,而“边缘”也许会成为新内容形态的动能中心,它利用算网融合的能力,在边缘端和云边协同机制下,解决更复杂的渲染和AI计算,以更自如的算力,让AIGC更自如地普惠。

不仅如此,边缘算力所拥有的低时延、安全、隐私等优势,更符合对AI创作所有权和隐私权之需。而“边缘”对AIGC时代的助攻,也只是我们能预见的冰山一角。

可以确定的是,用户群日益分散,需求日新月异,欲望的极限不断被打破,在每个边缘端不断被满足,这一切都为超⼤规模边缘提供商创造⼀系列的机会。

最后,把视线抬高,边缘云更像是新兴技术下的影响雷达,众多颠覆性技术的蔓延之势,总离不开边缘的存在。

 

文章目录

    • 概述
    • 1.1 实验介绍
    • 1.2 购买GaussDB数据库(可选)
    • 1.3 购买弹性云服务器 ECS
      • 1.3.1 购买ECS服务器
      • 1.3.2 安装客户端并连接数据库

 

概述

之前分享了如何通过DAS和公网连接GaussDB,本篇介绍第三种通过内网连接GaussDB。

1.1 实验介绍

本实验主要描述如何通过内网从另一台弹性云服务器ECS上连接到GaussDB实例。
掌握使用内网来连接GaussDB数据库实例。

1.2 购买GaussDB数据库(可选)

说明:如果已经购买好了GaussDB数据库可以跳过此章节,直接进入下一章节,如果没有购买好请参考 GaussDB 数据库实验环境搭建指导进行购买。

1.3 购买弹性云服务器 ECS

1.3.1 购买ECS服务器

步骤 1登录华为云官网。
登录https://www.huaweicloud.com/,进入华为云官网,输入账号密码,登录。
步骤 2进入控制台,单击服务列表,选择弹性云服务器ECS。

步骤 3进入服务器购买界面。

步骤 4配置服务器。
在左上角选择数据库(重要 )后,选择按需计费-华北北京四,CPU架构选择x86计算,规格选择通用计算增强型 | sn3.medium.2 | 1vCPUs | 2GiB,镜像为CentOS 8.0 64bit,单击下一步 网络配置。

 

在网络配置界面,网络选择默认网络、安全组选择默认安全组,公网带宽选择按流量计费,然后单击下一步 高级配置。

在高级配置界面,只要设置密码,其余默认即可,然后单击下一步 确认配置。

在确认配置界面,勾选我已经阅读并同意《镜像免责声明》,然后单击 立即购买。注意,购买后即进行实际按时计费。

提交完成后,回到返回到服务器列表界面。

服务器创建中。

等待几分钟后,服务器创建成功。注意已启动计费。

1.3.2 安装客户端并连接数据库

步骤 1以root用户远程登录服务器并创建“/tmp/tools”目录。可以使用华为云自带的或者连接工具进行登录。

 

 

这里需要注意下,GaussDB的公网IP默认禁ping,因此IP可能是ping不通的,但是不影响通过公网Data Studio或者私网服务器工具putty/xshell登录。
创建“/tmp/tools”目录:

 

步骤 2获取软件安装包,并解压上传安装文件。
下载地址为:https://dbs-download.obs.cn-north-1.myhuaweicloud.com/GaussDB/09/GaussDB_opengauss_client_tools.zip
在本地(例如D:/download)下载ZIP文件后进行解压缩。
由于购买的ecs为CentOS操作系统,这个操作系统基于X86,所以进入Euler2.5_X86_64文件夹,显示如下:

使用WinSCP工具连接弹性云服务器,主机名为弹性公网IP,用户名为root,密码为购买弹性云服务器时自定义的密码:

切换到对应文件夹:
左边:D:DownloadGaussDB_opengauss_client_toolsEuler2.5_X86_64
右边:/tmp/tools

将文件“GaussDB-Kernel-V500R001C10-EULER-64bit-gsql.tar.gz”上传到申请的弹性云服务器“/tmp/tools”路径下。
选中文件GaussDB-Kernel-V500R001C10-EULER-64bit-gsql.tar.gz,单击上传或者直接拖过去:

上传成功:

重新连接弹性云服务器,切换到“/tmp/tools”目录,解压文件。

 

步骤 3设置环境变量。
打开“~/.bashrc”文件。

 

按下i键进入INSERT模式,在其中输入如下内容后,按下Esc后输入“:wq!”命令保存并退出。

 

使环境变量配置生效。

 

步骤 4内网连接数据库。
从ECS服务器上连接到如下GaussDB数据库。
先查看GaussDB数据库的IP地址,内网地址可直接获取:

跨区的也可以使用弹性公网IP。

然后在ECS服务器执行如下命令进行连接,postgres为需要连接的数据库名称,IP的话分布式为CN的IP地址,主备版为主DN的IP地址,root为登录数据库的用户名,8000为CN的端口号。

 

输入数据库root用户密码,进行成功登录

 

数据库使用

 

 

如果ESC服务器不再使用了,记得把ESC服务器资源及时清除,避免持续计费。
内网连接GaussDB实验结束。

前言

大家好!我是 Rainbond 创始人刘凡,今年是 Rainbond 创立和开源的第七年,这个过程中我见证了Docker、K8s、云原生等技术的演进,Rainbond 也进化成为一体化的云原生管理平台,基于这么多年的产品研发及行业沉淀,我来分享我们对云原生的一些思考,以及云原生技术为企业数字化转型带来的新模式。

个人数字化三大驱动力

谈到企业数字化,首先我们来回顾一下个人数字化的历程和驱动力,通过分析和总结个人数字化,对我们理解企业数字化有借鉴意义。众所周知个人数字化最大的驱动力是移动互联网。移动互联网定义了技术实现和用户体验,催生了大量应用场景,为我们的生活带来了极大的便利。下面我们详细解析一下移动互联网的驱动力。

Goland激活2023.1.1(GoLand 2023.1 发布)

个人数字化三个最关键的驱动力,分别是易用性、生态建设及服务化。

  • 易用性:Android、iPhone手机等终端产品,可以做到较强易用性,小孩都能顺畅使用,是由其触摸屏及苹果定义的Iphone交互体验所决定的,易用性让移动终端的用户快速增长,从而为个人数字化提供了坚实的用户基础。
  • 生态建设:iPhone建立了App Store(应用商店)模式,通过应用生态,更多厂商可以为移动设备开发应用,产生了大量可以使用的应用,这些应用能覆盖到个人数字化生活的方方面面,生态建设为个人数字化提供了更多应用。
  • 服务化:软件本身是没有价值的,只有把软件变成服务,才能给用户带来价值,而服务订阅是可持续发展的商业模式,它让个人数字化能够良性发展。

云原生驱动企业数字化的四种模式

而对于企业数字化,云原生技术等同于个人数字化时代的移动互联网,在整个企业数字化进程中扮演非常重要的角色,已驱动着企业数字化。基于对个人数字化的总结,我们来分析一下企业数字化的驱动力。

Goland激活2023.1.1(GoLand 2023.1 发布)

企业数字化中应用多且复杂,与个人数字化有很大不同。所以除了个人数字化里面所提及的易用性、生态建设、服务化三个关键点,我们还需要关注应用全生命周期赋能,它是企业数字化的最底层驱动力。下面我分别从易用性、生态建设、服务化、应用全生命周期赋能这四个方面来讲解一下具体的实现模式。

1、云原⽣的“易⽤性”模式 – 应⽤级抽象模型

易用性越高,受众人群越大,易用性每提高一点,用户基数呈现几何倍数增加。云原生的易用性,涉及三个层次。

  • 最下面一层是Kubernetes和容器技术,Kubernetes和容器技术解决了运维管理中环境管理和自动化调度问题,提升了对复杂应用运维管理的易用性,但K8s和容器技术门槛比较高,要使用起来还是需要专门的学习,适合专职的工程师。如果要让更多人能使用起来,还需要更加易用。
  • 第二层是通过应用级抽象模型搭建应用管理平台,使用者不需要关心容器和K8s等底层技术,只需要关注业务本身,管理的范畴也扩大到应用的全生命周期,使用的关注点上移,重心在业务创造,体验上实现现积木式业务模块拼装和能力按需扩展。在这一层面,易用性相比容器抽象,大幅度提升,所有开发人员都可以快速上手,使用人群能进一步扩大。
  • 最上层,提供服务级使用体验,使用群体可以完全不用懂技术,类似手机App Store的使用体验,即点即用,用户实现自助安装和升级,这层的易用性适合所有企业用户。

Goland激活2023.1.1(GoLand 2023.1 发布)

2、云原⽣的“⽣态建设”模式 – 云原生应⽤市场

企业数字化的生态建设与个人数字化类似,也需要通过应用市场来实现。但是,由于企业数字化中应用和资源的复杂度较高,要实现应用市场,需要建立应用和资源的标准和规范,并且要能够完全解耦。此外,在交付的形态也更为复杂,需要解决各种企业场景的交付问题。

为了适应真实的企业数字化场景,云原生应用市场需要解决这些问题:

  • 在应用供应方面,软件供应商可以自助加入和上架应用,根据不同颗粒度的软件有不同类型的软件厂商加入。小颗粒基础能力厂商提供业务组件、技术组件、中间件、API等;中等颗粒度的行业产品和通用产品厂商提供通用软件产品和行业软件等;大颗粒度的行业解决方案厂商和集成商提供完整的解决方案,或基于能力和产品拼装行业解决方案。

  • 在计算资源供应方面,厂商也可以自助将自己的资源加入,前提是要符合K8S、API等标准。这样,应用市场就拥有了各种资源、各种应用、各种底层等模块。

  • 在交付能力方面,对于行业中小用户来说,可直接全自助交付,强调服务化和低成本化;另一方面,对于行业大型用户来说,可以基于他们自身的基础设施,实现软件自动化安装,供应商可远程对基础设施进行维护管理及定制开发。

总的来说,云原生生态建设需要通过应用市场的方式来落地,真正激活整个生态及整个软件行业,并实现最终用户自助的灵活性和生产应用场景的多样性。只有这样,才能适应真实的企业数字化场景,推动云原生技术的进一步发展和应用。

Goland激活2023.1.1(GoLand 2023.1 发布)

3、云原⽣的“服务化”模式 – ⾃服务SaaS

随着数字化的加速发展,越来越多的企业开始使用云原生技术来构建自己的数字化平台。云原生技术的一个重要应用就是自服务SaaS,通过自动化的运维过程,实现自助式的SaaS服务交付,大幅度提升企业数字化的效率。

自服务SaaS,顾名思义,就是利用云原生技术将企业软件自动化为SaaS服务的方式,提供给企业用户使用。这种服务模式不仅可以帮助企业降低成本,还能够提高数字化服务的交付效率,为企业带来更大的价值。

Goland激活2023.1.1(GoLand 2023.1 发布)

自服务SaaS的实现需要从以下五个方面考虑:

第一,企业软件。通过将企业软件进行云原生改造,实现自动化的运维过程。这样,企业可以快速部署应用,提高数字化服务的交付速度和效率。

第二,计算资源。通过云原生技术实现自动化计算资源调度,将企业应用交付到自己的计算资源中,解决数据安全问题,并降低成本。

第三,自动安装。通过云原生技术实现自动化的安装过程,用户只需简单操作,即可快速使用企业应用,提高数字化服务的用户体验。

第四,自动运维。通过云原生技术实现自动化的运维过程,实时监控应用的运行状态,并自动修复故障,提高数字化服务的可靠性和稳定性。

第五,多租户。通过云原生技术实现多租户机制,为不同用户提供独立的应用服务,并实现资源的隔离和共享。

4、云原⽣为应⽤全⽣命周期赋能,实现企业应⽤⼀体化管理

云原生为企业应用生态赋能,主要涉及应用生命周期的四个方面。

首先,从开发角度看,云原生可以实现源代码的自动识别和构建,并提供云端开发、云端调试以及一体化的开发环境。这样可以让开发人员专注于业务代码的开发,而无需进行太多的迁移工作。

其次,从架构角度看,云原生可以实现可拼装的业务逻辑、无侵入的微服务架构以及按需扩展的服务治理能力。这些特性最终带来的价值是模块化的复用率大幅度提高,所有厂商都可以找到合适的定位,从而实现积木式的拼装体验。因此,每个企业都可以通过云原生快速落地数字化转型。

第三,从交付角度看,云原生可以通过应用模版实现一键安装和升级,并自动适应各种交付环境,从而实现自动化交付和灰度发布,提高迭代和交付效率,同时提高交付过程的标准化。

最后,从运维角度看,云原生可以让底层的系统运维环节变得更加简单,应用层运维变得更加自动化。这不仅可以为企业带来效率提升,同时也让开发者除了编写代码以外,还能够实现对整个开发过程的可控,从而提高资源利用率。

Goland激活2023.1.1(GoLand 2023.1 发布)

企业数字化的iPhone时刻

Goland激活2023.1.1(GoLand 2023.1 发布)

这些驱动力构成了云原生的基础,使得企业能够更快地进行数字化转型,并且通过新模式来提高数字化转型的效率和质量。我相信随着云原生技术的不断发展和普及,很快就会出现“云原生的iPhone时刻”,这将助推企业数字化建设全面开花。

功能或特点 MyBatis-Flex MyBatis-Plus Fluent-Mybatis 对 entity 的基本增删改查 ✅ ✅ ✅ 分页查询 ✅ ✅ ✅ 分页查询之总量缓存 ✅ ❌ ❌ 分页查询无 SQL 解析设计(更轻量,及更高性能) ✅ ❌ ✅ 多表查询: from 多张表 ✅ ❌ ❌ 多表查询: left join、inner join 等等 ✅ ❌ ✅ 多表查询: union,union all ✅ ❌ ✅ 单主键配置 ✅ ✅ ✅ 多种 id 生成策略 ✅ ✅ ✅ 支持多主键、复合主键 ✅ ❌ ❌ 字段的 typeHandler 配置 ✅ ✅ ✅ 除了 Mybatis,无其他第三方依赖(更轻量) ✅ ❌ ❌ QueryWrapper 是否支持在微服务项目下进行 RPC 传输 ✅ ❌ 未知 逻辑删除 ✅ ✅ ✅ 乐观锁 ✅ ✅ ✅ SQL 审计 ✅ ❌ ❌ 数据填充 ✅ ✔️
 
(收费) ✅ 数据脱敏 ✅ ✔️
 
(收费) ❌ 字段权限 ✅ ✔️
 
(收费) ❌ 字段加密 ✅ ✔️
 
(收费) ❌ 字典回显 ✅ ✔️
 
(收费) ❌ Db + Row ✅ ❌ ❌ Entity 监听 ✅ ❌ ❌ 多数据源支持 ✅ 借助其他框架或收费,不支持非Spring项目 ❌ 多租户 ✅ ✅ ❌

SunnyUI

star fork

  • 帮助文档: https://gitee.com/yhuse/SunnyUI/wikis/pages
  • Gitee: https://gitee.com/yhuse/SunnyUI
  • GitHub: https://github.com/yhuse/SunnyUI
  • Nuget: https://www.nuget.org/packages/SunnyUI/
  • Blog: https://www.cnblogs.com/yhuse

SunnyUI.Net 是基于.Net Framework 4.0~4.8、.Net 6 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。

Goland激活2023.1.1(GoLand 2023.1 发布)

此版本更新内容为:

+ 增加 * 修改 – 删除

2023-04-08 V3.3.5

* UMessageTip: 解决了Release模式下GDI位图未释放的Bug
* Demo: 重写FMain,从UIForm继承
* UITreeView: 修改LabelEdit属性
* 内置的一些容器增加关闭过滤下拉框的事件
* UINumPadTextBox: 增加了最大值、最小值等属性
* UGraphics: 重构了一遍绘图方法
* UIComboDataGridViewItem: 增加多语翻译
* UIComboTreeView: 显示清除按钮
* UControl: 修复关闭弹窗null的Bug
* UIDropControl: DropDownList时,显示水印文字

 

Jmix Web 快速开发框架 1.5.1 发布,该补丁版本中主要包含了 Bug 修复,推荐升级:

 

💥 主要新功能:

支持 Spring Boot 2.7.10

组件工具箱支持 PivotTable(透视表)

在 Studio 中添加表格类型组件默认 100% 宽度

Quartz 任务管理界面按钮支持本地化

 

🛠️ 主要 Bug 修复:

PresentationProvider 在某些情况下应用两次的问题

组件 enable 属性不支持的问题

通知组件为替代用户展示错误通知的问题

扩展组件中运行测试由于 Liquibase 脚本导致失败的问题

URL 参数值中带有 “&” 符号导致解析失败的问题

一些 Flow UI 相关的修复

 

详细修复的问题列表,请参考 Jmix GitHub:
https://github.com/jmix-framework/jmix/issues?q=is%3Aclosed+milestone%3A1.5.1

 

🔑 Jmix 是一个覆盖应用程序全生命周期的 Java 少代码快速开发平台。以 Spring Boot 作为开源基础框架,提供过程中的 Studio 开发工具以及开箱即用的扩展组件。通过 Jmix 实现您的数字化愿景,无低代码平台限制,无供应商依赖,无需按用户付费。

 

资源:👉🏻
Jmix 适合我吗?
👉🏻

中文官网

更新日志 

1. 立即购买支持多个商品
2. 新增公共加入购物车操作
3. 订单分组多订单场景下仅支持快递模式
4. 起购数和限购数提升到规格层级
5. 新增视频扫码组件
6. 自提订单取货支持扫码操作
7. 自定义页面改为html+css+javascript代码编辑模式
8. 多端多系统标识调支持用户信息共享
9. 用户新增所属平台标记
10. api接口token各端独立,并加强token加密
11. 内置多语言模块(前后端及语言可控)
12. 可视化设计支持鼠标悬停图片放大控制
13. 可视化页面支持自定义协议url
14. 订单、订单售后、消息新增钩子
15. 图标导航支持纯净模式
16. 地区支持唯一编号快捷选择
17. 弹窗支持拖动和双击全屏缩小
18. 后台管理窗口支持多窗口并行
19. 单独售后仅退款自动退数量优化
20. 进销存支持与商城双向同步和运单打印及商品标签打印
21. 新增商品服务插件
22. 新增组合搭配插件
23. 新增批量下单插件
24. 小程序整体结构及功能细节优化

进销存效果图片(支持多商户使用)

Goland激活2023.1.1(GoLand 2023.1 发布)

门店收银台效果图片(O2O 多门店)

Goland激活2023.1.1(GoLand 2023.1 发布)

小程序端效果图片(内置多种配色)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

可视化 DIY 拖拽装修展示

 Goland激活2023.1.1(GoLand 2023.1 发布)

PC 端展示

Goland激活2023.1.1(GoLand 2023.1 发布)

后台管理展示

Goland激活2023.1.1(GoLand 2023.1 发布)

 

文档 源码 在线体验 模板性能测试 表达式引擎性能测试  性能优化指南 

最新模板性能测试,各个模板引擎均采用最新版本, Score 越大越好

Beetl>Rocker>>Freemarker>>Thymeleaf==Velociy

 Benchmark Mode Cnt Score Error Units Beetl.benchmark thrpt 5 .506 ± 19090.130 ops/s Freemarker.benchmark thrpt 5 48062.783 ± 9054.282 ops/s Handlebars.benchmark thrpt 5 48505.286 ± 6078.944 ops/s Rocker.benchmark thrpt 5 .041 ± 11827.123 ops/s Thymeleaf.benchmark thrpt 5 14495.261 ± 1460.815 ops/s Velocity.benchmark thrpt 5 12071.498 ± 4226.219 ops/s

最新规则引擎性能测试,Score 越大越好

JfireEL>> Aviator=Beetl=Jexl3 >>Spel>>Mvel=Groovy>>Nashor

 Benchmark Mode Cnt Score Error Units Aviator.forExpresss thrpt 5 .321 ± 4657.336 ops/s Aviator.ifExpresss thrpt 5 .542 ± .101 ops/s Aviator.simpleExpress thrpt 5 .018 ± 38439.986 ops/s Beetl.forExpresss thrpt 5 .017 ± 28454.020 ops/s Beetl.ifExpresss thrpt 5 .443 ± 78687.317 ops/s Beetl.reflect thrpt 5 62972.088 ± 85785.390 ops/s Beetl.simpleExpress thrpt 5 .130 ± .699 ops/s Groovy.ifExpresss thrpt 5 .364 ± 1472.301 ops/s Groovy.simpleExpress thrpt 5 .720 ± 1533.726 ops/s Jexl3.forExpresss thrpt 5 .632 ± 42390.393 ops/s Jexl3.ifExpresss thrpt 5 .752 ± .400 ops/s Jexl3.simpleExpress thrpt 5 .173 ± .114 ops/s JfireEL.ifExpresss thrpt 5 .920 ± .385 ops/s JfireEL.simpleExpress thrpt 5 .084 ± .504 ops/s Mvel.forExpresss thrpt 5 11954.857 ± 84.105 ops/s Mvel.ifExpresss thrpt 5 .242 ± 1827.288 ops/s Mvel.simpleExpress thrpt 5 .646 ± 1320.717 ops/s Nashorn.ifExpresss thrpt 5 10010.541 ± 752.057 ops/s Nashorn.simpleExpress thrpt 5 8993.022 ± 518.940 ops/s Spel.ifExpresss thrpt 5 .540 ± 41826.542 ops/s Spel.simpleExpress thrpt 5 .839 ± 2553.017 ops/s 

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

更新内容:

[修复] common.js 没有被导入 layui 模块的问题。

[修复] 消息列表,不存在消息仍显示徽章提示的问题。

[修复] card-list 的 image 素大小异常。

[修复] layui-table 的 cell 内,pear-btn 无间隔。

[优化] common.js 中过时 api 调用。

[修复] table.css 表格列错位问题。

[修复] tab.js 部分方法无法使用的问题。

[修复] common.js 的 submit 请求同一个url参数缓存的问题。

[修复] drawer.html 页面错误的代码。

[升级] layui@2.8.0-rc.15

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

sms-aggregation 聚合短信发送工具

作者介绍

  • 名称:wind
  • dromara 开源组织成员,dromara/sms_aggregation 作者
  • java高级开发工程师,拥有丰富实战经验
  • 个人空间:https://gitee.com/MR-wind
  • 官方文档:https://wind.kim/

关于 SMS Aggregation

​ SMS Aggregation 是一款聚合短信发送工具,统一了各个厂商的发送功能和发送方法,省去学习不同短信厂商的差异化的时间,极简单的使用,可以让你在三分钟内完成短信发送功能的编写,并且额外添加了许多常用的工具和方法,让简单的事情回归简单的本质

Goland激活2023.1.1(GoLand 2023.1 发布)

使用

  1. 引入maven依赖
  2. 配置yml文件
  3. 注入统一接口
  4. 调用对应方法
  5. 完成短信发送

支持厂商

各个厂商正在不断的适配中,最新的支持请查看官网

  • 阿里云国内短信
  • 腾讯云国内短信
  • 华为云国内短信
  • 合一短信
  • 云片短信

配置文件

以下以阿里云短信为例

 

注入接口

 

调用对应方法

已发送标准短信为例

 

关注项目

对项目有什么想法或者建议,可以加我微信拉交流群,或者创建issues,一起完善项目

个人微信: Crazy-d1810

sms-aggregation 聚合短信发送工具

作者介绍

  • 名称:wind

  • dromara 开源组织成员,dromara/sms_aggregation 作者

  • java高级开发工程师,拥有丰富实战经验

  • 个人空间:https://gitee.com/MR-wind

  • 官方文档:https://wind.kim/

关于 SMS Aggregation

SMS Aggregation 是一款聚合短信发送工具,统一了各个厂商的发送功能和发送方法,省去学习不同短信厂商的差异化的时间,极简单的使用,可以让你在三分钟内完成短信发送功能的编写,并且额外添加了许多常用的工具和方法,让简单的事情回归简单的本质

图片

使用

  1. 引入maven依赖

  2. 配置yml文件

  3. 注入统一接口

  4. 调用对应方法

  5. 完成短信发送

支持厂商

各个厂商正在不断的适配中,最新的支持请查看官网

  • 阿里云国内短信

  • 腾讯云国内短信

  • 华为云国内短信

  • 合一短信

  • 云片短信

配置文件

以下以阿里云短信为例

 

注入接口

 

调用对应方法

已发送标准短信为例

 

关注项目

对项目有什么想法或者建议,可以加我微信拉交流群,或者创建issues,一起完善项目

个人微信

图片

关于 Dromara

Dromara 是由国内顶尖的开源项目作者共同组成的开源社区。提供包括分布式事务,流行工具,企业级认证,微服务RPC,运维监控,Agent监控,分布式日志,调度编排等一系列开源产品、解决方案与咨询、技术支持与培训认证服务。技术栈全面开源共建、 保持社区中立,致力于为全球用户提供微服务云原生解决方案。让参与的每一位开源爱好者,体会到开源的快乐。

Dromara开源社区目前拥有10+GVP项目,总star数量超过十万,构建了上万人的开源社区,有成千上万的个人及团队在使用Dromara社区的开源项目。

UKUI (Ultimate Kylin User Interface) 是由openKylin社区UKUI SIG组开发维护的一款轻量级 Linux 桌面环境,默认搭载于openKylin开源操作系统、优麒麟开源操作系统和银河麒麟商业发行版中,同时支持 Debian、Ubuntu、ArchLinux、openEuler 等十款主流 Linux 发行版。基于 QT 进行开发,注重易用性和敏捷度,可以不依赖其它套件而独自运行,给用户带来亲切和高效的使用体验。

为进一步提升用户体验,openKylin社区对UKUI网站https://www.ukui.org  )进行了全新改版升级,并已于近期正式上线。各位小伙伴你发现了吗?是否有给大家带来一些惊喜呢?现在就让小K给大家简单介绍一下全新UKUI网站具体都有哪些亮点升级吧。

一、内容全面更新

新版UKUI网站对内容进行了全新规划,菜单导航信息分类更清晰,提炼出设计、开发、参与、文档、公告五个模块,方便用户更快定位到自己想要查看的内容。

Goland激活2023.1.1(GoLand 2023.1 发布)
 

二、视觉全新设计

区别于以往的只有夜间模式,新版UKUI网站新增了白天模式,用户可随意切换成自己喜欢的模式。同时对2种模式下的页面布局进行了优化,页面整体更简洁大气,减轻大家浏览网页时的视觉疲劳。

Goland激活2023.1.1(GoLand 2023.1 发布)

三、中英文双语切换

新版UKUI网站支持中英文实时切换,同时满足国内和国际用户诉求。

Goland激活2023.1.1(GoLand 2023.1 发布)

 

四、全面兼容各种设备

新版UKUI网站全面考虑了在PC电脑端、平板端、移动端上等不同设备上的展示效果,保障网站页面信息在不同设备上均能良好展示。

Goland激活2023.1.1(GoLand 2023.1 发布)

欢迎各位小伙伴“https://www.ukui.org/  ”前往体验,如果在体验过程中发现问题或不足,欢迎大家前往openKylin小程序提交反馈~

Goland激活2023.1.1(GoLand 2023.1 发布)

openKylin(开放麒麟)社区旨在以“共创”为核心,在开源、自愿、平等、协作的基础上,通过开源、开放的方式与企业构建合作伙伴生态体系,共同打造桌面操作系统顶级社区,推动Linux开源技术及其软硬件生态繁荣发展。

社区首批理事成员单位包括麒麟软件、普华基础软件、中科方德、麒麟信安、凝思软件、一铭软件、中兴新支点、心科技、中国电科32所、技德系统、北京麟卓、先进操作系统创新中心等13家产业同仁和行业机构。

 

审核:openKylin

3月29日凌晨,腾讯旗下的微信和等业务曾出现崩溃状况,包括微信语音对话、朋友圈、微信支付,以及文件传输、空间和邮箱在内的多个功能无法使用。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

虽然该故障在当天稍晚时候就被修复,但腾讯仍然对本次事故开出了堪称严厉的处罚单。

根据界面新闻的独家报道,本次事故由广州电信机房冷却系统故障导致,腾讯将它定义为公司一级事故。

腾讯管理层认为,这次事故暴露出容灾设计方案和应急预案不完善的隐患,有关业务部门的风险防范意识不到位,所以对大量相关领导做出了处罚。其中包含公司高级执行副总裁、TEG(技术工程事业群)总裁卢山(LS)和WXG(微信事业群)副总裁周颢(harveyzhou)在内的管理者承担领导责任,被予以通报批评。值得注意的是,卢山目前为腾讯总办(腾讯总裁办公室,为公司最高决策机构)成员。

此外,TEG华南数据中心的两位总经理和总监被处以降级和免职处罚,WXG技术架构部的两位总监和组长当期绩效考核给予Underperform等评级(二星级别,最高为五星)。

vivo 互联网服务器团队- Shang Yongxing


MySQL Replication(主从复制)是指数据变化可以从一个MySQL Server被复制到另一个或多个MySQL Server上,通过复制的功能,可以在单点服务的基础上扩充数据库的高可用性、可扩展性等。


一、背景


MySQL在生产环境中被广泛地应用,大量的应用和服务都对MySQL服务存在重要的依赖关系,可以说如果数据层的MySQL实例发生故障,在不具备可靠降级策略的背景下就会直接引发上层业务,甚至用户使用的障碍;同时MySQL中存储的数据也是需要尽可能地减少丢失的风险,以避免故障时出现数据丢失引发的资产损失、客诉等影响。



在这样对服务可用性和数据可靠性需求的背景下,MySQL在Server层提供了一种可靠的基于日志的复制能力(MySQL Replication),在这一机制的作用下,可以轻易构建一个或者多个从库,提高数据库的高可用性可扩展性,同时实现负载均衡

  • 实时数据变化备份

    主库的写入数据会持续地在冗余的从库节点上被执行保留,减少数据丢失的风险

  • 横向拓展节点,支撑读写分离

    当主库本身承受压力较大时,可以将读流量分散到其它的从库节点上,达成读扩展性和负载均衡

  • 高可用性保障

    当主库发生故障时,可以快速的切到其某一个从库,并将该从库提升为主库,因为数据都一样,所以不会影响系统的运行


具备包括但不限于以上特性的MySQL集群就可以覆盖绝大多数应用和故障场景,具备较高的可用性与数据可靠性,当前存储组提供的生产环境MySQL就是基于默认的异步主从复制的集群,向业务保证可用性99.99%,数据可靠性99.9999%的在线数据库服务。


本文将深入探讨MySQL的复制机制实现的方式, 同时讨论如何具体地应用复制的能力来提升数据库的可用性,可靠性等。


二、复制的原理


2.1 Binlog 的引入


从比较宽泛的角度来探讨复制的原理,MySQL的Server之间通过二进制日志来实现实时数据变化的传输复制,这里的二进制日志是属于MySQL服务器的日志,记录了所有对MySQL所做的更改。这种复制模式也可以根据具体数据的特性分为三种:

  • Statement:基于语句格式

    Statement模式下,复制过程中向获取数据的从库发送的就是在主库上执行的SQL原句,主库会将执行的SQL原有发送到从库中。

  • Row:基于行格式

    Row模式下,主库会将每次DML操作引发的数据具体行变化记录在Binlog中并复制到从库上,从库根据行的变更记录来对应地修改数据,但DDL类型的操作依然是以Statement的格式记录。

  • Mixed:基于混合语句和行格式

    MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。


最早的实现是基于语句格式,在3.23版本被引入MySQL,从最初起就是MySQL Server层的能力,这一点与具体使用的存储引擎没有关联;在5.1版本后开始支持基于行格式的复制;在5.1.8版本后开始支持混合格式的复制。


这三种模式各有优劣,相对来说,基于Row的行格式被应用的更广泛,虽然这种模式下对资源的开销会偏大,但数据变化的准确性以及可靠性是要强于Statement格式的,同时这种模式下的Binlog提供了完整的数据变更信息,可以使其应用不被局限在MySQL集群系统内,可以被例如Binlogserver,DTS数据传输等服务应用,提供灵活的跨系统数据传输能力, 目前互联网业务的在线MySQL集群全部都是基于Row行格式的Binlog

2.2  Binlog 的要点


2.2.1 Binlog事件类型


对于Binlog的定义而言,可以认为是一个个单一的Event组成的序列,这些单独的Event可以主要分为以下几类:

Goland激活2023.1.1(GoLand 2023.1 发布)


各类Event出现是具有显著的规律的:

  • XID_EVENT标志一个事务的结尾

  • 当发生了DDL类型的QUERY_EVENT,那么也是一次事务的结束提交点,且不会出现XID_EVENT

  • GTID_EVENT只有开启了GTID_MODE(MySQL版本大于5.6)

  • TABLE_MAP_EVENT必定出现在某个表的变更数据前,存在一对多个ROW_EVENT的情况


除了上面和数据更贴近的事件类型外,还有ROTATE_EVENT(标识Binlog文件发生了切分),FORMAT_DESCRIPTION_EVENT(定义数据格式)等。


2.2.2 Binlog的生命周期


Binlog和Innodb Log(redolog)的存在方式是不同的,它并不会轮转重复覆写文件,Server会根据配置的单个Binlog文件大小配置不断地切分并产生新的Binlog,在一个.index文件记录当前硬盘上所有的binlog文件名,同时根据Binlog过期时间回收删除掉过期的Binlog文件,这两个在目前自建数据库的配置为单个大小1G,保留7天。


所以这种机制背景下,只能在短期内追溯历史数据的状态,而不可能完整追溯数据库的数据变化的,除非是还没有发生过日志过期回收的Server。 


2.2.3 Binlog事件示例


Binlog是对Server层生效的,即使没有从库正在复制主库,只要在配置中开启了log_bin,就会在对应的本地目录存储binlog文件,使用mysqlbinlog打开一个Row格式的示例binlog文件:

Goland激活2023.1.1(GoLand 2023.1 发布)


如上图,可以很明显地注意到三个操作,创建数据库test, 创建数据表test, 一次写入引发的行变更,可读语句(create, alter, drop, begin, commit…..)都可以认为是QUERY_EVENT,而Write_rows就属于ROW_EVENT中的一种。


在复制的过程中,就是这样的Binlog数据通过建立的连接发送到从库,等待从库处理并应用。


2.2.4 复制基准值


Binlog在产生时是严格有序的,但它本身只具备秒级的物理时间戳,所以依赖时间进行定位或排序是不可靠的,同一秒可能有成百上千的事件,同时对于复制节点而言,也需要有效可靠的记录值来定位Binlog中的水位,MySQL Binlog支持两种形式的复制基准值,分别是传统的Binlog File:Binlog Position模式,以及5.6版本后可用的全局事务序号GTID。


  • FILE Position

只要开启了log_bin,MySQL就会具有File Position的位点记录,这一点不受GTID影响。


这个概念相对来说更直观,可以直接理解为当前处在File对应编号的Binlog文件中,同时已经产生了合计Position bytes的数据,如例子中所示即该实例已经产生了 bytes的Binlog,这个值在对应机器直接查看文件的大小也是匹配的,所以File Postion就是文件序列与大小的对应值。


基于这种模式开启复制,需要显式地在复制关系中指定对应的File和Position:


这个值必须要准确,因为这种模式下从库获取的数据完全取决于有效的开启点,那么如果存在偏差,就会丢失或执行重复数据导致复制中断。


  • GTID

MySQL 会在开启GTID_MODE=ON的状态下,为每一个事务分配唯一的全局事务ID,格式为:server_uuid:id



其中e2e0a733-3478-11eb-90fe-b4055d009f6c用于唯一地标识产生该Binlog事件的实例,1-753表示已经产生或接收了由e2e0a733-3478-11eb-90fe-b4055d009f6c实例产生的753个事务;


从库在从主库获取Binlog Event时,自身的执行记录会保持和获取的主库Binlog GTID记录一致,还是以e2e0a733-3478-11eb-90fe-b4055d009f6c:1-753,如果有从库对e2e0a733-3478-11eb-90fe-b4055d009f6c开启了复制,那么在从库自身执行show master status也是会看到相同的值。


如果说从库上可以看到和复制的主库不一致的值,那么可以认为是存在errant GTID,这个一般是由于主从切换或强制在从库上执行了写操作引发,正常情况下从库的Binlog GTID应该和主库的保持一致;


基于这种模式开启复制,不需要像File Position一样指定具体的值,只需要设置:



从库在读取到Binlog后,会自动根据自身Executed_GTID_Set记录比对是否存在已执行或未执行的Binlog事务,并做对应的忽略和执行操作。


2.3 复制的具体流程


2.3.1 基本复制流程


当主库已经开启了binlog( log_bin = ON ),并正常地记录binlog,如何开启复制?


这里以MySQL默认的异步复制模式进行介绍:

  1. 首先从库启动I/O线程,跟主库建立客户端连接。

  2. 主库启动binlog dump线程,读取主库上的binlog event发送给从库的I/O线程,I/O线程获取到binlog event之后将其写入到自己的Relay Log中。

  3. 从库启动SQL线程,将等待Relay中的数据进行重放,完成从库的数据更新。

总结来说,主库上只会有一个线程,而从库上则会有两个线程。

Goland激活2023.1.1(GoLand 2023.1 发布)


  • 时序关系

当集群进入运行的状态时,从库会持续地从主库接收到Binlog事件,并做对应的处理,那么这个过程中将会按照下述的数据流转方式:

  1. Master将数据更改记录在Binlog中,BinlogDump Thread接到写入请求后,读取对应的Binlog

  2. Binlog信息推送给Slave的I/O Thread。

  3. Slave的I/O 线程将读取到的Binlog信息写入到本地Relay Log中。

  4. Slave的SQL 线程读取Relay Log中内容在从库上执行。


Goland激活2023.1.1(GoLand 2023.1 发布)

上述过程都是异步操作,所以在某些涉及到大的变更,例如DDL改变字段,影响行数较大的写入、更新或删除操作都会导致主从间的延迟激增,针对延迟的场景,高版本的MySQL逐步引入了一些新的特性来帮助提高事务在从库重放的速度。


  • Relay Log的意义

Relay log在本质上可以认为和binlog是等同的日志文件,即使是直接在本地打开两者也只能发现很少的差异;


Binlog Version 3 (MySQL 4.0.2 – < 5.0.0)

added the relay logs and changed the meaning of the log position


在MySQL 4.0 之前是没有Relay Log这部分的,整个过程中只有两个线程。但是这样也带来一个问题,那就是复制的过程需要同步的进行,很容易被影响,而且效率不高。例如主库必须要等待从库读取完了才能发送下一个binlog事件。这就有点类似于一个阻塞的信道和非阻塞的信道。


在流程中新增Relay Log中继日志后,让原本同步的获取事件、重放事件解耦了,两个步骤可以异步的进行,Relay Log充当了缓冲区的作用。Relay Log包含一个relay-log.info的文件,用于记录当前复制的进度,下一个事件从什么Pos开始写入,该文件由SQL线程负责更新。


对于后续逐渐引入的特殊复制模式,会存在一些差异,但整体来说,是按照这个流程来完成的。


2.3.2 半同步复制


异步复制的场景下,不能确保从库实时更新到和主库一致的状态,那么如果在出现延迟的背景下发生主库故障,那么两者间的差异数据还是无法进行保障,同时也无法在这种情况下进行读写分离,而如果说由异步改为完全同步,那么性能开销上又会大幅提高,很难满足实际使用的需求。


基于这一的背景,MySQL从5.5版本开始引入了半同步复制机制来降低数据丢失的概率,在这种复制模式中,MySQL让Master在某一个时间点等待一个Slave节点的 ACK(Acknowledge Character)消息,接收到ACK消息后才进行事务提交,这样既可以减少对性能的影响,还可以相对异步复制获得更强的数据可靠性。


介绍半同步复制之前先快速过一下 MySQL 事务写入碰到主从复制时的完整过程,主库事务写入分为 4个步骤:

  1. InnoDB Redo File Write (Prepare Write)

  2. Binlog File Flush & Sync to Binlog File

  3. InnoDB Redo File Commit(Commit Write)

  4. Send Binlog to Slave


  • 当Master不需要关注Slave是否接受到Binlog Event时,即为异步主从复制

  • 当Master需要在第3步Commit Write回复客户端前等待Slave的ACK时,为半同步复制(after-commit)

  • 当Master需要在第2步Flush&Sync,即Commit前等待Slave的ACK时,为增强半同步复制(after-sync)


  • 时序关系

从半同步复制的时序图来看,实际上只是在主库Commit的环节多了等待接收从库ACK的阶段,这里只需要收到一个从节点的ACK即可继续正常的处理流程,这种模式下,即使主库宕机了,也能至少保证有一个从库节点是可以用的,此外还减少了同步时的等待时间。


Goland激活2023.1.1(GoLand 2023.1 发布)

2.3.3 小结


在当前生产环境的在线数据库版本背景下,由MySQL官方提供的复制方式主要如上文介绍的内容,当然目前有还很多基于MySQL或兼容MySQL的衍生数据库产品,能在可用性和可靠性上做更大的提升,本文就不继续展开这部分的描述。


2.4 复制的特性


目前已经提及的复制方式,存在一个显著的特性:无法回避数据延迟的场景,异步复制会使得从库的数据落后,而半同步复制则会阻塞主库的写入,影响性能。


MySQL早期的复制模式中,从库的IO线程和SQL线程本质上都是串行获取事件并读取重放的,只有一个线程负责执行Relaylog,但主库本身接收请求是可以并发地,性能上限只取决于机器资源瓶颈和MySQL处理能力的上限,主库的执行和从库的执行(SQL线程应用事件)是很难对齐的,这里引用一组测试数据:

  • 机器:64核 256G,MySQL 5.7.29

  • 测试场景:常规的INSERT,UPDATE压测场景

  • 结果:MySQL Server的IO线程速度以网络上的数据量评估,每秒超过100MB,正常是可以覆盖业务使用的,然而SQL线程的预估速度只有21~23MB/s,如果是涉及UPDATE场景,性能还会减少;

  • 需要注意的是,以上结果是在高版本的MySQL具备并行复制能力的前提下取得,如果是不具备该特性的版本,性能会更差。


期望业务层限制使用是不现实的,MySQL则在5.6版本开始尝试引入可用的并行复制方案,总的来说,都是通过尝试加强在从库层面的应用速度的方式。


2.4.1 基于Schema级别的并行复制


基于库级别的并行复制是出于一个非常简易的原则,实例中不同Database/Schema内的数据以及数据变更是无关的,可以并行去处置。


在这种模式中,MySQL的从节点会启动多个WorkThread ,而原来负责回放的SQLThread会转变成Coordinator角色,负责判断事务能否并行执行并分发给WorkThread。


如果事务分别属于不同的Schema,并且不是DDL语句,同时没有跨Schema操作,那么就可以并行回放,否则需要等所有Worker线程执行完成后再执行当前日志中的内容。



对于从库而言,如果接收到了来自主库的aksay_record以及proxy_encrypt内的数据变更,那么它是可以同时去处理这两部分Schema的数据的。


但是这种方式也存在明显缺陷和不足,首先只有多个Schema流量均衡的情况下才会有较大的性能改善,但如果存在热点表或实例上只有一个Schema有数据变更,那么这种并行模式和早期的串行复制也不存在差异;同样,虽然不同Schema的数据是没有关联,这样并行执行也会影响事务的执行顺序,某种程度来说,整个Server的因果一致性被破坏了。


2.4.2 基于组提交的复制(Group Commit)


基于Schema的并行复制在大部分场景是没有效力的,例如一库多表的情况下,但改变从库的单执行线程的思路被延续了下来,在5.7版本新增加了一种基于事务组提交的并行复制方式,在具体介绍应用在复制中的组提交策略前,需要先介绍Server本身Innodb引擎提交事务的逻辑:


Binlog的落盘是基于sync_binlog的配置来的,正常情况都是取sync_binlog=1,即每次事务提交就发起fsync刷盘。


主库在大规模并发执行事务时,因为每个事务都触发加锁落盘,反而使得所有的Binlog串行落盘,成为性能上的瓶颈。针对这个问题,MySQL本身在5.6版本引入了事务的组提交能力(这里并不是指在从库上应用的逻辑),设计原理很容易理解,只要是能在同一个时间取得资源,开启Prepare的所有事务,都是可以同时提交的。


在主库具有这一能力的背景下,可以很容易得发现从库也可以应用相似的机制来并行地去执行事务,下面介绍MySQL具体实现经历的两个阶段:


  • 基于Commit-Parents-Based

    MySQL中写入是基于锁的并发控制,所以所有在Master端同时处于Prepare阶段且未提交的事务就不会存在锁冲突,在Slave端执行时都可以并行执行。


    因此可以在所有的事务进入prepare阶段的时候标记上一个logical timestamp(实现中使用上一个提交事务的sequence_number),在Slave端同样timestamp的事务就可以并发执行。


    但这种模式会依赖上一个事务组的提交,如果本身是不受资源限制的并发事务,却会因为它的commit-parent没有提交而无法执行;


  • 基于Logic-Based

    针对Commit-Parent-Based中存在的限制进行了解除,纯粹的理解就是只有当前事务的sequence_number一致就可以并发执行,只根据是否能取得锁且无冲突的情况即可以并发执行,而不是依赖上一个已提交事务的sequence_number。


三、应用


当前vivo的在线MySQL数据库服务标准架构是基于一主一从一离线的异步复制集群,其中一从用于业务读请求分离,离线节点不提供读服务,提供给大数据离线和实时抽数/DB平台查询以及备份系统使用;针对这样的应用背景,存储研发组针对MySQL场景提供了两种额外的扩展服务:


3.1 应用高可用系统+中间件


虽然MySQL的主从复制可以提高系统的高可用性,但是MySQL在5.6,5.7版本是不具备类似Redis的自动故障转移的能力,如果主库宕机后不进行干预,业务实际上是无法正常写入的,故障时间较长的情况下,分离在从库上的读也会变得不可靠。


3.1.1 VSQL(原高可用2.0架构)


那么在当前这样标准一主二从架构的基础上,为系统增加HA高可用组件以及中间件组件强化MySQL服务的高可用性、读拓展性、数据可靠性:

  • HA组件管理MySQL的复制拓扑,负责监控集群的健康状态,管理故障场景下的自动故障转移;

  • 中间件Proxy用于管理流量,应对原有域名场景下变更解析慢或缓存不生效的问题,控制读写分离、实现IP、SQL的黑白名单等;


Goland激活2023.1.1(GoLand 2023.1 发布)

3.1.2 数据可靠性强化


数据本身还是依赖MySQL原生的主从复制模式在集群中同步,这样仍然存在异步复制本身的风险,发生主库宕机时,如果从库上存在还未接收到的主库数据,这部分就会丢失,针对这个场景,我们提供了三种可行的方案:


  • 日志远程复制

配置HA的中心节点和全网MySQL机器的登录机器后,按照经典的MHA日志文件复制补偿方案来保障故障时的数据不丢失,操作上即HA节点会访问故障节点的本地文件目录读取候选主节点缺失的Binlog数据并在候选主上重放。


优势

  • 与1.0的MHA方案保持一致,可以直接使用旧的机制

  • 机制改造后可以混合在高可用的能力内,不需要机器间的免密互信,降低权限需求和安全风险


劣势

  • 不一定可用,需要故障节点所在机器可访达且硬盘正常,无法应对硬件或网络异常的情况

  • 网络上链路较长,可能无法控制中间重放日志的耗时,导致服务较长时间不可用


Goland激活2023.1.1(GoLand 2023.1 发布)

  • 日志集中存储

依赖数据传输服务中的BinlogServer模块,提供Binlog日志的集中存储能力,HA组件同时管理MySQL集群以及BinlogServer,强化MySQL架构的健壮性,真实从库的复制关系全部建立在BinlogServer上,不直接连接主库。


优势

  • 可以自定义日志的存储形式:文件系统或其它共享存储模式

  • 不涉及机器可用和权限的问题

  • 间接提高binlog的保存安全性(备份)


劣势

  • 额外的资源使用,如果需要保留较长时间的日志,资源使用量较大

  • 如果不开启半同步,也不能保证所有的binlog日志都能被采集到,即使采集(相当于IO线程)速度远超relay速度,极限约110MB/s

  • 系统复杂度提升,需要承受引入额外链路的风险


  • 改变为半同步复制

MySQL集群开启半同步复制,通过配置防止退化(风险较大),Agent本身支持半同步集群的相关监控,可以减少故障切换时日志丢失的量(相比异步复制)


优势

  • MySQL原生的机制,不需要引入额外的风险

  • 本质上就是在强化高可用的能力(MySQL集群本身)

  • HA组件可以无缝接入开启半同步的集群,不需要任何改造


劣势

  • 存在不兼容的版本,不一定可以开启

  • 业务可能无法接受性能下降的后果

  • 半同步不能保证完全不丢数据,Agent本身机制实际上是优先选择“执行最多”的从节点而不是“日志最多”的从节点


orchestrator will promote the replica which has executed more events rather than the replica which has more data in the relay logs.


目前来说,我们采用的是日志远程复制的方案,同时今年在规划集中存储的BinlogServer方案来强化数据安全性;不过值得一提的是,半同步也是一种有效可行的方式,对于读多写少的业务实际上是可以考虑升级集群的能力,这样本质上也可以保证分离读流量的准确性。


3.2 数据传输服务


3.2.1 基于Binlog的跨系统数据流转


通过利用Binlog,实时地将MySQL的数据流转到其它系统,包括MySQL,ElasticSearch,Kafka等MQ已经是一种非常经典的应用场景了,MySQL原生提供的这种变化数据同步的能力使其可以有效地在各个系统间实时联动,DTS(数据传输服务)针对MySQL的采集也是基于和前文介绍的复制原理一致的方法,这里介绍我们是如何利用和MySQL 从节点相同的机制去获取数据的,也是对于完整开启复制的拓展介绍:


(1)如何获取Binlog


比较常规的方式有两种:

  • 监听Binlog文件,类似日志采集系统的操作

  • MySQL Slave的机制,采集者伪装成Slave来实现


本文只介绍第二种,Fake Slave的实现方式

Goland激活2023.1.1(GoLand 2023.1 发布)


(2)注册Slave身份


这里以GO SDK为例,GO的byte范围是0~255,其它语言做对应转换即可。


  1. 第0-3位为0,无意义

  2. 第4位是MySQL协议中的Command_Register_Slave,byte值为21

  3. 第5-8位是当前实例预设的server_id(非uuid,是一个数值)使用小端编码成的4个字节

  4. 接下来的若干位是把当前实例的hostname,user,password

  5. 接下来的2位是小端编码的port端口值

  6. 最后8位一般都置为0,其中最后4位指master_id,伪装slave设置为0即可


(3)发起复制指令


Goland激活2023.1.1(GoLand 2023.1 发布)

  1. 第0-3位同样置为0,无特殊意义

  2. 第4位是MySQL协议的Command_Binlog_Dump,byte值为18

  3. 第5-8位是Binlog Position值的小端序编码产生的4位字节

  4. 第9-10位是MySQL Dump的类别,默认是0,指Binlog_Dump_Never_Stop,即编码成2个0值

  5. 第11-14位是实例的server_id(非uuid)基于小端编码的四个字节值

  6. 最后若干位即直接追加Binlog File名称


以上两个命令通过客户端连接执行后,就可以在主库上观察到一个有效的复制连接。


Goland激活2023.1.1(GoLand 2023.1 发布)

3.2.2 利用并行复制模式提升性能


以上两个命令通过客户端连接执行后,就可以在主库上观察到一个有效的复制连接。

根据早期的性能测试结果,不做任何优化,直接单连接重放源集群数据,在网络上的平均传输速度在7.3MB/s左右,即使是和MySQL的SQL Relay速度相比也是相差很远,在高压场景下很难满足需求。


DTS消费单实现了对消费自kafka的事件的事务重组以及并发的事务解析工作,但实际最终执行还是串行单线程地向MySQL回放,这一过程使得性能瓶颈完全集中在了串行执行这一步骤。

  1. MySQL 5.7版本以前,会利用事务的Schema属性,使不同db下的DML操作可以在备库并发回放。在优化后,可以做到不同表table下并发。但是如果业务在Master端高并发写入一个库(或者优化后的表),那么slave端就会出现较大的延迟。基于schema的并行复制,Slave作为只读实例提供读取功能时候可以保证同schema下事务的因果序(Causal Consistency,本文讨论Consistency的时候均假设Slave端为只读),而无法保证不同schema间的。例如当业务关注事务执行先后顺序时候,在Master端db1写入T1,收到T1返回后,才在db2执行T2。但在Slave端可能先读取到T2的数据,才读取到T1的数据。


  2. MySQL 5.7的LOGICAL CLOCK并行复制,解除了schema的限制,使得在主库对一个db或一张表并发执行的事务到slave端也可以并行执行。Logical Clock并行复制的实现,最初是Commit-Parent-Based方式,同一个commit parent的事务可以并发执行。但这种方式会存在可以保证没有冲突的事务不可以并发,事务一定要等到前一个commit parent group的事务全部回放完才能执行。后面优化为Lock-Based方式,做到只要事务和当前执行事务的Lock Interval都存在重叠,即保证了Master端没有锁冲突,就可以在Slave端并发执行。LOGICAL CLOCK可以保证非并发执行事务,即当一个事务T1执行完后另一个事务T2再开始执行场景下的Causal Consistency。


(1)连接池改造


旧版的DTS的每一个消费任务只有一条维持的MySQL长连接,该消费链路的所有的事务都在这条长连接上串行执行,产生了极大的性能瓶颈,那么考虑到并发执行事务的需求,不可能对连接进行并发复用,所以需要改造原本的单连接对象,提升到近似连接池的机制。


go-mysql/client包本身不包含连接池模式,这里基于事务并发解析的并发度在启动时,扩展存活连接的数量。



(2)并发选择连接


  • 利用逻辑时钟

开启GTID复制的模式下,binlog中的GTID_EVENT的正文内会包含两个值:


lastCommitted是我们并发的依据,原则上,LastCommitted相等事务可以并发执行,结合原本事务并发解析完成后会产生并发度(配置值)数量的事务集合,那么对这个列表进行分析判断,进行事务到连接池的分配,实现一种近似负载均衡的机制。


  • 非并发项互斥

对于并发执行的场景,可以比较简单地使用类似负载均衡的机制,从连接池中遍历mysql connection执行对应的事务;但需要注意到的是,源的事务本身是具有顺序的,在logical-clock的场景下,存在部分并发prepare的事务是可以被并发执行的,但仍然有相当一部分的事务是不可并发执行,它们显然是分散于整个事务队列中,可以认为并发事务(最少2个)是被不可并发事务包围的:


假定存在一个事务队列有6个素,其中只有t1、t2和t5、t6可以并发执行,那么执行t3时,需要t1、t2已经执行完毕,执行t5时需要t3,t4都执行完毕。

Goland激活2023.1.1(GoLand 2023.1 发布)

(3)校验点更新


在并发的事务执行场景下,存在水位低的事务后执行完,而水位高的事务先执行完,那么依照原本的机制,更低的水位会覆盖掉更高的水位,存在一定的风险:

  1. Write_Event的构造SQL调整为replace into,可以回避冲突重复的写事件;Update和Delete可以基于逻辑时钟的并发保障,不会出现。

  2. 水位只会向上提升,不会向下降低。


但不论怎样进行优化,并发执行事务必然会引入更多的风险,例如并发事务的回滚无法控制,目标实例和源实例的因果一致性被破坏等,业务可以根据自身的需要进行权衡,是否开启并发的执行。

基于逻辑时钟并发执行事务改造后,消费端的执行性能在同等的测试场景下,可以从7.3MB/s提升到13.4MB/s左右。


(4)小结

基于消费任务本身的库、表过滤,可以实现另一种形式下的并发执行,可以启动复数的消费任务分别支持不同的库、表,这也是利用了kafka的多消费者组支持,可以横向扩展以提高并发性能,适用于数据迁移场景,这一部分可以专门提供支持。


而基于逻辑时钟的方式,对于目前现网大规模存在的未开启GTID的集群是无效的,所以这一部分我们也一直在寻找更优的解决方案,例如更高版本的特性Write Set的合并等,继续做性能优化。


四、总结


最后,关于MySQL的复制能力不仅对于MySQL数据库服务本身的可用性、可靠性有巨大的提升,也提供了Binlog这一非常灵活的开放式的数据接口用于扩展数据的应用范围,通过利用这个“接口”,很容易就可以达成数据在多个不同存储结构、环境的实时同步,未来存储组也将会聚焦于BinlogServer这一扩展服务来强化MySQL的架构,包括但不限于数据安全性保障以及对下游数据链路的开放等。


参考资料:

  • MySQL官方文档

  • 数据库内核月报



END

猜你喜欢

  • Hive 和 Spark 分区策略剖析

  • Bigkey 问题的解决思路与方式探索

  • 云原生时代数据库运维体系演进

前言

监控指标诚然是发现问题于微末之时的极佳手段,但指标往往有其表达的极限。在很多情况下,单独看一个黄金指标并不能表征系统的健康程度,反而有可能被其迷惑,进而忽略相关问题。(本文所提及的Linux Kernel源码版本为4.18.10)

Bug现场

某天中午,某应用的999线突然升高。由于是个QPS高达几十万的查询服务,1分钟的升高就会影响数千个请求。初步判断应用容量不够,直接进行相关扩容,扩容后反而加剧了问题!不得已又做了一次紧急扩容,999线才恢复。这两波操作过去,20多分钟已经过去了。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

为了防止问题再次发生,我们必须要彻查相关原因。于是笔者也就参与了调查。

Young GC升高

首先是去看常用的指标,例如CPU idle, GC Time。发现有一些机器的CPU达到了60%,而在这些机器中,young gc有一个大幅度的增长。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

为什么Young GC升高

看上去GC问题。那么,笔者就开始思考为什么young gc升高。翻看gc日志。看到故障期间,不停的young gc。但这些young gc的表现很诡异。有时候young gc很快,只有数十毫秒,有时确达到了数百毫秒。而且这个耗时的跳跃没什么规律,不是从某个时间点之后就一直是数百毫秒,而是数十和数百一直参杂着。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

观察young GC的详细输出,在数百毫秒的young GC时间里,大部分时间都在[Object Copy]上。令人奇怪的是。其Copy的Object大小确实差不多的。而这是个非常单纯的查询服务,故障期间,它的流量分布以及对应的Object分布不应该有非常大的变化。那么究竟是什么原因让同样大小以及数量的Object Copy会有十倍的差距呢?

再仔细观察,不仅仅是Object Copy,在其它的GC阶段也会出现时间暴涨的情况,只不过大部分集中在Object Copy而已。仅仅靠这些信息是无法看出来相关问题的。

为什么只有部分机器Young GC升高

继续观察监控,发现问题出现在一部分机器上。而这部分机器都在一个机房(B机房)里面。另一个机房(A机房)的机器没有受任何影响。当然,出问题的机器都出现了Young GC飙高的现象。难道两个机房的流量分布不一样?经过一番统计,发现接口的调用分布只是略微有些不同。但细细思考一下,如果是机房流量分布不一样,由于同机房是负载均衡的。要出问题,也是同机房都出问题。但问题只集中B机房的一部分机器中。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

寻找这些机器的共同特征

young gc都大幅升高

那么既然只有一部分机器出问题。那么笔者开始搜索起这些机器的共同特征。young gc在这部分机器耗时都大幅增长。但由于笔者尚不能通过gc日志找出原因。那么就寻找了其它特征。

CPU.Busy

首先,是CPU.busy指标。笔者发现,出问题的机器CPU都在60%左右。但是,正常的节点CPU也有60%的,也有50%的,特征不是很明显。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

delta_nr_throttled和delta_throttled_time

在笔者观察某台故障机器监控指标的时候发现,发现delta_nr_throttled和delta_throttled_time这个指标大幅度升高。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

我们看下这两个指标的含义


由于线上应用这边采用的是docker容器,所以会有这两个指标。而这两个指标表明了,这个CGroup由于CPU消耗太高而被宿主机的Kernel限制运行。而令人奇怪的是,这些机器的CPU最多只有60%左右,按理来说只有达到100%才能被限制(throttled/limit)。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

宿主机CPU飙升

既然是宿主机限制了相关docker容器,那么很自然的联想到宿主机出了问题。统计了一下出故障容器在宿主机上的分布。发现出问题的所有容器都是集中出现在两台宿主机上!

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

查看了下这两台宿主机的CPU Busy,发现平均已经90%多了。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

宿主机超卖

详细观察了下这两个宿主机,发现它们超卖非常严重。而且当前这个出问题的应用非常集中的部署在这两个宿主机上。一台48核的宿主机,仅仅出问题的这个应用就分配了10个,而且分配的资源是每个容器8核(实际上是时间片)。那么按照,每个容器使用了60%计算,正好用满了这个宿主机的核


 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

为什么第一次扩容后加剧了问题

因为这次是通过API自动扩容,而由于打散度计算的原因,还是扩容到了这两台已经不堪重负的CPU上。同时应用启动加载时候的CPU消耗也加剧了宿主机CPU的消耗。

为什么第二次扩容之后999线恢复正常

因为第二次直接通过API手动扩容,一次性在10多台宿主机上机器上扩了一倍的机器。这样分配在这两台不堪重负的宿主机上的应用流量降低到一半左右。进而使得999线恢复正常。

为什么容器相关的CPU busy在宿主机已经接近100%的情况下,依旧只展示60%的

很明显的,容器的CPU Busy在很大程度上误导了我们的决策。在之前的容量压测中,压到期望的TPS时候CPU Busy只有50%多,而且基本是按照TPS线性增长的,就使得我们觉得这个应用在当前的资源下容量是绰绰有余。毕竟CPU Busy显示的还是非常健康的。

但没想到,在压测CPU 50%多的时候,其实已经到了整个应用容量的极限。线上的流量和压测流量的构造有稍微一点的区别,让CPU涨了个5%左右,过了那个宿主机CPU的临界点,进而就导致了应用出现了非常高的999线。

容器CPU busy和idle的计算

为了探究这个问题,笔者就不得不看下容器的CPU busy是如何计算出来的。毕竟Linux的CGroup并没有提供CPU Busy这个指标。翻阅了一下监控的计算公式。


 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

那么我们可以看一下cpuacct.usage是如何计算的。Kernel的代码实现为:


由代码可见,其计算是将所有CPU中的关于当前CGroup的cpuusage->usages中的user和system time相加,进而获取到最终此。那么我们可以进一步看下CGroup中的cpuusage是如何计算的。这边笔者以我们常用的CFS(完全公平调度的代码实现为例):


由上面代码可知,kernel会在进程间切换的时候,将当前进程的运行时间记入到相关。那么就是这个cputime的计算了。


好了,翻了一大堆代码,我们的cpuusage实际上就是这个cgroup在这一次CFS的kernel调度时间片中实际运行的时间。而我们的应用主要是一个Java进程,那么其基本就是这个Java进程运行了多长时间。值得注意的是,每个CPU的调度都会进行这样的计算。如下图所示:

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

 

那么我们来看一下在超卖情况下的表现。如下图所示:

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

 

(图中1.25s只是为了绘图方便,实际调度时间切片非常小)

如果超卖了,而且进程都比较繁忙,那么每个CGroup肯定不能完全的占用宿主机的CPU。指定到某个CPU上就势必会有多个CGroup交替进行。而之前的容器CPU.Busy计算公式


反应的实际上是这个容器在这个CPU(核)上运行了多长时间。而完全不能反应CPU的繁忙程度。

如果不超卖,每个CGroup被均匀的分到各自的CPU上互不影响(当然如果cgroup绑核了那隔离性更好),那么这个计算公式才能够比较准确的反映CPU的情况。

nr_throttled和throttled_time

在Kernel中这两个参数表示由于分配给Cgroup的cfs_quota_us时间片额度用完。进而导致被内核限制,限制的次数为nr_throttled,限制的总时间为throttled_time。


但这边和上面的推论有一个矛盾的点,如果由于CPU超卖而引起的问题的话。那么每个CGroup并不能分到800ms这样总的时间片。因为按照上面的推算,每个CGroup最多分到60% * 800=480ms的时间片。而这个时间片是不应该触发nr_throttled和throttled_time的!

 

Goland激活2023.1.1(GoLand 2023.1 发布)

就在笔者对着Kernel源码百思不得其解之际,笔者发现Linux Kernel在5.4版本有个优化


也就是说在5.4版本之前,在一些场景下low cpu usage依旧能导致cgroup被throttled。而这个场景即是:


出故障的应用使用了大量的线程去处理请求,同时也有大量的IO操作(操作分布式缓存),符合此Bug的描述。

# 那么到底是内核Bug还是超卖是主因呢?

这个疑问当然靠对比来解决,我们在故障之后,做了一次压测(CPU.Busy > 60%),这次应用是不超卖的。这次delta_nr_throttled和delta_throttled_time依旧存在,不过比故障时的数量少了一个数量级。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

同时999线从故障时候的暴涨6倍变成了只增长1倍。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

很明显的,宿主机超卖是主因!而且宿主机超卖后的宿主机CPU负载过高还加重了这个Bug的触发。

关于Cgroup的核数分配

线上的Cgroup(容器)的核数分配实际上是按照(核数=cfs_quota_us/cfs_period_us)这个模型去分配的,同时并不会在cpuset进行绑核。也就是说一个48核的容器,应用的各个线程可以跑在任何一个核上,只不过只分配了8核的时间片额度。这就利用了Cgroup的带宽控制机制CFS_BANDWITH。

改进措施

很明显的改进措施可以是下面几种:


为什么Young GC会变慢

回过头来看看young gc为什么会慢就很明显了。因为在young gc时候,被shedule出去了,而且没有其它的空闲CPU让jvm可以schedule回来,白白浪费了很长时间。

因为object copy在这个应用的young gc中是最耗费CPU以及时间的操作,所以自然在object copy阶段出现变慢的现象。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

当然,进程schedule可以处在各种时间点,所以并不仅仅是Young GC变慢了,在请求处理阶段也可能变慢。

总结

指标虽然能够比较准确且客观的反映两个时间点的变化。但指标的定义和对指标的解读确实比较主观的,没有理解清楚指标所能表达的极限以及使用场景。往往会让我们排查问题进入误区!

Goland激活2023.1.1(GoLand 2023.1 发布)

摘要:Redis事务包含两种模式:事务模式和Lua脚本。

本文分享自华为云社区《一文讲透 Redis 事务》,作者: 勇哥java实战分享。

Goland激活2023.1.1(GoLand 2023.1 发布)

准确的讲,Redis事务包含两种模式:事务模式Lua脚本

先说结论:

Redis的事务模式具备如下特点:

  • 保证隔离性;
  • 无法保证持久性;
  • 具备了一定的原子性,但不支持回滚;
  • 一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis 的事务可以保证一致性。

但Lua脚本更具备实用场景,它是另一种形式的事务,他具备一定的原子性,但脚本报错的情况下,事务并不会回滚。Lua脚本可以保证隔离性,而且可以完美的支持后面的步骤依赖前面步骤的结果

Lua脚本模式的身影几乎无处不在,比如分布式锁、延迟队列、抢红包等场景。

1 事务原理

Redis的事务包含如下命令:

Goland激活2023.1.1(GoLand 2023.1 发布)

事务包含三个阶段:

  1. 事务开启,使用 MULTI , 该命令标志着执行该命令的客户端从非事务状态切换至事务状态 ;
  2. 命令入队,MULTI 开启事务之后,客户端的命令并不会被立即执行,而是放入一个事务队列 ;
  3. 执行事务或者丢弃。如果收到 EXEC 的命令,事务队列里的命令将会被执行 ,如果是 DISCARD 则事务被丢弃。

下面展示一个事务的例子。


这里有一个疑问?在开启事务的时候,Redis key 可以被修改吗?

Goland激活2023.1.1(GoLand 2023.1 发布)

在事务执行 EXEC 命令之前 ,Redis key 依然可以被修改

在事务开启之前,我们可以 watch 命令监听 Redis key 。在事务执行之前,我们修改 key 值 ,事务执行失败,返回 nil 

Goland激活2023.1.1(GoLand 2023.1 发布)

通过上面的例子,watch 命令可以实现类似乐观锁的效果 

2 事务的ACID

2.1 原子性

原子性是指:一个事务中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

第一个例子:

在执行 EXEC 命令前,客户端发送的操作命令错误,比如:语法错误或者使用了不存在的命令。


在这个例子中,我们使用了不存在的命令,导致入队失败,整个事务都将无法执行 。

第二个例子:

事务操作入队时,命令和操作的数据类型不匹配 ,入队列正常,但执行 EXEC 命令异常 。


这个例子里,Redis 在执行 EXEC 命令时,如果出现了错误,Redis 不会终止其它命令的执行,事务也不会因为某个命令执行失败而回滚 。

综上,我对 Redis 事务原子性的理解如下:

  1. 命令入队时报错, 会放弃事务执行,保证原子性;
  2. 命令入队时正常,执行 EXEC 命令后报错,不保证原子性;

也就是:Redis 事务在特定条件下,才具备一定的原子性 

2.2 隔离性

数据库的隔离性是指:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

事务隔离分为不同级别 ,分别是:

  • 未提交读(read uncommitted)
  • 提交读(read committed)
  • 可重复读(repeatable read)
  • 串行化(serializable)

首先,需要明确一点:Redis 并没有事务隔离级别的概念。这里我们讨论 Redis 的隔离性是指:并发场景下,事务之间是否可以做到互不干扰

我们可以将事务执行可以分为 EXEC 命令执行前 EXEC 命令执行后两个阶段,分开讨论。

  • EXEC 命令执行前

在事务原理这一小节,我们发现在事务执行之前 ,Redis key 依然可以被修改。此时,可以使用 WATCH 机制来实现乐观锁的效果。

  • EXEC 命令执行后

因为 Redis 是单线程执行操作命令, EXEC 命令执行后,Redis 会保证命令队列中的所有命令执行完 。 这样就可以保证事务的隔离性。

2.3 持久性

数据库的持久性是指 :事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

Redis 的数据是否持久化取决于 Redis 的持久化配置模式 。

  1. 没有配置 RDB 或者 AOF ,事务的持久性无法保证;
  2. 使用了 RDB模式,在一个事务执行后,下一次的 RDB 快照还未执行前,如果发生了实例宕机,事务的持久性同样无法保证;
  3. 使用了 AOF 模式;AOF 模式的三种配置选项 no 、everysec 都会存在数据丢失的情况 。always 可以保证事务的持久性,但因为性能太差,在生产环境一般不推荐使用。

综上,redis 事务的持久性是无法保证的 

2.4 一致性

一致性的概念一直很让人困惑,在我搜寻的资料里,有两类不同的定义。

  • 维基百科

我们先看下维基百科上一致性的定义:

Consistency ensures that a transaction can only bring the database from one valid state to another, maintaining database invariants: any data written to the database must be valid according to all defined rules, including constraints, cascades, triggers, and any combination thereof. This prevents database corruption by an illegal transaction, but does not guarantee that a transaction is correct. Referential integrity guarantees the primary key – foreign key relationship.

在这段文字里,一致性的核心是“约束”,“any data written to the database must be valid according to all defined rules ”。

如何理解约束?这里引用知乎问题 如何理解数据库的内部一致性和外部一致性,蚂蚁金服 OceanBase 研发专家韩富晟回答的一段话:

“约束”由数据库的使用者告诉数据库,使用者要求数据一定符合这样或者那样的约束。当数据发生修改时,数据库会检查数据是否还符合约束条件,如果约束条件不再被满足,那么修改操作不会发生。

关系数据库最常见的两类约束是“唯一性约束”和“完整性约束”,表格中定义的主键和唯一键都保证了指定的数据项绝不会出现重复,表格之间定义的参照完整性也保证了同一个属性在不同表格中的一致性。

“ Consistency in ACID ”是如此的好用,以至于已经融化在大部分使用者的血液里了,使用者会在表格设计的时候自觉的加上需要的约束条件,数据库也会严格的执行这个约束条件。

所以事务的一致性和预先定义的约束有关,保证了约束即保证了一致性

我们细细品一品这句话: This prevents database corruption by an illegal transaction, but does not guarantee that a transaction is correct

写到这里可能大家还是有点模糊,我们举经典转账的案例。

我们开启一个事务,张三和李四账号上的初始余额都是1000,并且余额字段没有任何约束。张三给李四转账1200。张三的余额更新为 -200 , 李四的余额更新为2200。

从应用层面来看,这个事务明显不合法,因为现实场景中,用户余额不可能小于 0 , 但是它完全遵循数据库的约束,所以从数据库层面来看,这个事务依然保证了一致性。

Redis 的事务一致性是指:Redis 事务在执行过程中符合数据库的约束,没有包含非法或者无效的错误数据。

我们分三种异常场景分别讨论:

  1. 执行 EXEC 命令前,客户端发送的操作命令错误,事务终止,数据保持一致性;
  2. 执行 EXEC 命令后,命令和操作的数据类型不匹配,错误的命令会报错,但事务不会因为错误的命令而终止,而是会继续执行。正确的命令正常执行,错误的命令报错,从这个角度来看,数据也可以保持一致性;
  3. 执行事务的过程中,Redis 服务宕机。这里需要考虑服务配置的持久化模式。
  • 无持久化的内存模式:服务重启之后,数据库没有保持数据,因此数据都是保持一致性的;
  • RDB / AOF 模式: 服务重启后,Redis 通过 RDB / AOF 文件恢复数据,数据库会还原到一致的状态。

综上所述,在一致性的核心是约束的语意下,Redis 的事务可以保证一致性

  • 《设计数据密集型应用》

这本书是分布式系统入门的神书。在事务这一章节有一段关于 ACID 的解释:

Goland激活2023.1.1(GoLand 2023.1 发布)

Atomicity, isolation, and durability are properties of the database,whereas consistency (in the ACID sense) is a property of the application. The application may rely on the database’s atomicity and isolation properties in order to achieve consistency, but it’s not up to the database alone. Thus, the letter C doesn’t really belong in ACID.

原子性,隔离性和持久性是数据库的属性,而一致性(在 ACID 意义上)是应用程序的属性。应用可能依赖数据库的原子性和隔离属性来实现一致性,但这并不仅取决于数据库。因此,字母 C 不属于 ACID 。

很多时候,我们一直在纠结的一致性,其实就是指符合现实世界的一致性,现实世界的一致性才是事务追求的最终目标。

为了实现现实世界的一致性,需要满足如下几点:

  1. 保证原子性,持久性和隔离性,如果这些特征都无法保证,那么事务的一致性也无法保证;
  2. 数据库本身的约束,比如字符串长度不能超过列的限制或者唯一性约束;
  3. 业务层面同样需要进行保障 。

2.5 事务特点

我们通常称 Redis 为内存数据库 , 不同于传统的关系数据库,为了提供了更高的性能,更快的写入速度,在设计和实现层面做了一些平衡,并不能完全支持事务的 ACID。

Redis 的事务具备如下特点:

  • 保证隔离性;
  • 无法保证持久性;
  • 具备了一定的原子性,但不支持回滚;
  • 一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis 的事务可以保证一致性。

从工程角度来看,假设事务操作中每个步骤需要依赖上一个步骤返回的结果,则需要通过 watch 来实现乐观锁 。

3 Lua 脚本

3.1 简介

Goland激活2023.1.1(GoLand 2023.1 发布)

Lua 由标准 C 编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。Lua 脚本可以很容易的被 C/C ++ 代码调用,也可以反过来调用 C/C++ 的函数,这使得 Lua 在应用程序中可以被广泛应用。

Lua 脚本在游戏领域大放异彩,大家耳熟能详的《大话西游II》,《魔兽世界》都大量使用 Lua 脚本。Java 后端工程师接触过的 api 网关,比如 Openresty Kong 都可以看到 Lua 脚本的身影。

从 Redis 2.6.0 版本开始, Redis内置的 Lua 解释器,可以实现在 Redis 中运行 Lua 脚本。

使用 Lua 脚本的好处 :

  • 减少网络开销。将多个请求通过脚本的形式一次发送,减少网络时延。
  • 原子操作。Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
  • 复用。客户端发送的脚本会永久存在 Redis 中,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。

Redis Lua 脚本常用命令:

Goland激活2023.1.1(GoLand 2023.1 发布)

3.2 EVAL 命令

命令格式:


说明:

  • script是第一个参数,为 Lua 5.1脚本;
  • 第二个参数numkeys指定后续参数有几个 key;
  • key [key …],是要操作的键,可以指定多个,在 Lua 脚本中通过KEYS[1], KEYS[2]获取;
  • arg [arg …],参数,在 Lua 脚本中通过ARGV[1], ARGV[2]获取。

简单实例:


下面演示下 Lua 如何调用 Redis 命令 ,通过redis.call()来执行了 Redis 命令 。


“hello world”

3.3 EVALSHA 命令

使用 EVAL 命令每次请求都需要传输 Lua 脚本 ,若 Lua 脚本过长,不仅会消耗网络带宽,而且也会对 Redis 的性能造成一定的影响。

思路是先将 Lua 脚本先缓存起来 , 返回给客户端 Lua 脚本的 sha1 摘要。 客户端存储脚本的 sha1 摘要 ,每次请求执行 EVALSHA 命令即可。

Goland激活2023.1.1(GoLand 2023.1 发布)

EVALSHA 命令基本语法如下:


实例如下:


4 事务 VS Lua 脚本

从定义上来说, Redis 中的脚本本身就是一种事务, 所以任何在事务里可以完成的事, 在脚本里面也能完成。 并且一般来说, 使用脚本要来得更简单,并且速度更快

因为脚本功能是 Redis 2.6 才引入的, 而事务功能则更早之前就存在了, 所以 Redis 才会同时存在两种处理事务的方法。

不过我们并不打算在短时间内就移除事务功能, 因为事务提供了一种即使不使用脚本, 也可以避免竞争条件的方法, 而且事务本身的实现并不复杂。

 https://redis.io/

Lua 脚本是另一种形式的事务,他具备一定的原子性,但脚本报错的情况下,事务并不会回滚。Lua 脚本可以保证隔离性,而且可以完美的支持后面的步骤依赖前面步骤的结果

Lua 脚本模式的身影几乎无处不在,比如分布式锁、延迟队列、抢红包等场景。

不过在编写 Lua 脚本时,要注意如下两点:

  1. 为了避免 Redis 阻塞,Lua 脚本业务逻辑不能过于复杂和耗时;
  2. 仔细检查和测试 Lua 脚本 ,因为执行 Lua 脚本具备一定的原子性,不支持回滚。

 

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

Review PR 是开源项目的重要一环。对于项目维护者来说,社区有人来贡献代码,是一件值得开心的事情,说明自己的项目受到了认可。开源项目将通过社区贡献变得更强大。对于贡献代码的开发者来说,编程能力获得了开源项目的认可,也是一件值得写到简历的事情。在 Review 代码的过程中加上了 ChatGPT,会发生什么化学反应?

我司 Second State 最近在自己的开源项目的 GitHub repo 中引入了一个基于 ChatGPT 的 PR Review 机器人。当有人提交新的 PR 的时候,这个机器人会总结 PR在干什么、潜在的风险与问题、以及这个 PR 里的每次 commit 都干了什么。这对 Reviewer 来说,能够大大增加 review PR 的速度。更重要的是 ChatGPT 还能找到代码里的潜在问题,提供更高效的写代码的方式。下面我们来看一个真实的例子。

看看下面这段代码,你有发现什么问题吗?


这段代码是检查一个给定的正整数 是否为素数。其中,变量 被初始化为 的平方根转换为整数,这可以有效地减少计算量。然后,使用 循环逐个测试从 2到 之间的所有数字是否是 的因数。如果 能被其中任何一个数字整除,则说明 不是素数,并且代码将返回 。反之,如果代码成功通过所有循环,则说明 是素数,并且将返回 。这段代码看起来属于 Rust 语言,而 是在 Rust 和 JavaScript 之间交换数据的类型之一,所以它可能用于将这段 Rust 代码嵌入到 JavaScript 中。

声明,以上代码解释文字由 ChatGPT 生成。

简单来说,如果给定的数字是 1927,这段代码就会先开根 1927,得出结果43,然后就开始循环除以从2开始到43的整数,一直到43结束。 从 2 到 43 所有的数字中,如果有能整除的数字,那1927就不是质数,如果没有,那1927 就是质数。

写到这里是不是也没有发现什么问题,这段代码在开始的时候就开根了正整数 n,已经提高了效率。

那让我们看看 ChatGPT 的 review 是什么样的,下面的 ChatGPT Review 结果是基于 GPT4 的。

之前已经介绍过,我们在 Second State 的主要 repo 都部署了一个基于 ChatGPT 的 PR Review 机器人。在部署这个机器人后,有人新提了 PR , 机器人会自动总结并审阅 PR,以往的 PR 也可以通过自己定义的关键词来触发机器人让它工作。

我们试验了一个之前的 PR,让 ChatGPT总结并审阅,ChatGPT 在 Potential problems 提到了下面这段话:

The function can be optimized further, as it checks for divisibility with even numbers after 2, which isn’t necessary.

GPT4 说 函数可以被更好的优化,因为没有必要检查2之后的偶数。看到这里,你有没有恍然大悟,想拍大腿的感觉。已经不能被2整除,就不用试 4 6 8 10 等偶数了,因为肯定也不能整除。节省了一半工作量!优秀还得是 ChatGPT,这是连人都容易忽略的地方。当然还可以继续沿着这个思路优化,任何在这个循环中发现的素数的倍数(比如 3 的倍数,5 的倍数),都不用在下面试啦。ChatGPT 也能帮你写这个通用的算法。

上面这个例子节选自 ChatGPT 在 WasmEdge-quickjs 项目的 PR Review: https://github.com/second-state/wasmedge-quickjs/pull/82 ChatGPT 还提了很多建设性意见,这个 PR 的改动不大,大家可以自行查看改动的代码与ChatGPT 的 Review。

Goland激活2023.1.1(GoLand 2023.1 发布)

ChatGPT 在复杂 PR 中也有不错的表现,这个 PR 有 56 次 commit。下面的链接可以查 Review 的具体情况。 https://github.com/WasmEdge/WasmEdge/pull/2314#issuecomment-

通过上面的例子,我们现在可以回答文章标题提出的问题了:那些让 ChatGPT review 代码的程序员,后来都怎么样了?这个答案是 ChatGPT 可以赋能程序员,让软件更好、更快地吃掉世界

看到这里,你一定有个问题,如何在自己的 GitHub Repo 安装一个这样的机器人,让 ChatGPT 提升自己的代码能力?下面就是手把手教程,教你在5分钟上线一个自己的 ChatGPT Review 机器人。

部署自己的 ChatGPT Review 机器人

首先我们要用到 flows.network 这个平台,这是一个联接 AI 大模型与真实世界 SaaS 的工作流自动化平台。使用它的好处之一是不用自己搭服务器(serverless),也不用自己做 Oauth,直接写了业务代码上传就可以!flows.nework 有着非常用户友好的界面。

首先第一步是 fork flows.network 的 github-pr-summary repo。这是开源的,你也可以根据自己的需求在代码里自定义 prompt,详情请见下文。这里将介绍如何通过无代码的形式,部署自己的机器人。

repo 地址:https://github.com/flows-network/github-pr-summary/

fork 之后,就可以直接去 flows.network 部署。

首先你要在 flows.network 有一个账号,你可以直接用 github 账号登录,不需要任何费用。

然后 Create a flow 按钮,创建一个新的flow。然后在 UI 中导入你刚刚 fork 的这个 repo。

Goland激活2023.1.1(GoLand 2023.1 发布)

然后点开 advanced,去配置环境变量,让 flows.network 知道你要在哪个 github repo 部署这个机器人,OpenAI API Key 是什么,哪个词语能够唤醒这个 function。

  • : 填写你个人的 github 账号. 当发布 review 的时候,这个机器人会扮演你的角色来 review。
  • : 填写你想部署机器人的 Github repo 属于哪个组织。
  • : 填写你想部署机器人的 Github repo 名字。
  • : 填写你想给 OpenAI Key 命名的名字,后续我们直接用到。
  • : 填写你想要触发这个机器人的词语。

Goland激活2023.1.1(GoLand 2023.1 发布)

输入这些环境变量后,就可以 deploy 按钮。这个时候 flows.network 会自动进行build 你的函数,未来你的 repo 如果有了新的 commit,flows.network 也会自动帮你 build 部署。

下一步是配置我们需要连接的 SaaS,flows.network 会根据你的函数提示你需要验证哪些 SaaS 的账号。刚刚我们在环境变量里已经填写我们想在哪个 repo 部署机器人,OpenAI API key 的名字是什么,现在我们要授权 flows.network ,让它能够访问你的 repo 和你的 OpenAI API key,才能真正生效。

Goland激活2023.1.1(GoLand 2023.1 发布)

紫色的 connect 连接 OpenAI 账号,你需要输入你从 OpenAI 申请到的 API Key 并命名这个 OpenAI Key。 这里的名字要和前面在环境变量输入的名字一致。

Goland激活2023.1.1(GoLand 2023.1 发布)

OpenAI 验证完后,继续验证 GitHub, Connect ,你会打开一个由 GitHub 提供的验证页面,选择你刚刚选好的 Repo, 安装 flows network integration,这样才能在你的 repo 进行评论。

这些都设置好后, Go to the Flow 按钮。等待函数编译完,flow 的状态变成 running,就可以让 ChatGPT 帮你 review PR 啦。

Goland激活2023.1.1(GoLand 2023.1 发布)

进阶玩法:自定义规则与 prompt

github-pr-summary repo 是开源的,你也可以根据自己的需求在代码里自定义 prompt。 函数逻辑主要在 文件。

repo 地址:https://github.com/flows-network/github-pr-summary/


这段代码里的 system 与 question 都可以根据自己需求进行重写。比如,如果你的项目是纯 Rust 或 纯 C++ 代码,你可以让 ChatGPT 扮演成一个有经验的 Rust / C++ 开发者,而不是笼统的有经验的软件开发者。如果你有 GPT4 的权限,也可以在代码里把模型换成 GPT4。这些都可以根据你自己的需求来定制。

上面我们介绍了通过 flows network 平台的环境变量把一些参数如部署到哪个 GitHub repo、OpenAI API key 的名字传到函数里,这里我们来介绍如何直接在代码里告诉 flows.network。

参照下面的代码,把 里的 改成自己个人的 github 账号,把 的 改成自己的 github repo 所在的 org,把 的 改成你的 github repo 名字, 里的 改成你想给 OpenAI Key 命名的名字。最后是 里的 改成你想触发这个的词语,也可以不改,就用这个。 这里的逻辑和环境变量那一步是一样的,只是我们直接在代码里改了。


如果你改好了你的函数,那下一步就是去 flows.network 部署你的函数,只需要点点点点,就能上线一个 GitHub 机器人。

看到这里,实属真爱了!flows.network 与 GitHub PR Summary bot 正在 Product Hunt 上 launch,觉得还不错的朋友,请下方的链接给这个机器人投一票吧。

https://www.producthunt.com/posts/gpt-nitro-for-github-pr

<a href=”https://www.producthunt.com/posts/gpt-nitro-for-github-pr?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-gpt-nitro-for-github-pr” target=”_blank”><img src=”https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=&theme=light” alt=”GPT Nitro for Github PR – A ChatGPT-based reviewer for your GitHub pull requests | Product Hunt” style=”width: 250px; height: 54px;” width=”250″ height=”54″ /></a>

作者: 殷达

背景

最近,云原生计算基金会 CNCF 下的 App Delivery TAG (应用交付领域小组)发布了《CNCF 平台工程白皮书》,KubeVela 被纳入“统一 API 层”项目。

原文下载链接:

https://appdelivery.cncf.io/whitepapers/platforms/

回溯 2019 年,Kubernetes 逐渐成为部署和管理基础设施的事实标准。越来越多的平台工程师开始在 Kubernetes 之上构建平台,并向最终用户提供服务。容器化部署和声明式 API 大大降低了复杂系统操作的难度。

然而,当集群中存在数千个工作负载和相关资源时,操作人员很难识别逻辑关系,并根据其内部关系进行准确且符合业务需要的管理。

同时,像 Helm 或 Kustomize 这样的工具已经探索了 打包和交付  Kubernetes 资源的解决方案。这些已被证明是非常有效的,显然 Helm Chart 现在是在 Kubernetes 中打包和分发制品最受欢迎的方式。

另一方面,各种项目也开始定义应用程序。这些尝试不仅是简单地打包资源,而是从自上而下的视角寻求解决方案。与将离散的对象分组以更方便使用相比,应用程序旨在弥合业务应用的研发者和基础设施之间的认知差距。开放应用模型 Open Application Model(OAM) [ 1] 及其对 KubeVela 的实现正是从这里开始。

image.png

Pic 1. OAM is proposed to bridge the gap between app developers and the use of underlying infrastructures

应用程序模型的诞生

由微软和阿里云支持的开放应用程序模型(OAM),其目标是为云原生应用程序应该是什么样子提供一个理论模型。它最初被设计为不与 Kubernetes 绑定,并且倾向于为操作应用程序提供统一的接口。OAM 提出了组件和特性的概念,以对应用程序架构进行抽象。这对于原生 Kubernetes 用户来说是一个很大的变革,但这是有原因的。

在 Kubernetes 中,Deployment 或 Service 等资源侧重于实现。每种资源类型都提供特定的功能。一些低级功能,(如运行容器),会转到 Pod 等基本单。一些更高级别功能,例如容器编排,处理回滚的功能,(例如 Deployment 或 StatefulSet),则是建立在较低级别的功能之上的。毫无疑问, “为平台构建者服务的平台” 这个定位获得了巨大的成功。但对于应用开发人员来说,社区正在迫使他们成为 Kubernetes 专家才能使事情正常运行。此外,对低级资源的肤浅理解实际上可能导致不正确操作带来的显著风险。

组件

OAM 切入的视角与传统的解决方案显著不同。应用程序的真正组成是什么?应用程序开发人员需要什么?

运行应用程序的东西。 对于应用程序来说,这绝对是最核心的部分。在 Kubernetes 中,它可以是 Deployment、Pods 或其他东西。在 Kubernetes 之外,它可以是 Docker 容器、虚拟机或云执行引擎。99.9% 的应用程序开发人员创建程序并运行它。OAM 将运行应用程序的整个内容定义为组件。它不仅仅是一组资源。没有组件,你将无法知道应用程序的用途。


Pic 2. Example of a component inside an OAM application

随着微服务变得越来越普遍,许多应用程序开发人员开始将庞大的单体程序分解为小的部分。OAM 的定义中的每个可运行的部分都可以建模为一个组件,作为一个整体,它们共同组成了一个完整的 OAM 应用程序。它们的内部逻辑关系也在组件中绘制。

特性

要使应用程序正常运行,还需要其他一些东西。例如,在 Kubernetes 中,我们有 Service、ConfigMap、PersistentVolumeClaim 和许多其他资源,它们为 Deployment 提供特定的功能。但是这些资源是为了满足某些技术需求而创建的,而不是以目的为导向的。ConfigMap 为Kubernetes 用户提供了一种存储配置数据的方法,但要让容器使用该配置,用户需要在 Deployment 中添加卷部分并设置容器参数或环境变量。

如果我们再次改变视角,考虑应用程序开发人员在使用这些资源时真正想要做什么,我们可能会得出这样一个结论即许多资源都是为应用程序组件提供额外功能。创建 Service 或 Ingress 对象是为应用程序提供访问而创建的。PersistentVolumeClaim 和 Deployment 中的卷部分是为提供存储而创建的。 第三方对象(如 Prometheus 中的ServiceMonitor)用于提供观察规则。这些提供功能的辅助资源和修改在 OAM 中被定义为特性。

这些特性 Trait 不能独立工作。这些功能附加到组件并用作装饰。没有它,应用程序的主要目的不会改变,但会不完整。


Pic 3. Example of an OAM application containing two components with traits attached

更多

除了 Component 和 Trait 之外,还有其他东西可以从不同的层面为应用程序工作。

每个应用程序可能包含多个原子功能单,即 Component(组件),每个 Component 可以由多个 Trait 修饰。如果我们想定义一些与运行 Component 没有明确一对一关系的应用程序级别的行为或策略,需要更多的应用程序定义。

截至目前,OAM 还没有对这部分建模提出决定性的解决方案。已经提出了包括 Scope、Policy、Workflow、Scope 在内的一些概念,用于定义应用程序的使用范围。Policy 用于描述常见的策略和行为。Workflow 侧重于应用程序的交付方面。其中一些已被 KubeVela 采用,KubeVela 是基于 Kubernetes 的 OAM 实现之一,在模型的演进上可以帮助我们通过实践来驱动设计。

从理论到实践

开放应用模型(Open Application Model)的规范从概念上为那些希望从应用开发人员的角度对应用程序和构建平台进行建模的平台构建者们提供指导。在过去的几年中,包括 KubeVela、Crossplane、Verrazzano 和 Intuit 在内的采用者都做了各种尝试。尽管 OAM 规范被提出为与基础架构无关,但到目前为止,目前大部分的(功能)实现都是基于 Kubernetes 作为控制平面。

回顾历史,我们得出的结论是,在 Kubernetes 上进行应用程序建模尤为重要。在将 OAM 规范应用于 Kubernetes 时,KubeVela 做了很多工作来解决各种细节上的技术问题。这些问题又可以分为三个不同的方向:抽象、交付和管理。

抽象

OAM 中的组件定义了应用程序的运行实例。不同类型的组件适用于不同类型的运行实例。在 Kubernetes 中,它对应于不同的工作负载实现,如 Deployment 或 StatefulSet。KubeVela 将这些类型声明为 ComponentDefinition,并为可扩展性解决方案引入 CUE。CUE 用于模板化 Kubernetes 资源,因此平台构建者可以进行任意的自定义操作。

image.png

Pic 4. KubeVela leverages CUE for templating Component and Trait

在 Trait 这层,抽象的方法与 Component 类似,也就是用 TraitDefinition 来声明不同类型。与 Component 的主要区别之一是,某些类型的 Trait 需要对 Component Definition 所抽象的资源进行修改。例如,为了暴露端口,我们需要同时添加 Service 对象并在 Deployment 规范中暴露端口。CUE 本身并没有提供这样的方法,但是KubeVela 会以某种方式对 CUE 进行扩展来实现了这一功能。除静态渲染外,KubeVela 的抽象层还有运行时感知能力。这意味着渲染逻辑可以根据运行环境进行更改,就像它当前运行的 Kubernetes 版本一样。当 KubeVela 用作跨集群的统一控制平面时,这一点尤其有用。

image.png

Pic 5. In traditional system, application developer needs to deal with version upgrades across clusters

总之,与 Helm Chart 使用的 Go Template 或通过 Kustomization 做配置简化类似,KubeVela 中抽象层的实现在功能上是完整包含的。另一方面,KubeVela 将这些抽象基础建立在 ComponentDefinitions 和 TraitDefinitions 之上,以便更好地实现重用。与直接使用 Helm Chart 对整个应用程序进行模板化相比,这为平台构建者提供了更精细的选择。这反过来又为平台工程师和业务研发人员之间的职责划分提供了更清晰的界限:平台工程师负责 X-Definitions,业务研发负责应用程序。

image.png

Pic 6. KubeVela leaves the abstraction implementation to platform engineers and lets app developers to use predefined types of Components and Traits to compose Applications

交付

抽象层主要解决构建、打包和分发应用的问题。在交付应用程序并将它们作为统一的整体时,情况会变得更加复杂。应用程序作为一个整体,在 KubeVela 中,被视为是交付的基本单。一个应用程序内部不同组件之间的关系可以决定如何交付这些组件,这些关系会在 dependsOn 字段中指示。

除了资源调度外,应用程序的交付有时还涉及更多,比如对生产环境的高风险交付进行人工审核、在自动交付完成时通知、跨多集群进行差异化交付等。为了让用户能够自定义交付过程,KubeVela 在应用程序模型中添加了 Workflow,其中 WorkflowStepDefinition 利用 CUE 定义原子执行单。

image.png

Pic 7. KubeVela provides a consistent, programmable, declarative workflow to orchestrate app delivery process

一些用户可能会遇到多个关联应用程序进行交付的情况,KubeVela 甚至为此提供了更高级别的解决方案,称为 Pipeline。同时,应用程序模型是否应该与交付一起设计,也是一个有争议的问题。像 Tekton、Argo Workflow 这样的独立交付工具已经发展了多年。其他 CI 工具如 Jenkins 或 GitHub Actions 也在不断发展以支持各种交付场景。KubeVela 在将应用程序模型和交付流程结合在一起方面迈出了极为前瞻性的一步,因为它认为这种方法是将应用程序模型投入到生产使用的最佳实践。但是OAM 规范并没有急于添加工作流等内容,因为对于理论建模的答案仍需要更广泛的讨论。

管理

应用程序模型不仅用于交付,声明式 API 面向终态的能力也同样适用。因此,在实践中,应用程序模型也被用于 KubeVela 的一致性对比。KubeVela 确保在交付过程成功完成后不会偏离期望状态,这符合 Kubernetes 的最终面向状态的理念。

image.png

Pic 8. KubeVela constantly ensures there’s no configuration drift for the delivered application

此外,KubeVela 还嵌入了许多其他管理操作,包括版本管理、权限控制、资源共享和垃圾回收。目前这些功能不包含在 OAM 规范中,但被认为是未来 OAM 规范的一部分。

总体而言,为了满足在 Kubernetes 上应用程序使用的各种需求,KubeVela 一直在 OAM 规范之外做不断的尝试,并探索更多可能的应用操作方式。

如果您对更多的技术细节感兴趣,请参阅此博客 [ 2]

未来

很多人质疑为什么 OAM 的 Github 仓库似乎不活跃了。对于主要关心生产实践和模型使用的人来说,答案是,KubeVela 作为 OAM 的 实现 一直在高速发展,采纳 KubeVela 的用户一直在增加,并且 KubeVela 刚刚成为一个 CNCF 孵化项目,这也意味着 OAM 模型的采纳者一直在快速增加。

至于理论模型,KubeVela 仍在等待来自工业生产实践的更多反馈和证据,我们不希望过快的对规范引入变更导致规范的稳定性出现问题。我们的计划是 KubeVela 的实践被广泛采用并逐渐稳定后,再向 OAM 规范提出其额外附加的概念,如工作流程或策略。我们希望在 CNCF基金会的帮助下越来越多的人能加入社区,使在现代化应用的部署和运维变得更容易、更高效、更可靠。

最后做个预告,在 4 月 17 日至 21 日即将举办的 KubeCon + CloudNativeCon Europe 2023 中,将有三场围绕 KubeVela 的话题分享,欢迎大家提前锁定,了解 KubeVela 最新的技术升级、社区动态和企业实践:

(*TimeZone:Europe/Amsterdam)

  • Wednesday, April 19 • 15:25 – 16:00 :Building a Platform Engineering Fabric with the Kube API at Autodesk – Jesse Sanford & Greg Haynes, Autodesk

https://kccnceu2023.sched.com/event/1HyXP/building-a-platform-engineering-fabric-with-the-kube-api-at-autodesk-jesse-sanford-greg-haynes-autodesk

  • Thursday, April 20 • 16:30 – 18:00 :Tutorial: Deploying Cloud-Native Applications Using Kubevela and OAM – Daniel Higuero, Napptive

https://kccnceu2023.sched.com/event/1K8nU/challenges-of-modern-application-delivery-a-retrospection-of-kubevela-highlight-technologies-jianbo-sun-da-yin-alibaba-cloud

  • Friday April 21 • 11:00 – 11:35 :Challenges of Modern Application Delivery: A Retrospection of KubeVela Highlight Technologies – Jianbo Sun & Da Yin, Alibaba Cloud

https://kccnceu2023.sched.com/event/1K8nU/challenges-of-modern-application-delivery-a-retrospection-of-kubevela-highlight-technologies-jianbo-sun-da-yin-alibaba-cloud

英文原文地址:https://www.cncf.io/blog/2023/03/31/kubevela-the-road-to-cloud-native-application-and-platform-engineering/

您可以通过如下材料了解更多关于 KubeVela 以及 OAM 项目的细节:

  • 项目代码库:https://github.com/kubevela/kubevela 欢迎 Star/Watch/Fork!
  • 项目官方主页与文档:kubevela.io ,从 1.1 版本开始,已提供中文、英文文档,更多语言文档欢迎开发者进行翻译。
  • 项目钉钉群:;Slack:CNCF #kubevela Channel
  • 加入微信群:请先添加以下 maintainer 微信号,表明进入 KubeVela 用户群:

image.png

相关链接:

[1] Open Application Model(OAM)

https://oam.dev/

[2] 此博客

https://kubevela.net/blog/2022/11/29/retro-2022

此处查看 KubeVela 项目官网

前篇《虚拟云网络系列 | Antrea 应用于 VMware 方案功能简介(六)》中,我们以实际画面展示了采用 NSX 搭配基于 Antrea 的 Kubernetes Cluster 内,在 NSX UI 管理界面内可以查看到 K8S 丛集的相关信息,并且可以基于 Namespace / Service / Pod Label 等,将要管理的 Pod 纳入 Antrea 群组。本篇内,同样地我想要以实际的画面与大家展示,在 NSX 内如何配置对应的 K8S 防火墙规则,并且查询相关日志。

在前篇展示内我们建立了一个叫做 dvwa-ns 的群组,把所有在 dvwa-ns namespace 内的 Pods 都加到这个群组内。接下来我们要做的展示如下:

  • 在上述群组内的 Pod,可以连往任何地方,但不能连到 9.9.9.9 这个 IP 地址;
  • 防火墙规则符合时,可以提供日志记录。

下图是我要实现上面的这个防火墙政策,在 NSX – Security – Policy Management – Distributed Firewall 内输入的规则:

Goland激活2023.1.1(GoLand 2023.1 发布)

几个重点讨论如下:

1.定义规则前,我们需要建立一个 Policy Section,也就是上图内的 TKGM-Cluster。在 Section 内,必须要特别配置 Applied To 指明这个段落内的包含的所有规则是要运作在哪个 Kubernetes Cluster 上。下面的放大图内可以看到,这个 Section 内的规则是配置到 tkgm-122-tkc03 这个丛集内的(其他的 Kubernetes Cluster 不会接收到此规则)。

Goland激活2023.1.1(GoLand 2023.1 发布)

2.在段落内的第一条规则( 3052 号),配置到 dvwa-ns 这个群组上,目的地往 9.9.9.9 的网络流都设定要拒绝( Reject )。因此这是一条对应 dvwa-ns 这个群组内的 Pod 上面的egress 规则(对外往指定 IP 地址拒绝)。

3.在段落内的第二条规则( 3051 号)同样配置到 dvwa-ns 这个群组上,所有的网络流都设定为允许( Allow )。因此这是一条对应 dvwa-ns 这个群组内的 Pod 上面的预设规则(所有其他 Traffic 都允许)。

4.在段落内,规则当然是有顺序性的,3052 号规则在上方会先比对,如果没有 match 才会比对到下方的 3051 号规则。

5.在每条规则内最后像是齿轮的图标时,我们可以设定这条规则是否要启用日志,如下图。

Goland激活2023.1.1(GoLand 2023.1 发布)

6.这样规则就设定完成了,应该很直觉。但大家不知道是否有注意到在规则配置上方,与虚机配置时一样,同样有 ETHERNET – EMERGENCY – INFRASTRUCTURE – ENVIRONMENT – APPLICATION 五个 Catogories。这五个项次和之前我们虚机微分段的概念一样,是有顺序性的,管理者可以依据不同的需求,在各项次内配置对应的规则,优先权是 Ethernet > Emergency > Infrastructure > Environment > Application。举例来说,在 Kubernetes Cluster 内每个 Pod 与服务间的相互连线,都需要查询内部的 DNS,因此若任何 Kubernetes 应用要正常运作,DNS 连线绝对不能阻挡掉。我们需要在 Infrastructure 内设定通用规则,所有 DNS Traffic 都一定要允许通过,如下图所示:

Goland激活2023.1.1(GoLand 2023.1 发布)

上面的配置完成后,在 NSX 接口右上角按 Publish ,NSX Manager 就会把相关规则派送到对应的 Kubernetes Cluster 内,由 Antrea 接手进行对应的 Antrea Network Policy 设定。

接着我们到受上述安全政策规范,用来展示的这个 Pod 上面。

DVWA 是一个专门用来做渗透测试与 WAF 功能展示的示范应用,利用上面的工具,我们尝试去 ping 9.9.9.9,以及另一个 168.95.1.1 两个 Internet 上的 IP 地址。大家可以看到,往 9.9.9.9 的连线被拒绝了,但往 168.95.1.1 的连线可以正常 ping 通:

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

可见得防火墙规则有依照上面我们的配置生效。

其次,在规则内我们有要求要启用日志。Antrea 默认会将防火墙日志放在每个 Kubernetes Nodes 内的 /var/log/antrea/networkpolicy/np.log 目录下, Kubernetes 管理者可以用不同的工具将这个 log 导出,送往集中的日志管理系统,比如说 Log Insight。在我们的展示环境内,使用 Fluentbit 套件把 log 送出,在 Log Insight 内可以看到下列的日志。首先我们搜寻往 9.9.9.9 的相关日志,可以看到由 10.61.2.10 往 9.9.9.9 的 ICMP 连线被拒绝:

Goland激活2023.1.1(GoLand 2023.1 发布)

接着搜寻往 168.95.1.1 的相关日志,可以看到由 10.61.2.10 往 168.95.1.1 的 ICMP 连线允许通过:

Goland激活2023.1.1(GoLand 2023.1 发布)

前篇我们有谈到 NSX 可以抓取 Kubernetes 里面的相关信息,当然包含 Pod 以及对应的 IP 地址。因此我们可以到 Inventory 内看这个 DVWA pod 的相关信息,很明确地,IP Address 是 10.61.2.10 没有错:

Goland激活2023.1.1(GoLand 2023.1 发布)

这两篇内我们用实际的画面让大家看到采用 NSX 搭配 Antrea 时,如何在 UI 管理界面内进行群组、安全政策的配置,并且能收集日志。简单的总结,与传统的 Kubernetes Network Policies 比较,采用 NSX + Antrea 的运作方式,能够:

  • 以方便的图形化用户管理界面进行防火墙政策配置;
  • 具备企业需求的安全日志( log )功能;
  • 如同标准企业等级防火墙,可以明确配置 deny 规则,也可以依据顺序进行防火墙规则比对;
  • 目前虽仅有 L4 防火墙,L7 及 IDPS 相关功能已经在 Antrea 的后续 Roadmap 列表上。

希望能让大家感受到 NSX + Antrea 的威力。下一篇,回到技术层面,我们要讨论一下 Antrea + NSX 的运作架构,并继续讨论安装整合的方法。

内容来源|公众号:VMware 中国研发中心

本文作者:Colin Jao (饶康立), VMware 资深技术顾问,主要负责 VMware NSX 产品线,目前致力于网络虚拟化、分布式安全防护技术与新应用递送方案的介绍与推广。

本文介绍了 API 货币化和 APISIX 实现 API 货币化方法。

作者刘维,API7.ai 技术工程师,Apache APISIX Contributor

原文链接

什么是 API 货币化

想象你开发并部署了一个服务,能够搜集你所在城市所有超市的打折和优惠信息,其他的开发者想要使用你的数据,就需要你提供相应的 API, 然后其他开发者通过支付费用获得你的授权,再使用你提供的 API 获取想要的数据,像这样通过 API 的方式将数据的使用转化为金钱就是 API 货币化,API 货币化是使你的服务盈利的一种理想方式。

API货币化

在决定采用 API 货币化的商业模式后,接下来需要考虑的就是如何计费,可以选择按调用次数计费,或者直接订阅计费,但不管采用哪种计费方式,都需要统计不同用户的 API 调用数量,如果超出数量还需要进行限流限速操作,所以能否识别出用户的身份很关键。但仅仅识别出用户的个人身份还不够,因为往往购买服务的都是企业用户,企业员工在登录企业账号后,需要能够共享同一个计费账号,所以识别出用户所属组织也同样重要。

API 货币化的应用

现实生活中 API 货币化的应用无处不在,例如每个人都要接触的验证码功能,各个云厂商提供的消息队列,文字识别等服务,各个安全厂家提供的 WAF 和内容过滤等服务,这种模式是如此的成功,以至于我们迫切需要一个合适的技术栈来为 API 货币化打下坚实的基础,也就是说我们需要对 API 进行精细的管理。

在管理 API 时,我们需要能够控制谁可以在哪里发布什么,并且要确保发布这些 API 符合组织标准,诸如 URL 模式、命名约定、访问控制规则。并且能让每个业务职能部门独立管理自己的 API,包括对已发布的 API 进行更新或设计改进,执行流量控制、速率限制和安全策略。也需要能够实时观测使用情况、性能及其他指标。

要对 API 进行管理需要引入的工具就是 API 网关,API 网关可以帮助你解决管理 API 过程中遇到的各种问题。作为一个中央代理,API 网关将所有从客户端传入的请求路由到预定的目的地(后端服务),使你的 API 更安全和更容易管理,同时大部分 API 网关支持各种授权和认证协议,能够对 API 进行复杂的权限控制,还有速率限制等诸多功能。

有许多流行的 API 网关开源项目,其中最为引人注目的就是 Apache APISIX 和其替代的企业 SaaS 解决方案 API7 Cloud。

APISIX 的 API 货币化实践

Apache APISIX 不仅支持上面提到的各种功能,还通过其丰富的插件,能够与 Prometheus、OpenTelemetry、Apache Skywalking 等多种可观察性平台进行集成,以进一步增强其分析 API 的能力并获得完整的可视性。同时 Apache APISIX 针对上文提到的识别用户身份,提出了 consumer 的概念。

consumer

不同 consumer 对应不同的用户,通过在 consumer 上绑定对应的插件和上游,不同的 consumer 假如请求同一个 API,经用户认证体系识别后,网关服务根据当前请求用户信息,会对应不同的 Plugin 或 Upstream 配置,方便对不同的用户进行管理。

consumer

但是仅仅支持 consumer 还不够,针对上文提到的企业用户,需要多个 consumer 共享同一个消费额度,并且如果只能分别管理每个 consumer 的配置,操作就太过繁琐了。因此 APISIX 提出了 consumer group 的概念,有了 consumer group,多个 consumer 就能共享同一套配置和同一个消费配额。

consumer group

了解了 APISIX 在 API 货币化的实践,下面我们来看看具体的应用。

  • 给企业配置限流限速,企业的用户共享同一配置

总结

企业通过 API 货币化将服务和数据转化为收入,要实现 API 货币化需要引入专业的 API 管理工具:API 网关,现在最热门的 API 网关是 APISIX,APISIX 在 API 货币化上有丰富的实践,包括 consumer, consumer group 等概念极大方便了用户对 API 的管理,赋能企业更顺畅的将 API 货币化落地。

关于 API7.ai 与 APISIX

API7.ai(支流科技 )是一家提供 API 处理和分析的开源基础软件公司,于 2019 年开源了新一代云原生 API 网关 — APISIX 并捐赠给 Apache 软件基金会。此后,API7.ai 一直积极投入支持 Apache APISIX 的开发、维护和社区运营。与千万贡献者、使用者、支持者一起做出世界级的开源项目,是 API7.ai 努力的目标。

Excelize 发布 2.7.1 版本,Go 语言 Excel 文档基础库

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。入选 2020 Gopher China – Go 领域明星开源项目(GSP)、2018 年开源中国码云最有价值开源项目 GVP (Gitee Most Valuable Project),目前已成为 Go 语言最受欢迎的 Excel 文档基础库。

开源代码

GitHub: github.com/xuri/excelize

Gitee: gitee.com/xurime/excelize

中文文档: xuri.me/excelize/zh-hans

2023年4月10日,社区正式发布了 2.7.1 版本,该版本包含了多项新增功能、错误修复和兼容性提升优化。下面是有关该版本更新内容的摘要,完整的更改列表可查看 changelog。

此版本中最显著的变化包括:

兼容性提示

  • 移除了  数据类型中的  字段
  • 使用  数据类型代替 
  • 使用  代替  数据类型中的  字段
  • 移除了已导出的数据类型 
  • 将数据类型  重命名为 
  • 添加图表函数  改为使用  类型枚举值指定图表类型
  • 修改了 7 个函数的签名,具体更改详见官方文档中的更新说明

新增功能

  • 新增函数    以支持设置与获取工作表已用区域,相关 issue #1463
  • 创建样式函数  现已支持 17 种渐变填充样式
  • 增加创建样式数量上限至 65430
  • 通过  添加图片时,现已允许插入 BMP 格式图片
  • 函数  支持读取被添加至同一单格中的多张图片
  • 设置条件格式函数  支持设置带有“如果为真则停止”和“图标集”条件的条件格式规则
  • 设置条件格式函数  支持设置在条件格式中使用带有纯色填充样式的数据条,并支持指定数据条的颜色,相关 issue #1462
  • 添加图表函数  支持设置图表中各个数据系列使用自定义填充颜色,相关 issue #1474
  • 添加图表函数  支持设置气泡图图表中各个系列气泡的大小
  • 添加图表函数  支持设置子母饼图和复合条饼图中第二绘图区域的数据系列
  • 添加图表函数  支持为图表中数据标签设置自定义数字格式,相关 issue #1499
  • 创建表格函数  支持在创建表格时指定是否包含标题行
  • 创建表格函数  创建表格时增加对表格名称的校验,并导出了错误常量 ,相关 issue #1468
  • 函数  支持为筛选范围内的多个列设置筛选条件
  • 计算单格的值函数  现已支持指定是否为公式计算结果应用数字格式
  • 计算单格的值函数  对于以下公式函数加入了双字节字符的支持:LEFT, LEN, LENB, MID, MIDB, RIGHT 和 RIGHTB,相关 issue #1476
  • 计算单格的值函数  函数对于存在错误的公式将在计算结果中返回公式错误代码,并将详细错误信息在 error 数据类型的返回值中返回,相关 issue #1490
  • 对输入图片文件的扩展名调整为大小写不敏感,相关 issue #1503
  • 使用流式写入器流式按行赋值时,对于值为 nil 的单格将会跳过生成该单格,相关 issue #756
  • 获取超链接  函数支持读取合并单格中的超链接
  • 添加了新的导出类型  以表示图表类型枚举

兼容性提升

  • 兼容带有函数组的工作簿
  • 兼容带有严格模式 XML 命名空间地址的工作簿主题,相关 issue #1447
  • 提高了与文档内部不含工作簿关系部件工作簿的兼容性,以修复打开此类工作簿可能出现的 panic

问题修复

  • 修复了特定情况下读取日期时间类型单格的值存在精度误差的问题
  • 修复了特定情况下当修改原本存储了日期时间类型的单格为文本类型值,修改后单格数据类型有误的问题,解决 issue #1464
  • 修复了部分情况下公式计算结果为空的问题,解决 issue #1469
  • 修复了设置数据条类型条件格式时,指定自定义最大/最小值无效的问题,解决 issue #1492
  • 修复了打开行高或列宽为 0 的工作表,保存后行高列宽设置失效的问题,解决 issue #1461
  • 提高了读取带有空白字符共享字符串表索引值的兼容性,解决 issue #1508

性能优化

  • 提高了应用带有自定义月份数字格式的速度,相关 issue #1455
  • 大幅提高了对于带有合并单格工作表的处理速度,相关 issue #1448

其他

  • Go Excelize 提供了支持 WebAssembly / Javascript 环境的 excelize-wasm NPM 包
  • Go Modules 依赖模块更新
  • 单测试与文档更新
  • 优化内部变量与函数命名
  • 包含简体中文、英语、法语、俄语、日语、韩语、阿拉伯语、德语和西班牙语的多国语言文档网站更新

致谢

感谢 Excelize 的所有贡献者,以下是为此版本提交代码的贡献者列表:

  • liron-l (Liron Levin)

  • nathj07 (Nathan Davies)

  • Josh-Weston (Josh Weston)

  • jaby

  • FlowingSPDG (Shugo Kawamura)

  • barismar (Baris Mar Aziz)

  • doingNobb (张涛)

  • rpoetrap (Rizki Putra)

  • huangshaokun

  • CHANTXU64 (ChantXu64)

  • playGitboy

 

昆仑万维今日宣布,由昆仑万维和奇点智源合作自研、中国第一个真正实现智能涌现的国产大语言模型 ——「天工」3.5 发布在即,并将于 4 月 17 日启动邀请测试。

公告指出,「天工」大模型已经非常接近 OpenAI ChatGPT 的智能水平。鉴于 ChatGPT 是基于 GPT3.5 大模型,所以他们也把这个版本命名为「天工」3.5。

“天工作为一款大型语言模型,拥有强大的自然语言处理和智能交互能力,能够实现智能问答、聊天互动、文本生成等多种应用场景,并且具有丰富的知识储备,涵盖科学、技术、文化、艺术、历史等领域。”

Goland激活2023.1.1(GoLand 2023.1 发布)

关于“第一个真正实现智能涌现的 GPT 类大模型”这一说法,昆仑万维方面则解释称,涌现现象是指一个相对简单的系统中产生出了复杂的行为或特性。在 AI 领域,涌现能力也标志着人工智能是否已具备高度的自主学习能力,以及是否有可能完成逻辑推理等复杂的任务。此前推出的“友商模型的逻辑推理是靠定向优化来覆盖特定题库,而不是靠大模型的智能涌现来解答较为复杂的问题。而靠人工打补丁、定向优化的方式是不能真正实现人工智能的。

根据介绍,昆仑万维自 2020 年开始布局 AIGC 领域。2022 年 12 月 15 日,昆仑万维发布了“昆仑天工”AIGC 全系列算法与模型,并宣布模型开源。“昆仑天工”旗下模型包括天工巧绘 SkyPaint、天工乐府 SkyMusic、天工妙笔 SkyText、天工智码 SkyCode,覆盖图像、音乐、文本、编程等多模态内容生成能力。目前,该公司已与奇点智源就 ChatGPT、图像视频生成等 AIGC 技术领域达成全面技术战略合作,启动 ChatGPT 的联合开发,并于 2 月 9 日宣布将在今年内发布中国版类 ChatGPT 代码开源。

“我们的研发团队 2020 年起从一亿级模型做起,然后十亿级模型,再到百亿级模型……至今已耕耘了三年时光。我们凭借对 AGI 的热情和信仰,三年时间里在一片质疑声中坚持了下来,今天我们骄傲地宣布:我们做出来了。未来,「天工」4 和「天工」5 也将继续以行业领先的速度与大家见面。ChatGPT 离真正的 AGI 还有很远的路,相信跟所有新科技一样,大语言模型在未来也会遇到波折和低谷。当热潮褪去,我们仍将继续,继续以我们的热情,坚定地在 AGI 的道路上走下去,走到全球前列。

天工大模型即将开启邀请测试,具体信息可关注:https://tiangong.kunlun.com/

Goland激活2023.1.1(GoLand 2023.1 发布)

官网:https://playedu.xyz

PlayEdu 是基于 SpringBoot3 + Java17 + React18 开发的企业内部培训系统。它专注于提供私有化部署方案,包括视频,图片等资源的内网部署。目前主要支持有本地视频上传播放、学员邮箱登录、无限级部门、无限级资源分类、学员在线学习等主要功能。

功能明细

  • 学习端口:PC端口
  • 学员:邮箱登录、批量导入、部门关联、学习信息、学员实名信息
  • 线上课:分类关联、部门关联、章节课、无章节课
  • 后台管理:资源分类管理(无限级)、部门管理(无限级)、图片管理、视频管理、线上课管理、学员管理、系统管理、管理员权限管理
  • 数据统计:学习进度明细(任务进度、课程进度、课时进度)、资源明细统计、每日学习排名、学员每日学习时长统计、学员总学习时长统计
  • 视频播放:记忆播放、防录屏跑马灯配置、倍速播放
  • 其它:后台系统管理员权限(行为权限、数据权限)、系统配置

源代码

  • https://gitee.com/playeduxyz/playedu
  • https://github.com/playedu/playedu

快速上手

如果您想快速的本地预览 PlayEdu 的功能的话,那么可以参考我们提供的 快手上手 文档。如果您是想在正式环境中部署 PlayEdu 的话,可以参考我们提供的安装教程:

  • PlayEdu 主程序安装
  • PlayEdu 后台界面程序安装
  • PlayEdu PC 界面程序安装

主要界面预览

PC学习首页

Goland激活2023.1.1(GoLand 2023.1 发布)

PC 课程详情页面

Goland激活2023.1.1(GoLand 2023.1 发布)

PC 最近学习页面

Goland激活2023.1.1(GoLand 2023.1 发布)

后台主界面

Goland激活2023.1.1(GoLand 2023.1 发布)

后台学员列表页面

Goland激活2023.1.1(GoLand 2023.1 发布)

使用协议

欢迎使用杭州白书科技有限公司提供的开源培训解决方案!请您仔细阅读以下条款。通过使用 PlayEdu ,您表示同意接受以下所有条款。

  • 本开源项目中所有代码基于 Apache-2.0 许可协议,您默认遵守许可协议中约定的义务。
  • 您默认授权我们将您使用 PlayEdu 所在业务的 Logo 放置在本官网展示。

 

OpenShot 是跨平台的开源视频剪辑软件,该项目在 2008 年 8 月由 Jonathan Thomas 发起,其目标是提供稳定、自由且易于使用的视频编辑器。OpenShot 的核心视频编辑功能是以 C++ 库实现,称之为 libopenshot。

OpenShot 支持 Linux、macOS、Windows,以及 chromeOS。

OpenShot 3.1 正式发布,新版本现在支持 400 多个视频配置文件,并改进了功能、修复了错误、提高了性能。

亮点和功能:

  • 改进的配置文件(400 多个视频配置文件)
  • 时间重映射更新(改进的音频重采样,支持反向音频,支持 bezier 曲线)
  • 改进的撤销/重做系统,包括分组操作
  • 改进了预览和分割片段对话框
  • 改进的字幕效果(支持高 DPI,改进 VTT 支持)
  • 内存泄漏修复
  • 改进的性能
  • 改进了键盘绑定
  • 修复了 Blender Animated Titles 使用高 FPS
  • 修复了视频预览组件大小的问题,以正确清除缓存。
  • 修复了自动过渡方向逻辑的问题(即根据过渡的位置正确淡入/淡出)。
  • 修复了 AppImage 的问题,以支持新的发行版
  • 改进了关于对话框
  • 扩展了默认的 Emojis
  • 改进了文件属性对话框,以处理替换文件和缩略图,并更好地支持改变 FPS
  • 更新了语言翻译
  • 更新了支持者和捐赠者
  • 更新了文档/用户指南

更多详情可查看:https://www.openshot.org/blog/2023/04/06/new_openshot_release_310/

 

fastjson 2.0.27 现已发布。这又是一个每月更新例行的Bug修复功能增强版本,大家按需升级。最近非常多用户从fastjson 1.1.x升级到2.0.x,升级后获得性能显著提升。dubbo用户使用fastjson2二进制格式JSONB的用户也越来越多,这次的发布也修复了一些相关的问题。

Issues

  1. 修复集成spring-doc导致文档无法显示的问题 #387 #1318 #1256 #1309
  2. 修复kotlin某些场景序列化报错的问题 #1266
  3. 修复Android兼容问题,Timestamp.valueOf方法在Android下不存在 #1272
  4. 提升fastjson 1.x兼容性,支持对List类型反序列化输入single object #1291 #1292
  5. 提升fastjson 1.x兼容性,增强对注释的支持
  6. 修复对ascii 128 ~ 255段LATIN1字符在JDK 11/JDK17下某些场景反序列化结果不对的问题 #1277
  7. 提升对fastjson 1.x兼容性,支持TypeUtils.compatibleWithFieldName=true
  8. 修复对GraalVM识别不准确的问题 #1328
  9. 修复autoType打开时不支持Enum类型作为Key的Map类型反序列化 #1324
  10. 修复某些场景引用检测NPE的问题 #1332 #1315
  11. 修复List类型输入空字符串行为和fastjson 1.x不兼容的问题 #1320
  12. 修复List<List>类型反序列化某些场景会报错的问题 #1312
  13. 修复AtomicBoolean类型不支持反序列化的问题 #1316
  14. 修复某些场景JSONField不起作用的问题 #1258
  15. JSONObject & JSONArray新增方法getDateOrDefault #1252
  16. 反序列化和类型转换支持mongedb的Decimal128 #1300
  17. 序列化增强对动态代理的支持 #1290
  18. 修复某些场景JSON.isValid结果不对的问题 #1287
  19. 修复某些场景序列化处理Annotation报错的问题 #1286
  20. 修复JSONObject转化为Java对象时Map类型字段素类型不正确的问题 #1269
  21. 增强对日期格式的自动识别 #1276
  22. 增强对base64格式的支持 #1271 #1255
  23. TypeReference支持输入参数 #1267
  24. 增强对CSV的支持 (对标Jackson对CSV的支持)
  25. 增强对自定义Map的支持
  26. 进一步提升在JDK 8下的序列化性能

MAVEN依赖配置

 <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.27</version> </dependency>
 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.27</version> </dependency>
 <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2-extension-spring5</artifactId> <version>2.0.27</version> </dependency>
 <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2-extension-spring6</artifactId> <version>2.0.27</version> </dependency>

相关链接

  • FASTJSON 1.x用户升级指南 https://github.com/alibaba/fastjson2/wiki/fastjson_1_upgrade_cn
  • 相关issues https://github.com/alibaba/fastjson2/milestone/26
  • 代码tag https://github.com/alibaba/fastjson2/tree/2.0.27
  • Maven下载 https://repo1.maven.org/maven2/com/alibaba/fastjson2/fastjson2/2.0.27/
  • 1.x兼容版本 https://repo1.maven.org/maven2/com/alibaba/fastjson/2.0.27/
  • 性能测试报告 https://github.com/alibaba/fastjson2/blob/main/docs/benchmark/benchmark_2.0.27.md

详情可查看 Release Notes

OpenBSD 7.3 现已发布!此版本的主题是“巫师与鱼”。

Dry Garden

OpenBSD 是一个专注于代码正确和文档准确且关注安全的操作系统,其强调可移植性、标准化、正确性、前摄安全性以及集成的密码技术。该项目还开发广为使用且受欢迎的 OpenSSH(OpenBSD Secure Shell)软件,它利用 SSH 协议为计算机网络提供加密的通信会话。

OpenBSD 7.3 带来了许多改进,包括新硬件支持、内核创新和安全改进等各种更新。此外,OpenBSD 7.3 还在其安装程序中添加了引导式磁盘加密功能。

OpenBSD 7.3 的亮点包括:

  • 新的内核功能包括 waiid、pinsyscall、getthrname、setthrname 和其他新接口。

  • 各种 SMP 改进/优化。

  • OpenBSD 的直接渲染管理器 (DRM) 内核图形/显示驱动程序支持已更新至 Linux 6.1 内核状态,在此过程中,AMDGPU 驱动程序支持更新的 RDNA3 图形、 Ryzen 7000 系列集成显卡和更新的 Mendocino / Dragon Range 硬件。

  • 支持各种新的 Arm SoC,如 Rockchip RK3566 / RK3568,同时改进现有驱动程序,如更好的 Apple M1 支持。

  • 安装程序中对 AMD64、i386、RISCV64 和 SPARC64 安装映像进行了引导磁盘加密指南的初始支持。

  • 各种 CPU 安全性改进,例如 ARM64 Spectre-BHB 缓解和启用 ARM64 数据独立定时特性。

可以通过官方发布公告查看 OpenBSD 7.3 的数百个变化。

KDE Frameworks 是一个库和软件框架的集合,可供任何基于 Qt 的软件堆栈或多个操作系统上的应用程序使用。具有经常需要的功能解决方案,如硬件集成、文件格式支持、额外的图形控制素、绘图功能和拼写检查,该集合作为 KDE Plasma 和 KDE Gear 的技术基础,以 LGPL 发布。

KDE 近日正式发布 KDE Frameworks 5.105,部分更新内容如下:

  • 改进了对 Flatpak 应用程序的支持,特别是那些从 Flathub 仓库安装的应用程序,以便它们遵循 Breeze 图标主题

  • 默认阻止 Flatpak 应用程序发送的普通通知播放声音

  • 为 Night Color(Redshift)配备了漂亮的新图标

    Goland激活2023.1.1(GoLand 2023.1 发布)

    Goland激活2023.1.1(GoLand 2023.1 发布)

  • 修复了一个问题,即 Filelight 应用程序的图标在 GParted 和 KwikDisk 软件中显示不正确

  • 增加了显示和隐藏虚拟键盘的图标

  • Baloo 文件索引服务得到了改进,不再索引 Python virtualenv 文件夹中的文件,并停止将不可打印字符的数据索引到数据库中,这也是一些应用程序崩溃的原因

  • KDE Frameworks 5.105 改进了对基于 Kirigami 的应用程序的支持,在具有互斥项目的菜单中正确显示一个单选按钮,而不是一个复选框

  • ……

更多详情可查看:https://kde.org/announcements/frameworks/5/5.105.0/

 

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Mozilla Firefox 浏览器 112 版本现已正式发布并提供下载。

Firefox 112 版本的新功能并不算多,最大的变化是 Ubuntu 用户能够从作为 Snap 包安装的 Chromium 网络浏览器导入浏览器数据到 FireFox。如图所示,在导入浏览器数据时,Chromium 也属于受支持的 Web 浏览器。

Goland激活2023.1.1(GoLand 2023.1 发布)

Firefox 112 的其他新功能是:

  • 能够通过右键单击密码字段来显示密码
  • 能够通过鼠标中键单击列表中的项目,来关闭选项卡栏中的选项卡
  • 如果没有更多关闭的选项卡可以重新打开,则可以使用 Ctrl+Shift+T 恢复上一个会话
  • 此版本还更新了日期选择器面板上的“清除”按钮,允许用户快速清除类型为“date”或“datetime-local”的输入
  • 默认禁用已弃用的 U2F Javascript API 

其他详情可查看发布公告, Firefox 112 现在可以作为二进制包从 Mozilla 的 FTP 服务器下载。

njs 0.7.12 已发布。njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能耗更低、更符合 nginx 应用场景的小虚拟机实现,可以理解成 nginx 为其实现了一套自己的词法解析。

作为 nginx 的插件,njs 的安装方式是重新编译 nginx。

新版本下载地址:http://nginx.org/en/docs/njs/install.html

主要变化

nginx modules:

  • Bugfix:修复了 Fetch API 中的constructor。

Core:

  • Feature: 在 crypto 模块中添加了方法 。

  • Feature:添加了 zlib 模块。

  • Improvement:增加了对语句的支持。

  • Bugfix:根据规范修复了constructor。

 更多详情可查看 Changelog

魔豆文库

魔豆文库MOREDOC,使用 Go 语言开发实现的文库解决方案,为dochub文库的重构版本,支持 office (全部类型)、PDF、TXT、EPUB、MOBI 等多种文档格式的在线阅读浏览,支持无限级分类、文档批量上传、批量转换、全文搜索等功能,拥有简洁美观的用户视觉和功能体验。

技术栈

  • Golang :gin + gRPC + GORM
  • Vue.js : nuxt2 + element-ui
  • Database : MySQL 5.7

升级日志

社区版升级日志

  •  文档搜索,支持根据上传时间排序
  •  前台文档列表,支持根据扩展名过滤筛选Word、PDF等格式文档
  •  管理后台文档列表,支持给选中的文档批量调整分类
  •  管理后台面板,显示CPU、内存、磁盘空间大小以及使用率,以知晓服务器运行情况
  •  在中,支持控制从回收站清除的文档文件被真正删除的时间,以适时释放磁盘空间
  •  修复搜索结果页类型与排序筛选素高度溢出的问题
  •  修复相关安全问题

普惠版升级日志

普惠版的功能升级包括了社区版的升级

  •  支持百度云对象存储 BOS
  •  支持阿里云对象存储 0SS
  •  支持腾讯云对象存储 COS
  •  支持华为云对象存储 OBS
  •  支持自行搭建的混合云和多云对象存储 Minio

之前版本升级到现在的版本,详见升级到 v1.3.0

魔豆文库 moredoc v1.3.0 发布,文库系统解决方案,支持对象存储 - 图2

魔豆文库 moredoc v1.3.0 发布,文库系统解决方案,支持对象存储 - 图3

演示站点

程序体验,一睹为快!

  • 网址: https://moredoc.mnt.ltd
  • 管理员账号: admin
  • 管理员密码: mnt.ltd

演示站点,每天凌晨 1:00 ~ 6:00,每隔一小时重置一次全部数据

开源地址

  • Gitee – https://gitee.com/mnt-ltd/moredoc
  • Github – https://github.com/mnt-ltd/moredoc
  • MNT.Ltd – https://git.mnt.ltd/mnt-ltd/moredoc

使用手册

关于魔豆文库安装部署、二次开发等更详细的教程,详见书栈网《魔豆文库使用手册》

禅道插件上新了,OpenAI 禅道集成,可提供神奇海螺聊天、需求润色功能。

神奇海螺

“章鱼哥,你为什么不问问神奇海螺呢?”——海绵宝宝

那么,就让我们问一问神奇海螺吧!禅道上线神奇海螺功能,打通ChatGPT的API,解决在国内个人用户使用ChatGPT比较困难的问题,您可以通过禅道的神奇海螺向ChatGPT聊天提问了!
Goland激活2023.1.1(GoLand 2023.1 发布)
在禅道右下角增加了神奇海螺功能,是一个 ChatGPT 聊天框,可以在这里与 ChatGPT 聊天。
具体如何更好地使用神奇海螺,可以参考下列原则:

  • 提问最好聚焦在某个具体问题,太开放性的问题可能只能用来“调戏”它,得不到具有参考意义的回答;
  • 提问时可以尽可能详细地描述问题背景、上下文信息,或者根据它的回答继续补充明确信息;
  • 神奇海螺具有上下文功能,支持多次迭代,重新调整问题描述或给到更清楚的信息,在原有基础上进行迭代。

Goland激活2023.1.1(GoLand 2023.1 发布)Goland激活2023.1.1(GoLand 2023.1 发布)

总而言之,神奇海螺适合用来写诗、写文章、写小说、写代码、归纳总结,不适合开放性广义问题、寻求情感建议。

需求润色

作为一个产品经理,我偶尔写不出好需求……别怕,需求润色来帮你!

在产品-需求功能下,神奇海螺可以帮助产品经理进行需求的润色、完善和优化。它可以:

  • 把一句话需求转化为准确、清晰、具体,具有完整描述的需求;
  • 把需求标题、需求描述、验收标准补充为条理清晰的内容;

    Goland激活2023.1.1(GoLand 2023.1 发布)Goland激活2023.1.1(GoLand 2023.1 发布)

  • 转换后不合适的需求可以进行重新转换,直到满意为止;Goland激活2023.1.1(GoLand 2023.1 发布)
  • 可以根据转换后的内容再度调整原有需求描述,重新转换;
  • 保存转换结果后,进入需求编辑或需求变更流程。

有了需求润色,妈妈再也不用担心我的需求写的太烂!不过,可不要过度依赖它,它依然有不够了解、不够智能的领域,所以加强自身的能力,把需求润色作为辅助工具,不断提高自身的产品经理技能才是王道。

插件安装和配置

下载地址:https://www.zentao.net/extension-viewExt-218.html

前提

为了使用这个插件,禅道管理员需要拥有:
1.一个可用的 OpenAI 账户和 API Key;
2.一个可以访问 OpenAI 服务的 SOCKS5 代理服务器(如果你的禅道服务器不能直接访问 OpenAI 服务)。

安装方式

1.在禅道插件管理中安装;
2.下载插件包后,解压并覆盖对应的 extension 目录到禅道的 extension 目录。

配置步骤

1.在后台 – 系统设置中,定位到 OpenAI 设置;
2.填写自 OpenAI 获取到的 API Key,并按照情况填写代理设置;
3.在后台 – 用户 – 权限中,为相应的用户组赋予 OpenAI 功能权限。
 

安装配置完成,就可以去使用这两个功能啦,不过最后还是强调一下,ChatGPT会“骗人”,会一本正经地讲它并不了解的信息,所以跟它的交互最好还是具备一定的知识储备,合理使用工具,让它为自己所用!

目前的禅道OpenAI 插件是1.0版本,后续还将继续优化,集成更多智能功能,敬请期待!

作者:京东零售 郑书剑

1、推荐LBS业务介绍

1.1 业务场景

现有的同城购业务围绕京东即时零售能力搭建了到店、到家两种业务场景。同城业务与现有业务进行互补,利用高频,时效性快的特点,可以有效提升主站复访复购频次,是零售的重要战略方向。

1.2 名词解释

LBS:基于位置的服务(Location Based Services)。

下文LBS商品代指京东小时购商品;LBS推荐代指京东基于地理位置的推荐能力,需要考虑到附近的供给和履约能力。

B2C:直接面向消费者销售产品和服务商业的零售模式。

下文B2C商品代指京东主站商品,包括自营/pop等非小时购商品;B2C推荐指主站主流推荐能力,不需要考虑当前地理位置的供给,而是面向全国用户的推荐模式。

1.3 推荐模式

主要推荐模式集中在一下四种流量场域:

1、附近-商品推feeds推荐;

2、附近-纯门店推荐;

3、附近-门店-商品列表页推荐;

4、主站核心推荐场景lbs商品混排推荐(首页为你推荐、购物车、我的京东等);

Goland激活2023.1.1(GoLand 2023.1 发布)

2、推荐系统设计

目前主站核心场景从支持b2c商品推荐,b2c内容素材/聚合素材推荐拓展到更丰富的业务形式,支持lbs业务逻辑推荐,给用户带来更多化的体验,同时给线下商家和运营提供了更丰富的流量渗透策略。

目前lbs商品推荐架构和b2c商品推荐架构的推荐流程紧密的耦合在一起,上线lbs商品推荐相关策略,都需要考虑到b2c推荐业务的逻辑无diff,效率低,兼容性差,迭代成本高,不利于后续优化策略的快速迭代。通过对lbs商品推荐的整体链路进行升级,与目前的b2c商品推荐链路进行解耦,提升系统的拓展性,更易维护,提高算法策略接入的效率。b2c商品和lbs商品均具备独立quota空间,推荐链路更加清晰,效果优化空间更大。

Goland激活2023.1.1(GoLand 2023.1 发布)

3、算法实践

3.1 概述

我们的前端展现形态分为纯商品、纯门店、门店-商品三种形态,且推荐位分布较多,为了减少人力维护成本,同时考虑到LBS推荐模式和传统电商模式的差异,以及流量场域分布和推荐展示形态的区别,我们针对LBS推荐能力进行了单独的设计,抽象出一套推荐模板可以同时解决三种推荐模式,支持跨场景复用。

首先前端请求入参用户当前的经纬度信息,推荐系统从gis系统获取当前可履约的门店信息;推荐系统根据用户个性化信息和门店-商品信息,为用户推荐感兴趣的附近门店-商品。

此时的item粒度为门店+商品粒度,为了同时保证用户对门店和商品兴趣的同时感知,区别于b2c商品的推荐模式,我们将整个系统分为两个阶段。在一阶段对用户感兴趣的门店进行推荐,在二阶段对用户的感兴趣的门店下的商品进行推荐。在两个阶段内完成门店推荐、商品推荐、门店-商品推荐三种模式,三种推荐模式可复用算子达到80+%,覆盖站点从京东主站到小程序,覆盖场景从首页-为你推荐到营销推荐位,总计覆盖核心推荐位30+。

Goland激活2023.1.1(GoLand 2023.1 发布)

3.2 LBS召回算法实践

3.2.1 背景概述

背景:LBS推荐是基于地理位置的推荐场景,和主站b2c推荐模式有所差异;用户对更多维度的因素敏感,如门店质量,配送距离,配送时效等等;

所以推荐系统需要在召回的时候就考虑到这些体验因素,所以我们将LBS的召回算法设计成两阶段的模式。一阶段根据用户兴趣(user-store兴趣)和门店质量(ka/销量/距离/时效)等因素召回用户感兴趣的高质量/距离近/配送快的门店。在二阶段进行商品召回用于召回用户感兴趣的商品。

同时我们面临着以下几个问题:

冷启问题:我们是新业务+新场景,新品多,新用户多,相比较成熟的b2c场景,lbs场景交互稀疏问题严重;

跨场域兴趣迁移:用户在b2c场景和lbs场景的兴趣表达往往是不一样的,不同场景的兴趣表达往往存在着一定的差异和联系,怎么精准捕捉和表达用户跨场景体现出的兴趣是新场景初期发展的重要工作;

兴趣激发周期短:lbs场景用户决策成本低,转化链路短,高转化场景下更要关注物品相关关系的表达;

我们初期也对以上几个问题进行了简单的探索,通过跨域兴趣探索和优化i2i关联关系简单的验证了我们的想法。

3.2.2 召回算法实践

1、冷启动召回

冷启动召回一般有以下几种方案:

•商圈热门:缺点是和user无关,纯热门item召回,相关性差;这里我们将全局热销/poi热销商品作为兜底召回,用于补充;

•cross domain:是一种基于不同场域(如京东b2c场景/lbs场景)共同用户的行为将不同域的用户映射到同一个向量空间,然后借助其他域的丰富行为提升本域冷启动用户的召回效果。

我们这里主要针对cross domain的方式进行了一些简单探索来优化跨场域用户的冷启体验效果。

1)潜客画像召回:根据用户在b2c场景的相关行为(诸如偏好类目是否为lbs转化优势类目)以及是否对lbs相关场景有前置行为的用户(推荐下浏览过附近/搜索内过小时购通栏等),来判断当前用户是否为lbs的潜在转化用户,给这些用户推荐其在b2c偏好下的高转化lbs商品;

2)跨域类目召回:通过对b2c/lbs共现商品进行挖掘,得到b2c到lbs的类目协同关系,根据用户在b2c场景下的偏好类目推荐对应的lbs类目下的商品;

3)跨域i2i召回:结合b2c/lbs的用户的跨场域行为,对lbs商品和b2c商品进行i2i关系挖掘,得到b2c sku到lbs sku的相似相关关系,使用b2c的用户行为为其推荐lbs商品;

4)间接召回:基于b2c召回结果,为用户召回相似相关的lbs商品。

2、i2i直接召回

基于用户在lbs场景的行为直接召回lbs商品,常见方法有如itemCF,swingCF等。

我们针对lbs场景高转化的特点对i2i召回进行了针对性的优化。我们对lbs场景的用户行为进行了分析,发现用户的行为体现了商品的相似性(同品比较等),订单行为体现了商品之间的相关关系(搭配购等),但是用户的订单行为往往非常稀疏,且考虑到lbs商品还含有地域属性,直接使用订单行为构建相关的i2i关系得到的结果非常稀疏,召回的下发占比往往比较低。

于是我们把订单的i2i关系抽象为类目-类目,产品词-产品词的的粗粒度相关关系。然后对全站lbs行为进行i2i关系挖掘,得到的结果使用粗粒度相关关系进行过滤,得到了比直接使用定订单行为构建i2i关系更丰富的结果,召回效率也比相似关系的效率更高。

3、向量化召回

i2i vs embed:i2i的相似相关关系表现的更加精准,但是覆盖率低;embed方式新颖性好,覆盖率高,但是关系表达相对不这么精准。

为了解决前文中提到的问题,对用户行为进行预处理,对异常用户和异常表现的商品先进行过滤,防止脏数据对整体数据分布造成影响,行为选取时,优先保留订单行为附近的用户行为(高质量行为),同时历史行为序列进行了session划分,保证行为的连续性和相关性,更能体现出用户决策周期内的集中兴趣,优化i-i的关联关系。

模型方面我们采用了随机游走的graph embedding建模方式,和传统方案差异不大:行为序列挖掘 -> 同构图构建 -> 带权重游走序列采样 -> skip-gram+负采样训练,得到物品的item embedding。

同时这里的用户行为序列的选取也可以参考跨域的思路,使用b2c行为进行补充,进一步解决lbs场域召回稀疏的问题。线上即可以使用i2i的方式进行召回,也可以使用u2i的方式进行召回。相比i2i直接召回,曝光占比更高,效率更高。

4、其他召回通道

还有诸如其他的根据品类兴趣和常购行为的兴趣画像召回,复购、常购召回等。

3.3 排序模型实践

排序准备方面,由于历史遗留原因,目前无论是用户在lbs场域的行为,还是lbs商品画像都有所缺失。于是第一步,我们首先对基础数据进行了维护:1)统一了全站lbs行为接入口径:通过门店pv和商详的pv埋点,捕捉全站lbs行为;2)建立了user-sku和user-store的用户画像和lbs商品画像。

排序特征方面:在复用了b2c商品的部分精排特征的基础上,构建了lbs场景的特有特征,如lbs场景用户行为序列,lbs场景商品/门店反馈特征,以及配送时效,配送费,配送距离等context类特征。

模型优化方面:引入了用户在b2c场景的用户行为,同时引入了b2c训练样本做样本增强。

模型结构方面:在模型输入的方面分为和b2c共享的部分,以及lbs独立特征输入的部分,异构b2c/lbs用户行为序列提取多场域用户兴趣,与B2C场景进行多场景联合优化。上线时进行拆图,仅使用lbs task tower进行打分。

Goland激活2023.1.1(GoLand 2023.1 发布)

4、总结

lbs推荐能力作为创新业务,我们通过模板化推荐能力,快速承接推荐位30+,支持三种推荐模式,初期快速的助力了全渠道的业务发展。

后续针对业务理解,经过对LBS推荐链路的独立拆分,以及召回和精排迭代优化。在首页-为你推荐上,lbs商品曝光UV占比相对Q3提升 488% ,CTR相对Q3提升159.52%。同时带动整体大盘指标提升,首页整体浏览深度显著提升0.39%,推荐整体uctr显著提升0.79%,推荐人均三级类目数显著提升0.76%,推荐外页uctr显著提升0.37%。

后续我们将继续结合场景特点和业务理解,逐渐完善优化LBS流量分发能力,更好服务商家和用户,提升京东LBS推荐能力。

SQL Chat 是基于对话式交互的 SQL 客户端,以 Chat 交互为中心,与传统 GUI 模式的 SQL 客户端完全不同,可以使用自然语言询问数据库问题和查询数据库。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

随着进入 Developer Tools 2.0 时代,有大量机会使用基于聊天的界面重建现有工具。SQL 客户端也不例外。与在许多 UI 控件之间导航不同,基于聊天的界面更加直观。当然,前提是可行,而该项目的目标就是提供这种体验。

SQL Chat 由 Next.js 构建,它支持以下数据库,预计会随着时间的推移添加更多:

  • MySQL
  • PostgreSQL

根据介绍,SQL Chat 是 Bytebase 成立以来的第二条独立产品线。从零打造,以 Chat 交互为中心,颠覆传统 GUI 模式的 SQL 客户端。采用 Next.js 框架,国内可直接部署到腾讯云 Web 应用托管服务,国外也可一键部署到 Vercel,同样支持私有化部署。

自 Python 1.5(1997 年)以来, 结构就被添加到了 CPython,允许开发者在一个进程中同时运行多个 Python 解释器。然而,多个解释器在同一进程中运行时,并不能真正地相互隔离。同一进程中的解释器始终共享大量全局状态。这是很多错误的来源,随着越来越多的人使用该功能,其影响也越来越大。

造成这个情况的主要原因就是由于 GIL(全局解释器锁),这是 CPython 的一个核心特性,而为了解决这个问题就有开发者曾提出过删除全局解释器锁 GIL 的提议。除此之外,另一个显而易见的方法则是建立每一个解释器的 GIL:为进程中产生的每一个解释器建立一个单独的锁。

Goland激活2023.1.1(GoLand 2023.1 发布)

因此在去年 3 月,开发者 Eric Snow 就提出了一个针对每个解释器的全局解释器锁(A Per-Interpreter GIL),通过充分的隔离有助于实现真正的多核并行,其中的解释器不再共享 GIL。

Eric Snow 在提议中表示:

有了每个解释器的 GIL,CPython 将能够为在不同解释器中运行的代码实现真正的多核并行性。

Goland激活2023.1.1(GoLand 2023.1 发布)

经过一年多时间的讨论,日前 CPython 的核心开发者 Emily Morehouse 代表指导委员会正式接受了这个提议(PEP 684),Eric Snow 仍然以 Python 3.12 为目标,希望能在该版本中看到每个解释器的 GIL,Python 3.12 预计将于今年 10 月发布。

然而,实现每个解释器的 GIL 不是一个小任务。一般来说,在多个解释器之间共享的任何可变状态都必须由锁来保护。这意味着,如果要为每一个解释器建立一个单独的锁,那么多个解释器之间共享的状态数量必须降到绝对最低。适当地隔离解释器需要将大部分 CPython 运行时状态存储在 结构中。目前,只有其中的一部分是这样的,其中大部分都需要被移动。

关于这个提议的更多详情可以查看 GitHub 的 PR 和 Python 社区的讨论。

CPython 核心开发者 Nathaniel J. Smith 提交了一项新提案:

  • PEP 711 —— PyBI: a standard format for distributing Python Binaries

Goland激活2023.1.1(GoLand 2023.1 发布)

根据该提案的描述,PyBI (Python Binary) 是用于分发 Python 二进制文件的标准格式。Nathaniel 对 PyBI 的概括如下:它不是预构建的 Python 软件包,而是预构建的 Python 解释器。

此提案定义了一个标准的打包文件格式来保存预构建的 Python 解释器,并尽可能重用现有的 Python 打包标准。

命名格式:

示例:

详情查看原始草案:https://github.com/njsmith/posy/blob/main/pybi/README.md

PyBI 构建工具:https://github.com/njsmith/pybi-tools

pybi 构建示例:https://pybi.vorpus.org/

Nathaniel 还介绍道,他希望 PyBI 能像 Pypi.org 一样——为所有流行平台上的所有 Python 版本预构建软件包,以便自动化工具可以轻松获取其中任何一个并进行设置。让尝试 Python 预发布、在 CI 中修复 Python 版本、创建一个临时环境来重现仅在特定 Python 点版本上发生的错误报告等都变得快速和容易。

 

Rust 基金会宣布正在为注册商标 Rust 和 Cargo 的使用制定新的商标政策。该组织于 2022 年 8 月启动了这一法律程序,共收到了近 1000 份回复。之后,基金会还邀请了一些感兴趣的人加入他们的商标政策工作组,该工作组由 Rust 项目负责人、基金会工作人员和法律顾问组成,以制定适合 Rust 社区需求的更新政策。

Rust 商标政策的一个核心目的是帮助确保当你遇到通过标记列出与 Rust 编程语言有关联的产品、项目或资源时,可以更好地确保其真实性以及与 Rust 基金会/Rust 项目的关联。“我们希望在 Rust 社区中灌输对该政策的信心,并使你能够将其用作有用的资源 —— 它并不是要恐吓或在不适当的地方强加一种巨大的限制感。”

草案内容指出,Rust 基金会的商标政策是为了保护 Rust 项目和 Rust 社区的工作,并确保 Rust 语言不会因为不实陈述或政策侵权而被贬值、稀释或合用。Rust基金会不希望参与小规模的治安管理或无意义的诉讼。但是,如果基金会认为 Rust 商标被滥用或者恶意使用,他们将坚决采取捍卫措施。

Goland激活2023.1.1(GoLand 2023.1 发布)

常见用例的快速商标政策参考:

  • 销售商品 —— 除非得到明确批准,否则不得将 Rust 名称或 Logo 用于销售产品/促销商品以获取收益/利润或注册域名。例如,不允许在网上商店出售带有 Rust logo 的贴纸以谋取个人利益。
  • 表示对 Rust 的支持——在个人网站或博客上表示对 Rust 项目的支持时,可以使用 Rust 名称或 Logo,只要遵守政策中列出的所有要求即可。你可以在社交媒体用户名、头像和表情符号中使用 Rust 名称或 Logo,以装饰性的方式展示对 Rust 项目的支持,只要你不暗示与 Rust 有商业联系。
  • 在教育材料中包含 Marks —— 可以在书籍和文章标题中使用 Rust 名称,在图形组件中使用 Logo,只要你明确表示 Rust 项目或基金会没有审查/批准/认可你的内容。
  • Ferris —— Ferris 可供任何人自由使用,不需要得到基金会的许可。
  • RS —— RS 可以自由使用,无需许可,以表明软件或项目来自或基于 Rust、与 Rust 兼容、受Rust 启发,或可用于与 Rust 相同的目的。如果你担心你的使用超出了本政策的范围,基金会建议使用 RS 而不是”Rust”,例如,将你的 crate 命名为 foo-rs 而不是 rust-foo。

关于使用 Rust Logo 作为社交平台头像这一举措,更新后的政策草案进一步解释称:个人账户上的社交媒体头像是合理使用,但禁止在企业社交媒体简介/个人资料图片中使用 Rust 商标。且除了缩放操作,一般来说禁止出于任何目的对 Rust 商标进行修改。

一般来说,营利性活动中 Rust 名称或 Logo 的使用,都需要获得 Rust 基金会的批准。非营利性的使用可以不用批准;但需要明确表示,该活动不是由 Rust 基金会支持的。

目前该政策草案还在征询意见期。随着该阶段的结束,Rust 基金会将确定商标政策的最终版本,并将对收到的反馈做出总结性回应。Rust 商标政策的公众意见征询期将于太平洋夏令时间 4 月 16 日下午 5 点结束。

关于具体软件使用情况的更多细节,以及一些常见问题解答部分,可查阅完整的 Rust 基金会商标政策。

伪造的空软件包正在占领 NPM ,甚至短暂地导致拒绝服务 (DoS) 攻击。

 

Checkmarx 在上周发布的一份 npm 恶意行为分析报告中介绍:

针对开源生态系统的恶意活动正在导致大量垃圾邮件、SEO 中毒和恶意软件感染。

这些攻击造成了拒绝服务 (DoS),使 NPM 不稳定,甚至出现零星的‘服务不可用’错误。

通常,单月在 NPM 上发布的包版本数量约为 80 万。然而,上个月 NPM 的新包数量超过了 140 万。

Goland激活2023.1.1(GoLand 2023.1 发布)

这些空包来源于一些恶意行为者创建的自动化发布流程:他们先创建一些带病毒的恶意网站,然后在 npm 等开源生态平台上发布带有这些网站链接的空包。

由于开源生态系统在搜索引擎上的权重非常高,这些新的空软件包也会在搜索结果中排在前面。

Goland激活2023.1.1(GoLand 2023.1 发布)

这些空包的 README.md 文件会包含恶意站点,或者带着推荐 ID 跳转到一些电商网站的链接,以此获取电商平台的推荐费。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

而且整个恶意软件包的发布过程是自动化的,大量包所产生的负载导致 NPM 在 2023 年 3 月底间歇性地遇到稳定性问题。甚至出现不响应的 DoS 表现。

Goland激活2023.1.1(GoLand 2023.1 发布)

为防止此类自动化活动,Checmarx 建议 npm 在用户帐户创建过程中加入反机器人技术,避免一些恶意攻击者使用自动化技术轻易地创建大量垃圾软件包。

Radeon RADV Vulkan 驱动程序已经默认启用图形管道库“GPL”支持。

RADV GPL enabled by default.

去年发布的 Vulkan 1.3.210 添加了 VK_EXT_graphics_pipeline_library ,允许单独编译图形管道的四个不同部分,最后将它们链接在一起创建可执行管道。这样可以更好地重用具有相同着色器或状态的管道,且能在多个管道中使用。

几个月来,Valve 的 Linux 图形驱动程序团队一直致力于 RADV 的 VK_EXT_graphics_pipeline_library 支持,以改善 Linux 游戏体验。

上周,RADV 驱动程序已经合并了图形管道库“GPL”支持的最后一个功能 —— GPL 着色器缓存。现在整个 GPL 扩展的支持已经足够好了,可以默认启用,有助于减少游戏加载时间和避免卡顿。

RADV GPL libraries caching MR

目前 RADV Vulkan 驱动程序的图形管道库支持代码已合并到 Mesa 23.1,应该会在 5 月底或 6 月初稳定发布。

作者:vivo 互联网服务器团队- Liu Yanjiang


月光宝盒是一个基于流量录制回放的自动化测试平台,通过录制回放取代编写脚本进行自动化回归,提升测试效率和覆盖率。因为其解决方案具有很强的通用性,所以我们把这它开源出来,希望能帮助到有需要的用户。


一、月光宝盒 是什么?


Moonbox(月光宝盒)是 JVM-Sandbox 生态下的一款流量录制回放产品。所谓流量录制回放是服务端通过挂载agent探针自动注册到服务端,拦截服务端调用,将所有外部调用依赖的内容(如数据库、分布式缓存、外部服务响应等)进行完整记录形成录制流量。其核心价值是通过录制流量数据,将流量数据转化成可复用、可执行的自动化用例,快速在测试环境中进行回放比对接口返回值和外部调用依参数(见下图)。Moonbox(月光宝盒)提供了大量的常用插件,能够对常见的中间调用进行录制回放,同时也提供了非常可靠、高性能的数据存储、计算能力。

Goland激活2023.1.1(GoLand 2023.1 发布)


二、月光宝盒 有哪些优势?


正如开头所说月光宝盒是一款面向测试、研发工程师使用的低门槛、高性能、更易于使用的自动化测试工具。这款产品已经在vivo运行了2年多了,经过我们持续优化、打磨拥有很多实用、易用功能。它的优点主要体现在下面几方面:


2.1 全面可视化视操作(部分功能)


(1)基于任务、接口维度的流量管理能力

Goland激活2023.1.1(GoLand 2023.1 发布)

(2)详细的流量展示细节(请求、响应、子调用)


Goland激活2023.1.1(GoLand 2023.1 发布)

(3)基于任务、接口维度的回放数据管理,叠加各种维度统计、查询能力


Goland激活2023.1.1(GoLand 2023.1 发布)

(4)易于人工分析的回放比对结果和差异展示

Goland激活2023.1.1(GoLand 2023.1 发布)


2.2 丰富的插件支持


月光宝盒支持非常多组件录制和回放能力,基本上能满足绝大多数人诉求。

Goland激活2023.1.1(GoLand 2023.1 发布)


2.3 多种部署方式


  • Docker:这种方式简单、可靠,让您可以摒弃复杂的环境配置和安装,快速在本地体验我们项目。

  • 常规方式:这种方式复杂、步骤繁琐,需要按照步骤创建ES和MySQL数据库,初始化数据表,更新好应用配置,安装好前端node服务。


此外月光宝盒是前后端分离项目,当您使用该项目需要分别部署前端、后端,非常有助于您后续将项目部署到生产环境。


2.4 性能安全可靠


平台对性能进行了长期优化,在vivo内部历经多个高并发系统验证。我们对agent端录制流量进行了一系列安全防护,例如对相同接口同时只能有一个进入采样中,限制并行录制接口数量。服务端使用了ES储存流量,有效提升了数据储存规模。


三、月光宝盒 实现原理


3.1 整体架构


月光宝盒平台分为2个部分,分别为moonbox-agent 和 moonbox-server(整体架构如下图所示)


moonbox-agent

使用Java-attach技术(实际的动态字节码增强由JVM-Sandbox实现)动态代理到目标进程上,提供流量录制和回放的增强。


moonbox-server

  • Agent端使用接口,提供配置查询、录制流量保存、流量查询、回放结果保存等服务

  • 录制任务/回放任务的配置,agent任务远程管理能力和管理后台操作界面(前后端分离部署)

Goland激活2023.1.1(GoLand 2023.1 发布)


3.2 流量录制&回放


流量录制

核心逻辑是将agent分发到用户填写的机器上(本地、远程机器),然后将agent attach到用户填写应用所对应的正确进程上去。然后通过JVM-Sandbox的BEFORE、RETRUN、THROW事件机制拦截关键调用位置获取流量入参、出参。整体流程见下图整体流程见下图:

Goland激活2023.1.1(GoLand 2023.1 发布)

流量回放

核心逻辑是将agent分发到用户填写的机器上(本地、远程机器),然后将agent attach到用户填写应用所对应的正确进程上去,agent启动后从服务端不断拉取流量去分发到对应接口做回放,整体流程见下图:

Goland激活2023.1.1(GoLand 2023.1 发布)

心跳管理

Agent启动后会单独开启线程固定间隔时间通过http请求给服务端上报心跳

Goland激活2023.1.1(GoLand 2023.1 发布)


3.3 Agent启动过程


执行脚本将sandbox agent attach到目标java进程上,sandbox 启动jetty服务,加载moonbox module,然后从服务端拉取moonbox配置,加载流量录制和回放插件。

Goland激活2023.1.1(GoLand 2023.1 发布)


四、 和 jvm-sandbox-repeater 关系?


Moonbox是基于jvm-sandbox-repeater重新开发的一款流量回放平台产品。在jvm-sandbox-repeater基础上重写了很多模块,并提供了更加丰富功能,同时便于线上部署和使用,和jvm-sandbox-repeater差异如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

五、为什么要开源?


流量录制回放技术复杂,挑战较高,开源社区虽然有很多类似产品但是在易用性方面都有一些欠缺,我们希望通过开源月光宝盒帮助对该方向有兴趣的开发者快速构建自己的自动化工具,同时可以基于我们这款产品制定个性化诉求。此外,月光宝盒本身也借鉴了jvm-sandbox-repeater设计和方案,是开源的受益方,现在我们将自己思考和探索回馈给开源社区,丰富流量回放开源技术生态。除此之外通过社区中开发者的使用,也可以帮助我们更好的改进我们的工具,获得更多的需求场景输入,也能让该工具获得更加长远的发展。


六、Roadmap


月光宝盒已经完成V1.0.0版本开源,初步完成了各项重要功能开源,后续我们会持续性的完成平台性能、体验优化工作,同时积极收集社区使用反馈的功能需求,将一些好的需求纳入我们版本计划里面。2023年我们规划了一些迭代版本,如下图所示:

Goland激活2023.1.1(GoLand 2023.1 发布)


七、写在最后


今天月光宝盒的开源只是我们迈出的一小步,后续我们会持续按照计划向社区贡献版本和特性。如果您对月光宝盒有兴趣,欢迎体验我们开源产品。如果您有问题或者更好的方案,欢迎向我们开源项目贡献反馈ISSUE和贡献PR,这将是我们莫大的荣幸。


GItHub项目地址:https://github.com/vivo/MoonBox


END

猜你喜欢

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

  • Dubbo 中 Zookeeper 注册中心原理分析

  • 解密游戏推荐系统的建设之路



摘要:一份精心准备的《JS项目改造TS指南》文档供大家参考,顺便介绍TS 基础知识和 TS 在 Vue 中的实践。

本文分享自华为云社区《历史性的时刻!OpenTiny 跨端、跨框架组件库正式升级 TypeScript,10 万行代码重获新生!》,作者:Kagol。

根据 The Software House 发布的《2022 前端开发市场状态调查报告》数据显示,使用 TypeScript 的人数已经达到 84%,和 2021 年相比增加了 7 个百分点。

3月16日发布了 TypeScript 5.0 版本。TypeScript 可谓逐年火热,使用者呈现逐年上升的趋势,再不学起来就说不过去。

我们 OpenTiny 近期做了一次大的升级,将原来运行了 9年 的 JavaScript 代码升级到了 TypeScript,并通过 Monorepo 进行子包的管理,还在用 JavaScript 的朋友抓紧升级哦,我特意准备了一份《JS项目改造TS指南》文档供大家参考,顺便介绍了一些 TS 基础知识和 TS 在 Vue 中的一些实践。

Goland激活2023.1.1(GoLand 2023.1 发布)

通过本文你将收获:

  • 通过了解 TS 的四大好处,说服自己下定决心学习 TS
  • 5 分钟学习 TS 最基础和常用的知识点,快速入门,包教包会
  • 了解如何在 Vue 中使用 TypeScript,给 Vue2 开发者切换到 Vue3 + TypeScript 提供最基本的参考
  • 如何将现有的 JS 项目改造成 TS 项目

1 学习 TS 的好处

1.1 好处一:紧跟潮流:让自己看起来很酷

如果你没学过 TS
你的前端朋友:都 2023 年了,你还不会 TS?给你一个眼色你自己感悟吧

如果你学过 TS
你的前端朋友:哇,你们的项目已经用上 Vue3 + TS 啦,看起来真棒!教教我吧

Goland激活2023.1.1(GoLand 2023.1 发布)

如果说上面那个好处太虚了,那下面的3条好处可都是实实在在能让自己受益的。

1.2 好处二:智能提示:提升开发者体验和效率

当循环一个对象数组时,对象的属性列表可以直接显示出来,不用到对象的定义中去查询该对象有哪些属性。

Goland激活2023.1.1(GoLand 2023.1 发布)

通过调用后台接口获取的异步数据也可以通过TS类型进行智能提示,这样相当于集成了接口文档,后续后台修改字段,我们很容易就能发现。

Goland激活2023.1.1(GoLand 2023.1 发布)

Vue 组件的属性和事件都可以智能提示。

下图是我们OpenTiny跨端跨框架前端组件库中的 Alert 组件,当在组件标签中输入 des 时,会自动提示 description 属性;当输入 @c 时,会自动提示 @close 事件。

Goland激活2023.1.1(GoLand 2023.1 发布)

1.3 好处三:错误标记:代码哪里有问题一眼就知道

在 JS 项目使用不存在的对象属性,在编码阶段不容易看出来,到运行时才会报错。

Goland激活2023.1.1(GoLand 2023.1 发布)

在 TS 项目使用不存在的对象属性,在IDE中会有红色波浪线标记,鼠标移上去能看到具体的错误信息。

Goland激活2023.1.1(GoLand 2023.1 发布)

在 JS 项目,调用方法时拼错单词不容易被发现,要在运行时才会将错误暴露出来。

Goland激活2023.1.1(GoLand 2023.1 发布)

在 TS 项目会有红色波浪线提示,一眼就看出拼错单词。

Goland激活2023.1.1(GoLand 2023.1 发布)

1.4 好处四:类型约束:用我的代码就得听我的

你写了一个工具函数 getType 给别人用,限定参数只能是指定的字符串,这时如果使用这个函数的人传入其他字符串,就会有红色波浪线提示。

Goland激活2023.1.1(GoLand 2023.1 发布)

Vue 组件也是一样的,可以限定组件 props 的类型,组件的使用者如果传入不正确的类型,将会有错误提示,比如:我们 OpenTiny 的 Alert 组件,closable 只能传入 Boolean 值,如果传入一个字符串就会有错误提示。

Goland激活2023.1.1(GoLand 2023.1 发布)

2 极简 TS 基础,5分钟学会

以下内容虽然不多,但包含了实际项目开发中最实用的部分,对于 TS 入门者来说也是能很快学会的,学不会的找我,手把手教,包教包会,有手就会写。

2.1 基本类型

用得较多的类型就下面5个,更多类型请参考:TS官网文档

  • 布尔 boolean
  • 数值 number
  • 字符串 string
  • 空值 void:表示没有任何返回值的函数
  • 任意 any:表示不被类型检查

用法也很简单:


默认情况下,name 会自动类型推导成 string 类型,此时如果给它赋值为一个 number 类型的值,会出现错误提示。


Goland激活2023.1.1(GoLand 2023.1 发布)

如果给 name 设置 any 类型,表示不做类型检查,这时错误提示消失。


Goland激活2023.1.1(GoLand 2023.1 发布)

2.2 函数

主要定义函数参数和返回值类型。

看一下例子:


以上代码包含以下 TS 校验规则:

  • 调用 sum 函数时,必须传入两个参数,多一个或者少一个都不行
  • 并且这两个参数的类型要为 number 类型
  • 且函数的返回值为 number 类型

少参数:

Goland激活2023.1.1(GoLand 2023.1 发布)

多参数:

Goland激活2023.1.1(GoLand 2023.1 发布)

参数类型错误:

Goland激活2023.1.1(GoLand 2023.1 发布)

返回值:

Goland激活2023.1.1(GoLand 2023.1 发布)

用问号 ? 可以表示该参数是可选的。


如果将 y 定义为可选参数,则调用 sum 函数时可以只传入一个参数。

需要注意的是,可选参数必须接在必需参数后面。换句话说,可选参数后面不允许再出现必需参数了。

给 y 增加默认值 0 之后,y 会自动类型推导成 number 类型,不需要加 number 类型,并且由于有默认值,也不需要加可选参数。


2.3 数组

数组类型有两种表示方式:

  • 类型 + 方括号 表示法
  • 泛型 表示法

这两种都可以表示数组类型,看自己喜好进行选择即可。

如果是类数组,则不可以用数组的方式定义类型,因为它不是真的数组,需要用 interface 进行定义


IArguments 类型已在 TypeScript 中内置,类似的还有很多:


如果数组里的素类型并不都是相同的怎么办呢?

这时 any 类型就发挥作用啦啦


2.4 接口

接口简单理解就是一个对象的“轮廓”


接口是可以继承接口的


这样 IClosableResourceItem 就包含了 IResourceItem 属性和自己的 closable 可选属性。

接口也是可以被类实现的


如果类实现了一个接口,却不写具体的实现代码,则会有错误提示

Goland激活2023.1.1(GoLand 2023.1 发布)

2.5 联合类型 & 类型别名

联合类型是指取值可以为多种类型中的一种,而类型别名常用于联合类型。

看以下例子:


当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法:


2.6 类型断言

类型断言(Type Assertion)可以用来手动指定一个值的类型。

语法:值 as 类型,比如:(animal as Fish).swim()

类型断言主要有以下用途:

  • 将一个联合类型断言为其中一个类型
  • 将一个父类断言为更加具体的子类
  • 将任何一个类型断言为 any
  • 将 any 断言为一个具体的类型

我们一个个来看。

用途1:将一个联合类型断言为其中一个类型


animal 是一个联合类型,可能是猫 Cat,也可能是鱼 Fish,如果直接调用 swim 方法是要出现错误提示的,因为猫不会游泳。

Goland激活2023.1.1(GoLand 2023.1 发布)

这时类型断言就派上用场啦啦,因为调用的是 swim 方法,那肯定是鱼,所以直接断言为 Fish 就不会出现错误提示。


用途2:将一个父类断言为更加具体的子类


ApiError 和 HttpError 都继承自 Error 父类,error 变量的类型是 Error,去取 code 变量肯定是不行,因为取的是 code 变量,我们可以直接断言为 ApiError 类型。

用途3:将任何一个类型断言为 any

这个非常有用,看一下例子:


getCacheData 是一个历史遗留函数,不是你写的,由于他返回 any 类型,就等于放弃了 TS 的类型检验,假如 tom 是一只猫,里面有 name 属性和 run() 方法,但由于返回 any 类型,tom. 是没有任何提示的。

如果将其断言为 Cat 类型,就可以 点 出 name 属性和 run() 方法。

Goland激活2023.1.1(GoLand 2023.1 发布)

用途4:将 any 断言为一个具体的类型

这个比较常见的场景是给 window 挂在一个自己的变量和方法。


由于 window 下没有 foo 变量,直接赋值会有错误提示,将 window 断言为 any 就没问题啦啦。

2.7 组

数组合并了相同类型的对象,而组(Tuple)合并了不同类型的对象。


给组类型赋值时,数组每一项的类型需要和组定义的类型对应上。

当赋值或访问一个已知索引的素时,会得到正确的类型:


也可以只赋值其中一项:


但是当直接对组类型的变量进行初始化或者赋值的时候,需要提供所有组类型中指定的项。


当添加越界的素时,它的类型会被限制为组中每个类型的联合类型:


push 字符串和数字都可以,布尔就不行。

2.8 枚举

枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等。


枚举成员会被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射:


手动赋值:未手动赋值的枚举项会接着上一个枚举项递增。


2.9 类

给类加上 TypeScript 的类型很简单,与接口类似:


类的语法涉及到较多概念,请参考:

  • https://es6.ruanyifeng.com/#docs/class
  • https://ts.xcatliu.com/advanced/class.html

2.10 泛型

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

可以简单理解为定义函数时的形参。

设想以下场景,我们有一个 print 函数,输入什么,原样打印,函数的入参和返回值类型是一致的。

一开始只需要打印字符串:


后面需求变了,除了能打印字符串,还要能打印数字:


假如需求又变了,要打印布尔值、对象、数组,甚至自定义的类型,怎么办,写一串联合类型?显然是不可取的,用 any?那就失去了 TS 类型校验能力,沦为 JS。


解决这个问题的完美方法就是泛型!

print 后面加上一对尖括号,里面写一个 T,这个 T 就类似是一个类型的形参。

这个类型形参可以在函数入参里用,也可以在函数返回值使用,甚至也可以在函数体里面的变量、函数里面用。


那么实参哪里来?用的时候传进来!


我们还可以使用泛型来约束后端接口参数类型。


以上代码对接口进行了约束:

  • url 只能是 API 中定义过的,其他 url 都会提示错误
Goland激活2023.1.1(GoLand 2023.1 发布)
  • 接口参数 obj 必须和 url 能对应上,不能少属性,属性类型也不能错
Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)

而且调用 request 方法时,也会提示 url 可以选择哪些

Goland激活2023.1.1(GoLand 2023.1 发布)

如果后台改了接口参数名,我们一眼就看出来了,都不用去找接口文档,是不是很厉害!

泛型的例子参考了前端阿林的文章:

  • 轻松拿下 TS 泛型

3 TS 在 Vue 中的实践

3.1 定义组件 props 的类型

不使用 setup 语法糖


使用 setup 语法糖 – runtime 声明


使用 setup 语法糖 – type-based 声明


3.2 定义 emits 类型

不使用 setup 语法糖


Goland激活2023.1.1(GoLand 2023.1 发布)

使用 setup 语法糖


3.3 定义 ref 类型

默认会自动进行类型推导


两种声明 ref 类型的方法


3.4 定义 reactive 类型

默认会自动进行类型推导


使用接口定义明确的类型


3.5 定义 computed 类型

默认会自动进行类型推导


两种声明 computed 类型的方法


3.6 定义 provide/inject 类型

provide


inject


3.7 定义模板引用的类型


3.8 定义组件模板引用的类型

定义一个 MyModal 组件


在 App.vue 中引用 MyModal 组件


Goland激活2023.1.1(GoLand 2023.1 发布)

参考 Vue 官网文档:

  • TypeScript with Composition API

4 JS 项目转 TS

还是使用 JS 的同学有福啦!为了让大家快速用上 TS,享受 TS 的丝滑体验,我整理了一份《JS 项目改造成 TS 项目指南》。有了这份步骤指南,JS 项目转 TS 不再是难事!

我们新开源的 TinyVue 组件库,就使用这份《JS 项目改造成 TS 项目指南》,成功地由 JS 项目改造成了 TS 项目,悄悄地告诉大家:

  • TinyVue 是一套跨端、跨框架的企业级 UI 组件库,支持 Vue 2 和 Vue 3,支持 PC 端和移动端。
  • 在内部经过9年持续打磨,服务于华为内外部上千个项目。
  • 目前代码量超过10万行。

这么庞大的代码量都能从 JS 转 TS,其他小规模的项目更是不在话下。

为了验证自己的猜想,我又在 GitHub 找到了一个6年前的 Vue2 + JS 项目,目前早已不再维护,打算尝试将其改造成 TS 项目,结果按照这份指南,1个小时不用就搞定啦啦

https://github.com/liangxiaojuan/vue-todos

这个项目的效果图长这样:

Goland激活2023.1.1(GoLand 2023.1 发布)

我已经提了 issue,看下作者是否同意改造成 TS,同意的话,我立马就是一个 PR 过去!

话不多说,大家有需要的,可直接拿走!

《JS 项目改造成 TS 项目指南》

JS 项目改造成 TS 步骤:

  1. 安装 TS:npm i typescript ts-loader -D
  2. 增加 TS 配置文件:tsconfig.json
  3. 修改文件后缀名:x.js -> x.ts
  4. x.vue 文件增加 lang:<script lang=”ts”>
  5. vite.config.js 配置后缀名
  6. 升级依赖,修改本地启动和构建脚本
  7. 添加 loader / plugin 等
  8. 逐步补充类型声明

tsconfig.ts


配置文件后缀名,增加 .ts 和 .tsx


入口文件要由 main.js 改成 main.ts


需要配置下 loader


以及 plugin


完成之后,先测试下项目是否能正常启动和构建:npm run dev / npm run build

都没问题之后,本次 TS 项目改造就完成大部分啦啦!

后续就是逐步补充代码涉及到的变量和函数的类型声明即可。

改造过程中遇到问题欢迎留言讨论,希望你也能尽快享受 TS 的丝滑开发者体验!

TinyVue 招募贡献者啦

如果你对我们的跨端跨框架组件库 TinyVue 感兴趣,欢迎参与到我们的开源社区中来,一起将它建设得更好!

参与 TinyVue 组件库建设,你将收获:

直接的价值:

  • 通过打造一个跨端、跨框架的组件库项目,学习最新的 Monorepo + Vite + Vue3 + TypeScript 技术
  • 学习从 0 到 1 搭建一个自己的组件库的整套流程和方法论,包括组件库工程化、组件的设计和开发等
  • 为自己的简历和职业生涯添彩,参与过优秀的开源项目,这本身就是受面试官青睐的亮点
  • 结识一群优秀的、热爱学习、热爱开源的小伙伴,大家一起打造一个伟大的产品

长远的价值:

  • 打造个人品牌,提升个人影响力
  • 培养良好的编码习惯
  • 获得华为云 OpenTiny 开源社区的荣誉&认可和定制小礼物
  • 成为 PMC & Committer 之后还能参与 OpenTiny 整个开源生态的决策和长远规划,培养自己的管理和规划能力。
  • 未来有更多机会和可能

往期活动礼品及贡献者的反馈:

Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)

联系我们

如果你对我们 OpenTiny 的开源项目感兴趣,欢迎添加小助手微信:opentiny-official,拉你进群,一起交流前端技术,一起玩开源。

OpenTiny 官网:https://opentiny.design/

OpenTiny 仓库:https://github.com/opentiny/

Vue 组件库:https://github.com/opentiny/tiny-vue(欢迎 Star 🌟)

Angular 组件库:https://github.com/opentiny/ng(欢迎 Star 🌟)

 

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

摘要:相比于传统的微服务架构,云原生和 serverless 技术更加灵活、高效,能够更好地满足用户的需求。

本文分享自华为云社区《《凤凰架构》学习和思考——云原生时代的服务架构演进史》,作者:breakDawn。

随着云原生的概念越来越火,服务的架构应该如何发展和演进,成为很多程序员关心的话题。大名鼎鼎的《深入理解java虚拟机》一书作者于21年推出了新作《凤凰架构》,从这本书中可以看到当前时下很多最新的技术或者理念。

Goland激活2023.1.1(GoLand 2023.1 发布)

一、服务架构演进史

1.1原始分布式时代

DCE(Distributed Computing Enviroment) 分布式运算环境。

DCE的设计主旨:“开发人员不必关心服务是远程还是本地,都能够透明地调用服务或者访问资源”

是很早由OSF指定的分布式技术体系理论,解答了很多问题,例如:

  • 远程服务在哪?——对应服务发现
  • 要部署多少个?——对应负载均衡
  • 请求超时怎么办?——对应熔断、隔离、降级
  • 方法参数和结果如何表示?——对应序列化方式
  • 信息如何传入?——对应传输协议选型
  • 服务权限?——对应认证、授权方案
  • 怎么保证不同机器间的状态最终一致?——对应分布式数据一致性

但最终发现解决这些问题的代价 远超 分布式所带来的收益,在DCE刚提出的年代(80年代),机器资源并没到那个程度, 于是暂时被搁置了。

1.2 单体系统

单体系统并不一定就代表是坏的,不好的。

单体架构的好处

如果是相同资源的前提下, 单体系统的性能是比分布式要高的。所有数据都是进程内通信,且开发、部署、测试都基于同一个对象进行处理,更加方便。单体系统中的代码一般也是做好了分层、分模块的,也是易于敏捷开发和迭代的。

单体架构的坏处

然而如果单体系统中一部分代码出现缺陷, 可能直接把进程空间耗光,或者直接打崩整个进程,也没有办法针对某个代码模块做单独的升级或者更新。因此当系统规模较小的时候,单体系统有独特的优势。系统规模越来越大, 则要求各功能模块能够自治和隔离,减少爆炸范围。
从“追求尽量不出错”到“追求出错是必然”,是微服务架构挑战并取代单体架构的底气所在。

1.3 SOA——面向服务架构

SOA(Service-Oriented-Architecture)叫做面向服务的架构,类似于各服务之间协议和通信方式高度一致性,各服务遵循完全相同的消息协议和管理机制。

终极目标是总结出一套自上而下的软件研发方法论,最后新厂家要开发系统时,八股文一般照搬SOA架构和实现即可

有一种参考的SOA架构是事件驱动架构,所有服务连接一个统一的消息管道,从管道中接收统一的事件消息和响应机制。

SOA落寞的原因:

  • 过于严格的规范定义带来了过度的复杂性;
  • 过于精密的流程和理论需要懂得复杂概念的专业人员才能驾驭。

1.4 微服务时代

微服务的九个核心业务与技术特征

  1. 围绕业务能力构建:根据业务划分细粒度的服务和团队;
  2. 分散治理: 各服务、各团队对服务质量各自负责,不受其他服务影响,可以各自演进而不用统一规化;
  3. 通过服务而不是类库来实现自治;
  4. 产品化思维:各服务开发人员关注整个微服务的全方位生命周期,大家不是为了仅仅完成某个功能,而是提供一个持续改进、提升的服务;
  5. 数据去中心化:允许不同的存储方式或者存储位置,但要考虑分布式一致性的成本;
  6. 强终端弱管道:即弱化类似SOAP的通信机制(通信管道设计很重,所有服务强制依赖,多了很多不必要的管道功能), 如果有调用需要,提供服务终端的endpoint去调用而不是强制管道使用;
  7. 容错性设计:认为各服务是可以出错的,并不会直接影响所有服务的运行;
  8. 演进式设计:不仅可以容错,也可以允许某个服务突然被淘汰;
  9. 基础设置自动化:通过CI/CD等自动化构建、发布、运维,减少人工维护成本。

微服务相比SOA的优势

微服务不是SOA的变体或者衍生品,微服务中的每一部分可以自由的选择其中的各种可选方案,例如远程调用有RMI、Dubbo、Rest;服务发现有ZK、Etcd等。也因为选择很多,对于架构师而言是一个很沉重的挑战。

1.5 后微服务时代(云原生时代)

用硬件方案替代软件方案

对于注册、跟踪治理、均衡等问题,能否脱离应用代码实现, 直接在硬件层面来实现?很早以前行不通,因为硬件基础设置跟不上软件应用的灵活性。直到docker和k8s的出现。微服务时代离不开以docker为代表的早期容器化技术,微服务框架springCloud所支持的软件级别微服务治理功能,都能够在k8s中找到硬件层面的替代:

Goland激活2023.1.1(GoLand 2023.1 发布)

通过k8s和相关的虚拟化技术, 与业务无关的技术性问题可以从软件层面剥离,直接在硬件设置层面进行解决!

第二次进化

当涉及调用链路的切换或者变更, 单纯依靠DNS的硬件层面来做切换还是比较困难的,不如软件方案灵活。于是引入了“服务网格”的边车代理模式,类似于脱离应用代码,在容器中部署一个通信代理服务器,对于请求的熔断、变更、流量控制都可通过这个代理服务器来管控。这样微服务应用代码中无需再考虑任何和上面这些通信过程相关的逻辑了,全部通过第三方的代理服务器实现!

1.6无服务(ServerLess)时代

无服务的定义

  • 后端即服务: 数据库、存储、日志等业务无关的后端等都存储在云上;
  • 函数即服务:供使用者调用的函数/接口都是运行在云端,调用者不需要考虑容量规划和算力问题。

无服务的愿景

  1. 开发者只需要纯粹地关注业务;
  2. 不需要考虑技术组件,后端组件现成的,直接使用,不用考虑如何采购和选型;
  3. 不用操心运维,运维能力交给云计算厂商。

无服务的缺点

对于信息管理系统、网络游戏或者对后端接口响应速度较高的应用而言, 无服务并不是最佳选择, 因为无服务的函数肯定不会一直处理高活跃度状态,存在冷启动的情况,对于其响应性能会有影响。

总结和思考

在很多年前的架构或者介绍微服务的书中,基本都是从单体->SOA->微服务。但是现在,随着云原生和serverless等新概念的出现,微服务架构的发展已经越来越多化。对于需要频繁接触云业务的开发者而言,这些新概念显得更加重要。在学习这个章节时,需要关注这些架构演进的原因和理由,比如SOA相比单体的优点和缺点,后微服务又是如何从理念上逐步领先了传统的微服务等。

而《凤凰架构》一书的后半章节内容,更多是聚焦容器、k8s等云原生的重要内容。

像基于容器、k8s的设计,云原生技术将原先软件能力中复杂的内容转移到了硬件层面进行替代,开发者能够用更集中的精力关心业务实现而非服务治理等繁杂的内容。

华为云CCE服务对于部署云业务的服务而言就是云原生时代的重要一环,CCE服务可以面向云原生2.0打造CCE Turbo容器集群,计算、网络、调度全面加速,学习 CCE 服务可以帮助开发者更深入地了解 Kubernetes 和容器技术,从而提高自己的微服务开发和容器化应用部署能力。

而无服务一般也是基于容器实现,对使用者而言基本不感知底层硬件资源,只需要调用即可,大大减少了创建和维护的学习和精力成本,即开即用的理念。  华为云数据湖探索DLI华为云湖仓构建LakeFormation等都是基于serverless实现的云服务,云用户基于这些serverless服务并结合华为MRS等大数据底座之后,可以快速运行自己的大数据作业或者数据统一管理等能力,构建数智融合的相关能力。

总而言之,相比于传统的微服务架构,云原生和 serverless 技术更加灵活、高效,能够更好地满足用户的需求。

 

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

摘要:本文介绍大模型低参微调套件——MindSpore PET。

本文分享自华为云社区《大模型高效开发的秘密武器——大模型低参微调套件MindSpore PET篇》,作者:yd_ 。

人工智能进入“大模型时代”。大模型具备更强泛化能力,在各垂直领域落地时,只需要进行参数微调,就可以适配多个场景。因此,发展大模型已成为产学研各界共识。

在大模型开发方面,昇腾推出了大模型开发使能平台,基于昇思MindSpore构建了支撑大模型开发的全流程大模型使能套件,包括TransFormers大模型套件MindSpore TransFormers、以文生图大模型套件MindSpore Diffusion、人类反馈强化学习套件MindSpore RLHF、大模型低参微调套件MindSpore PET,支撑大模型从预训练、微调、压缩、推理及服务化部署。

本期,我们将开启“大模型高效开发的秘密武器”系列之首篇,为大家介绍大模型低参微调套件——MindSpore PET。

一、MindSpore PET介绍

MindSpore PET(MindSpore Parameter-Efficient Tuning)是基于昇思MindSpore AI融合框架开发的大模型低参微调套件。当前该套件提供6种算法,包含5种经典的低参微调算法LoRA、Prefix-Tuning、Adapter、LowRankAdapter、BitFit,以及1种用于下游任务精度提升的微调算法R_Drop。低参微调算法只需微调极少量的参数,即可在保持全参微调精度的情况下,大大节约计算和存储内存,减少微调训练的时间;精度提升的微调算法在几乎不增加计算内存及时间情况下,增加模型随机性,防止模型过拟合从而提高模型的正确率。

套件为所有算法提供了API调用接口及使用案例,实现开箱即用,并为低参微调算法提供了只保存极少的可学习参数的接口,使得生成的ckpt文件非常小。

开源仓地址:https://github.com/mindspore-lab/MindPet

Goland激活2023.1.1(GoLand 2023.1 发布)

二、MindSpore PET – LoRA

2.1 算法原理

LoRA: Low-Rank Adaptation of Large Language Models,是微软提出的一种针对大语言模型的低参微调算法。LoRA假设在适配下游任务时,大模型的全连接层存在一个低内在秩(low intrinsic rank),即包含大量冗余信息。因此提出将可训练的秩分解矩阵注入Transformer架构的全连接层,并冻结原始预训练模型的权重,从而可大大减少参与训练的参数量。

Goland激活2023.1.1(GoLand 2023.1 发布)

2.2 应用效果——以悟空画画为例

悟空画画模型是基于扩散模型的中文文生图大模型。虽然有强大的能力,但模型网络规模巨大,约9亿参数量,适配下游任务时训练时间长,计算和存储内存开销大。

经分析,悟空画画中使用CLIP模型将人类语言转换成机器能理解的数学向量,并通过 U-Net 模型预测噪声。这两种模型的Attention结构都包含全连接层,适配下游任务时可能含有大量冗余信息。

Goland激活2023.1.1(GoLand 2023.1 发布)

因此,我们分别在 U-Net的交叉注意力层q、k、v、output四个模块上,注入了LoRA模块,发现效果异常好。

如下图所示,适配LoRA后即使仅训练0.07%参数,也可以生成高质量的图像!

Goland激活2023.1.1(GoLand 2023.1 发布)

同时,相比全参微调,应用LoRA算法,训练性能也得到大幅提升:

Goland激活2023.1.1(GoLand 2023.1 发布)
  1. 原本端到端全参微调需17小时,适配后仅需9小时,节约近50%时间;
  2. 计算内存节约40%,可继续增大一倍batch_size,速度更快;
  3. 最终保存的ckpt大小才3.06MB,不再需要用4个GB保存所有参数。

这说明当有n个下游任务时,仅需保存n x 3.06MB,避免了n x 4GB的“庞然大物”。而且,我们还做了令人振奋的实验。如果用户训练了多种风格的模型,只需0.5s就可以切换风格,真正的无缝切换“毕加索”和“新海诚”!

原因在于MindSpore框架的静态图特性,只需要在第一次正向训练时编图,后续即使加载其它LoRA-ckpt更新参数,也无需重新编图。

2.3 使用方式

为大模型减轻负担的LoRA算法本身用起来也很轻松,端到端仅需简单五步就可以完成适配。

第一步:

将模型CrossAttention结构中qkvo的Dense层替换成LoRADense:


第二步:

在训练脚本中调用冻结方法,仅训练新增的lora模块:


第三步:

在训练脚本中将保存ckpt的ModelCheckpoint替换为TrainableParamsCheckPoint,仅保存需要更新的参数:


第四步:

根据训练目标调整学习率、batch_size等参数:


第五步:

训练完成后,在评估脚本中分别加载预训练ckpt和微调后生成的ckpt:


我们已经开源所有代码,并给出了详细的接口和用例介绍:https://github.com/mindspore-lab/MindPet/blob/master/doc/TK_DeltaAlgorithm_README.md

需要注意的是相比全参微调,适配LoRA后一般要设置更大的学习率。如适配悟空画画时,我们就将学习率从1e-5增大到1e-4。

三、MindSpore PET – Prefix-Tuning

Prefix-Tuning: Optimizing Continuous Prompts for Generation,也是一种针对大语言模型的低参微调算法。研究人员提出,使用连续的向量而不是离散的词汇来构建前缀模板,即在输入前加入连续的token embedding,可以增加query和key的相关性。因此,Prefix-Tuning通过在每个multi-head attention的 key 矩阵和 value 矩阵前注入可训练的prefix向量k,v,并冻结原始网络参数,来大幅提升生成类任务的性能。

Prefix-Tuning在GPT-2和盘古Alpha大模型上都有很好的效果。与全参微调相比,在保持原有精度的前提下,使用Prefix-Tuning训练盘古Alpha仅需5.5%的参数量,节约了65%以上的计算内存,并将一个迭代的耗时缩短到一半。

Goland激活2023.1.1(GoLand 2023.1 发布)

四、MindSpore PET – Rdrop

R-Drop: Regularized Dropout for Neural Networks,是一种用于提升精度的微调算法,主要通过简单的“两次Dropout”来构造正样本进行对比学习,增加模型随机性。具体是在模型加载完一个batch的数据集之后,复制一份该数据,并同时输入到模型中,然后分别计算损失函数,并将结果相加得到最终的loss值。尽管逻辑非常简单,却能很好的防止模型过拟合,进一步提高模型的正确率。经在Bert上多个下游任务上验证,几乎保持同样的内存和时间开销,就能提升2.6个点的精度。

Goland激活2023.1.1(GoLand 2023.1 发布)

大模型开发到部署是一个高门槛、复杂的过程,大模型使能套件将帮助开发者,让大模型更易开发、易适配、易部署。

想了解更多关于TransFormers大模型套件MindSpore TransFormers、以文生图大模型套件MindSpore Diffusion、人类反馈强化学习套件MindSpore RLHF的相关信息,请关注昇思MindSpore公众号,我们将持续为大家带来人工智能领域技术干货和活动消息。

 

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

作者:京东零售 吴聪

引言

目前京东实行BigBoss机制以及积木型组织,同时现阶段再次强调了“经营”理念,以上均是比较大的组织层面的纲领和引导,核心是为了激发大家owner意识可以更好更快为公司产出价值和贡献。落到具体执行层面,与测试岗位息息相关的那便是“测试1号位”职责。

什么是测试1号位以及由来

借用Paul总在开年战略会上的话:“职责有边界、思考无边界、担当无边界”

测试1号位一般由大型项目中拆分出来的角色(产品1号位、研发1号位、测试1号位等),也叫主测试,是该项目的质量架构师,负责把控整体的资源协调、测试计划、用例评审,风险预判以及问题解决等,保障项目高质量交付。

1. 自身想象成一个枢纽,可以连接多个测试个体、模块、业务线甚至团队机构,是一个化零为整、力出一孔的角色定位,凝聚大家的力量协作并完成目标,需要在测试内横向拉通,有较强的协调组织能力。

2. 是该角色的代言人,本身携带了半个项目经理的属性。需要与其他角色(业产研设项)有横向沟通,协商,甚至谈判等能力,能主动去前置思考,遇到事情有担当,能发言,逻辑思维能力强。

3. 职能上具有向上汇报和向下管理的能力。可以快速总结抽象进展进行汇报和复盘,或抛出问题、申请资源等。当有下属时学会管理整体工作安排,或继续拆解多个分1号位协助管理等,将自身的思想和价值观感染他人,需要有纵向沟通和管理能力。

总而言之,测试1号位是一个虚拟岗位,通常伴随项目而生,是变化的。但是在某个项目中,1号位承担的责任和权利也是非常重要和关键,是实实在在的实体,是不变的。上述三点重点围绕“沟通”展开,可见身为1号位沟通是相当的关键。同样一名测试1号位的培养也离不开价值观的加持,比如拼搏、协作、担当、诚信、感恩、客户为先都是身为1号位应体现出的人格魅力。

测试1号位需要做什么

从接到一个项目开始,测试1号位就开始了相关工作,以下9条工作指导可按序进行。

1. 背景与构成

身处项目之中,当明确了自己1号位的职责后,第一反应不是马上扎入其中“拆解”而是应该先了解“背景与环境”,比如为什么要做这个项目,带来哪些收益,涉及哪些团队,涉及哪些业务系统,有哪些关键角色和其他1号位,里程碑节奏和交付时间等等,总而言之是“情报”,打好一场仗先要将情报工作做到位。用一个全盘视角去系统性的看待事情,这就是系统论的思想。了解这些信息有了整体认识便于更好的去做各类沟通,制定策略和战术,把控风险,所谓“磨刀不误砍柴工”。

2. 范围、排期与资源(参与brd,prd评审)

项目三要素告诉了我们“时间、成本、范围”,在项目中范围是非常重要的概念,项目不能一直往里塞东西,需要有始有终有边界有范围。而在资源有限,时间节点不可更改的情况下,范围就显的更为重要。与业产研明确范围后,开始进行相应的资源预估和排期评估,在这个过程中通常已进行了prd和brd评审,建议1号位尽量多参与brd评审,更前置的了解业务思路和逻辑。遇到排期和资源紧张和风险时,学会提前协调和布局,或者上升申请而不是等到后面或者进入测试了再考虑,那样就会比较被动。

3. 链路逻辑图(大型项目尤为关键)

我们通常在一些小项目或者内部项目时,涉及几个模块系统都是比较清晰的,链路也较短大家也容易忽略。而一旦涉及到大型项目,跨多个团队项目,会涉及到几十个系统。此时业务之间的交互逻辑,系统之间的交互逻辑,必须要严格梳理出来。这就是1号位存在的枢纽价值,各个单位节点难以看到的全局需要你来看,难以识别的风险需要你来识别,难以想到的上下游问题需要你来提问。此时可以组织各个系统节点首先画出自身的逻辑,然后进行串联输出一个完整的系统链路,并且需要细化些可以到接口级别,其次到应用级别,最粗颗粒度到系统级别,越细致越能挖掘的透彻越能把控住风险。基于该链路图测试可以与研发一起评审,参与系统设计,同样基于该链路才可以制定下一步的测试策略和计划。

4. 制定测试计划

4.1 测试链路拆解、核心链路攻坚

上述得到的链路逻辑图仍然只是个研发语言,我们需要将其转化成测试语言,即测试计划(也就是测试需要做的事情)。其中包括

a. 大型项目时链路过长,可以拆解成多个子链路跟进,但需要确认每个子链路的耦合性。小型项目直接拆解到具体模块负责人跟进即可。

b. 每个子链路/模块①确定好接口人或负责人,②确定内部的主要测试工作范围和内容,相关干系人,③确定可测性(测试环境或预发环境,测试物料的逻辑,上下游依赖逻辑),④确定高可用性(相关质量保障的举措的进一步明确),⑤确定自动化特性(主要用于测试执行的提效,灵活运用,平台和工具的使用)

c. 在上述的计划中进一步识别一些核心攻坚或业务特殊专项,比如测试物料专项、压测专项、兼容性测试专项、体验保障专项、安全专项等等。

4.2 测试里程碑以及节奏明确

把上述要做的事情基于现有资源,合理的安排进整体项目的排期中,从而制定出测试的里程碑计划。该点通常需要和项目经理保持强沟通,并将结果同步。

Goland激活2023.1.1(GoLand 2023.1 发布)

总之测试计划是拆解的产物,需要细化成一项项每个执行单(个人、模块、团队)可执行的语言,同时给出时间计划,最好的方式是利用清单思维,输出一张清单表格,接下来就是按计划执行打钩即可。

5. 测试物料准备

下面就进入到了测试阶段了,这里单独把测试物料的事情提了出来。就目前营销平台域的项目为例,测试物料的诉求具有便捷性、可塑性、时效性、多维性、安全性的特性。便捷性需要更方便快捷的构造,而目前我们许多造数流程很冗长,成本和时间极高(需要用自动化或回放解决);可塑性是需要能构造满足测试场景的物料,面对不同的业务大家的测试物料诉求是不一样的,也决定了这块的物料需求多而且杂(需要有自主的造数工具解决);时效性和多维性是从时空的角度解读,营销的属性带来很多物料会失效(促销、预约、预售),因此对时效要求较高。而从物料分层来看,大家需要单一型测试物料(商品、券、账号、内容等),更需要复杂型测试物料(在单一型基础上叠加了用户行为或业务逻辑的场景化产物,如设促、策略、订单等),面对不同的维度需要有不同的解决办法。最后的安全性,更需要我们把控好各类权限和合规,避免影响到线上或者造成事故。

因此我们需要分析不同业务的特性,根据不同的特性情况有针对性的提出解决方案和长期的能力建设。然而最初还是需要设计好相关逻辑和表格,能前置收集整理好大家的测试物料诉求,避免到了最后再提出。这里梳理完毕也方便研发自测,和业务的走查,有必要时也可以组织物料评审。

6. 核心用例以及上下游联调用例评审

用例评审是非常核心的内容,也是大家执行的标准和质量的标准。特别在大型项目中,不同系统之间的联调用例评审更是一种渠道,帮助大家识别是否有遗漏的地方。这里务必需要业务、产品、研发多角色都要参与,因为这是一个难得的信息汇总点,如果这里遗漏的信息,或者不对齐,将会直接导致后续的质量下降。测试1号位在这个环节也是一个把控质量的核心节点,1号位应充分理解全链路逻辑图,在评审会上大胆发言和质疑,尽量排除每一个不确定因素。

评审后需要将会议的结果通过邮件的形式输出,明确每一个待办项都需要得到结论。另外评审会并不是结束,由此引发大家的思考会提出更多的风险点,这里需要测试1号位持续收集大家提出的可能的问题和风险,列出风险表并一一跟进结论。只有我们提前识别越多的问题和风险,项目后续的质量才能有所保证。一个项目最大的风险就是没有风险,或没人提问

7. 测试执行阶段(风险预判识别与解决)

在执行过程我们使用现有公司内统一的测试工具,自动化工具和平台进行帮助规范操作和提效。这里重点梳理下大项目过程中1号位需要关注的一些信息和机制。其实这里最核心还是把控风险进一步识别和解决,如果我们前置的分析和预判到位,这里会轻松很多。

日例会机制:配合项目进行,每日将测试执行阶段的风险项及时抛出并寻求解决办法,和项目保持强沟通。这里要明确好风险的内容、影响是什么、需要谁协助,要清晰明确。

风险升级或者跨系统沟通:当项目日例会难以解决的问题或者内部无法解决时,需要及时升级解决,让更多的角色以及老板参与进来进行决策提高解决效率,千万不能藏在自己手里。

BUG日清机制:面对系统复杂,问题众多而又临近交付节点,需要各角色加强协同而且提高要求,达到BUG日清,便于保障在规定时间内高质量交付。

测试记录收集:过程中的测试记录留痕,需要汇总做好记录便于追踪、复盘、归档或者赋能给其他项目。这里包括了物料的评审记录,风险评审记录,用例评审记录,各系统测试报告,大联调记录或者全链路回归等。如果是要求比较高的项目,测试1号位也需要发出每日的测试进度报告,这里需要收集各个系统的进展、风险、卡点等(有的跟随项目日报可以cover)。

紧急需求与变更把控:项目中难免会遇到各类变更,其中最大的风险就是紧急需求的插入,需要与项目制定准入机制,对ROI高的紧急需求进行评估按照现有资源合理安排,同时当有大量紧急需求,已经严重影响到交付质量时,需要进行多轮review或其他方式保障交付质量。“变更”是引入问题的根源

与业产设协同:与前链路角色进行协同,及时邀请进入UAT走查或者验收,提前发现问题。如果使用预发环境或测试环境,需提前准备好相关物料和使用手册说明。

8. 全链路演练剧本(尤其大项目尤为关键)

小型项目时各个模块各司其职,容易忽略全链路视角的回归或者演练,当然因为涉及模块少因此质量容易把控。但是“全链路”思想是一名测试1号位必须要具备的,我们举个军演压测的例子,每年大促的军演其实也是一个基于流量的项目,卷入了公司内的所有系统,因此我们的军演一定是全链路的,只有全链路才能模拟线上真实的流量情况。大型项目同理,即使我们每个系统、模块完成了自己的测试工作,并不意味着整体链路就没问题了,我们需要模拟线上用户和业务最真实的场景和习惯,进行全链路演练或回归

具体的操作离不开全链路联调用例,这里建议从上述的评审用例中挑选P0级涉及到核心主干的用例作为剧本用例,在一个规定的时间范围内,组织各个角色一同参与剧本演练,及时发现问题,如果能邀请业务、用户等种子选手参与更好,此时很有可能提出我们意想不到的场景和问题,而这样的问题就是我们剧本演练最大的价值。

9. 上线与总结

上线切量与监控:与项目经理、产品1号位、研发1号位等核心角色一同确认好研发的上线顺序和机器灰度策略,避免出现上线顺序问题,发现问题后及时回滚,准备好降级开关和预案。确定好业务的灰度策略,或者使用时间点,做好及时响应和解决。另外上线后的巡检和监控必不可少,需要第一时间加入至巡检体系,巡检是我们的眼睛,可以代替我们发现很多问题。同时用表格记录线上发现的各类问题,及时跟进问题修复进展。

总结与复盘:对新业务需要基于全链路逻辑图以及各个节点的业务知识点进行汇总,进行知识库的沉淀;对项目好的测试实践进行沉淀并形成通用能力进行赋能;对项目中的测试卡点进行分析,避免犯同样的问题。大部分1号位容易忘记复盘,每一个项目都是一个宝贵的经历,如何让经历变成自己的财富,需要进行反思和复盘,并且进行输出。

百亿补贴案例

百亿补贴项目是2023年初零售最核心的项目,涉及系统范围之广,相关人员之多,上线交付时间之急,也是前所未有的。各个团队牺牲了较多的春节和假期时间,测试同学们在这个项目中也收获了良多,分拆了多链路和专项1号位,一起携手最终保障的交付。

百补的测试1号位细分了6大子链路(创促链路、导购链路、交易链路、资金链路、申诉链路、渠道屏蔽)基本覆盖了全部项目范围并设立各链路测试1号位,而这些链路几乎也涵盖了京东APP的核心业务,每个子链路1号位下继续对接各系统接口人。同时设立了7大专项(物料统筹、频道性能、B端体验、版本保障、风控保障、压测保障、众测保障)测试1号位,后期也引入了安全团队介入,从测试链路的每个阶段,从B到C各个系统,各个维度加强质量保障举措。

写在最后

随着时代的进步,我们面临的业务会越来越复杂,面临的技术也会越来越进化,对测试1号位的要求同样也会越来越高,职责边界越来越扩大,更需要有思考,有担当,有owner意识扛起整体项目的质量与交付。最后这里再列举一些tips分享。

1. 与项目经理的协作:测试1号位需要与项目经理紧密协作,上述也提到了多次,之所以说本身带有半个项目经理属性,是因为测试和项目都对“质量”关注,这是相通点。由该点引发的各类举措,大家是可以互相理解互相帮助的。

2. 与主测试的协作:在目前的团队中会并行多个项目,同时存在多个项目的测试1号位,同时这些项目又卷入了多个系统测试(模块测试)的主测。这里就形成了项目的测试1号位与系统主测之前的关系协同与矛盾点。其实还是经营理念的差异,系统主测或者产品线主测关注的是长期,而项目测试1号位关注的是该项目本身。一个项目测试1号位会协同多个系统主测,共同交付这个项目。而一个系统主测可能会承接多个项目,需要合理安排好自己模块的资源和时间,与多个测试1号位沟通协调,保障每个项目的交付。这里是“多对多”的关系,因此更需要大家齐心协力,遇到排期资源上的问题时,多沟通多协调;遇到项目统筹层面的问题时,需要参考项目测试1号位的意见;遇到具体执行实施时,要多深入了解系统主测的情况和现状。这里我建议从系统主测的角度需要立版本,定节奏,帮助长期的迭代和质量把控;从项目测试1号位角度需要立机制,定规范,帮助项目敏捷高质量交付。

3. 1号位的并行策略:每个测试1号位类似大家长角色,需要看到项目里所有和测试相关的事情,任何问题都要去管理,一定会存在大量并行的事务,这里非常考验大家对并行的处理。建议大家把事情“写下来”,同时排好优先级,自己不要乱,确保自己能聚焦精力集中处理一件事。

4. 重点把握结果,解决核心问题:多数1号位同学在跟进项目时,有着测试人员的特性会很细心,有时对执行过程很细致。这不是坏事,但是会大量浪费精力,特别面临大型项目时,测试1号位要学会设卡点,看结果,轻过程,这样才能把精力用在刀刃上。另外项目中一定会发生多数问题,有业务层面有资源层面等,要学会优先解决核心问题,抓大放小。

5. 与担当相对应的解压:1号位是有责任感的,是有担当的,必然肩膀上会承担很多压力。特别是第一次做1号位的同学,或多或少会不适应感觉压力巨大,一定要学会解压释放,好的方法包括与上级沟通倾诉,与小伙伴吐槽,寻求他人帮助与援助,吃吃吃等。但是请相信,每一次1号位经历都是很好的成长机会,勇敢挑战,希望大家都能借此收获自己的感悟与改变

作者:京东零售  李泽阳

最近在阅读《认知觉醒》这本书,里面有句话非常打动我:通过自己的语言,用最简单的话把一件事情讲清楚,最好让外行人也能听懂。

也许这就是大道至简,只是我们习惯了烦琐和复杂。

希望借助今天这篇文章,能用大白话说清楚这个相对比较底层和复杂的MVCC机制。

在开始之前,先抛出一个问题:我们都知道,目前(MySQL 5.6以上)数据库已普遍使用InnoDB存储引擎,InnoDB相对于MyISAM存储引擎其中一个好处就是在数据库级别锁和表级别锁的基础上支持了行锁,还有就是支持事务,保证一组数据库操作要么成功,要么失败。基于此,问题来了,在InnoDB默认隔离级别(可重复读)下,一个事务想要更新一行数据,如果刚好有另外一个事务拥有这个行锁,那么这个事务就会进入等待状态。既然进入等待状态,那么等到这个事务获取到行锁要更新数据的时候,它读取到的值是什么呢?

具体的问题见下图,我们设定有一张表user,初始化语句如下,试想在这样的场景下,事务A三次查询的值分别是什么?

 



Goland激活2023.1.1(GoLand 2023.1 发布)



想要把这件事情回答正确,我们先来铺垫一下基础知识。

提到事务,首先会想到的就是ACID(Atomic原子性、Consist一致性、Isolate隔离性、Durable持久性),今天我们主要关注隔离性,当有多个事务同时执行发生并发时,数据库可能会出现脏读、不可重复读和幻读等问题,为了解决这些问题,“隔离级别”这位大哥上场,包含:读未提交、读已提交、可重复读和串行

但我们都知道,隔离级别越高,执行效率越低。毕竟大哥就是大哥,级别越高,越谨慎,常在河边走哪能不湿鞋。

我们通过一个例子简单说一下这四种隔离级别:

Goland激活2023.1.1(GoLand 2023.1 发布)




读未提交:一个事务还未提交,它的变更就能被其他事务看到。V1为B,V2为B,V3为B。

读已提交:一个事务提交之后,变更结果对其他事务可见。V1为A,V2和V3为B。

可重复读:一个事务执行过程中看到的数据与事务启动时一致。V1为A,V2为A,V3为B。

串行:不管读和写,加锁就完了,就是干!V1和V2均为A,V3为B。

事务是怎么实现的呢?实际上,事务执行时,数据库会创建一个视图,读未提交直接返回最新值,没有视图概念;串行是直接加锁避免并发访问;读已提交是在每个SQL语句开始执行时创建的视图。可重复读的视图是在事务启动的时候创建的,整个事务都会使用这个视图。这样的话,上面四种不同隔离级别下的V1、V2、V3值便对号入座,有了结果。

MySQL是怎么实现的呢?我们以MySQL默认的可重复读隔离级别为例,实际上每条行记录在更新时都会记录一条回滚日志,也就是大家常说的undo log。通过回滚操作,都可以得到前一个状态的值。假设name值从初始值A被依次更新为B、C、D,我们看一下回滚日志:

 

Goland激活2023.1.1(GoLand 2023.1 发布)



当前值是D,但是在查询这条记录的时候,不同时刻启动的事务会有不同的视图,看到的值也就不一样。在视图1、2、3、4里面,记录的name值分别是A、B、C、D。同一条行记录在数据库中可以存在多个版本,这就是多版本并发控制(MVCC)。对于视图1,如果想要将name值回到A,那么就要依次执行图中所有回滚操作。

到这里,你已经接触到了MVCC的概念,也许你已经对文章最开始的问题有了一点点想法,别着急,我们先来简单总结下MVCC的特点:

MVCC的出现使得一条行记录在不同隔离级别下不同的事务操作会形成一条不同版本的链路,从而实现在不加锁的前提下使不同事务的读写操作能够并发安全执行,这个版本链就是通过回滚日志undo log实现的。用大白话说,你这个事务想要查询一条行记录,MVCC会通过你这个事务所在视图确认版本链中哪个版本的行数据对你可见。刚才我们提到,四种隔离级别下,只有读已提交可重复读会用到视图。对于读已提交,MVCC会在每次查询前都会生成一个视图,可重复读隔离级别只会在第一次查询时生成一个视图,之后在这个事务中的所有查询操作都会重复使用这个视图。行业上,将创建视图的那一刻称为快照,晃你一下子,让你激灵激灵,别发生脏读,变脏喽~

想要解决文章最开始的那个问题,我们还得展开说说版本链是如何形成的和快照的原理,稍有枯燥,先忍一下,耐心看下去,乖~

对于InnoDB存储引擎来说,主键索引(也称为聚簇索引)记录中除了正常的字段数据外,还包含两个隐藏列:



Goland激活2023.1.1(GoLand 2023.1 发布)



(1)trx_id:每次一个事务想要对主键索引进行更新、删除和新增时,都会把这个事务的事务id赋值给trx_id字段。注意事务id严格递增,且查询操作不会分配事务id,即trx_id = 0;

(2)roll_point:每次一个事务对主键索引进行更新时,都会把旧的版本写入到undo日志中,roll_point相当于一个指针,通过它可以找到这条记录修改前的信息。

我们以可重复读隔离级别为例,为了尚未提交的更新结果对其他事务不可见,InnoDB在创建视图时,有以下四部分组成:


m_ids:表示生成视图时,当前系统中“活跃”的读写事务的事务id列表,这里的活跃大白话就是事务尚未提交;

min_trx_id:表示在生成视图时,当前系统中活跃的读写事务中最小的事务id,即m_ids中的最小值;

max_trx_id:表示生成视图时系统应该分配给下一个事务的id值;

creator_trx_id:表示生成该视图的事务id。

概念比较多,举个例子,现在有事务id分别是1、2、3三个事务,1和2事务尚未提交,3事务已提交,这个时候如果来了一个新事务,那么它创建的视图对应这几个参数分别为:m_ids包含1、2,min_trx_id为1,max_trx_id为4。

关键的知识点来了,如何根据某个事务生成的视图,判断版本链上的某个版本对这个事务可见呢?

遵循下面步骤:

1、版本链上的不同版本trx_id值如果与这个视图的creator_trx_id值相同,说明当前事务在访问它自己修改过的记录,所以被访问的版本对当前事务可见。一家人还是认识一家人的~

2、版本链上的不同版本trx_id值小于这个视图的min_trx_id值,说明这个版本的事务在当前事务生成视图之前就已经提交了,所以被访问的版本对当前事务可见。

3、版本链上的不同版本的trx_id值大于或等于这个视图的max_trx_id值,说明这个版本的事务在当前事务之后才开启,所以被访问版本对当前事务不可见。

4、版本链上的不同版本的trx_id值在这个视图的min_trx_id和max_trx_id之间,需要进一步判断被访问版本trx_id值是不是在m_ids中,如果在,说明当前事务是活跃的,被访问版本对当前事务不可见。如果不在,说明被访问版本的事务已经提交了,被访问版本对当前事务可见。

比较绕是不是,千万别晕,兄弟呀~,大白话解释一下,设定某个事务生成的视图瞬间(也就是快照),这个事务的id为creator_trx_id,那么有下面三种可能:



Goland激活2023.1.1(GoLand 2023.1 发布)



1、如果creator_trx_id落在绿色部分,表示被访问的版本是已提交的事务或者就是当前事务自己生成的,这个数据是可见的;

2、如果creator_trx_id落在红色部分,表示被访问的版本还未开启,数据不可见;

3、如果creator_trx_id落在黄色部分,包括两种情况:

若creator_trx_id在m_ids集合中,表示被访问的版本尚未提交,数据不可见;

若creator_trx_id不在m_ids集合中,表示被访问的版本已经已经提交了,数据可见。

知道了这个之后,我们就可以回答文章最开始那个问题了,在隔离级别为可重复读的情况下(这里的隐含条件就是可重复读隔离级别只会在第一次查询时生成一个视图,之后在这个事务中的所有查询操作都会重复使用这个视图)分析一波:

以文章开头的例子,设定事务B的事务id=100,事务C的事务id=200,当事务B尚未提交时,id=1这条记录的版本链是这样的:



Goland激活2023.1.1(GoLand 2023.1 发布)



这个时候我们看一下事务A第一个select语句,注意查询操作的事务trx_id=0,在执行select语句时会创建一个视图,这个视图的m_ids={100},min_trx_id=100,max_trx_id=101,creator_trx_id=0。

然后在版本链中挑选可见的数据记录,从图中可以看到最新版本的name值是B,最新版本的trx_id值为100,在m_ids集合中,这个版本数据不可见,根据roll_point跳到下一个版本;

下一个版本的name值是A,这个版本的trx_id=99,小于min_trx_id,这个版本数据是可见的,所以返回name为A的记录,即V1为A。

我们继续,事务B这时进行了commit提交,此时事务C已经开启,那么事务A第二个select语句不会创建一个新的视图,而是重新利用第一次创建的视图。最新版本的trx_id为100,在m_ids中,数据不可见,即V2=A;

接下来,事务C进行了更新操作,此时版本链发生的改变如下:



Goland激活2023.1.1(GoLand 2023.1 发布)



事务C接着进行了commit提交,此时事务A第三次select语句也不会创建一个新的视图,最新版本的trx_id为200,大于max_trx_id,数据不可见,即V3=A。

到这里,MVCC就结束啦,留一个小问题,如果是读已提交隔离级别,那么文章开头的例子中V1、V2、V3的值又分别是什么呢?答案在最后哦。

最后,我们再来总结一下MVCC的作用,使用可重复读隔离级别的事务在查询时,仅会使用第一次select时生成的视图,相比于读已提交隔离级别每次查询都会生成一个新的视图,可重复读在查询时使用的视图版本不会那么新,因此有些已经提交的事务对行记录进行修改时对查询事务就不可见,进而避免了不可重复读现象的发生,同时也避免了脏读。




小问题答案:

读已提交隔离级别下,每次select查询都会生成一个新的视图,基于此,分析如下:

事务A第一个select语句,注意查询操作的事务trx_id=0,在执行select语句时会创建一个视图,这个视图的m_ids={100},min_trx_id=100,max_trx_id=101,creator_trx_id=0。

然后在版本链中挑选可见的数据记录,从图中可以看到最新版本的name值时B,最新版本的trx_id值为100,在m_ids集合中,这个版本数据不可见,根据roll_point跳到下一个版本;

下一个版本的name值是A,这个版本的trx_id=99,小于min_trx_id,这个版本数据是可见的,所以返回name为A的记录,即V1为A。

事务B这时进行了commit提交,此时事务C已经开启,那么事务A第二个select语句会创建一个新的视图,这个视图的m_ids={200},min_trx_id=200,max_trx_id=201,creator_trx_id=0。版本链没有发生变化,最新版本trx_id值为100,小于min_trx_id,数据可见,即V2=B;

事务C接着进行了commit提交,此时事务A第三次select语句会创建一个新的视图,这个视图的m_ids={},min_trx_id不存在,max_trx_id=201,creator_trx_id=0。在版本链中挑选可见的数据记录,从图中可以看到最新版本的name值为C,最新版本的trx_id值为200,小于max_trx_id且不在m_ids中,则数据可见,即V3=C。

作者:京东物流 陈维

一、引言

G.J.Myers在《软件测试的艺术》中提出:从心理学角度来说,测试是一个为了寻找错误而运行程序的过程。

那么安全测试则是一个寻找系统潜在安全问题的过程,通过测试手段发现系统中可能存在的安全问题和风险,分析并进行优化,保障系统的安全质量。

从应用安全维度出发,展开系列安全测试工作,包括不限于:安全前置扫描、安全渗透测试、数据安全、SDL流程引入等。

本文我们将以围绕系统安全质量提升为目标,讲述在安全前置扫描上实践开展过程。

希望通过此篇文章,帮助大家更深入、透彻地了解安全测试,能快速开展安全测试。

二、安全前置实践

1.工单分析-明确来源

在开展扫描前,首先对现有工单漏洞进行分析。

(1)漏洞来源分析

Goland激活2023.1.1(GoLand 2023.1 发布)



漏洞占比分布:

开源组件-版本问题、代码扫描 ,这两类占比91%;

这两类主要为编译时,平台自动调用安全部代码扫描接口发起的扫描

安全部按照规则,则形成漏洞工单下发研发

白盒漏洞分布:

Goland激活2023.1.1(GoLand 2023.1 发布)



检测分支:master分支、uat分支、test分支等。

即:所有在jdos上进行部署的分支都会进行扫描,扫描出的问题都是工单的产生来源。

JSRC类分析:

外部白帽在JSRC上提交的问题:https://security.jd.com,相关部门再下发形成工单。

(2)形成预防措施

通过上述分析,开展的具体措施:

1.开展前置扫描。在行云部署编译之前,主动发起安全前置扫描,避免遗漏到线上。并且统一代码安全扫描规则,避免内部扫描过代码仍存在代码扫描类漏洞。

2.安全质量卡控。研发测试落实代码安全扫描,安全扫描作为上线必备环节,触发形成自动扫描,漏出问题修复后才可进行上线编译。

3.开展渗透测试。针对外网系统和内网敏感系统已上线系统开展渗透测试,新需求接入安全SDL安全研发生命周期进行管理。

4.前置扫描-解决存量

通过对应用代码白盒扫描,应用域名的黑盒扫描,前置识别问题,预防缺陷,减少漏洞。以及在扫描过程中进行工具提效,近一步提高前置识别预防的范围。

(1)代码白盒扫描

①基于流水线源代码安全审计原子的master分支扫描

在部门刚开始做扫描时,使用流水线方式,优先流水线方式,实现持续的集成扫描,流水线主要步骤为:



Goland激活2023.1.1(GoLand 2023.1 发布)



扫描分支:master分支

触发条件:码提交触发、定时触发

邮件通知:通过邮件进行扫描报告链接下发

问题跟进:人工查看报告-漏洞分类整理-下发任务至研发

总结:

能有效地覆盖master分支的扫描,但是存在的问题是:

覆盖分支有限,造成非master分支漏洞遗漏;

如需新增覆盖分支,则需新建流水线,耗时不变;

人工方式的问题梳理,效率低,易出错。

②活跃分支的预防扫描

部署平台上的编译分支,除master外,其他编译分支也会产生漏洞工单。

仅进行master分支扫描,不能完全预防白盒漏洞问题。

故:抓取活跃分支-提交活跃分支代码扫描-形成全分支扫描覆盖

识别活跃分支:



Goland激活2023.1.1(GoLand 2023.1 发布)



安全代码扫描平台:



Goland激活2023.1.1(GoLand 2023.1 发布)



活跃分支扫描结果。

总结:

基于以上,实现了master分支+活跃分支的扫描覆盖,完全覆盖,可完全前置识别白盒漏洞问题。

(2)应用黑盒扫描

Step1获取域名基于域名、解析IP的黑盒扫描。

Step2:白盒漏洞扫描执行:



Goland激活2023.1.1(GoLand 2023.1 发布)



整理漏洞扫描结果:

(3)提效工具开发

问题:白盒&黑盒扫描,包含【提交任务-获取结果-漏洞整理-问题下发】的实施步骤,过程中,纯手工操作:时

间长,问题收集、整理,易遗漏&出错 。白盒扫描覆盖率低,遗漏的问题形成工单。

方案:基于开放接口实现批量提交任务-获取结果-报告整理工具



Goland激活2023.1.1(GoLand 2023.1 发布)





Goland激活2023.1.1(GoLand 2023.1 发布)



收益

效率提升:人工4小时->1小时,提效75%

覆盖率提升:master分支->近两周活跃分支+master分支,扫描覆盖率100%,发现更多问题,避免遗漏。

1.漏洞修复-闭环跟踪

完成白盒和黑盒扫描之后,要将扫出的漏洞推送至研发解决,以及完成漏洞的闭环跟踪验证。

(1)基于行云缺陷跟踪处理

•以应用对应的代码库为维度,进行安全漏洞扫描;

•一个代码库一次扫描出一份报告,报告中展示工程代码当前存在的所有安全类问题;

•每次扫描出的结果会在行云上记录一个问题,反馈到研发接口人,由研发接口人分配到具体研发;

总结:

•基于行云缺陷录入管理,录入过程耗时耗力,未实现自动录入;

•过程不精细;

(2)基于任务批量管理平台进行下发

•扫描完成之后->对问题进行整理->通过OE接口人(或OE接口)进行批量下发任务;

•研发修复解决;

(3)安全流程建设

•每周测试接口人、研发接口人,组织会议对本周安全工单、漏洞问题进行复盘;

•周二、周四上线日的黑白合扫描的常态化执行,发送安全测试报告邮件;

•每周安全测试周报;每月安全测试月报;

•研发安全自测意识建立,行云部署编译之前,使用平台进行自测;

1.浅析漏洞

(1)扫描原理-污点分析

使用污点分析检测程序漏洞的工作原理如下图所示:



Goland激活2023.1.1(GoLand 2023.1 发布)





•基于数据流的污点分析:

在不考虑隐式信息流的情况下,可以将污点分析看做针对污点数据的数据流分析。根据污点传播规则跟踪污点信息或者标记路径上的变量污染情况,进而检查污点信息是否影响敏感操作。

•基于依赖关系的污点分析:

考虑隐式信息流,在分析过程中,根据程序中的语句或者指令之间的依赖关系,检查 Sink 点处敏感操作是否依赖于 Source 点处接收污点信息的操作。

参考资料:https://firmianay.gitbooks.io/ctf-all-in-one/content/doc/5.5_taint_analysis.html#%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86

三、总结

本文我们讲述了体验保障的安全质量提升过程。重点讲述黑盒、白盒的扫描过程。

首先对漏洞工单进行了分析,确定了漏洞的来源、种类、分布,摸清了漏洞的现阶段情况。

然后通过进行安全前置扫描,对工单中的白盒、黑盒问题前置识别。过程中通过开发工具来提升效率,最终形成一套可行的前置开展方案。

但需注意:除了解决存量漏洞问题,还需要新增类问题,需要持续不断地建设,需要实现安全测试的常态化运行。并且要利用更多自动化工具,去进行提效。

 

作者:京东科技 高飞

前言

本文旨在通过部署微前端项目的实践过程中沉淀出一套部署方案,现就一些重点步骤、碰到的问题做了一些总结。

部署顺序

因为线上部署主应用时需要用到子应用的线上可访问地址,因此部署顺序应该是先部署子应用,保证子应用能够线上可访问后,再将子应用的线上可访问地址配置到主应用,最后再将主应用部署到线上环境。

部署分支

线上环境部署统一用master分支的代码

应用构建打包

主应用构建打包

主应用csd-tech-main-app基于ant-design-pro,需要在config目录中配置微前端项目的访问地址。

在config目录下配置config.test.ts用于测试环境的打包配置,生产环境打包配置放在在config.prod.ts中。如果部署到测试环境,或者生产环境,可以换成对应的访问地址。

测试环境打包配置:

 

生产环境配置打包配置:

 

然后,我们需要在微应用注册信息中,将我们加载微应用的地址换成我们配置的地址,代码实现如下:

 

最后,我们在 package.json 中,通过不同的命令区分不同环境,代码实现如下:

 

在配置完成后,我们在命令行运行如下命令,将主应用构建打包:

 

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置根目录下的 html 目录下,并重命名为 main,目录结构如下(见下图)

Goland激活2023.1.1(GoLand 2023.1 发布)

到这里,我们的主应用就构建打包好了,接下来我们介绍各个微应用构建打包过程。

调度系统(dlink)微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:

 

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名为 dlink ,目录结构如下(见下图)

Goland激活2023.1.1(GoLand 2023.1 发布)



数据迁移系统(datax)微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:

 

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名名为dx2 ,目录结构如下(见下图)

Goland激活2023.1.1(GoLand 2023.1 发布)



标签系统微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:

 



在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名名为ls ,目录结构如下(见下图)

Goland激活2023.1.1(GoLand 2023.1 发布)



监控系统(kinesis-link)微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:

 

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名名为ksl ,目录结构如下(见下图)

Goland激活2023.1.1(GoLand 2023.1 发布)



Nginx 服务器部署方案

在将我们的主应用和微应用全部打包完成后,我们将介绍如何使用 Nginx 完成微前端架构的部署。

Nginx 部署方案是可以作为生产方案使用的。

配置时有四点注意事项:

•搭建nginx服务之前,保证所用到的端口是空闲

•子应用和主应用配置在同一台服务器下的同一个端口下,主应用配置在根路径下/,子应用的配置路径需要主应用里配置的字应用的入口地址和子应用自身的根路径一致

•子应用和主应用所用到接口地址都需要在nginx 配置代理

•配置nginx软连接,将/etc/nginx/html/main/子应用访问路径 指向 /etc/nginx/html/子应用访问路径

配置nginx软连接方式:ln -s /etc/nginx/html/子应用访问路径 /etc/nginx/html/main/子应用访问路径

本地测试nginx服务配置如下:

nginx.conf

 



api.conf

 



在配置完成后,我们需要重启一下 nginx 服务。

输入nginx启动命令启动nginx

在浏览器中访问主应用测试地址localhost:8000 ,登录后如下图:

Goland激活2023.1.1(GoLand 2023.1 发布)


在浏览器中访问调度系统(dlink)子应用测试地址 http://localhost:8000/dlink , 登录后如下图:

Goland激活2023.1.1(GoLand 2023.1 发布)


在浏览器中访问数据迁移系统(dx2)子应用测试地址 http://localhost:8000/dx2 , 登录后如下图:

Goland激活2023.1.1(GoLand 2023.1 发布)


在浏览器中访问标签管理系统(ls) 子应用测试地址:http://localhost:8000/ls ,登录后如下:

Goland激活2023.1.1(GoLand 2023.1 发布)


至此,nginx 服务部署大功告成!

扩展

如果需要把服务部署到真实服务器,只需要把所有的 localhost 都换成真实注册的域名即可,其他配置都可以复用!

 

作者:京东零售 杜兴文

首先聊一下概念,Web 前端自动化测试是一种通过编写代码来自动化执行 Web 应用程序的测试任务的方法,它通常使用 JavaScript 和测试框架 (如 Selenium、Appium 等) 来实现。

Web 前端自动化测试的优点是可以提高测试效率、减少测试时间和测试成本,并且可以确保测试质量。以下是一些 Web 前端自动化测试的优点:

1.
提高测试效率:自动化测试可以在短时间内完成大量的测试任务,从而减少测试所需的时间和测试成本。
2.
减少测试成本:自动化测试不需要手动执行测试任务,从而减少了测试所需的人员和成本。
3.
提高测试质量:自动化测试可以确保测试的覆盖率和提高测试的准确性,从而减少测试遗漏和测试质量不高的问题。
4.
覆盖更多场景:自动化测试可以覆盖更多的测试场景,从而确保软件质量得到保障。
5.
减少人为错误:自动化测试可以减少测试人员的人为错误,从而提高测试的准确性。

在实际应用中,Web 前端自动化测试通常用于测试 Web 应用程序的交互功能、性能、安全性等方面。例如,可以使用自动化测试工具来测试 Web 应用程序的登录、注册、导航、表单验证等功能,或者使用自动化测试工具来测试 Web 应用程序的性能,如响应速度、页面加载时间等。

总之,Web 前端自动化测试是一种可以提高测试效率、减少测试成本和提高测试质量的方法,适用于各种类型的 Web 应用程序。

本文谈谈前端自动化测试从入门到精通再到专家级的方案与思维!分为以下不分:

一、首先来构建一个 Selenium 自动化测试用例

示例测试需求非常简单:访问百度主页,搜索某个关键词,并验证搜索结果页面的标题是“被搜索的关键词”+“_ 百度搜索”。如果搜索的关键词是“ChatGPT”,那么搜索结果页面的标题就应该是“ ChatGPT_ 百度搜索”。

明白了测试需求后,我强烈建议你先用手工方式执行一遍测试,具体步骤是:打开 Chrome 浏览器,输入百度的网址“www.baidu.com”;在搜索输入框中输入关键词“ChatGPT”并按下回车键;验证搜索结果页面的标题是否是“ChatGPT _ 百度搜索”。

明确了 GUI 测试的具体步骤后,我们就可以用 Java 代码,基于 Selenium 实现这个测试用例了。这里,我要用到 Chrome 浏览器,所以需要先下载 Chrome Driver 并将其放入环境变量。接下来,你可以用自己熟悉的方式建立一个空的 Maven 项目,然后在 POM 文件中加入 Selenium 2.0 的依赖,如图 1 所示。

Goland激活2023.1.1(GoLand 2023.1 发布)



图 1 在 POM 文件中加入 Selenium 2.0 的依赖

接着用 Java 创建一个 main 方法,并把如图 2 所示的代码复制到你的 main 方法中。下面是基于 Selenium 的自动化测试用例的样本代码

 

以上是从 0 到 1 建立了一个最简单直接的 GUI 自动化测试用例。这个用例的实现很简单,但是只有真正理解了 Selenium 工具的原理,你才能真正用好它。

二、入门了之后我们要在测试职责的效率上大展身手,即脚本与数据的解耦 + Page Object模型。

“测试脚本和数据解耦”的本质是实现了数据驱动的测试,让操作相同但是数据不同的测试可以通过同一套自动化测试脚本来实现,只是在每次测试执行时提供不同的测试输入数据。

在测试脚本中通过 data provider 去 CSV 文件中读取一行数据,赋值给相应的变量,执行测试用例。接着再去 CSV 文件中读取下一行数据,读取完所有的数据后,测试结束。CSV 文件中有几行数据,测试用例就会被执行几次。具体流程如下图所示。

Goland激活2023.1.1(GoLand 2023.1 发布)



“页面对象模型”的核心理念是,以页面为单位来封装页面上的控件以及控件的部分操作。而测试用例使用页面对象来完成具体的界面操作。

页面对象模型的核心理念是,以页面(Web Page 或者 Native App Page)为单位来封装页面上的控件以及控件的部分操作。而测试用例,更确切地说是操作函数,基于页面封装对象来完成具体的界面操作,最典型的模式是“XXXPage.YYYComponent.ZZZOperation”。

基于这个思想,上述用例的伪代码可以进化成下图 所示的结构。这里给出了 login 函数的伪代码,建议大家按照这种思路自己去实现一下 search 和 logout 的代码,这样可以更好的体会页面对象模型带来的变化。

Goland激活2023.1.1(GoLand 2023.1 发布)



三、让自动化测试脚本更好地描述业务

业务流程抽象是,基于操作函数的更接近于实际业务的更高层次的抽象方式。基于业务流程抽象实现的测试用例往往灵活性会非常好,你可以很方便地组装出各种测试用例。

假设,某个具体的业务流程是:已注册的用户登录电商平台购买指定的书籍。那么,基于业务流程抽象的测试用例伪代码,如下图所示。

Goland激活2023.1.1(GoLand 2023.1 发布)



这段伪代码的信息量很大,但是理解了这段代码的设计思想,也就掌握了业务流程抽象的精髓。

从整体结构上看,伪代码顺序调用了 4 个业务流程, 依次是完成用户登录的 LoginFlow、完成书籍查询的 SearchBookFlow、完成书籍购买的 CheckoutBookFlow、完成用户登出的 LogoutFlow。

四、前端GUI自动化测试的测试数据

GUI 自动化测试的测试数据是指用于测试应用程序用户界面 (GUI) 的测试数据。在自动化测试中,测试数据通常是从测试数据集中获取的,这些数据集包含了应用程序的不同输入和输出。

以下是一些常见的 GUI 自动化测试数据:

1.
输入数据:输入数据是指用于测试应用程序输入区域的输入数据,例如文本框、下拉框、单选按钮等。输入数据通常包括变量名、变量值、数据类型等。
2.
按钮数据:按钮数据是指用于测试应用程序按钮的操作的输入数据。按钮数据通常包括按钮的名称、描述、事件等。
3.
文本数据:文本数据是指用于测试应用程序文本输入区域的输入数据。文本数据通常包括变量名、变量值、文本内容等。
4.
图像数据:图像数据是指用于测试应用程序图像输入区域的输入数据。图像数据通常包括变量名、图像内容、尺寸等。
5.
表格数据:表格数据是指用于测试应用程序表格的输入数据。表格数据通常包括表格名称、行数据、列数据等。
6.
图表数据:图表数据是指用于测试应用程序图表的输入数据。图表数据通常包括图表名称、数据系列、数据值等。

在 GUI 自动化测试中,测试数据集的构建对于测试的成功非常重要。测试数据集应该尽可能地覆盖应用程序的不同输入和输出,以便在测试过程中识别潜在的问题和缺陷。

传统上,数据质量被分成6个方面。

•准确性:一项信息在多大程度上反映了现实?

•完备性:它是否满足你对全面性的期望?

•连贯性:存储在一个地方的信息与存储在其他地方的相关数据是否一致?

•及时性:当你需要时,你的信息是否可用?

•有效性:信息是否有特定的格式、类型或大小?它是否遵循业务规则/最佳实践?

•完整性:不同的数据集能否被正确地连接起来,以反映一个更大的画面?关系是否被很好地定义和实施?

这些维度是在对设计数据仓库采取广泛的观点时定义的。考虑了所有定义和收集的数据集,它们之间的关系,以及正确服务于组织的能力。

五、提高 GUI 自动化测试稳定性的关键技术

提高 GUI 自动化测试稳定性的理论点包括以下几点:

1.
选择合适的测试框架:测试框架是 GUI 自动化测试的核心,它决定了测试的效率和稳定性。选择合适的测试框架需要综合考虑测试工具、测试环境、测试需求等多个因素。
2.
编写高质量的测试用例:测试用例是 GUI 自动化测试的关键,它决定了测试的覆盖率和测试质量。编写高质量的测试用例需要深入了解软件功能和界面设计,能够覆盖软件的各个功能点和细节。
3.
选择适当的测试数据:测试数据是 GUI 自动化测试的基础,它决定了测试的准确性和效率。选择适当的测试数据需要综合考虑软件功能、界面设计、测试需求等多个因素。
4.
优化测试环境:测试环境是 GUI 自动化测试的基石,它决定了测试的稳定性和可靠性。优化测试环境需要综合考虑测试工具、测试环境、测试需求等多个因素,保证测试环境的稳定性和兼容性。
5.
进行性能测试:GUI 自动化测试需要在测试过程中考虑软件的性能和响应速度。进行性能测试需要模拟大量的用户操作和负载,评估软件的性能和响应速度,及时发现和解决软件性能瓶颈。
6.
定期进行测试维护:GUI 自动化测试需要定期进行测试维护,更新测试用例和测试数据,清理过时的测试环境和测试工具,保证测试的及时性和有效性。

提高 GUI 自动化测试稳定性的关键技术点包括以下几点:

1. 基本HTML/CSS/JS技能:对于一个web前端自动化测试工程师,基本的HTML/CSS/JS技能必不可少,可以帮助其更好的理解页面交互与渲染机制。

2. 工具链技术:对于 web 前端自动化测试,工具链技术是必备技能,例如 Grunt 和 Gulp 等。

3. 语言技能:web自动化测试需要用到多种编程语言,如Java、Python、JavaScript等,具备这些语言的开发能力是必不可少的。

4. 基本的测试技术:web前端自动化测试工程师需要熟知测试的基本概念和方法,如测试计划、测试用例、测试策略等。

5. API和接口测试:web前端自动化测试工程师需要熟悉如何对API和接口进行测试,这对于确保应用程序功能的准确性非常重要。

6. 自动化测试框架技术:web前端自动化测试工程师需要掌握至少一种自动化测试框架技术,如Selenium、WebdriverIO等。

7. 调试技能:web前端自动化测试工程师需要熟练使用调试技能来解决测试过程中的问题,如使用Fiddler、Chrome开发者工具等。

8. 数据库技术:web前端自动化测试工程师需要熟悉基本的数据库操作和SQL语句,以便在测试时进行数据验证和数据比对。

9. 脚本编写技能:通过编写JavaScript和Python等脚本,可以帮助测试人员实现自动化测试和快速生成测试报告。

10. 高效的测试方法:web前端自动化测试工程师需要熟练掌握各种测试方法和技巧,以便在工作中更加高效和全面的完成测试任务。

总之,提高 GUI 自动化测试稳定性需要综合考虑测试框架、测试用例、测试数据、测试环境、性能测试和测试维护等多个因素,通过不断优化和升级,提高测试效率和质量。大概可从以下5个方面来进行入手:

1、对于非预计的弹出对话框引起的不稳定,可以引入“异常场景恢复模式”来解决。

2、对于页面控件属性的细微变化造成的不稳定,可以使用“组合属性”定位控件,并且可以通过“模糊匹配技术”提高定位识别率。

3、对于 A/B 测试带来的不稳定,需要在测试用例脚本中做分支处理,并且需要脚本做到正确识别出不同的分支。

4、对于随机的页面延迟造成的不稳定,可以引入重试机制,重试可以是步骤级别的,也可以是页面级别的,甚至是业务流程级别的。

5、对于测试数据引起的不稳定,我在这里没有详细展开,留到后续的测试数据准备系列文章中做专门介绍。

六、优雅的自动化测试报告

早期基于视频的 GUI 测试报告由于体积较大,而且不能比较方便地和日志适配,所以并不是最好的解决方案。理想的 GUI 测试报告应该是由一系列按时间顺序的屏幕截图组成,并且可以在这些截图上高亮你所操作的素,同时按照执行时序配有相关操作步骤的详细描述。

商业 GUI 自动化测试框架的 GUI 测试报告已经做得非常成熟,通常不需要做额外的定制或者开发。

但是开源 GUI 自动化测试框架的 GUI 测试报告往往需要自己来开发,主要使用了扩展 Selenium 原本的操作函数的方式以及 Hook 函数来实现。

开源 GUI 测试框架的测试报告实现思路

但是,如果你使用的是开源软件,比如 Selenium WebDriver,那就需要自己去实现截图以及高亮显示操作素的功能。实现的思路通常是:利用 Selenium WebDriver 的 screenshot 函数在一些特定的时机(比如,页面发生跳转时,在页面上操作某个控件时,或者是测试失败时,等等)完成界面截图功能。

具体到代码实现,通常有两种方式:1、扩展 Selenium 原本的操作函数;2、在相关的 Hook 操作中调用 screenshot 函数。

第一,扩展 Selenium 原本的操作函数实现截图以及高亮显示操作素的功能

既然 Selenium 原生的 click 操作函数并不具备截图以及高亮显示操作素的功能,那我们就来实现一个自己 click 函数。当自己实现的 click 函数被调用时:

首先,用 Javascript 代码高亮显示被操作的素,高亮的实现方式就是利用 JavaScript 在对象的边框上渲染一个 5-8 个像素的边缘;

然后,调用 screenshot 函数完成前的截图;

最后,调用 Selenium 原生的 click 函数完成真正的操作。

那么,以后凡是需要调用 click 函数时,都直接调用这个自己封装的 click 函数,直接得到高亮了被操作对象的界面截图。

第二,在相关的 Hook 操作中调用 screenshot 函数实现截图以及高亮显示操作素的功能

其实使用 Hook 的方法比较简单和直观,但是你首先要理解什么是 Hook。

Hook 中文的意思是“钩子”,直接通过定义介绍什么是“钩子”会有些难以理解,那么我就通过一个实例来跟你解释一下。当执行某个函数 F 时,系统会在执行函数 F 前先隐式执行一个空实现的函数,那么当你需要做一些扩展或者拦截时,就可以在这个空实现的函数中加入自定义的操作了。那么这个空实现的函数就是所谓的 Hook 函数。

第三是全球化 GUI 测试报告的创新设计

所谓全球化测试是指,同一个业务在全球各个国家都有自己网站。比如,一些大型全球化电商企业在很多国家都有自己的站点,那么对这些站点的测试除了要关注基本的功能,以及各个国家特有的功能外,还要去验证界面布局以及翻译在上下文环境中是否合适。

早期的做法是,雇佣当地的测试工程师,由他们手工执行主要的业务场景测试,并验证相关的页面布局,以及翻译内容与上下文中的匹配度。在当地专门雇佣的这些测试工程师,被称为 LQA。

显然,聘请 LQA 的效率非常低,主要原因是:全部测试工作都由 LQA 在项目后期手工执行,执行前还需要对他们进行业务培训;同时,我们需要准备非常详尽的测试用例文档,LQA 也要花很大的精力去截图并完成最终的测试报告。为了解决这种低效的模式,最好的解决方法就是:利用 GUI 自动化测试工具生成完整的测试执行过程的截图。

这样,LQA 就不再需要去手工执行测试用例了,而是直接分析测试报告中业务操作过程中 GUI 界面截图就可以了,然后发现页面布局问题或者是不恰当的翻译问题。

这个方案看起来已经比较完美了,LQA 的工作重点也更清晰了,但这并不是最优的方案。因为这些 LQA 在实际工作中,还会有以下三个比较痛苦的地方:

需要经常在多个国家的测试报告之间来回切换去比较页面布局;

需要频繁切换到美国网站(也就是主站)的报告,去比较翻译内容与上下文的匹配度;

发现缺陷后,还是需要从 GUI 测试报告中复制截图,并用图像软件标注有问题的点,然后才能打开缺陷管理系统递交缺陷报告。

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

loginsight经历两年的开发,积累了一些用户,但一开始的付费策略和技术选型导致项目很难迅速成长。

所以此次更新主要有两个:

1. 迁移到electron+vue+elementui。选择了流行的前端技术,降低技术门槛,期望更多开发者一起参与

2. 完全免费(限时),扩大用户群

完整更新日志

项目主页

源码仓库

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

v2.3.0 更新内容:
1、go.mod依赖管理导入Excel操作类依赖;
2、新增职级管理导出Excel数据的功能;
3、新增职级管理导入Excel模板文件;
4、新增职级管理导入Excel操作面板;
5、新增职级管理导入Excel数据的功能;
6、新增职级管理导入、导出和下载模板的理由;
7、修复近期用户使用过程中反馈的BUG;

一款 Go 语言基于 Beego、Vue3、AntDesign、MySQL 等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可快速搭建前后端分离后台管理系统,本着简化开发、提升开发效率的初衷,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式,同时为了敏捷快速开发,框架特地集成了代码生成器,完全自主研发了自定义后端服务模板和前端自定义模板,可以根据已建好的表结构,可以快速的一键生成整个模块的所有代码和增删改查等等功能业务,真正实现了低代码开发方式,极大的节省了人力成本的同时提高了开发效率,缩短了研发周期,是一款真正意义上实现组件化、可插拔式的敏捷开发框架。

 

软件信息

  • 软件名称:EasyGoAdmin 敏捷开发框架 Beego+AntdVue 版本
  • 官网网址:https://www.easygoadmin.vip
  • 文档网址:http://docs.beego.antdvue.easygoadmin.vip
  • 演示地址:http://manage.beego.antdvue.easygoadmin.vip

路由注册

 

特别鸣谢

感谢 Beego、Vue、AntDesign 等优秀开源项目。

Goland激活2023.1.1(GoLand 2023.1 发布)

JPress 是一个使用 Java 开发的类似 WordPress 的开源 CMS,始于 2015 年。

到目前为止, 已经有 10w+ 网站使用 JPress 进行驱动,其中包括多个政府机构,200 + 上市公司,中科院、红 + 字会等。相比 WordPress,高安全、高性能、本地化是我们的切入点。(已获得 Gitee 评为:最有价值的开源项目)。

JPress v5.1.0  更新内容如下:

  • 优化:CKEditor 编辑器完善字体和字号的选择
  • 优化:文章内容添加 oembed 标签的支持
  • 优化:丰富 categoryArticles 的属性支持,添加是否读取下级分类内容的支持
  • 文档:优化模板指令的相关文档

说的再多,不如亲自一试。

在 阿里云(腾讯云) 上一键通过 8080 端口运行

 wget https://gitee.com/JPressProjects/jpress/raw/master/install.sh && bash install.sh 8080 

通过 Docker-Compose 一键运行

 curl -O https://gitee.com/JPressProjects/jpress/raw/master/docker-compose.yml && docker-compose up -d

通过 Eclipse 或者 Idea 等开发工具运行

  • 1、在本地安装好 Java、Maven 等开发环境
  • 2、将源码下载、并导入 eclipse 或者 idea
  • 3、在项目的根目录,执行  命令进行编译
  • 4、在开发工具,右键运行  下的  方法
  • 5、通过浏览器访问 ,进行自动安装

企业版

针对企业更高的安全要求和性能要求,我们还推出了企业版旗舰版,详情请登录 JPress 官网 http://www.jpress.cn 了解。

交流

  • 官网:http://www.jpress.cn
  • 文档:http://doc.jpress.cn
  • JPress 的案例:这里
  • JPress 插件列表:这里
  • JPress 模板列表:这里

 

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

FOSSASIA Summit是一个致力于开源方案及专案的技术型聚会,自2009年以来已持续举办十多年。2023年FOSSASIA峰会将于4月13日(星期四)至4月15日(星期六)在新加坡Lifelong Learning Institute举行,主题涵盖云计算、人工智能、区块链、开源文化、开源硬件、Linux 内核、网络安全、开放科学等多个领域。

届时,openKylin技术委员会委员李剑峰、王文竹及openKylin社区战略合作伙伴鉴释科技创始人兼CEO梁宇宁将受邀参会并发表《The practice and experience of openKylin on RISC-V Architecture》主题演讲,给来自全球的技术开发者带来openKylin社区在RISC-V软硬件生态建设方面的经验与成果介绍,向大家展示中国开源社区的潜力,并同国际技术社区共研RISC-V未来之势,欢迎大家报名观看直播~此外,本次活动还设置了展览环节,欢迎大家前来一起玩耍。

活动官网:

http://summit.fossasia.org

活动日程&预约:

https://eventyay.com/e/7cfe0771/schedule

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

openKylin(开放麒麟)社区旨在以“共创”为核心,在开源、自愿、平等、协作的基础上,通过开源、开放的方式与企业构建合作伙伴生态体系,共同打造桌面操作系统顶级社区,推动Linux开源技术及其软硬件生态繁荣发展。

社区首批理事成员单位包括麒麟软件、普华基础软件、中科方德、麒麟信安、凝思软件、一铭软件、中兴新支点、心科技、中国电科32所、技德系统、北京麟卓、先进操作系统创新中心等13家产业同仁和行业机构。

 

审核:openKylin

作者:涯海

前文回顾:

基础篇|链路追踪(Tracing)其实很简单

使用篇|链路追踪(Tracing)其实很简单:请求轨迹回溯与多维链路筛选

在前面文章里面,我们介绍了单链路的筛选与轨迹回溯,是从单次请求的视角来分析问题,类似查询某个快递订单的物流轨迹。但单次请求无法直观反映应用或接口整体服务状态,经常会由于网络抖动、宿主机 GC 等原因出现偶发性、不可控的随机离群点。当一个问题发生时,应用负责人或稳定性负责人需要首先判断问题的实际影响面,从而决定下一步应急处理动作。因此,我们需要综合一段时间内所有链路进行统计分析,这就好比我们评估某个物流中转站点效率是否合理,不能只看某一个订单,而要看一段时间内所有订单平均中转时间与出错率。

统计分析是我们观察、应用分布式链路追踪技术的重要手段。我们既可以根据不同场景要求进行实时的后聚合分析,也可以将常用的分析语句固化成规则生成预聚合指标,实现常态化监控与告警。相对于链路多维筛选,统计分析需要明确分析对象与聚合维度。其中,分析对象决定了我们对哪些指标进行聚合操作,比如请求量、耗时或错误率。而聚合维度决定了我们对哪些特征进行统计对比,比如不同应用、接口、IP、用户类型的统计量对比。接下来,我们先了解下分析对象和聚合维度的具体概念,再介绍实时分析与监控告警的具体用法。

01 分析对象

分析对象,又称为度量值(Measure),决定了我们对哪些指标进行聚合操作。常见的度量值包括“黄金三指标”——请求量、错误和耗时。 除此之外,消息延迟、缓存命中率或自定义度量值也是高频应用的分析对象,我们来逐一了解下。

(一)请求量

请求量可以说是我们最熟悉的度量值之一。这个接口被调用了多少次?这一分钟的请求量与上一分钟相比有什么变化,与前一天相比有什么变化?这些问题都是我们在日常运维过程中最熟悉的对话。

请求量通常按照一个固定的时间间隔进行统计,比如按秒统计的请求量通常称之为 QPS(Queries Per Second),有些场景也会称之为 TPS(Transactions Per Second)。两者有一些细微差别,但含义基本相同,经常被混用。我们可以使用 QPS 来衡量系统的单位时间吞吐能力,用以指导系统资源的分配调度;或者观测用户行为的变化,判断系统是否出现异常。

如下图所示,创建订单接口每天上午 10 点和 12 点的请求量都会有一个周期性的突增,这种情况大概率是整点促销活动的正常表现,我们在做资源容量评估时需要参考整点的峰值请求量,而不是系统平均请求量,否则每当流量突增时系统可用性就可能大幅下降,影响用户体验。

image.png

下面第二张图的创建订单接口在 10 月 8 号凌晨 00:39 分有一个非常明显的下跌,并且前一天的曲线是比较平滑的,这种现象大概率是接口异常导致的,已经影响了用户的下单体验,需要深入排查定位原因。

image.png

请求 QPS 的变化趋势反映了系统吞吐能力的变化,是请求量最常用的一种方式。但在某些离线计算场景,对短时间内的吞吐变化不敏感,更需要一个比较大的时间间隔内的吞吐总量统计,比如一天或一周的请求处理总量。以便灵活分配离线计算资源。

错误

每一次链路请求都会对应着一个状态:成功,或失败。一次失败的请求通常称之为错误请求。单条错误请求可能由于各种各样的偶发性原因不予关注。但是当错误数累积到一定程度,超过一定阈值时,就必须要进行处理,否则会引发大面积的系统故障。

错误指标除了像请求量一样,分为错误 QPS 和错误总量之外,还有一种比较特殊的统计方式,就是错误率。错误率是指在单位时间间隔内错误数占请求总数的比例。 比如 A 接口一分钟内被调用了 10000 次,其中有 120 次是错误调用,那么 A 接口这一分钟的错误比率就是 120 / 10000 = 0.012,也就是 1.2%。

错误率是衡量系统健康程度的关键指标,针对它的健康阈值设置不会受请求量的周期性变化影响。比如下单接口的请求量在白天达到峰值的 10000 QPS,在夜间的谷值只有 100 QPS,全天的请求量变化范围在 100 ~ 10000 QPS 之间。相应的错误量变化范围在 0.2 ~ 20 QPS 之间,而错误率基本固定在 0.2% 左右。无论是使用固定阈值或同环比的方式,错误数都很难精确反映系统实际的健康程度,而错误率使用起来就简单、有效的多。比如设置错误率超过 1% 时就发送告警短信,超过 5% 就电话通知稳定性负责人立即排查。

image.png

(二)耗时

耗时也是我们非常熟悉的度量值之一,简单地说就是这次请求的处理花费了多长时间。但是不同于请求量。对耗时次数或总量的统计不具备实用价值,最常用的耗时统计方式是平均耗时。比如 10000次调用的耗时可能各不相同,将这些耗时相加再除以 10000 就得到了单次请求的平均耗时,它可以直观的反应当前系统的响应速度或用户体验。

不过,平均耗时有一个致命的缺陷,就是容易被异常请求的离散值干扰,比如 100 次请求里有 99 次请求耗时都是 10ms,但是有一次异常请求的耗时长达1分钟,最终平均下来的耗时就变成(60000 + 10*99)/100 = 609.9ms。这显然无法反应系统的真实表现。因此,除了平均耗时,我们还经常使用耗时分位数和耗时分桶这两种统计方式来表达系统的响应情况。

耗时分位数

分位数,也叫做分位点,是指将一个随机变量的概率分布范围划分为几个等份的数值点,例如中位数(即二分位数)可以将样本数据分为两个部分,一部分的数值都大于中位数,另一部分都小于中位数。相对于平均值,中位数可以有效的排除样本值的随机扰动。

举个例子,你们公司每个同事的薪资收入可能各不相同,如果财务负责人要统计公司的中间薪资水平有两种方式,一种就是把所有人的薪资加在一起再除以人数,这样就得到了平均薪资;还有一种是将薪资从高到低排序,选取排在中间的那个人的薪资作为参考值,也就是薪资中位数。这两种做法的效果对比如下图所示:

image.png

分位数被广泛应用于日常生活的各个领域,比如教育领域的成绩排布就大量使用了分位数的概念,大家最熟悉的应该就是高考录取分数线。假如某大学在 A 省招收 100 人,而该省有 1 万人报考该大学,那么该大学的录取分数线就是所有报考学生成绩的 99 分位数,也就是排名前 1% 的同学可以被录取。无论该省的高考试题是偏难还是偏简单,都能准确录取到预定的招生人数。

将分位数应用在 IT 领域的耗时指标上,可以准确的反映接口服务的响应速度,比如 99分位数可以反映耗时最高的前 1% 接口请求的处理时间。对于这部分请求来说服务的响应速度可能已经达到了一个无法忍受的程度,例如 30 秒钟。相对于平均耗时,耗时 99 分位数额外反映了 3 个重要的信息:

  1. 有 1% 的服务请求可能正在忍受一个超长的响应速度,而它影响到的用户是远大于 1% 的比例。因为一次终端用户请求会直接或间接的调用多个节点服务,只要任意一次变慢,就会拖慢整体的终端体验。另外,一个用户可能会执行多次操作,只要有一次操作变慢,就会影响整体的产品体验。
  2. 耗时 99 分位数是对应用性能瓶颈的提前预警。当 99 分位数超出可用性阈值时,反映了系统服务能力已经达到了某种瓶颈,如果不加处理,当流量继续增长时,超时请求影响的用户比例将会不断扩大。虽然你现在处理的只是这 1% 的慢请求,但实际上是提前优化了未来 5%、10%,甚至更高比例的慢请求。
  3. 什么样的用户请求更可能触发 99 分位数的异常?根据经验表明,往往是那些数据体量大,查询条件复杂的“高端”用户更容易触发慢查询。同时,这部分用户通常是影响产品营收和口碑的高价值用户,绝不能置若罔闻,而要优先响应解决。

除了 99 分位数,常用的耗时分位数还包括 99.9、95、90、50 分位数,可以根据应用接口的重要性和服务质量承诺(SLA)选择适当的分位数进行监控和预警。当一条时间序列上的分位数连在一起就形成了一条“分位线”,可用于观察耗时是否存在异常的变化趋势,如下图所示:

image.png

耗时直方图

耗时分位数和平均值将接口响应速度抽象成了有限的几个数值,比较适合监控和告警。但是,如果要做深度的分析,识别所有请求的耗时分布情况,那就没有比直方图更适合的统计方式了。

直方图大家可能不是很熟悉,平时接触的也比较少。它的横坐标代表请求耗时,纵坐标代表请求次数,并且横/纵坐标值通常都是非等分的,因为耗时与次数的分布通常是不均衡的,使用非等分坐标轴更容易观测重要且低频的慢请求分布,而等分坐标轴很容易将低频值忽略掉。如下图所示,我们可以直观的发现不同耗时范围内的请求次数分布:耗时在 100ms 左右的请求次数最多,超过了 10000 次;耗时在 5-10s 范围内次数也不少,接近 1000 次,而超过 30s 以上的请求也有接近 10 次。

image.png

直方图可以与分位数结合使用,每一个耗时分位数都会落在直方图具体的某个区间内,如下图所示 P99 分位数落在了 3s 的区间。这样,我们不仅能够快速发现最慢的 1% 请求耗时阈值是3s,还能进一步区分这 1% 最慢的请求在 3-5s,5-7s,7-10s,10s 以上的具体分布数量。同样的 P99 分位数(3s),慢请求全部集中在 3-5s 区间,和全部集中在 10s 以上区间所反映的问题严重程度,以及问题背后的原因可能是完全不同的。

image.png

通过对比不同时段的直方图分布,我们可以精准发现每一个耗时区间的变化情况。如果你的业务是面向终端用户,每一个长尾请求都代表着一次糟糕的用户体验,那你应该重点关注耗时区间最高的那部分变化,比如 P99 分位数所在的区间;如果你的系统是负责图形图像处理,更加看重单位时间内的吞吐率,不那么在意长尾耗时,那你应该优先关注大部分请求的耗时变化,比如 P90 或 P50 所在区间的分布变化。

直方图能够为我们分析耗时问题提供更丰富的细节,在后续章节的实践案例中我们将做进一步的介绍。

(三)其他度量值

请求量、错误和耗时又被称为“黄金三指标”,可以应用于绝大部分类型的链路请求,如 HTTP,RPC,DB等。除此之外,一些特殊的请求类型,具备独特的场景特性,需要一些新的度量值来表达其语义,例如缓存命中率、消息时延、任务调度时延等。这一类度量值的通用性不高,但是可以恰当地描述所属类型的关键特征。下面我们以缓存命中率为例,了解下它的典型用法。

缓存命中率

小玉负责的订单中心会调用存储在 Redis 缓存中的商品详情,只有查询缓存未命中时才会去请求数据库。有一个问题一直苦恼着小玉,就是每次促销活动刚开始的时候就会出现访问量激增又下降再缓慢回升,伴随耗时大幅抖动的现象,而缓存和数据库的请求量也会相对应的抖动变化,如下图所示:

image.png

我们可以看到缓存请求量的变化是与创建订单接口大致相同的,而数据库的请求量有一个比较大幅的增长。可以初步判断是由于促销活动初期出现了大量缓存未命中,从而调用数据库导致的创建订单接口耗时异常,因为查询数据库的耗时开销要远大于缓存。那么,缓存未命中的原因又是什么呢?主要有两种常见原因,一种是查询了大量冷数据导致的缓存命中率下降,另一种是查询量激增导致缓存连接被打满,超过其服务提供能力。两种原因的具体表现可以结合缓存命中率指标进一步区分,如下图所示。

image.png

为了减少冷数据对促销活动体验的影响,可以提前进行缓存预热提高命中率;而连接打满的问题可以提前调整客户端或服务端的缓存连接池最大连接数限制,或者提前扩容。缓存命中率下降的严重后果会导致大量请求击穿数据库,最终导致整体服务不可用。因此,在生产环境中建议对缓存命中率设置告警,提前发现风险。

(四)自定义度量值

除了分布式链路追踪框架默认生成的通用度量值外,我们还可以将自定义度量值添加到 Attributes 对象中,再对其执行统计、分析和告警等操作。这些自定义度量值可以很好的拓展分布式链路追踪在业务域的应用。比如,我们将每笔订单的金额添加至 Attributes 中,类似 attributes.price = 129.0 。接下来,按照接口维度聚合订单金额,就可以看到不同接口的关联收入,并给出相应的漏斗分析图。帮助业务同学分析哪一步行为影响了用户的最终支付,造成了潜在的营收损失,如下图所示。

image.png

02 聚合维度

分析对象决定了我们要对哪些指标进行操作,而聚合维度决定了对该指标从多少个切面进行统计分析。通过对不同切面进行展开和对比,我们能够发现这些指标值为什么会发生这样或那样的一些变化。例如某个接口一段时间内的平均耗时为 3s,但是分布在两个不同的版本,其中 v1 版本的平均耗时只有 1s,而 v2 版本的平均耗时却高达 5s。此时,我们可以将问题明确的聚焦在 v2 版本上,观察 v2 版本相对于 v1 版本有哪些不同,进而定位耗时高的原因,如下图所示。

image.png

如果说分析对象回答了“是什么”的问题,那么聚合维度就回答了“为什么”的问题。选择一个恰当的聚合维度进行展开,可以帮忙我们有效的分析异常发生的特征分布,例如版本、IP、用户类型、流量类型等等。如果单个维度不足以定位问题,就需要进行多个维度的聚合分析,比如查看特定应用特定版本在不同用户类型的接口耗时变化。

与分析对象类似,常用的聚合维度可以分为链路框架自动生成的基础特征维度,以及用户自定义标签维度这两类,如下所示:

  • 链路基础特征聚合:在链路特征筛选的章节我们介绍过链路基础特征主要是指调用链本身所具备的一些基础信息,比如接口名称,所属应用,节点IP、请求状态等等。无论是何种编程语言、何种埋点框架,这些基础特征都是由链路埋点框架自行生成的,也是最常用的聚合分析维度。目前主流的 Tracing 或 APM 产品都会提供预置的应用服务维度聚合指标,例如 Jaeger、Zipkin、Skywalking 等开源实现还会提供对应的监控大盘。
  • 用户自定义标签聚合:除了链路基础特征以外,用户如果想要扩展业务属性,就可以通过链路 SDK 向 Attributes 里添加自定义标签,例如流量类型、用户类型、业务领域、商品类目、销售渠道等等。自定义标签提供了一种从业务视角分析流量问题的手段,灵活的运用自定义标签可以更好的发挥分布式链路追踪的数据价值。不过,由于自定义标签具有一定的埋点改造和运维成本,目前在生产环境还没有被大规模应用起来,需要 Tracing 产品提供更加灵活、成本更低的打标方案,例如白屏化动态打标,我们在后续章节再进行详细介绍。

(一)基础特征与自定义标签结合使用

小玉作为订单中心的应用负责人,对于核心接口的版本更新一直非常谨慎,按照惯例,她会先在预发环境进行灰度用户引流,对比新老版本的差异,确认无误后再发布至生产环境。此时,小玉会同时对应用、接口、环境、IP等多个基础特征进行聚合,再结合自定义的版本标签对比流量状态变化,如下图所示,v1.1 新版本的接口耗时大幅上升,错误率也远高于 v1.0 版本,应该立即停止发布,回滚版本,避免影响线上用户体验。

在这个案例中,由于 v1.1 版本的灰度流量要远小于 v1.0 版本,如果没有按照版本维度进行聚合比对,新版本的异常问题就会被整体流量平均稀释掉,难以被提前发现。只能等到发布比例增加到足够大的程度,对线上用户造成更加严重的影响后,才可能被定位。

image.png

(二)注意事项

不是所有的聚合维度都是有意义的,一个有效的聚合维度必须具备一个前提,就是它的值分布在有限的、肉眼可观测的数据集,而不能无限发散。比如一个日活上亿的 APP 应用,不应该直接将访问用户的 UserId 作为聚合维度,因为聚合后的上亿条曲线完全无法观测,不具备监控和告警价值。相对应的,我们可以选择用户类型作为聚合维度,区分游客、普通会员、白金会员、钻石会员等不同用户类型的访问情况。

还有一种情况是,聚合维度部分发散,比如 URL 里面有部分字段包含了时间戳,UID 等变量信息。此时,我们需要对 URL 做模糊化处理,通过收敛算法将不断变化的字段收敛成星号 *,保留不变的协议、域名、路径等,收敛前后的效果如下图所示。

image.png

03 链路实时分析

随着时间的流逝,马上要临近双11啦,为了保障大促洪峰流量下的系统可用性,小玉的部门发起了全面治理慢调用接口的活动。小玉接到通知后,有一些发愁,虽然她已经熟练掌握了调用链的筛选与查询,但是微服务调用接口有这么多,一条条的查询调用链,每个接口全都治理一遍的成本属实有点高,即使她疯狂加班也不一定能按时完成。此时,小明建议她优先分析与治理慢调用出现次数最多的 Top10 核心接口。那么,如何快速识别出 Top10 的慢接口有哪些呢?这就是我们本小节将要介绍的链路实时分析功能。

链路实时分析,是基于给定的调用链明细数据样本集(通常是全量数据),自由组合筛选条件与聚合规则,得出分析对象统计维度的分布结果。 相比于链路筛选,实时分析需要指定分析对象和聚合维度,对满足筛选条件的结果集执行二次聚合(GROUP BY)操作。比如对订单中心应用耗时大于 3s 的慢请求按照接口名称维度,对请求总次数进行聚合与排序,就可以得到订单中心 Top10 接口的慢调用次数分布结果,如下所示。

image.png

链路实时分析可以从统计分布的视角给出问题的影响面,结合自定义标签与度量值,灵活的满足各类业务分析需求。比如大于3秒的下单请求有多少次,占总请求的比例是多少?下单失败的请求集中在哪些渠道或品类?由于下单失败导致的潜在营收损失数额有多大?

灵活性是链路实时分析的最大优势,但缺点也很明显,主要有以下三点:

  1. 基于明细数据的实时分析结果会受到调用链采样率的影响,一旦开启了调用链采样,基于非全量数据的实时分析结果就会产生偏差,出现样本倾斜情况,影响用户判断,分析价值会大打折扣。
  2. 基于明细数据的查询分析成本较高,每次需要扫描大量原始数据,当调用链数据量较大时,分析速度会比较慢,不适合做常态化、高频次的监控与告警。
  3. 实时分析需要用户给定查询与聚合条件,不支持开箱即用,使用和学习成本较高。

链路实时分析适用于个性化、低频的查询场景,而面向经典、高频查询场景,链路监控无疑是更合适的选择。

04 链路监控

为了弥补链路实时分析采样不精确、查询速度慢、使用成本高等问题,聪明的程序员想到了一个好办法,就是对链路明细数据提前进行预处理,在链路采样发生前将其预聚合成监控指标。比如上文中提到的大于 3s 的慢请求接口分布,如果在端侧提前将满足条件的 Span 记录进行预聚合,即使单位时间内满足该条件的 Span 只有1个,由于监控指标不受采样率影响,仍然可以精准记录该 Span 的调用情况;如果单位时间内同一个接口大于 3s 的 Span 非常多,比如大于 1万次,最终转化的监控指标也只有一条,后续的数据处理与存储成本将大幅下降,查询速度也会显著提升。

image.png

(一)经典指标 vs 自定义指标

为了进一步降低用户的使用成本,大部分链路追踪开源实现或商业化产品都会面向经典查询提供开箱即用的链路指标与大盘。比较典型的包括应用流量总览,HTTP 状态码统计,数据库 SQL 统计等。

image.png

开箱即用的经典链路指标与大盘,可以满足大部分用户的通用查询需求,但是无法满足不同用户的差异化查询诉求。那么该如何平衡易用性与灵活性的天秤,低成本的释放链路数据的完整价值呢?

一种比较有效的方法就是自定义指标。比如慢 SQL 治理是一种生产系统面临的经典难题,但是不同业务类型对“慢”的定义不同,金融类系统容忍度比较低,可能大于 0.5s 就算慢。而提供文件下载服务的系统容忍度比较高,可能大于 10s 才算慢。为了平衡不同用户的差异化诉求,为每个用户生成专属的慢SQL自定义指标是个不错的选择。

image.png

(二)影响应用健康的关键链路监控有哪些?

小玉作为订单中心的 Owner,需要全力保障订单服务的稳定运行,为了实时监控应用服务的健康状态,及时处理线上风险,小玉该掌握哪些关键的链路监控大盘呢?

  • 对外提供的关键接口的 RED 黄金三指标:作为应用 Owner,最优先要关注的就是对外提供的服务是否正常,只要对外提供的服务保持在健康水位之内,其他的指标波动不会即刻产生太大的业务影响。因此,梳理订单中心对外服务的关键接口列表,掌握它们在不同时段的流量、耗时与错误率变化特征,是小玉保障应用健康的“重中之重”。
  • SQL 响应耗时:慢 SQL 是影响服务健康的“致命杀手”。据不完全统计,线上系统 40% 响应慢引发的故障的罪魁祸首都是慢 SQL。因此,小玉应该重点关注 SQL 响应耗时,无论是连接慢、执行慢还是结果处理慢,都应及时跟进、尽快恢复。
  • 缓存命中率:缓存命中率是一个影响应用健康的间接指标或预警指标,一旦缓存命中率大幅下跌,通常会伴随着数据库查询次数快速上升,压力过载,最终导致服务不可用等问题。影响缓存命中率的常见因素包括冷数据查询,缓存热点,请求量突增等,小玉应该针对性给予处理。

除了上述关键链路监控外,为了更好的保障应用健康,小玉还应关注连接池负载、FGC、CPU、内存、磁盘空间使用率、网络重传率等其他非链路数据的监控。这些内容我们将在第4章《如何保障系统可用性》再进行详述。

(三)链路监控的限制

上文介绍了链路监控具备统计精度高、查询速度快、使用成本低等优势,那这种优势的代价又是什么,它还存在哪些方面的限制?接下来,让我们来了解下链路监控在数据与使用这两方面的主要限制:

  • 预聚合精度:首先,链路监控的信息密度直接受预聚合维度的数量影响。预聚合维度数量越多,指标包含的信息就越具体,但是当预聚合维度达到最大时,指标的数量几乎等同于链路明细数据,已经失去了预聚合的意义。如果预聚合维度数量比较少,比如只有应用和接口,没有 IP,那我们就无法通过指标判断异常发生在哪些 IP,缺失了关键信息。因此,如何合理控制预聚合的维度组合,保留关键信息,是链路监控非常重要的探索性课题。
  • 先验性知识:预聚合监控相比对后聚合实时分析,一个很重要的特点就是需要输入先验性知识,即对哪些数据在哪些维度上进行统计。这些先验性知识可以是系统内置的,也可以由用户提前输入。但是,一旦流量已经发生,就错过了预聚合的时机。预聚合规则只能作用于对未发生的链路数据,指标的生成相对于预聚合规则生效具有一定的滞后性。
  • 被动式响应:监控这种使用方式本身受人为因素影响,需要人来“看”监控。在生产环境的实际应用中,这里就会引发两个问题,一是用户什么时候来看监控,二是用户怎么知道要看哪些监控指标?如果系统没有问题,那么用户是不需要看监控的,如果系统出了问题,用户如何第一时间知道,并且快速定位异常的监控指标?监控自身无法突破被动式响应的限制,我们可以带着这些问题来看下一小节将要介绍的链路告警功能。

05 链路告警

为了突破监控被动式响应的限制,聪明的程序员又开始琢磨,可不可以写一段程序,由它来代替人们对所有的监控指标进行周期性扫描,一旦发现某项监控指标符合了预先设定的异常特征(比如超过某个固定阈值,或环比下跌 30%),就通过短信/电话/邮件等方式主动通知用户进行处理,这就是告警。

链路告警相对于其他告警,在实现原理上并没有本质的区别,但在使用上却有不同的侧重与分工。由于链路数据描述了用户行为转化为系统请求后,在分布式系统中的流转与状态。因此,链路告警可以作为业务告警与系统告警的一个联结,起到承上启下的作用。

比如,某电商系统的交易金额突然下跌了 30%,此时,地址修改接口的错误率超过 95%,相关应用的机器也出现磁盘空间不足告警。这时,我们就可以比较清晰的判断出是由于机器磁盘空间不足,导致地址修改接口不可用,进而导致交易额下跌的业务资损。如果缺失了中间的链路告警,我们就很难明确根因,无法快速做出清理磁盘或精准扩容等故障恢复手段。

(一)经典链路告警规则

与上一小节的关键链路监控类似,经典链路告警规则包括核心接口的黄金三指标告警:流量下跌、响应变慢、错误率上升。此外,异常调用次数增多、慢 SQL 与缓存命中率下跌也是比较重要的链路告警规则,可以默认启用。

image.png

image.png

(二)如何避免链路告警风暴

链路告警相比于其他类型的告警,具有一个很重要但也很容易引发问题的维度:接口名称。由于告警的有效性主要是基于统计数据的趋势变化进行判断,一旦数据呈现出明显的离散现象,就很容易造成误告警。比如某个接口的流量很小,偶尔发生一次错误调用,就很容易触发错误率超过 50% 的告警通知;再比如某个 URL 或 SQL 接口名称中包含了一个时间戳变量,导致接口极度发散,无法反映出该类接口的实际分布特征,很容易引发链路告警风暴。

因此,为了避免由接口名称引发的误告警或更为严重的告警风暴,我们可以采取以下措施:

  1. 对接口名称进行模板化处理,比如抹去 URL 中不断变化的 Parameters 部分,只保留相对静态的 Path 部分。针对 SQL,只保留模板语句,不记录实际的执行语句,将 SQL 中的参数用 ?代替。
  2. 通过自动收敛算法对接口名称进行收敛处理,尽可能避免变量导致的接口发散。
  3. 设置告警规则时附加一个调用次数限制,比如过滤掉每分钟调用次数小于 10 次的接口,减少小流量接口引发的误告警。
  4. 只面向核心接口设置接口粒度的告警规则,非核心接口不单独设置告警规则,只看组件类型整体的变化情况。

当然,除了接口名称以外,实例 IP 或其他自定义维度也可能导致链路告警风暴,可以通过告警抑制等手段临时屏蔽,再参考接口名称的治理手段进行告警规则优化。

06 小结

本小节详细介绍了统计分析的两个关键概念:分析对象与聚合维度,以及它们在链路实时分析、监控、告警三种不同场景下的用法与区别。三种场景的优劣势互有补充,层层递进,不仅帮助我们有效的解决了链路问题的定界,也为其他数据类型的统计分析应用提供了理论参考。因此,我们有必要汇总一下三种不同场景的特征对比表格,如下所示。

image.png

作者简介:牛学蔚(GitHub: @justxuewei):Apache Dubbo PMC,对云原生、中间件、容器等领域有浓厚兴趣,活跃在 Dubbo 和 Kata containers 两个开源项目中。

01 Go 微服务体系发展与选型

随着微服务技术的快速发展,其在各个领域都形成了一系列事实标准,在 Kubernetes 和容器技术加持下,云原生微服务已经成为了主流解决方案。而 Go 语言作为云原生领域最受欢迎的开发语言,正被越来越多的企业作为微服务开发的首选语言,其中比较流行的包括 Go-micro、Go-zero、Dubbo-go 等。作为 Dubbo 微服务体系中多语言实现的一员,在 2022 年 Dubbo-go 以微服务领跑者的角色积极拥抱云原生标准,探索了 Proxyless Mesh 形态,配合适配 Pixiu 云原生网关,形成了完善的 Dubbo-go 微服务生态矩阵。

以 Dubbo-go 为中心的微服务体系在多个知名企业中成功落地和实践,框架的稳定性在实际场景下经受住了考验。截止今年已有 60+ 家企业在我们的用户列表中登记,其中较为典型案例请参考文章《小米电商 Apache Dubbo-go 微服务实践》。小米电商选用了 Dubbo-go + Nacos + sidecar + etcd + mirpc 为核心的微服务体系,除了看中了 Dubbo-go 的互联互通和服务治理能力外,也认可 Dubbo-go 在微服务方向的沉淀和积累。

02 Dubbo-go 简介

2.1 什么是 Dubbo-go

Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。Dubbo3 从设计上不绑定编程语言,社区目前提供了 Java、Go、Rust、Node.js 等多语言实现,在未来,我们计划为所有主流语言提供对等的微服务开发体验。

Dubbo 框架作为国内最具影响力的开源微服务开发框架之一,拥有非常高的关注度和活跃度,在 GitHub 上拥有 3.8 万+ stars。Dubbo 项目于 2017 年捐赠给 Apache 基金会,在经历了短短 15 个月孵化后顺利毕业,在 Apache 基金会管理的全部项目中关注度排名第三(前两名分别是 echarts 和 superset),Dubbo-go 作为 Dubbo 多语言生态的重要一员,很好的兼容 Dubbo 生态的同时提供面向 Go 语言体系的微服务开发体验。

Dubbo-go(项目地址 github.com/apache/dubbo-go)作为 Dubbo 多语言生态的重要组成部分,目前完全兑现了 Dubbo3 架构的核心能力,并且在云原生时代,凭借 Go 语言无需重量级虚拟机、静态编译以及垃圾回收的特性,获得了广泛关注,其应用规模也逐渐扩大。从特性上来说,Dubbo-go 目前支持 HTTP/2、TCP、gRPC 协议通信、服务发现、流量管控、配置管理、全链路追、可视化观测等诸多新特性,Dubbo3 已是众多用户生产环境首选的微服务框架(用户列表);在生态建设方面,Dubbo-go 适配了包括 Zookeeper、Nacos、Sentinel、Zipkin、Kubernetes、Prometheus、云原生 API 网关项目 Dubbo-pixiu、异步网络库 Dubbo-getty、Hessian2 等生态项目。

2022 年 Dubbo-go 社区以生态互联、开发者体验、稳定性为切入点,不断优化系统架构,社区荣获多个开源奖项:

  • Dubbo 生态被评为 2021 年中国 20 大最活跃社区之一
  • Dubbo-go 入围 2021 年“科创中国”榜单。
  • Dubbo-go 开源社区被 OSCHINA 评为“2022 年度 OSCHINA 优秀开源技术团队”。

2.2 重要特性

通信协议: 遵循 Dubbo 核心架构设计,Dubbo-go 在实现上不绑定通信协议,目前支持 HTTP/2、TCP (Dubbo2)、JSONRPC、gRPC、HTTP 等多种通信协议,开发者可以根据使用场景灵活的选择通信协议。

服务注册: 支持 Client-based 服务发现机制,支持注册中心适配如 Nacos、Consul、Zookeeper 等。Dubbo3 的服务发现机制诞生于阿里巴巴超大规模微服务电商集群实践场景,其在性能、可伸缩性、易用性等方面的表现大幅领先于业界大多数主流开源产品。

配置中心: Dubbo 配置中心可实现应用配置的远程托管,支持配置变更的实时感知,目前支持 Nacos、Apollo(携程开源)、ZooKeeper 等作为配置中心。

负载均衡: Dubbo 提供了多种负载均衡策略,如随机负载均衡策略、一致性哈希负载、基于权重的轮询、最小活跃度优先、自适应负载均衡 P2C 等。

流量控制: Dubbo 的流量管控规则可以基于应用、服务、方法、参数等粒度精准的控制流量走向,基于此可灵活的实现超时时间调整、开启访问日志、金丝雀发布、参数路由、同区域优先、按比例流量分发等。除此之外,通过接入 Hystrix、Sentinel 等,Dubbo-go 还支持自适应限流、限流熔断等。

分布式事务: 支持 Seata-golang 分布式事务框架,实现了 AT 模式和 TCC 模式分布式事务的调用,AT 模式相较 TCC 模式对代码的入侵性更小、需要开发的接口更少,但 AT 模式对事务操作的数据持有全局锁,TCC 模型性能更好。

链路追踪: 支持基于 Jaeger、ZipKin 的链路追踪能力。

指标可视化: 支持使用 Prometheus 收集框架指标和用户指标。

可扩展性: Dubbo-go 提供了灵活的 extension 扩展机制,用户可随时根据自己的需求灵活扩展服务发现、负载均衡、配置中心、流量管控规则、全链路追踪等中间件。

03 过去一年我们做了什么

3.1 优雅上下线

在微服务场景下,业务是以容器的形式对外提供服务,k8s 能够方便的对 Pod 进行滚动升级,在旧版本被替换的时候应该达到无损下线的效果,即容器不能被销毁直到没有正在处理的请求。如果其不能被正确实现,对于承载高流量的在线服务来说,在更新期间可能会导致大量的请求报错,甚至可能触发报警,其影响是巨大的。优雅上下线功能是 Dubbo-go 3.0 正式版本发布后的第一个重大增强,王晓伟同学(GitHub: @XiaoWeiKIN)贡献了全流程的优雅上下线能力。

image.png

Dubbo 经典的调用流程如上图所示,这里面包含了服务提供者(Provider)、服务消费者(Consumer)以及注册中心(Registry)三个关键组件,一个服务能够被调用,首先需要提供者准备服务并对外暴露端口(步骤 0),然后提供者需要将调用信息注册到注册中心中(步骤 1),消费者则会通过异步订阅的方式获取最新的提供者数据(步骤 2),注册中心在有新数据后会主动推送给消费者(步骤 3),此时消费者已经有本次调用的全部信息了,最后消费者发送调用请求(步骤 4),这样就完成了整个调用链路。

在单体应用中,上述逻辑非常清晰和简单,但是在大规模微服务集群中,这个逻辑的每一个细节都需要被仔细推敲后,才能保证上下线的过程中调用不出错。

image.png

优雅上线的目标是解决服务上线调用报错的问题,主要针对微服务场景下的调用依赖问题。在 Dubbo 生态中,Service 表示一个服务,能够被暴露并被其他服务调用,Reference 表示引用,可以简单的理解为下游服务。一个典型调用结构如上图所示,该服务对外暴露一个接口,同时引用了下游的 N 个服务。该服务在上线的时候应该严格遵循以下流程,首先保证下游服务的引用被成功初始化,之后再初始化 Service 对外暴露服务,最后再向注册中心注册服务。优雅上线相对来说逻辑比较简单,只需要严格遵循初始化过程的依赖关系就能保证上线过程中服务能够被正常调用。

优雅下线是优雅上下线的难点,涉及到了信号监听、反注册、等待已有请求完成调用等逻辑。在需要销毁容器的时候,kubelet 会向容器发送 SIGTERM 信号,Dubbo-go 会进入优雅下线流程,此时容器并不会立刻被销毁。即将下线的提供者首先会执行反注册,即向注册中心中删除自己的信息,消费者可以通过订阅获得这个信息,这个过程需要一定的时间。换句话说,在消费者获得这个删除信息之前,流量还是有可能会流向该提供者,此时提供者应该拒绝这部分请求。当然除了下线期间的新请求外,还有残留的来自上游的请求以及自己调用下游的请求,我们分别为这两种情况设置一个计数器,当两个计数器都被清零时,可以认为该提供者是“干净”的。Dubbo-go 的策略是拒绝新请求,等待已放行的旧请求。最后,销毁协议并关闭监听,该容器就能够被安全的摘除。

在启动优雅上下线后,集群内无错误请求,成功率保持在100%。

image.png

3.2 新一代柔性服务

在去年发布 Dubbo-go 3.0 版本的时候,柔性服务首次作为一个重要特性被提出。时隔一年,我们带来了全新升级的新一代柔性服务,在新版本中我们将爬山算法替换为峰值干预算法,在经过多次测试后新算法行为可控性更高、性能更优异,这部分工作由来自北京邮电大学的张业鹏同学(GitHub: @CoolIceV)贡献。

柔性服务是一种更智能的负载均衡算法。传统负载均衡算法大多是基于消费者视角,它们共同的局限性是无法根据服务提供者的当前状态动态调整分流策略,如 RR、hash 等算法。这些算法总是以尽可能公平的概率分配流量,但在实践中公平不等于负载均衡。

爬山算法是一种容量预估的算法,服务提供者需要将一些关键信息回传给消费者,比如时延、请求排队数量、预估容量等,消费者使用 P2C 算法选择一个负载最低的作为本次请求的提供者。这些数据实效性要求非常高,如果这些数据是被动传递的,那么很难保证实效性,如果这些数据是被主动探测的,那么在一个大型集群下感知成本非常高。基于上述问题,我们选择了更可控的峰值干预算法。

消费者部分中,我们使用了改良版的 P2C 算法,采集的指标包括请求数(requests)、成功数(accepts)、请求时延(rtt)。与原实现方案不同的是,该版本采用了更合理的滑动窗口(SlidingWindowCounter)和指数移动平均(EMA)两种带有时序性的模块进行采集。

SlidingWindowCounter 会保存时长为统计周期 T 的数据,整个周期内的数据被分割为若干个 Bucket,每个Bucket 保存计数时长内的数据,当前所处的 Bucket 会随着时间前进而向后移动。

image.png

EMA 利用指数移动平均算法进行平滑、减小抖动,适用于统计时延型的指标,计算公式:

image.png

以下为一个客户端请求 3 个服务端的测试结果,3 个服务端配置不同,分别为 1 核 1GB、2 核 2GB、3 核 3GB。兰青色虚线代表开始使用上述负载均衡算法,可以看到开启前每个服务端接收到的请求数几乎相同,开启之后流量会根据提供者的规格进行智能分流。

image.png

提供者基于一个 AutoConcurrencyLimiter 组件限流,在请求到达时会判断已接受的请求是否超过最大处理量,如果超过了就会直接返回失败,限流导致的失败会影响负载均衡时的成功率,进而影响该实例被请求的可能性。与常规限流组件不同的是,该组件会根据采样情况自动调整服务的最大处理量,不需要手动配置,而且增加了 CPU 负载作为启动开关,可以减少被错误限流的数量。

该组件主要关注 QPS、无负载时延(NoLoadLatency)和最大并发量(maxConcurrency),同时有一个用户指定的超参数 exploreRatio,表示探索最大并发量的程度。更新规则是

  • 使用总请求数(包含未被采样的数据)计算 QPS,新 QPS 更大时直接替换,更小则使用指数移动平均进行平滑处理。
  • 使用采样数据计算平均处理时延来估算 NoLoadLatency,平均时延变小才会更新,并使用指数移动平均进行平滑处理。
  • 增加探索因子启发式计算 maxConcurrency, 在采样时延或 QPS 在探索允许的范围之内时会逐步增大 exploreRatio,否则用指数移动平均的方式进行平滑处理

image.png

最后可以提供给用户一个可以通过 cgroup v1 进行 CPU 限制,当当前提供者 CPU 负载过高的时候,会无条件拒绝一切新请求。CPU 限制是一种最坏情况下的兜底策略。

以下为 1 个客户端请求一个服务端的测试结果,该测试随着时间推移,QPS 会逐步增大,如蓝线所示。可以看到当CPU 负载(橙线)过高时,有请求被限流(黄线),随后即使 QPS 再增大,CPU 负载、请求成功数均已相对稳定。

image.png

3.3 Dubbo Mesh

今年 Dubbo Go 社区发布了 Dubbo Mesh [1] 架构的完整实现,能够以 Proxyless Mesh 的形式加入 Istio 服务网格,开启了 Go 语言体系下的微服务新形态。

Istio 在架构层面分为控制平面(control plane)和数据平面(data plane),其中控制平面是一个名为 istiod 的进程,网络代理是 envoy 。Istiod 简体 Kubernetes 资源(resources)获取服务信息,比如 Service、Endpoint 等,将这些信息通过 xDS 协议发送给位于数据平面的 envoy。Envoy 作为一个独立代理进程以边车(sidecar)形式运行,该进程与业务进程共同加入同一个网络,劫持业务流量并转发到正确的位置。

服务网格能够屏蔽复杂的服务治理细节,让开发者能够专注于业务实现。Istio 通过边车的形式实现了业务逻辑的无侵入性,降低了系统之间的耦合性,带来开发便利的同时也引入了转发时延、额外资源消耗的问题。但是 Istio 作为云原生时代的标杆产品,其架构模式和思路就有非常大的借鉴意义,针对上述提到的 Proxy Mesh 的弊端,我们提出了一套基于 Dubbo-go 的 Proxyless Mesh 微服务治理模式。

Proxyless Mesh 是无代理服务网格,由 Google 提出后,多个开源产品在这个方向进行了探索和实践。其核心思路是用 SDK 代替独立代理进程,SDK 作为数据平面接收来自控制平面的控制信息,负责服务之间的通信和治理工作。

Dubbo-go 为了融入 Istio 体系,将扩展出来的注册发现流程进行了特殊改造。除了复用 Istio 提供的 EDS、CDS 主机发现的能力之外,增加了接口名到主机名的映射,作为源数据注册在了控制平面上。客户端在发起调用前持有接口名,通过查询 istiod 上的数据信息,拿到接口名到主机名到映射,转换为主机名;再通过 EDS、CDS 和路由,完成主机名到下游端点实例的转换。完成服务发现流程。

3.4 互联互通的新典范:Polaris 和 Dubbo-go 全面对接

Dubbo-go 从发布伊始,一直非常重视与各个开源产品之间的互联互通,今年我们完成了与 Polaris 全面对接,这部分工作由社区邓正威同学(GitHub: @jasondeng1997)和春少同学(GitHub: @chuntaojun)贡献。

Polaris 是一款开源的服务治理平台,致力于解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题,针对不同的技术栈和环境提供服务治理的标准方案和最佳实践。在经典 Dubbo-go 使用场景下,用户需要自行部署注册中心、可观测服务、流量管理等组件,而 Polaris 内置了服务管理、流量管理、故障容错、配置管理和可观测性五大功能,能够帮助用户快速降低微服务开发门槛。

Polaris 有统一的控制平面,需要为 Dubbo-go 框架适配相应的数据平面 SDK,用户只需要在 Dubbo-go 中开启 Polaris,框架将自动通过 extension 机制进行注入,开发者无需其他额外的开发工作。从用户数据流的维度,当用户在 dubbogo 中启用 Polaris 的服务治理能力后,业务流量实际处理流程如下:

image.png

当前 Polaris 已实现了 Dubbo-go 原生的服务注册扩展点,因此原本服务注册逻辑不需要进行任何调整,只需要在 dubbogo.yaml 配置文件中新增 polaris 协议的注册中心配置即可,如下所示。


其中 polaris-ip 表示北极星服务端 IP 地址,此时 Dubbo-go 框架就接入了 Polaris 服务治理框架。Polaris 还提供了流量管理、故障容错等诸多内容,碍于篇幅限制这里就不一一展开了,如果有兴趣请参阅 《互联互通的新典范:Polaris 和 Dubbo-go 全面对接》[2]。

3.5 TLS 安全通信支持

在今年我们为 Dubbo 协议、Triple 协议和 gRPC 协议实现了 TLS 安全通信功能,微服务之间能够以可信的方式调用,该部分由社区张立斌同学(GitHub: @ZLBer)贡献。

TLS 的前身是 SSL,被用于通信加密,能够保证传输内容不被其他主机查看和篡改,已经被广泛的应用于 HTTPS 等技术中。在开启 TLS 之前,需要生成所需要的证书和秘钥,我们假设其保存在 x509 目录中。启用 TLS 不需要对业务逻辑进行修改,只需要设置相应的 Dubbo-go 配置文件 dubbogo.yaml 即可。

消费者配置文件:


提供者配置文件:


在正确开启 TLS 之后,提供者会输出一条 “Server initialized the TLSConfig configuration” 日志,消费者会输出一条 “Client initialized the TLSConfig configuration” 日志。更详细的使用实例请参考 tls 示例 [3]。

04 展望 2023

2022 年是极不容易的一年,感谢大家的信任,也非常感谢社区中每位同学的贡献。展望 2023 我们将会持续打磨框架,在优先保障稳定性的前提下持续提升易用性,打造一流的 Go 语言微服务框架。

4.1 Dubbo 开源整体规划

image.png

  • 官网与文档体验全面提升
  • Go、Node.js、Rust 等多语言体系建设
  • 全面提升整体可观测性
  • Dubbo Admin 一站式服务运维管控平台
  • Dubbo Mesh 走向成熟
  • 提升 HTTP 开发体验,补全 Web 互通
  • 打造 gRPC over Dubbo 最佳实践
  • 完善的认证鉴权体系

4.2 面向 Go 开发者全面使用体验提升

Dubbo-go 基础功能建设已经较为完善,同时在最近几年中我们持续在 dubbo-go-samples 目录完善示例代码 [4],能够帮助用户更加快速的上手项目。与此同时,Dubbo-go 文档内容还较为匮乏,代码示例只能让框架跑起来,但是这里面的使用和实现细节还需要在文档中进一步被详细阐述,让用户知其然,更知其所以然。除了文档建设工作外,社区对开发者工具的建设工作高度重视,在 2023 年,我们计划在 dubboctl 工具中集成更多命令,为用户提供快速创建微服务、支持了 Hessian2 生成器、新建 Dubbo-go 项目等诸多特性。在 2023 年我们将会进一步提升文档和工具的建设工作,除了强大的功能之外,成为真正面向 Go 开发者的轻量、易用的框架。

参考链接:

1、Dubbo-go-Mesh 开启新一代 Go 微服务形态 

2、https://baijiahao.baidu.com/s?id=0&wfr=spider&for=pc

3、https://github.com/apache/dubbo-go-samples/tree/master/tls

4、https://github.com/apache/dubbo-go-samples

zyplayer-doc 是一款适合企业和个人使用的WIKI知识库管理工具,提供在线化的知识库管理功能,专为私有化部署而设计,最大程度上保证企业或个人的数据安全,可以完全以内网的方式来部署使用它。

当然也可以将其作为企业产品的说明文档来使用,支持一键将整个空间的内容开放到互联网,并提供有不同风格的开放文档页样式可供选择,省去您为了产品的说明文档而去定制开发一个系统的成本。

本文将介绍通过 Rainbond 部署在线知识库系统 zyplayer-doc 的两种方式,使用 Rainbond 开源应用商店一键部署和通过源代码部署。

部署 zyplayer-doc

安装 Rainbond

Rainbond 是一个云原生应用管理平台,使用简单,不需要懂容器、Kubernetes和底层复杂技术,支持管理多个Kubernetes集群,和管理企业应用全生命周期。主要功能包括应用开发环境、应用市场、微服务架构、应用交付、应用运维、应用级多云管理等。

可通过一条命令快速安装 Rainbond。


通过应用商店部署 zyplayer-doc

已经发布到 Rainbond 开源应用商店,用户可通过开源应用商店一键安装 。

在 Rainbond 的 平台管理 -> 应用市场 -> 开源应用商店 中搜索 并安装。

Goland激活2023.1.1(GoLand 2023.1 发布)

部署完成后拓扑图如下。

Goland激活2023.1.1(GoLand 2023.1 发布)

可通过 Rainbond 默认提供的域名访问 ,访问需要加后缀 ,如:,默认用户密码 zyplayer/

Goland激活2023.1.1(GoLand 2023.1 发布)

通过源码部署 zyplayer-doc

zyplayer-doc 是由 Java 编写的 SpringBoot 项目,Rainbond 对于 Java 项目可以通过识别项目的 pom.xml 文件来进行模块的打包以及构建和部署,实现一键式体验。

部署 MySQL

zyplayer-doc 需要使用 MySQL 服务,可以通过 Rainbond 开源应用商店快速部署 MySQL。

在 Rainbond 的 平台管理 -> 应用市场 -> 开源应用商店 中搜索 并安装,可选择安装 或 版本。

Goland激活2023.1.1(GoLand 2023.1 发布)

源码部署 zyplayer-doc

修改 配置文件,连接信息可在 MySQL 组件中的依赖信息查看。


进入到团队/应用内,选择通过源码创建组件。

  • 组件名称、组件英文名称均自定义即可。
  • 仓库地址:https://gitee.com/dromara/zyplayer-doc
  • 代码分支:master

Goland激活2023.1.1(GoLand 2023.1 发布)

然后 Rainbond 会检测出来为多模块项目,选择 并进行构建,其他模块都是依赖项,是不可运行的。

Goland激活2023.1.1(GoLand 2023.1 发布)

编排服务

在应用内 -> 切换到编排模式,将 zyplayer 组件依赖至 MySQL 组件,这样 MySQL 组件会将自身的环境变量注入到 zyplayer 中,zyplayer 组件就可以通过配置文件中的环境变量连接到 MySQL 数据库。

Goland激活2023.1.1(GoLand 2023.1 发布)

然后更新 zyplayer 组件即可。

最后通过 Rainbond 默认提供的域名访问 ,访问需要加后缀 ,如:,默认用户密码 zyplayer/

背景

Mooncake是得物API一站式协作平台。从2022年3月份开始负责Mooncake,到现在已经一年了,回顾这一年,Mooncake大的阶段上,总共经历过两个版本:

1、Mooncake 1.0: 面向前端和客户端的mock平台,主要解决接口调用者的数据mock问题

2、Mooncake 2.0: 面向前后端的,融合了yapi和mock的一站式文档管理平台,从供需两端解决接口文档的流通效率问题

升级后的Mooncake产品架构如下:

641.png

如上图所示,我们希望Mooncake是得物研发生态系统中的重要一环,为了实现这个目标,Mooncake不断推陈出新,发布了许多重要功能,例如支持染色环境调试、业务迭代信息报表、支持Dubbo协议的mock等;打通了RDC、EP、CMDB、网关等平台。此外,Mooncake还提供了openAPI,向外生长,支持EP、DOP、APM等平台,让开发同学在研发的各个阶段都能方便的通过文档进行顺畅的交流。

在这个过程当中,Mooncake具体做了什么,又为什么这么做,做了之后有什么用,针对这几个问题我简单的说一下我自己的思考。

一切过往 皆为序章

2002年贝索斯曾经给亚马逊颁布了一份mandate,这份指令是这样的:

从今天起,所有的团队都要以服务接口的方式,提供数据和各种功能。

团队之间必须通过接口来通信。

不允许任何其他形式的互操作:不允许直接链接,不允许直接读其他团队的数据,不允许共享内存,不允许任何形式的后门。

唯一许可的通信方式,就是通过网络调用服务。

具体的实现技术不做规定,HTTP、Corba、PubSub、自定义协议皆可。

所有的服务接口,必须从一开始就以可以公开作为设计导向,没有例外。这就是说,在设计接口的时候,就默认这个接口可以对外部人员开放,没有讨价还价的余地。

不遵守上面规定者,一律开除。

谢谢;祝你过得愉快!

这份指令的出发点是,贝索斯认为人际沟通往往会造成组织执行不力,而他解决这个问题的方式,就是通过API,系统性的规范组织间的对话。 这个其实在当下很普遍的微服务架构之下,已经不是什么新鲜事了,还有我们大量使用三方开放API,这些都是通过API来完成系统间的调用;

但是在当时,如何让人们接受这个方案,积极的参与进来,同时也预防API泛滥,是个很大的问题。为此贝索斯建立了一套指标体系,通过激励最终形成一套正向的持续演进和迭代循环。

这套指标体系,我们可以理解为是一种公司或者组织层面的基建。

1934年,美国经济大萧条时期,罗斯福解决经济危机的两大新政之一的以工代赈,通过大兴基建的方式,刺激消费与生产均衡。

为什么罗斯福选择通过基建的方式来提振经济,其原因跟贝索斯这套指标体系是一样的原因。在兰小欢《置身事内:中国政府与经济发展》一书中提到,基建有三个特点:

1、扩展公共服务的规模 产生规模效益

2、提高信息沟通效率 降低信息复杂性

3、增强各方对资源的竞争 产生激励

由此可见,基建是可以降本增效,并且帮助组织形成一个正向的循环。

2022年3月份之前,得物通过Yapi平台,沉淀的HTTP接口有数万个,这是过去七年间得物自然增长的API数量,这已经是一个很庞大的数字,但是在这些http接口背后,还有数量更加庞大的rpc接口散落在语雀、飞书,更有大量的接口没有文档沉淀,在历史中默默发挥着余热。

那么如何让文档规范起来,如何让更多的开发同学把接口统一起来,如何让数量庞大的接口文档发挥更大的价值,Mooncake从三个方面提供服务做了一次升级:

1、从单一mock服务升级为围绕接口文档的一站式协作平台,用户从前端和客户端扩展到服务端、测试、前端、客户端

2、围绕接口研发生命周期,通过插件、飞书消息、一键mock、一键配置网关等一系列工具,提高信息沟通效率,降低前后端沟通复杂度

3、关联rdc提供迭代和团队两个维度的数据看板,通过文档质量分统计来刺激内部竞争,进而推动产出更高效的文档

接下来我从设计和技术两个层面简单回顾一下Mooncake这次升级都是如何做的。

Mooncake的设计理念

Mooncake的升级,我们遵循了尼尔森的十大设计理念:

1、系统可⻅性原则

系统要在适当的时间内给予用户恰当的反馈,始终让用户知道当前正在发生什么。 ——尼尔森

可以理解为包括⽤户在⻚⾯上的任何操作,系统需要给出相应的反馈,来确保⽤户在操作过程中的状态可⻅、变化可⻅、内容可⻅,从⽽帮助⽤户将交互引导到正确的⽅向,⽽不会浪费精⼒。 Mooncake通过按钮、消息提示的即时反馈,来响应用户的操作:

image.png 642.png

2、贴近场景原则

系统要使用用户的语言,用户熟悉的单词、短语和概念,而不是系统术语。遵循现实世界的约定,使信息以自然和合乎逻辑的顺序出现。 ——尼尔森

⽤户会习惯⽤现实世界中已有认知来看待问题,这个已有认知是⽤户根据⾃⼰掌握的经验、知识和想象所建⽴的⼼智模型。 Mooncake这次升级,融合了Yapi和Mock,除了技术底层在数据上的融合,交互上,也尽可能的保留了原有的交互习惯,比如通过idea上传文档的习惯,比如按照文档、编辑、运行、类型声明去组织页面tab:

643.png

3、可控性原则

当用户错误地选择了的某个功能后,系统需要提供一个明确的「紧急出口」,来让用户离开其不想要的状态,而且无需额外的对话框,支持撤销和重做。 ——尼尔森

Mooncake里,通过多tab的形式,方便用户打开多个接口文档,而无需频繁的刷新页面:

644.png

4、一致性原则

我们不应当让用户去怀疑不同的语句、状态或操作是否在表达同一件事,设计需遵循平台的惯例。 ——尼尔森

⼀致性可以给⽤户统⼀的认知,帮助⽤户快速学习、记忆和熟悉产品的功能,从⽽建⽴⽤户稳定的⼼智模型。为了保障产品间的⽤户体验统⼀,通常都需要建⽴设计规范,来确保产品内部的⼀致性,这里的⼀致性包括视觉⼀致性、⾏为⼀致性和感知⼀致性。 Mooncake这次升级,字体、颜色、尺寸布局、组件库都遵循了得物设计体系规范:

645.png

5、错误预防原则

比报错提示更好的方法是,通过严谨的设计来防止错误的发生:要么消除容易出错的情况,要么把这些容易出错的情况找出来,并在用户采取行动之前提供确认选项。 ——尼尔森

当操作不可逆时,给予⽤户⼆次确认的机会,避免⽤户由于误操作造成的后果:

646.png

6、系统识别胜过记忆

通过将对象、操作和选项进行可视化,最大限度地减轻用户的记忆负担,用户不需要记住对话框中某一部分到另一部分的信息,系统操作的指示信息需要易于被用户发现和获取。 ——尼尔森

⽤户是不可能记住操作过程中的过多信息的,Mooncake提供了我的收藏和最近访问帮助同学们快速找到自己常用的项目文档:

647.png

7、使用的灵活性和效率

一些快捷操作的功能,虽然会被新手用户忽略,但可能为专家用户所使用并帮助提升其使用效率,因此,系统需要同时满足新手用户和专家用户的需求,允许用户频繁地操作。 ——尼尔森

这⼀点其实是在B端产品设计中⽐较容易忽视的⼀个原则,我们往往默认使⽤产品的是相对成熟的产品使⽤者。 Mooncake的菜单栏提供折叠和展开两种模式,并且会记住用户上次的选择,对于新同学,默认展开菜单,方便了解平台的功能;对于已经熟悉Mooncake 的同学可以收起菜单,文档的可视区域最大化,方便阅读:

649.png

8、美观和简约设计

对话框中不应包含无关或很少用到的信息,在对话框中每增加一个信息,就意味着降低了主要信息的相对可见性。 ——尼尔森

Mooncake的对话框,都尽可能的降低复杂度,一次只做一件事情,一次只搜集最重要的数据,并且尽可能的提供下拉选框减少用户输入:

650.png

9、帮助⽤户发现、判断和修复错误

报错信息应该用通俗易懂的语言表达,而不是用代码,准确地反应问题,并且提出可行的解决方案。 ——尼尔森

651.png

10、人性化帮助原则

帮助文档的信息应该易于被搜索,聚焦于用户的任务,并列出具体的步骤,而且,不能太庞大。 ——尼尔森

Mooncake提供全局搜索、一键进飞书答疑群、自助帮助文档帮助同学快速的找到文档,定位问题:

652.png

Mooncake的技术架构

653.png

在这次升级之前,我们调研了一些业界关于API管理的实践,总的来说包含两大块内容:工具和平台。

4.1 工具向左

工具是轮子,解决当下的问题,是生产力工具;

Mooncake 提供了一系列工具:

1、针对java开发的IDEA插件,针对golang开发的CLI工具,帮助开发同学快速的上传文档

2、覆盖 webpack、vite以及浏览器的代理插件,帮助前端同学方便的实现数据mock

3、覆盖iOS和android的客户端代理工具,帮助客户端同学mock数据

4、覆盖前端和客户端的抓包工具,用来快速的生成mock数据

4.2 平台向右

平台的作用就是,通过一系列的资源整合,让平台内的资源互相作用,不断的磨合,创造出新的生产力工具。

在Mooncake平台化的过程中,遵循了两个原则:

第一是多多维。这个概念来自穷查理宝典,Mooncake 融合打通了EP、CMDB、RDC、网关等平台,最大限度的发挥文档的价值,也最大限度的降低研发同学在API沟通上的成本。

第二分而治之,各个击破。架构本身是解决问题的过程,问题太复杂了,只能采用分而治之的办法。

怎么分?利用金字塔原理,同时在数据化上做思考,之后按照架构主题做拆分。Mooncake平台分为文档、用例、Mock三大块,围绕这三大块进行升级和优化。同时按照组织架构和迭代,进行数据统计和分析,提供各种指标帮助研发同学衡量项目的文档质量。

怎么击破?Mooncake采用了分层架构,优先解决文档的问题,围绕文档做深度;在解决了文档问题之后,在文档上下游和用例上持续迭代优化,通过openAPI的方式拓宽平台广度。

Mooncake的未来

如果说Mooncake 1.0是青铜时代,2.0是白银时代,那么接下来一定是Mooncake的黄金时代。

5.1 青铜时代

1.0的Mooncake 覆盖了得物前端平台所有用户,以及接近50%的客户端用户。

5.2 白银时代

2.0时代的Mooncake融合了yapi+mock,同时打通rdc、EP、网关平台等平台,在研发流程的各个阶段提供接口文档服务,共沉淀了数万接口,覆盖了得物技术部90%的研发同学,平台的NPS也一度达到57%。

5.3 黄金时代

目前的API建设、平台研发都还有很多问题:

1、在进度压力下,一些因为侥幸心理而遗留的技术债,比如网关环境和项目环境的切换,比如swagger定时扫描等等

2、一些屈从于短期目标的方案,比如简单版本的diff功能,比如简单版本的文档迁移功能等等

3、一些因为路径过长而放弃的远大目标,比如dubbo的调试,比如文档驱动开发等等

未来Mooncake还可以做很多,关于API体系建设、关于平台化、关于开放,Mooncake将不断推进产品和技术的创新和升级,为技术部的小伙伴提供更好的产品和服务。

本文源自得物技术官网:tech.dewu.com

API鉴权是保证API安全性和可用性的一项重要措施。通过API鉴权,系统可以对用户或者应用进行有效的身份认证和权限管理。

 

更新了什么

 
除了我们之前更新的
Basic Auth 鉴权插件,这次给大家带来
JWT 鉴权插件
 
JSON Web Token是一种开放标准,可以让服务器生成一个密钥签名的Token,该Token包含用户、其角色和过期时间等信息。JWT Token会发送回客户端,然后传递到后续的API请求中,以对接下来的操作进行认证和授权。

 

如何使用

在插件市场中找到 JWT 插件,安装

Goland激活2023.1.1(GoLand 2023.1 发布)

安装插件后,测试页面选中鉴权,填入数据后会自动在请求信息中添加头部 。

Goland激活2023.1.1(GoLand 2023.1 发布)

 

JWT 说明

 
包括:
 
头部
 
Payload
 
WT 规定了 7 个默认字段供开发者选用。
  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众,相当于接受者
  • nbf (Not Before):生效的起始时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号,唯一标识
签名 Signature
对于每种加密算法,签名都对应的一个计算公式。例如 SHA256 加密算法的签名如下:
 
 
后续我们还会继续更新其他鉴权插件,欢迎关注!
 
这个项目是开源的,感兴趣的话可以给项目 Star 和 fork 一下
 
Github:
https://github.com/Postcatlab/postcat
Gitee:
https://gitee.com/eolink_admin/postcat

 

关于 Postcat

Postcat 是开源的 API 管理工具,有 API 相关的核心功能,还有丰富的插件广场,帮你快速地完成 API 的发布和测试功能。
 
核心功能:
  1. API
    文档管理,可视化 API 设计,生成 API 文档
  2. API
    测试, 自动生成测试参数,自动生成测试用例,可视化数据编辑
  3. Mock,根据文档自动生成 Mock,或创建自定义 Mock 满足复杂场景
  4. 插件拓展,众多插件扩展产品功能,打造属于你和团队的 API 开发平台
  5. 团队协作,既能实现API 分享也能可以创建云空间共同协作
 
 
突出亮点:
  1. 免登录即可测试,省去繁琐的验证登录的操作
  2. 界面简洁,没有冗余的功能与复杂选项
  3. 开源,免费,适合个人以及小团队使用
  4. 丰富的插件,支持数据迁移、主题、API 安全等高达 22 款插件
  5. 国产,能更好的理解国内用户的需求,沟通无障碍
  6. 完善的用户文档,跟着操作就能快速上手

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

项目介绍

        项目地址:https://gitee.com/bootx/bootx-platform,非常欢迎看看项目介绍留以及个Star呀🤺🤺🤺

    基于Spring Boot框架生态打造,针对单体式应用进行专门设计,同时做好模块切分,兼顾快速适应分布式改造,其设计准则是切分功能,划分模块,不同模块之间间可能减少耦合,更好的适应实际中各类不同项目开发时的侧重点。设计目标是将日常项目开发中,尤其是中小型项目中的一些高频诉求进行覆盖,还有一些主流业务场景进行实现,对这些高频但并不高大上的需要进行解决。同时核心源码和文档开源,不需要进行额外操作就可以直接获取源码和文档,以及查看演示环境。

应用场景

    适用于一些中小型项目开发中,内含各类开箱即用的组件,以及对一些常见领域提供一些默认的解决方式,供应商关系管理、合同管理、人力资源管理、项目管理、资产管理、订单管理、电商商城等领域;相较于一些使用广泛的开源版本平台,对其一些不包含在开源版的付费功能进行了开源实现,适合一些较低预算,或是Demo验证开发等无法有充足资金购买商业版软件的场合使用。

项目构成

  1. 后端:bootx-platform,基于Spring Boot 相关生态技术栈进行开发

  2. 前端(Vue2):bootx-platform-ui, 基于Vue2版本的Antd Pro Vue进行开发

  3. 前端(Vue3):bootx-platform-vue3,基于Vue3版本的Vben-Admin进行开发

  4. 可视化大屏:bootx / bootx-platform-visualization,基于Go-VIew进行二次开发

  5. 小程序端:bootx-platform-mobile,基于京东Taro、NutUI技术生态进行开发

本次功能更新

项目主要更新

  • 新增: 预定义SQL查询管理
  • 新增: 动态数据源管理
  • 优化: PlumeLog日志删除定时任务重写
  • 优化: sa-token适配1.34.0版本
  • 优化: 工作流Flowable更新到6.8.0版本
  • 优化: 升级spring boot 2.7.10, 解决漏洞问题
  • 优化: 升级spring-javaformat插件版本, 优化链式调用时的格式化
  • 优化: 微信公众平台消息处理模块优化
  • 优化: 新增函数工具类
  • fix: 解决修改密码时传入错误原密码可以修改密码的问题
  • fix: 字典编辑问题

Vue3更新

  • 新增: Vue3版本流程设计器流程图绘制编辑界面移植完成
  • 新增: 多数据源管理
  • 新增: 微信公众号扫码登录功能
  • 优化: 调整各种定时任务的实现为vueuse
  • fix: 字典编辑问题

Vue2更新

  • 新增: 多数据源管理
  • 优化: 流程设计区代码结构
  • 优化: 工作流页面调整
  • fix: 字典编辑问题

创新谷站

经过工研院1.1.x十余个版本的迭代,基础的功能和框架结构基本上是完成了,下一步就是要对更能进行丰富,增加一些特色实用的功能,所以在新年伊始,Bootx-Platform正式步入了1.2.x的时代,创新谷站作为1号线乃至济南地铁的第二站,作为对应的版本代号,正好标志着后续的工作计划需要是创新,只有创新才能与其他脚手架做出差异化。

创新谷站墙面细节装饰、地面提示语等,采用了“经典繁方篆”字体,充满了美感与文化气息~

Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)

功能介绍

微信自定义菜单

对微信菜单配置的接口进行的可视化实现,通过配置可以使被管理的公众号菜单发生相应的变化

微信自定义菜单

支付结算台

提供支付宝、微信、聚合支付等支付方式的演示示例

简单支付

工作流

基于Bpmn.js开发的流程设计器,相对于Flowable原生设计器更加美观易用

工作流

超级查询器

通过一个查询配置的json,可以自动生成前端超级查询器,能够实现多条件、多级嵌套的操作

输入图片说明

日志收集

分别整合ELK和PlumeLog Lite,前者作为主流日志管理解决方案,后者作为轻量级日志框架,可适应不同的项目需求

输入图片说明

输入图片说明

 
 

 

 

此版本着重更新了前端,由更换到自研的,使用了最新的技术栈,UI库更换为了Arco Design
着重设计了两个组件。在php与vue里使用前后端分离的,是第一个使用配置化开发CRUD的开源后台系统
我们没有选择php与vue耦合过深的开发方式,作为绝对的前后端分离,对于单纯使用前端去适配别的语言也更容易。

 

更新说明

1.1.0 已经适配Hyperf3.0,要求最低版本PHP8.0(跟之前一样),同时支持8.1和8.2版本
更新代码后,需要执行  即可升级hyperf到3.0

更新日志

[fix] 修复代码生成一些配置无效问题
[fix] 修复代码生成器缺失生成导入和导出
[fix] 修复修改配置数据报错异常
[fix] 修复phpoffice驱动设置宽度无效和报数组未定义问题
[fix] 修复代码生成器生成日期时间组件某些选项无效的问题
[fix] 修复代码生成器配置显示组件无效问题
[fix] 修复代码生成器生成删除接口拼写错误
[fix] 修复代码生成器未勾选必填项无效问题
[fix] 修复缓存监控和在线用户权限标识代码问题
[fix] 修复生成控制器注释生成错误
[fix] 修复代码生成器生成日期时间组件为范围选择的时候无效问题
[fix] 修复生成控制器生成用户选择器组件名字拼写错误
[fix] 修复记录删除定时任务日志时,业务名称为未定义菜单问题
[fix] 优化删除附件逻辑,改为删除附件时判断附件当时使用的存储方式。感谢@maimake贡献的代码
[fix] 修复服务监控某些情况下可能出现变量未定义
[fix] 修复优化Mine.php造成获取模块地址出错
[fix] 修复代码生成器生成密码组件formType属性错误问题
[fix] 修复之前改表字段名导致选择上传存储模式失效问题
[fix] 修复上传功能找不到配置项问题
[fix] 修复类型不匹配导致选择文件存储类型失败
[fix] 修复之前改表字段名导致选择上传存储模式失效问题
[fix] 修复获取当前用户部门id返回值类型不对问题
[fix] 修复本部门和子部门数据权限bug以及获取部门树数据非顶级不显示bug
[fix] 修复 DemoApi.php 调用函数名称拼写错误问
[fix] 修复saveAspect在定时任务下,无法获取头信息导致任务执行失败
[fix] 修复数据权限本部门及子部门使用like查询的问题
[fix] 配置保存报类型错误的问题
[fix] 修复用户选择多部门后可能出现的请求超时

[refactor] 导出excel添加参数
[refactor] 更新所有权限注解的权限代码,以适配菜单只勾选父级菜单
[refactor] 更新docker-composer
[refactor] 代码生成器控制器生成列表添加父级权限
[refactor] 公共控制器增加登录和操作日志方法
[refactor] vue生成模板更新
[refactor] 优化Mine.php、MineController.php,删除$this->app()方法,内部调用改用container()函数
[refactor] 升级依赖
[refactor] 优化获取缓存前缀赋予null默认值
[refactor] 优化API返回数据类型格式,由自己控制
[refactor] 优化清空缓存
[refactor] 升级依赖
[refactor] 新增和保存切面优化
[refactor] 优化服务监控报错则返回无法获取信息
[refactor] 优化表迁移创建结构
[refactor] 配置值适配最新的ma-form组件props
[refactor] 设置菜单权限获取数据逻辑变更,只能看到自己有权限的菜单
[refactor] 优化更新获取模块名称大小写逻辑
[refactor] 代码生成器优化 1.无操作选项时生成代码隐藏操作列 2.去掉菜单配置必须选择限制

[feat] 公共控制器增加登录和操作日志方法
[feat] 新增用户添加和删除事件
[feat] 新增用户删除监听,删除用户同时让当前活跃用户状态失效
[feat] 代码生成器新增排序选项
[feat] 新增通过文件id或hash获取文件信息接口
[feat] 增强DTO导出注解,支持字典翻译功能
[feat] 用户改为多部门,部门新增设置领导。PS:使用 php bin/hyperf.php mine:update 升级数据库

 

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

2023年4月11日,国家互联网信息办公室发布《生成式人工智能服务管理办法(征求意见稿)》。办法指出,国家支持人工智能算法、框架等基础技术的自主创新、推广应用、国际合作,鼓励优先采用安全可信的软件、工具、计算和数据资源;利用生成式人工智能产品向公众提供服务前,应当向国家网信部门申报安全评估,并履行算法备案和变更、注销备案手续

Goland激活2023.1.1(GoLand 2023.1 发布)

生成式人工智能服务管理办法

(征求意见稿)

第一条 为促进生成式人工智能健康发展和规范应用,根据《中华人民共和国网络安全法》《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》等法律、行政法规,制定本办法。

第二条 研发、利用生成式人工智能产品,面向中华人民共和国境内公众提供服务的,适用本办法。

本办法所称生成式人工智能,是指基于算法、模型、规则生成文本、图片、声音、视频、代码等内容的技术。

第三条 国家支持人工智能算法、框架等基础技术的自主创新、推广应用、国际合作,鼓励优先采用安全可信的软件、工具、计算和数据资源。

第四条 提供生成式人工智能产品或服务应当遵守法律法规的要求,尊重社会公德、公序良俗,符合以下要求:

(一)利用生成式人工智能生成的内容应当体现社会主义核心价值观,不得含有颠覆国家政权、推翻社会主义制度,煽动分裂国家、破坏国家统一,宣扬恐怖主义、极端主义,宣扬民族仇恨、民族歧视,暴力、淫秽色情信息,虚假信息,以及可能扰乱经济秩序和社会秩序的内容。

(二)在算法设计、训练数据选择、模型生成和优化、提供服务等过程中,采取措施防止出现种族、民族、信仰、国别、地域、性别、年龄、职业等歧视。

(三)尊重知识产权、商业道德,不得利用算法、数据、平台等优势实施不公平竞争。

(四)利用生成式人工智能生成的内容应当真实准确,采取措施防止生成虚假信息。

(五)尊重他人合法利益,防止伤害他人身心健康,损害肖像权、名誉权和个人隐私,侵犯知识产权。禁止非法获取、披露、利用个人信息和隐私、商业秘密。

第五条 利用生成式人工智能产品提供聊天和文本、图像、声音生成等服务的组织和个人(以下称“提供者”),包括通过提供可编程接口等方式支持他人自行生成文本、图像、声音等,承担该产品生成内容生产者的责任;涉及个人信息的,承担个人信息处理者的法定责任,履行个人信息保护义务。

第六条 利用生成式人工智能产品向公众提供服务前,应当按照《具有舆论属性或社会动员能力的互联网信息服务安全评估规定》向国家网信部门申报安全评估,并按照《互联网信息服务算法推荐管理规定》履行算法备案和变更、注销备案手续。

第七条 提供者应当对生成式人工智能产品的预训练数据、优化训练数据来源的合法性负责。

用于生成式人工智能产品的预训练、优化训练数据,应满足以下要求:

(一)符合《中华人民共和国网络安全法》等法律法规的要求;

(二)不含有侵犯知识产权的内容;

(三)数据包含个人信息的,应当征得个人信息主体同意或者符合法律、行政法规规定的其他情形;

(四)能够保证数据的真实性、准确性、客观性、多样性;

(五)国家网信部门关于生成式人工智能服务的其他监管要求。

第八条 生成式人工智能产品研制中采用人工标注时,提供者应当制定符合本办法要求,清晰、具体、可操作的标注规则,对标注人员进行必要培训,抽样核验标注内容的正确性。

第九条 提供生成式人工智能服务应当按照《中华人民共和国网络安全法》规定,要求用户提供真实身份信息。

第十条 提供者应当明确并公开其服务的适用人群、场合、用途,采取适当措施防范用户过分依赖或沉迷生成内容。

第十一条 提供者在提供服务过程中,对用户的输入信息和使用记录承担保护义务。不得非法留存能够推断出用户身份的输入信息,不得根据用户输入信息和使用情况进行画像,不得向他人提供用户输入信息。法律法规另有规定的,从其规定。

第十二条 提供者不得根据用户的种族、国别、性别等进行带有歧视性的内容生成。

第十三条 提供者应当建立用户投诉接收处理机制,及时处置个人关于更正、删除、屏蔽其个人信息的请求;发现、知悉生成的文本、图片、声音、视频等侵害他人肖像权、名誉权、个人隐私、商业秘密,或者不符合本办法要求时,应当采取措施,停止生成,防止危害持续。

第十四条 提供者应当在生命周期内,提供安全、稳健、持续的服务,保障用户正常使用。

第十五条 对于运行中发现、用户举报的不符合本办法要求的生成内容,除采取内容过滤等措施外,应在3个月内通过模型优化训练等方式防止再次生成。

第十六条 提供者应当按照《互联网信息服务深度合成管理规定》对生成的图片、视频等内容进行标识。

第十七条 提供者应当根据国家网信部门和有关主管部门的要求,提供可以影响用户信任、选择的必要信息,包括预训练和优化训练数据的来源、规模、类型、质量等描述,人工标注规则,人工标注数据的规模和类型,基础算法和技术体系等。

第十八条 提供者应当指导用户科学认识和理性使用生成式人工智能生成的内容,不利用生成内容损害他人形象、名誉以及其他合法权益,不进行商业炒作、不正当营销。

用户发现生成内容不符合本办法要求时,有权向网信部门或者有关主管部门举报。

第十九条 提供者发现用户利用生成式人工智能产品过程中违反法律法规,违背商业道德、社会公德行为时,包括从事网络炒作、恶意发帖跟评、制造垃圾邮件、编写恶意软件,实施不正当的商业营销等,应当暂停或者终止服务。

第二十条 提供者违反本办法规定的,由网信部门和有关主管部门按照《中华人民共和国网络安全法》《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》等法律、行政法规的规定予以处罚。

法律、行政法规没有规定的,由网信部门和有关主管部门依据职责给予警告、通报批评,责令限期改正;拒不改正或者情节严重的,责令暂停或者终止其利用生成式人工智能提供服务,并处一万以上十万以下罚款。构成违反治安管理行为的,依法给予治安管理处罚;构成犯罪的,依法追究刑事责任。

第二十一条 本办法自2023年 月 日起实施。

近日,深圳大普微电子科技有限公司(以下简称大普微)与阿里云PolarDB 开源数据库社区展开产品集成认证。测试结果表明,大普微旗下DapuStor PCle4.0 嵘神系列 企业级SSD与阿里云以下产品:阿里云PolarDB数据库管理软件、阿里云PolarDB-X云原生分布式数据库管理软件,完全满足产品兼容认证要求,兼容性良好,系统运行稳定。

Goland激活2023.1.1(GoLand 2023.1 发布)

关于PolarDB

PolarDB是阿里云自主研发的新一代云原生数据库,既拥有分布式设计的低成本优势,又具有集中式的易用性。

数年来,阿里云针对 PolarDB 进行了诸多创新,通过采用存储计算分离、软硬一体化设计,PolarDB 实现成本仅为传统商业数据库的十分之一。所实现的计算、内存与存储资源的“三层解耦”架构、多主多写、基于IMCI(内存列存索引)的 HTAP、Serverless 等功能已是全球首创或业内领先的技术。从 PolarDB 发布以来,它在技术和商业化上都获得了迅猛发展,如今已经成为阿里云数据库产品家族中最闪耀的产品。2021年,阿里云正式开源PolarDB,将PolarDB PostgreSQL 版(简称 PolarDB-PG )和 PolarDB分布式版(简称 PolarDB-X )进行了全内核开源,与社区一起共建云原生分布式数据库生态。

DapuStor企业级PCIe 4.0嵘神系列

嵘神5 R5100 、 R5300 、 R5101 及 R5301 是DapuStor推出的新一代NVMe PCIe4.0企业级SSD系列产品,基于DapuStor自研控制器DP600和固件,搭载KIOXIA 112层3D Enterprise TLC NAND, 且支持Flash Raid 2.0技术,可容忍更多flash die失效并不影响业务及性能。对比Gen3性能翻倍且向下兼容,覆盖2T、4T、8T、16T多种容量,支持固件在线升级业务不中断。

嵘神5系列产品还拥有增强型掉电保护技术、端到端数据保护、Multi namespace 、VSS、NVMe MI、9级可调功耗等高级企业级特性,凭借高可靠、高性能、低延时等优势,产品适用于不同的业务场景对新一代闪存存储产品的严格要求。

经过严格测试,双方产品完全兼容,整体运行稳定,在功能、性能及兼容性方面表现良好。

完成兼容性认证后,通过双方的交流合作和资源共享,大普微将充分发挥在企业级SSD存储方面从主控芯片、固件、算法等关键技术研发方面的创新优势,与阿里云PolarDB开源社区一起共建数据库生态,共同推动企业级数据中心存储技术的进步,不断创新产品和服务,为千行百业数字化转型提供更加高效和智能化的解决方案。

 

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

v2.7.2
changelog:

修复并发数问题
新增HMAC加密函数
新增IP黑白名单插件

Fix concurrent counter issue
Add HMAC encryption functions
Add IP blacklist/whitelist plugin

Fizz Gateway是什么?

An Aggregation API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务聚合网关,是拥有自主知识产权的应用网关国产化替代方案,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理、回调管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。

演示环境(Demo)

http://demo.fizzgate.com/

账号/密码:/

健康检查地址:http://demo.fizzgate.com/admin/health (线上版本请限制admin路径的外网访问)

API地址:http://demo.fizzgate.com/proxy/[服务名]/[API_Path]

Fizz的设计

Goland激活2023.1.1(GoLand 2023.1 发布)

Fizz典型应用场景

Goland激活2023.1.1(GoLand 2023.1 发布)

产品特性

  • 应用管理:支持对接入的应用进行管理;
  • API管理:支持API定义后端服务的配置;
  • 分组管理:支持通过分组管理实现同一分组的API使用相关的配置;
  • 服务鉴权:通过插件可对服务进行应用访问权限、检验等链式的拦截策略;
  • 集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。
  • 安全授权:支持内置的key-auth, JWT, basic-auth授权方式,并且可以方便控制。
  • 服务编排:支持HTTP、Dubbo、gRPC、Soap协议热服务编排能力,支持前后端编码,支持JSON/XML输出,随时随地更新API。
  • 负载均衡:支持round-robin负载均衡。
  • 策略熔断:根据服务或者具体地址进行多种恢复策略熔断配置。
  • 多注册中心:支持从Eureka或Nacos注册中心进行服务发现。
  • 配置中心:支持接入apollo配置中心。
  • HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。
  • 访问策略:支持不同策略访问不同的API、配置不同的鉴权等。
  • 黑白名单:支持配置通过绑定黑、白名单限制访问。
  • 自定义插件:强大的插件机制支持自由扩展。
  • 可扩展:简单易用的插件机制方便扩展功能。
  • 高性能:性能在众多网关之中表现优异。
  • 版本控制:支持操作的发布和多次回滚。
  • 管理后台:通过管理后台界面对网关集群进行各项配置。
  • 回调管理:支持回调的管理、订阅、重放、以及日志。
  • 多级限流:细颗粒度的限流方式包含服务限流,接口限流,APP_ID限流,IP限流。
  • 微服务文档:企业级管理开放微服务文档管理,系统集成更方便。
  • 公网专线:建立公网中受到完全保护的私有连接通道。

基准测试

我们将Fizz与市面上主要的网关产品进行比较,使用相同的环境和条件,测试对象均为单个节点。Mock接口模拟20ms时延,报文大小约2K。

  • Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz * 4
  • Linux version 3.10.0-957.21.3.el7.x86_64
  • 8G RAM
分类 产品 600并发

QPS 600并发

90% Latency(ms) 1000并发

QPS 1000并发

90% Latency(ms) 后端服务 直接访问后端服务 23540 32.19 27325 52.09 流量网关 kong

v2.4.1 15662 50.87 17152 84.3 应用网关 fizz-gateway-community

v2.0.0 12206 65.76 12766 100.34 应用网关 spring-cloud-gateway

v2.2.9 11323 68.57 10472 127.59 应用网关 shenyu

v2.3.0 9284 92.98 9939 148.61

版本对照

  • Fizz-gateway-community: 社区版

  • Fizz-manager-professional:管理后台专业版(服务端)

  • Fizz-admin-professional:管理后台专业版(前端)

Fizz-gateway-community Fizz-manager-professional Fizz-admin-professional v1.0.0 v1.0.0 v1.0.0 v1.1.0 v1.1.0 v1.1.0 v1.1.1 v1.1.1 v1.1.1 v1.2.0 v1.2.0 v1.2.0

从v1.3.0开始管理后台的前端和服务端合并成一个包

  • Fizz-gateway-community: 社区版

  • Fizz-manager-professional:管理后台

Fizz-gateway-community Fizz-manager-professional v1.3.0 v1.3.0 … … v2.6.6 v2.6.6 v2.7.0 v2.7.0 v2.7.1 v2.7.1 v2.7.2 v2.7.2

请根据社区版的版本下载对应的管理后台版本

 

Dante Cloud 是一款企业级微服务架构和服务能力开发平台,是采用领域驱动设计(DDD)的、全面拥抱 Spring Authorization Server 的、基于 OAuth2.1 协议的微服务架构。基于 Spring Authorization Server 1.1.0-M2、Spring Boot 3.0.5、Spring Cloud 2022.0.2、Spring Cloud Tencent 1.103-2022.0.1、Spring Cloud Alibaba 2022.0.0.0-RC1、Nacos 2.2.2 等主流技术栈开发的多租户系统,遵循 SpringBoot 编程思想,高度模块化和可配置化。具备服务发现、配置、熔断、限流、降级、监控、多级缓存、分布式事务、工作流等功能

平台定位

  • 构建成熟的、完善的、全面的,基于 OAuth2.1 的、前后端分离的微服务架构解决方案。
  • 面向企业级应用和互联网应用设计开发,既兼顾传统项目的微服务化,又满足互联网应用开发建设、快速迭代的使用需求。
  • 平台架构使用微服务领域及周边相关的各类新兴技术或主流技术进行建设,是帮助快速跨越架构技术选型、研究探索阶段的利器。
  • 代码简洁规范、结构合理清晰,是新技术开发应用的典型的、综合性案例,助力开发人员对新兴技术的学习和掌握。

发布背景

自11月24日,Spring Boot 3.0 以及 Spring Cloud 2022.0.0、Spring Cloud Tencent 1.8.2-2022.0.0 等全新版本发布,整个Java 社区也步入的 Java 17 和 Spring Boot 3 的新时代。紧跟 Java 技术和 Spring 社区的发展,让更多质量更好、性能更优的新特性服务于实际的开发工作,Dante Cloud 也同步进行升级及适配,开发了全新的 3.0 版本。

[1] 本次更新内容

  • 主要更新
    • [升级] Nacos 版本升级至 2.2.2
    • [升级] Spring Cloud Tencent 版本升级至 1.10.3-2022.0.1
  • 其它更新
    • [新增] 优化简单数据审计内容,新增实时数据审计、数据的变更记录、查看特定历史数据等数据审计功能
    • [新增] 新增MongoDB 基础 Entity、Repository、Service、Controller 和 MybatisPlus 基础 Controller,方便业务接口代码编写。
    • [修复] 收DeviceController类的success()方法影响,导致授权码模式页面跳转错误问题。fix: #I6US82 (ISSUED by 大叔丨小巷)
    • [修复] 单位删除时增加参数接收设定 (PR by 未来)
    • [修复] 修复数据库初始化数据 sql 脚本错误
    • [修复] 修复多租户数据源租户ID异步校验不生效问题
    • [修复] 修复前端应用新建多租户页面跳转错误问题
    • [优化] 优化数据自动初始化脚本放置位置,与新版本代码创建数据表需要启动两个服务机制进行统一。
    • [优化] 设备认证授权模式激活页面调整
  • 依赖升级
    • [升级] springdoc 版本升级至 2.1.0
    • [升级] fastjson2 版本升级至 2.0.27
    • [升级] tencentcloud-sdk-java-sms 版本升级至 3.1.731
    • [升级] qiniu-java-sdk 版本升级至 7.13.0
    • [升级] alipay-sdk-java 版本升级至 4.35.101.ALL
    • [升级] aliyun-sdk-oss 版本升级至 3.16.2
    • [升级] xnio 版本升级至 3.8.9.Final

[2] Dante Cloud 3.0.0 新特性

  1. 核心基础依赖便捷切换
  • 新增 和 原生微服务全家桶等两种基础设施支持。
  • 新增 、 和 原生微服务全家桶三种基础设值切换能力,可以以相对便捷的方式切换使用 Alibaba、Tencent、Spring 等基础设施环境。可根据自身实际需求选择,不再局限于只能在某一种基础设施环境中运行。
  1. 支持 原生镜像
  • 整体调整各类模块 pom build 配置,适当增加冗余重复配置,以支持 或 编译需要。规避对所有模块进行 Native 编译,而导致错误问题。
  1. 全特性支持及扩展
  • 基于 和 实现多租户系统架构, 支持 Database 和 Schema 两种模式。
  • 基于 ,重新构建 基础数据存储代码,替代原有 JDBC 数据访问方式,破除 原有数据存储局限,扩展为更符合实际应用的方式和设计。
  • 基于 ,在 OAuth 2.1 规范基础之上,增加自定义 (密码) 认证模式,以兼容现有基于 OAuth 2 规范的、前后端分离的应用,支持 的使用。
  • 基于 ,在 OAuth 2.1 规范基础之上,增加自定义 (社会化登录) 认证模式,支持手机短信验证码、微信小程序、基于 的第三方应用登录, 支持 的使用。
  • 扩展 默认的 模式,实现真正的使用 Scope 权限对接口进行验证。 增加客户端 Scope 的权限配置功能,并与已有的用户权限体系解耦
  • 支持 认证模式
  • 在 的标准的 加密校验方式外,支持基于自定义证书的 加密校验方式,可通过配置动态修改。
  • 支持 (不透明令牌) 格式及校验方式,将低 被捕获解析的风险。可通过修改配置参数,设置默认 Token 格式是采用 格式还是 格式。
  • 全面支持 (OIDC) 协议,系统使用时可根据使用需求,通过前端开关配置,快速切换 OIDC 模式和传统 OAuth2 模式
  • 深度扩展 、、 几种模式,全面融合 、、 与现有权限体系,同时提供 和 自定义 Token 扩展两种无须二次请求的用户信息传递方式,减少用户信息的频繁请求。
  • 自定义 授权码模式登录认证页面和授权确认页面,授权码模式登录采用数据加密传输。支持多种验证码类型,暂不支持行为验证码。
  • 无须在代码中配置 权限注解以及权限方法,即可实现接口鉴权以及权限的动态修改。采用分布式鉴权方案,规避 Gateway 统一鉴权的压力以及重复鉴权问题
  • OAuth2 UserDetails 核心数据支持直连数据库获取和 Feign 远程调用两种模式。OAuth2 直连数据库模式性能更优,Feign 访问远程调用可扩展性更强。可通过配置动态修改采用策略方式。
  • 基于自定义 Session,混合国密 (非对称) 和 (对称加密) 算法,实现基于数字信封技术的秘钥动态生成加密传输。利用 “一人一码机制”,实现密码模式登录数据进行动态加密传输。配合 OAuth2 Client 验证,保护接口调用和前后端数据传输的合理性及安全性。
  1. 采用 重构前端
  • 前端工程包管理器变更为 pnpm。
  • 采用 模式对前端工程进行重构,抽取 utils、components、apis、bpmn-designer 等相关代码,形成共享模块
  • 共享模块已进行优化配置,利用 Vite 可编译成独立的组件,单独以组件形式进行发布
  • 代码以共享模块的方式进行单独维护开发,降低现有工程代码复杂度,便于后续功能的扩展和代码的复用。

[3]界面预览

Goland激活2023.1.1(GoLand 2023.1 发布)Goland激活2023.1.1(GoLand 2023.1 发布)Goland激活2023.1.1(GoLand 2023.1 发布)Goland激活2023.1.1(GoLand 2023.1 发布)

Dromara 开源社区

一、社区愿景

让每一位开源爱好者,体会到开源的快乐。

二、社区官网

https://dromara.org 是 Dromara 开源社区官方网站。

三、成员项目

Goland激活2023.1.1(GoLand 2023.1 发布)

 

JustAuth 开发者文档域名已经替换为 https://www.justauth.cn

请知悉!

 

什么是 JustAuth?

JustAuth,如你所见,它仅仅是一个第三方授权登录工具类库,它可以让我们脱离繁琐的第三方登录 SDK,让登录变得So easy!

JustAuth 集成了诸如:Github、Gitee、支付宝、新浪微博、微信、Google、Facebook、Twitter、StackOverflow等国内外数十家第三方平台。更多请参考已集成的平台

有哪些特点?

  1. :已集成十多家第三方平台(国内外常用的基本都已包含),仍然还在持续扩展中(开发计划)!
  2. :API就是奔着最简单去设计的(见后面),尽量让您用起来没有障碍感!

 

Playnite 是一个开源的电子游戏库管理器和启动器,支持大量第三方库,如 Steam、Epic、GOG、EA App、Battle.net 等。Playnite 还提供了游戏模拟器支持,为游戏提供一个统一的界面。

自 Playnite 10.10 以来的变化内容如下:

  • 使用 eMixedNite 主题时,启动时出现崩溃。
  • 通过游戏编辑对话框下载数据时,可能会出现重复现象。
  • 从游戏编辑对话框中创建新的字段不能正常工作
  • 与某些现有主题的兼容性问题
  • 过滤器预设名称的更改在重启时无法保存
  • 在 Dolphin 模拟器的任天堂 Gamecube 配置文件中添加 m3u 格式
  • 更新 PCSX2 模拟器配置文件
  • 过滤器的预设顺序在资源管理器面板上不能正确更新
  • 更好地处理 gzip ROM 文件的名称
  • 在全屏模式下,某些自定义主题出现崩溃
  • 数据下载有时在游戏编辑对话框中失败
  • 统计视图上的安装大小计算不正确
  • 主题预览在 Blend 中不工作
  • 通过库管理器编辑过滤器预设时发生崩溃
  • 在失去和重新获得窗口焦点时,”Xinput Device Support” 设置会恢复到其默认行为

更多详情可查看:https://github.com/JosefNemec/Playnite/releases/tag/10.14

Pydantic V2 首个 alpha 版本已发布。Pydantic 是 Python 语言的开源类型规范和校验库,提供了强大的数据解析和验证功能,包括运行时强制类型提示、友好的错误消息和设置管理功能等。

发布公告写道Pydantic V2 的最大变化是  ——所有验证逻辑都已用 Rust 重写并迁移至单独的 包。这项变化带来了巨大的改进:

  • 性能——Pydantic V2 比 Pydantic V1 快 5-50 倍。
  • 安全性和可维护性——此版本变更了架构,团队认为这将有助于他们维护 Pydantic V2,从长远来看,错误要少得多。

使用后,Pydantic 库中的大部分逻辑专门用于生成”pydantic core schema”——所使用的模式定义了新的高性能验证器和序列化器的行为。

其他处于实验性阶段的功能:

  • BaseModel——Pydantic V1 中的验证核心仍然存在,但使用了新的方法名称
  • 数据类——改进了 Pydantic 数据类并已准备好进行测试
  • 序列化——转储/序列化/编组更加灵活,可以进行测试
  • 严格模式 (Strict Mode)——Pydantic V2 最大的新增功能之一是严格模式,现已准备好进行测试
  • JSON Schema——生成 JSON Schema 有了很大改进,现已可以进行测试
  • 通用模型 (Generic Models)——包含重大改进
  • 递归模型——递归数据结构的验证有重大改进
  • 自定义类型——引入新的接口,可以进行测试
  • 自定义字段修饰符——通过的使用正在运行中,并在 Pydantic 本身中使用
  • 无需 BaseModel 的验证——新的类允许在不需要类的情况下进行验证
  • TypedDict——现在通过完全支持

4MLinux 是一个轻量级的 Linux 发行版,适用于 32 位和 64 位架构。它被命名为 “4MLinux”,因为它有 4 个主要的操作系统组件。

  • 维护(它可以被用作救援的 Live CD)、
  • 多媒体(对几乎所有的多媒体格式都有内置的支持)
  • Miniserver(它包括一个 64 位的服务器)
  • Mystery(一个经典的 Linux 游戏集合)。

当用该发行版安装程序时,该发行版会检索 Windows 版本,而不是 Linux 版本,因为它预装了 Wine(Windows 应用程序的兼容层),而且没有任何软件包管理器。

目前 4MLinux 42.0 稳定版发布,此版本基于 Linux 6.1 LTS 内核系列以及 Mesa 22.2.3 图形堆栈,软件包的版本更新如下:

  • 使用 LibreOffice 7.5.2 和 GNOME Office(AbiWord 3.0.5、GIMP 2.10.34、Gnumeric 1.12.55)编辑文档,
  • 使用 Firefox 111.0 和 Chromium 106.0.5249.91 上网
  • 使用 Thunderbird 102.8.0 发送电子邮件
  • 使用 Audacious 4.3 收藏音乐
  • 使用 VLC 3.0.18 和 SMPlayer 22.7.0 观看视频
  • 可畅玩由 Mesa 22.2.3 和 Wine 8.3 驱动的游戏
  • 还可以设置 4MLinux LAMP 服务器(Linux 6.1.10、Apache 2.4.56、MariaDB 10.6.12、PHP 5.6.40、PHP 7.4.33 和 PHP 8.1.17。)
  • Perl 5.36.0、Python 2.7.18、Python 3.10.8 和 Ruby 3.1.3 可用

新的主要版本还有一些新功能:

  • Krita(光栅图形编辑器)和 Hex-a-Hop(视频游戏)已添加为可下载的扩展
  • 改进了对许多图像、音频和视频格式的支持
  • AlsaPlayer、Baka MPlayer、GNOME MPlayer、GNOME MPV、mp3blaster 现在开箱即用
  • 采用著名的(但相当古老)XMMS 作为默认媒体播放器,它能够打开现代音频和视频文件(包括对 MOD 和 MIDI 音乐的支持)
  • 可以一键下载丰富的 XMMS 皮肤

更新公告:https://4mlinux-releases.blogspot.com/

Download:http://4mlinux.com

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Node.js v19.9.0 已发布。

值得关注的变化:

diagnostic_channel 中的 Tracing Channel

添加了一个新的高性能通道,来发布有关函数执行的时间和目的的跟踪数据。#44943

新的 URL.canParse API

一个新的 API 添加到 URL。检查一个带有可选基值的是否可以根据 WHATWG URL 规范被正确解析。#47179

 

其他值得关注的变化包括:

events

  • (SEMVER-MINOR) 添加 getMaxListeners 方法
  • (SEMVER-MINOR) 迁移到 WiX4
  • (SEMVER-MINOR) 弃用 napi_module_register
  • (SEMVER-MINOR) 为默认的 highWaterMark 添加 setter & getter
  • (SEMVER-MINOR) 公开 reporter 用于运行 api

更多详情可查看发布公告 

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)

LiteFlow介绍

LiteFlow是一个开源编排式规则引擎,能够让你的系统逻辑任意编排,可选用脚本书写逻辑,支持多达5种脚本语言,支持丰富的第三方存储的支持,所有的逻辑和规则均可热变更。设计系统和重构系统的神器。

LiteFlow是国内优秀的社区驱动型开源项目,开源2年多,目前已经被各大公司应用在核心系统上。特性以及支持度都非常好。

如果你是第一次知道这个项目,可以去官网或相关的主页进行了解:

项目官网:

https://liteflow.yomahub.com

gitee托管仓库:

https://gitee.com/dromara/liteFlow

github托管仓库:

https://github.com/dromara/liteflow

v2.10.2介绍

我们为每个迭代版本都定了一个版本特性。

LiteFlow 2.10.2的版本特性就是表达式。

除此之外,我们还增强了一些内容,修复了社区提出的bug。一共5个issue,作为此次小版本迭代的组成部分。

与或非表达式

社区里一直有人反应,条件编排能否在EL上写表达式,例如这种。

其实编排EL语法一切的操作对象都是,所以EL编排语法不能像逻辑代码一样来写很多逻辑过程。

我一直建议逻辑过程,通过java代码或者脚本组件来完成。而脚本组件是可以热更新热替换的。更加灵活。

但是在实际应用中,的确有人需要在条件编排里判断多个条件,而每个条件又是互相独立的组件。那么按照以前的写法,你只能把多个条件的逻辑塞到一个组件里,返回统一的true或者false。

这次我们新增了组件编排层面的与或非表达式,就是,,表达式。

用法为方法模式:。

可能有些社区里的同学会问,为什么不设计成呢,或者是呢。

我来解释一下,首先这种用法模式和之前的语法呼应,都是方法模式,其次操作符的模式就有点像逻辑了,而这里突出的是编排。再者操作符的模式的几个关键字都被底层占用了。

综上所述,所以延续了之前的EL表述方式。

具体文档在官网大章的小章中。

脚本新增了一些数据

脚本中现在也可以拿到循环下标了,在数据里加入了和2个属性。

可以通过和来获取到。

所有的脚本数据可以参照官网的大章中的小章节。

选择表达式的增强和一些bug的修复

现在在选择编排语法上,之前属性只能添加到组件上,现在对任何的表达式后面都可以添加属性了。

在选择节点的返回上,更加灵活了。

具体见官网的大章中的小章节。

此次我们还另外修复了2个bug。

完整更新列表

 

支持和赞助LiteFlow

开源一个项目并坚持2年并不容易,所以我也需要一点赞助来给自己充能,如果各位对LiteFlow这个项目有信心并且愿意支持我的的话,可以在官网首先按钮。

但不管你是否选择赞助,我仍然会在社区里尽可能的解决你们的问题。

如何加群

LiteFlow的社区群已经有大约2500人以上了。你有任何问题,都可以在群里问。

关于加群的方式,请参考:https://liteflow.yomahub.com/pages/73c2c3/

作者:vivo 互联网服务器团队- Liu Yanjiang


月光宝盒是一个基于流量录制回放的自动化测试平台,通过录制回放取代编写脚本进行自动化回归,提升测试效率和覆盖率。因为其解决方案具有很强的通用性,所以我们把这它开源出来,希望能帮助到有需要的用户。


一、月光宝盒 是什么?


Moonbox(月光宝盒)是 JVM-Sandbox 生态下的一款流量录制回放产品。所谓流量录制回放是服务端通过挂载agent探针自动注册到服务端,拦截服务端调用,将所有外部调用依赖的内容(如数据库、分布式缓存、外部服务响应等)进行完整记录形成录制流量。其核心价值是通过录制流量数据,将流量数据转化成可复用、可执行的自动化用例,快速在测试环境中进行回放比对接口返回值和外部调用依参数(见下图)。Moonbox(月光宝盒)提供了大量的常用插件,能够对常见的中间调用进行录制回放,同时也提供了非常可靠、高性能的数据存储、计算能力。

Goland激活2023.1.1(GoLand 2023.1 发布)


二、月光宝盒 有哪些优势?


正如开头所说月光宝盒是一款面向测试、研发工程师使用的低门槛、高性能、更易于使用的自动化测试工具。这款产品已经在vivo运行了2年多了,经过我们持续优化、打磨拥有很多实用、易用功能。它的优点主要体现在下面几方面:


2.1 全面可视化视操作(部分功能)


(1)基于任务、接口维度的流量管理能力

Goland激活2023.1.1(GoLand 2023.1 发布)

(2)详细的流量展示细节(请求、响应、子调用)


Goland激活2023.1.1(GoLand 2023.1 发布)

(3)基于任务、接口维度的回放数据管理,叠加各种维度统计、查询能力


Goland激活2023.1.1(GoLand 2023.1 发布)

(4)易于人工分析的回放比对结果和差异展示

Goland激活2023.1.1(GoLand 2023.1 发布)


2.2 丰富的插件支持


月光宝盒支持非常多组件录制和回放能力,基本上能满足绝大多数人诉求。

Goland激活2023.1.1(GoLand 2023.1 发布)


2.3 多种部署方式


  • Docker:这种方式简单、可靠,让您可以摒弃复杂的环境配置和安装,快速在本地体验我们项目。

  • 常规方式:这种方式复杂、步骤繁琐,需要按照步骤创建ES和MySQL数据库,初始化数据表,更新好应用配置,安装好前端node服务。


此外月光宝盒是前后端分离项目,当您使用该项目需要分别部署前端、后端,非常有助于您后续将项目部署到生产环境。


2.4 性能安全可靠


平台对性能进行了长期优化,在vivo内部历经多个高并发系统验证。我们对agent端录制流量进行了一系列安全防护,例如对相同接口同时只能有一个进入采样中,限制并行录制接口数量。服务端使用了ES储存流量,有效提升了数据储存规模。


三、月光宝盒 实现原理


3.1 整体架构


月光宝盒平台分为2个部分,分别为moonbox-agent 和 moonbox-server(整体架构如下图所示)


moonbox-agent

使用Java-attach技术(实际的动态字节码增强由JVM-Sandbox实现)动态代理到目标进程上,提供流量录制和回放的增强。


moonbox-server

  • Agent端使用接口,提供配置查询、录制流量保存、流量查询、回放结果保存等服务

  • 录制任务/回放任务的配置,agent任务远程管理能力和管理后台操作界面(前后端分离部署)

Goland激活2023.1.1(GoLand 2023.1 发布)


3.2 流量录制&回放


流量录制

核心逻辑是将agent分发到用户填写的机器上(本地、远程机器),然后将agent attach到用户填写应用所对应的正确进程上去。然后通过JVM-Sandbox的BEFORE、RETRUN、THROW事件机制拦截关键调用位置获取流量入参、出参。整体流程见下图整体流程见下图:

Goland激活2023.1.1(GoLand 2023.1 发布)

流量回放

核心逻辑是将agent分发到用户填写的机器上(本地、远程机器),然后将agent attach到用户填写应用所对应的正确进程上去,agent启动后从服务端不断拉取流量去分发到对应接口做回放,整体流程见下图:

Goland激活2023.1.1(GoLand 2023.1 发布)

心跳管理

Agent启动后会单独开启线程固定间隔时间通过http请求给服务端上报心跳

Goland激活2023.1.1(GoLand 2023.1 发布)


3.3 Agent启动过程


执行脚本将sandbox agent attach到目标java进程上,sandbox 启动jetty服务,加载moonbox module,然后从服务端拉取moonbox配置,加载流量录制和回放插件。

Goland激活2023.1.1(GoLand 2023.1 发布)


四、 和 jvm-sandbox-repeater 关系?


Moonbox是基于jvm-sandbox-repeater重新开发的一款流量回放平台产品。在jvm-sandbox-repeater基础上重写了很多模块,并提供了更加丰富功能,同时便于线上部署和使用,和jvm-sandbox-repeater差异如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

五、为什么要开源?


流量录制回放技术复杂,挑战较高,开源社区虽然有很多类似产品但是在易用性方面都有一些欠缺,我们希望通过开源月光宝盒帮助对该方向有兴趣的开发者快速构建自己的自动化工具,同时可以基于我们这款产品制定个性化诉求。此外,月光宝盒本身也借鉴了jvm-sandbox-repeater设计和方案,是开源的受益方,现在我们将自己思考和探索回馈给开源社区,丰富流量回放开源技术生态。除此之外通过社区中开发者的使用,也可以帮助我们更好的改进我们的工具,获得更多的需求场景输入,也能让该工具获得更加长远的发展。


六、Roadmap


月光宝盒已经完成V1.0.0版本开源,初步完成了各项重要功能开源,后续我们会持续性的完成平台性能、体验优化工作,同时积极收集社区使用反馈的功能需求,将一些好的需求纳入我们版本计划里面。2023年我们规划了一些迭代版本,如下图所示:

Goland激活2023.1.1(GoLand 2023.1 发布)


七、写在最后


今天月光宝盒的开源只是我们迈出的一小步,后续我们会持续按照计划向社区贡献版本和特性。如果您对月光宝盒有兴趣,欢迎体验我们开源产品。如果您有问题或者更好的方案,欢迎向我们开源项目贡献反馈ISSUE和贡献PR,这将是我们莫大的荣幸。


GItHub项目地址:https://github.com/vivo/MoonBox


END

猜你喜欢

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

  • Dubbo 中 Zookeeper 注册中心原理分析

  • 解密游戏推荐系统的建设之路



Mochi Diffusion 可在 Mac 上原生运行 Stable Diffusion,本应用内置 Apple 的 Core ML Stable Diffusion 框架 ,以实现在搭载 Apple 芯片的 Mac 上用极低的内存占用发挥出最优性能。

Goland激活2023.1.1(GoLand 2023.1 发布)

功能

  • 极致性能和极低内存占用 (使用神经网络引擎时 ~150MB)
  • 在所有搭载 Apple 芯片的 Mac 上充分发挥神经网络引擎的优势
  • 生成图像时无需联网
  • 图像转图像(也被称为 Image2Image)
  • 在图像的 EXIF 信息中存储所有的关键词(在访达的“显示简介”窗口中查看)
  • 使用 RealESRGAN 放大生成的图像
  • 自动保存 & 恢复图像
  • 自定义 Stable Diffusion Core ML 模型
  • 无需担心损坏的模型
  • 使用 macOS 原生框架 SwiftUI 开发

下载

 发行 页面下载最新版本。

运行

在初次运行模型时, 神经网络引擎可能需要约2分钟编译缓存,后续运行速度会显著提高。

计算单

  •  能很好地平衡性能和内存占用
  •  在 M1 Max/Ultra 及后续型号上可能更快,但会占用更多内存

你需要根据不同的计算单选择对应的模型 (详情见模型部分)。

模型

需要自行转换或下载 Core ML 模型以使用 Mochi Diffusion。

这里上传了几个已经转换好的模型

  1. 转换 或下载 Core ML 模型
    •  版本适用于包括神经网络引擎在内的所有计算单
    •  版本仅适用于 
  2. 默认情况下,应用程序的模型文件夹将创建在您的主目录下。 可以在“设置”下自定义此位置
  3. 在模型文件夹中,你可以新建一个文件夹,用自己想在应用内显示的名字为其重命名,再将转换好的模型放到文件夹中
  4. 你的文件夹路径应该像这样:
 

兼容性

  • Apple 芯片的 Mac (M1 及后续)
  • macOS Ventura 13.1 以上
  • Xcode 14.2 (自行构建)

隐私

所有计算均在本地完成并绝对不会上传任何数据。

学习如何「强制退出应用程序/结束进程」是每一个 Windows 用户的必修课,相信 Windows 用户经常会遇到正在使用的程序突然冻结的情况,窗口中的「X」或使用快捷键「Alt + F4」都无法关闭程序,这个时候大家唯一的选择就是「结束进程」。

结束进程的方式多种多样,比如可以使用快捷键「CTRL + ALT + DELETE」或者「Windows + X」然后选择任务管理器,亦或是「CTRL + SHIFT + ESC」直接打开任务管理器来结束没有响应的进程。

不过上述这些方法都有一个缺点,那就是不够直观,也不符合用户日常操作的直觉,而且普通用户可能不一定知道或者会忘记这些快捷键。

别担心,外媒 Tom’s Hardware 日前发现微软正在开发一个全新的 “结束任务” 选项,有望改进结束进程比较 “麻烦” 这个问题。用户未来可以直接在任务栏图标上右键无响应的程序(如下图),再选择 “结束任务” 选项就可以直接结束该程序的进程。

Goland激活2023.1.1(GoLand 2023.1 发布)

这个选项目前出现在了最新的 Windows 11 Build 23430 的 Dev 通道版本中,该选项需要在「设置 > 隐私和安全 > 面向开发者」菜单中手动开启(如下图)。不过这个选项暂时还无法正常使用,而且设置菜单还无法记住用户的选择,关闭设置菜单后又会重新恢复默认设置。

Goland激活2023.1.1(GoLand 2023.1 发布)

微软将这个选项隐藏这么深,并且放在面向开发者的选项中,似乎并不希望普通用户使用它。无论如何,即便这个功能正式推出,为了避免数据丢失或文件损坏,非必要不使用。

开源和基于 API 的分发之间的摩擦是生成式 AI 生态中极为迫切的矛盾。比如在从文本到图像领域,Stable Diffusion 的发布清楚地表明开源是基础模型的可行分发机制。然而,在大型语言模型 (LLM) 领域却并非如此,该领域最大的突破来自 GPT-4、Claude 和 Cohere 等模型,这些模型只能通过 API 获取。并且这些模型的开源替代品没有表现出相同水平的性能,特别是在它们遵循人类指令的能力方面。

然而,一项意想不到的研究突破和泄露的模型版本彻底改变了这一现状。

几周前,Meta 宣布了它的大语言模型 LLaMA,其参数规模从 70 亿到 650 亿参数不等(包括 7B、13B、33B 和 65B 参数),该模型的一大优势是能运行在单张显卡上。当时 Meta 没有开源 LLaMA,而是通过邀请制的方式出于研究的目的将源代码提供给社区。但在宣布该消息一周后,LLaMA 模型在 4chan 上被泄露,有匿名用户通过 BT 种子公开了 LLaMA-65B——有 650 亿个参数的 LLaMA,容量为 220GB。它已被确认是真实的,有用户在单张显卡上运行了 LLaMA,结果相当出色,这位用户使用的显卡是服务器级别的英伟达 A100 80GB。虽然模型遭到泄露,Meta 表示会继续与挑选的研究人员共享 LLaMA。

在此之后的几周里,这场本应是不幸的事件却成了 LLM 领域最有趣的创新来源之一。自 LLaMA 被泄露后,基于它而构建的 LLM 代理的创新呈现出爆炸式增长。

下面列举一些出色的案例:

  • 斯坦福大学发布了 Alpaca,这是一种基于 LLama 7B 模型的指令跟随模型
  • 来自加州大学伯克利分校、卡内基梅隆大学、斯坦福大学和加州大学圣地亚哥分校的研究人员开源了 Vicuna,这是一个与 GPT-4 性能相匹配的 LLama 微调版本
  • Berkeley AI Research Institute (BAIR) 发布了 Koala,这是一种使用互联网对话进行微调的 LLama 版本
  • Nebuly 开源了 ChatLLama,这是一个使用您自己的数据创建对话助手的框架
  • FreedomGPT 是一个基于羊驼的开源会话代理,采用 LLama
  • 加州大学伯克利分校的 Colossal-AI 项目发布了 ColossalChat,这是一种 ChatGPT 类型的模型,具有基于 LLama 的完整 RLHF 管道

最后,推荐一批由 OSCHINA 整理的 LLM 开源项目:Awesome LLM

.NET 首席项目经理凯瑟琳在博客中介绍了 C# 12 的一些预览版新功能,这些功能可以在 Visual Studio 17.6 预览版和最新的.NET 8 预览版中体验。

C# 12 主要有如下新特性:

非记录类和结构的主构造函数 

主构造函数允许将参数添加到类声明本身,并在类主体中使用这些值。

作为记录位置语法的一部分,主构造函数在 C# 9 中引入,而 C# 12 则将主构造函数扩展到所有类和结构

主构造函数的基本语法和用法:

 

上面 Student 类中的主构造函数参数在类的整个主体中都可用。

所有类型均可使用 using 指令起别名

C# 12 将 using 指令支持扩展到任何类型,如:

 

可为几乎任何类型起别,如可空值类型,但不能为可空引用类型起别名。

组比较特别,它可以包含素名称和类型:

 

可以在任何需要使用类型的地方使用别名。例如:

 

lambda 表达式的默认值

C# 12 通过允许为参数指定默认值,进一步增强了 lambda 表达式的能力。

语法与其他默认参数相同:

 

与其他默认值类似,lambda 的默认值将在数据中发出,并可通过反射作为 lambda   属性的  的  获得。例如:

 

在 C# 12 之前,需要使用本地函数或  命名空间中的  来为 lambda 表达式参数提供默认值。这些方法仍然有效,但难阅读,且与方法的默认值不一致。

 

关于上述 C# 12 新功能的详细信息,可以在文档中细阅。

可以在 Roslyn Feature Status 关注 C# 12 的开发进度,还可以在 CSharpLang GitHub 仓库中探索 C# 12 的设计过程,比如相关的建议、讨论和会议记录。

Ubuntu 23.04“Lunar Lobster”计划于 2023 年 4 月 20 日星期四发布,这是 Ubuntu 桌面的第 38 个版本。作为一个短期版本,Ubuntu 23.04 共获得了 9 个月的持续更新、安全补丁和关键修复。

在正式发布之前,OMG! Ubuntu! 汇总整理了一些 Ubuntu 23.04 中的新功能、更改和增强功能,具体包括:

新的安装程序

Ubuntu 23.04 包含一个新的 OS installer。就功能而言,新的 Ubuntu 安装程序与旧版本没有太大区别,但底层技术肯定有所区别。新安装程序是使用 Flutter 构建的,并利用了 Subiquity、Canonical 的 Ubuntu Server CLI 安装程序和 Curtin 等技术。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

每个安装页面都经过了改进,以尽可能地实现清晰和简洁,并且在实际安装过程中还有一个改进的幻灯片(现在带有幻灯片控件)。总的来说,新的基于 Flutter 的安装程序给人印象还算良好。但 OMG! Ubuntu! 方面测试发现,确实存在一些 UI 交互很迟钝,安装程序的某些部分会瞬间 freeze 的问题。

对于不喜欢这一改进的用户,仍然可以选择下载使用旧版本的遗留构建。

GNOME 44

Ubuntu 23.04 附带了最新的 GNOME 44 稳定版本。GNOME 44 中添加了很多新功能,以增强桌面体验;但其与目前 Ubuntu 的 Yaru 主题似乎并未完美适配。“Ubuntu 的 Yaru 主题(除非未来有修复)确实让 GNOME 44 的一些新功能看起来有点……未完成/奇怪。”

现在,登录和锁定屏幕使用更大的用户头像和更宽的密码输入框。主题方面也有细微的调整,以便使用键盘导航的人可以知道哪个素处于活动状态。

Goland激活2023.1.1(GoLand 2023.1 发布) Goland激活2023.1.1(GoLand 2023.1 发布)

上游的 GNOME 设计师对快速设置菜单的形式和功能做了一些大的改进(但 Ubuntu 的 Yaru 主题在一定程度上削弱了这些改进–尽管有修复正在进行中)。

由于有”split”按钮,现在哪些功能有子菜单也更加一目了然(现在可以使用键盘打开子菜单)。以及更详细的相关信息展示,如你连接的是哪个 Wi-Fi 网络,或哪个 Power Mode 处于活动状态:

Goland激活2023.1.1(GoLand 2023.1 发布)

GNOME 开发人员还向蓝牙按钮添加了一个新的子菜单。使用子菜单,你可以快速连接/断开之前配对的蓝牙设备。你无法从此菜单配对新设备(前往“设置”>“蓝牙”进行配对),但一旦成功配对,它们就会在此展示:

Goland激活2023.1.1(GoLand 2023.1 发布)

GNOME 44 在“快速设置”菜单中推出了一个新的“后台应用程序”区域。此区域按需出现,并且仅当兼容的应用程序留在后台运行时才会出现。OMG! Ubuntu! 测试发现,无法让该功能与任何 Ubuntu 的预安装应用程序(如 Rhythmbox)一起出现,但会立即检测到 Flatpak 应用程序(如Amberol ):

Goland激活2023.1.1(GoLand 2023.1 发布)

此外,面板中也包含了许多改进、重组和新功能。GNOME 开发人员已经对鼠标和触摸板部分进行了重大修改,获得了更多控件(如鼠标加速)和新动画。以及将内核版本信息添加到了设置中的“关于”部分,只需滚动到底部即可找到。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Ubuntu 开发人员希望在下一版本的 Ubuntu 中加入 Tiling Assistant 扩展。而在这之前,有一个小小的复活节彩蛋。如果你从 Lunar 中的 Ubuntu 存储库安装此扩展,就可以在 Settings > Ubuntu Desktop 中解锁“enhanced tiling”设置。值得注意的是,这些只有在安装了该扩展后才会出现。

Goland激活2023.1.1(GoLand 2023.1 发布)

GNOME 44 附带了新版本的 Nautilus(又名 Files),它恢复了在列表视图中“展开”文件夹的功能,以便更快地导航。这个功能在默认情况下没有启用,所以如果你想使用它,需要进入偏好设置并将其打开。且开发人员还在 GTK 文件选择器添加了缩略图/图标视图。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

当一个应用程序在 Dock 中打开时,Ubuntu Dock 现在会显示一个由该应用程序产生的(所有)未读通知的计数标记。这不是旧的 Unity unread API(由 Telegram 等应用使用),而是一个新功能。具体表现为,如果一个应用程序显示本地通知,它就能够显示未读标记。但缺点是,如果你使用的应用程序(如 Telegram),显示有 1 条未读信息,同时通知也被发送,那么标记将显示 “2”;即,一条是未读信息,一条是关于未读信息的通知。

Goland激活2023.1.1(GoLand 2023.1 发布)

此外,Ubuntu 软件已更新为显示 snap 应用程序的类别。

Goland激活2023.1.1(GoLand 2023.1 发布)

视觉变化

Ubuntu 23.04 包括一个新壁纸,并修改了其基于 Adwaita 的 Yaru GTK 和 Shell 主题以适应上游 GNOME 开发人员所做的更改。

在图标方面的一些显着变化包括:快速设置菜单中的屏幕截图按钮有一个新图标;Ubuntu 的设计团队没有显示 LibreOffice 的新应用程序图标,而是用一组更新的自定义图标替换了它们。

Goland激活2023.1.1(GoLand 2023.1 发布)

软件与实用程序

Ubuntu 23.04 附带了其核心软件集的新版本,包括:

  • Mozilla Firefox 111
  • Thunderbird 102
  • LibreOffice 7.5
  • Shotwell 0.30.17
  • Remmina 1.4.29
  • Transmission 3.0

此外,还包括最新版本的 GNOME 新文本编辑器 ,它改进了滚动缩放、草稿处理和拼写检查。还包括对弹出窗口、菜单、状态页面、搜索和首选项对话框的大量 UI 调整。

内核版本

Ubuntu 23.04 使用 Linux kernel 6.2,并提供 Mesa 23.0 图形驱动程序来支持一些顶级游戏体验。

摘要:华为云DTSE团队出品云原生改造指南,助力轻松实践OCP上云。

本文分享自华为云社区《【云享专刊】开源遇上华为云,OCP架构变身“云原生框架”》,作者:华为云社区 。

OpenStack、Docker、K8S、Hadoop……这些都是开发者耳熟能详的开源技术。

开源技术的应用,正不断推动新兴技术和产业的发展。

作为国内知名开源托管平台Gitee上面的优秀开源项目,open-capacity-platform微服务能力开放平台(简称OCP)有着8K+的开发者关注并fork,人气颇高。

OCP是基于layui + springcloud的企业级微服务框架,包括用户权限管理,配置中心管理,应用管理等功能。开发者通过OCP可以在本地搭建自己的开发环境,进行学习和二次开发。

当前,我们正处在云原生时代,云原生技术凭借降本增效、提高持续交付能力、易于开发等优势,正在不断激活应用构建范式,也将开发过程带入云端。开源与云原生如影随形、协同发展。云原生为开源带来了更优的商业化模型,用户能够得到最新、最可靠的服务,开源项目正加速上云。

如果将open-capacity-platform进行云原生改造,将用到的传统软件架构替换为高可用、高效的云上组件,不仅可以降低风险、减少维护负担、提高安全性,更能在不扩大团队规模的情况下增加开发效益。

正是考虑到OCP进行上云改造后可以带来的好处,为此华为云DTSE团队进行了技术探索,将这个好的实践分享给广大的开发者。

浅析OCP架构基于华为云的改造方案

基于华为云云原生改造,改造完的OCP可实现一站式容器化交付,打通云上全生命周期管理。并且,OCP基于代码源可以自动完成代码编译、镜像构建、灰度发布、容器化部署、运维流程。对接已有CI/CD,利用云原生的优势服务,完成传统应用的容器化改造和上云部署。能够让开发者聚焦业务开发,提升整体开发效率。

无需关注运维服务,华为云加持下的OCP为开发者带来三大能力提升

华为云全容器化的架构设计,能够为开发者带来更灵活的任务调度,更高的执行效率。OCP上云后,运维能力转到了华为云侧,不需要开发者再去维护运维服务,只需要使用运维服务即可。不仅如此,针对应用部署方面为开发者带来了编译构建能力、部署运行能力和运维能力的提升。

1、编译构建能力:

使用编译构服务CodeArts Build可以帮助企业利用云端构建海量构建资源,采用多样化的云端构建加速手段,实现本地构建无法企及的构建速度。CodeArts Build是按照实际占用的资源及时长支付相应费用,杜绝企业硬件资源及维护资金投入,且服务器是由CodeArts统一维护,大幅度降低成本。

2、部署运行能力:

部署选择云容器引擎CCE,CCE基于在计算、网络、存储、异构等方面多年的行业技术积累,提供业界领先的高性能云容器引擎,支撑企业业务的高并发、大规模场景。并且,CCE可以一键创建和升级Kubernetes容器集群,无需自行搭建Docker和Kubernetes集群。部署在CCE的应用可以使用流水线CodeArts Pipeline实现自动化部署,实现缩短交付周期和提升交付质量的效果。

3、运维能力:

使用应用性能管理APM、应用运维管理AOM和云日志服务LTS替换OCP原有的自建运维微服务,开发者不需要再去对运维微服务进行运维,只需要关注使用华为云的运维能力。同样可以使用华为云运维提供的高级运维能力,如APM的智能告警、调用链追踪;AOM的自动化运维和告警降噪;LTS的日志查询与实时分析、日志转储能力。

OCP上云改造思路

看了前文讲了这么多OCP上云的好处,接下来为大家简单介绍上云改造思路:

  • 将open-capacity-platform项目迁移至 CCE+CSE,需要进行将OCP用的注册中心从Eureka替换成CSE;
  • 使用RDS+DCS实现数据库上云;改用 OBS实现原应用中文件上传;
  • 使用CodeHub+CloudBuild进行编译构建+制作docker镜像;
  • 使用k8s+容器基础设施承载应用;
  • 使用APM+AOM+LTS替换调原有的运维+日志。
Goland激活2023.1.1(GoLand 2023.1 发布)

OCP基于华为云云原生改造架构图

OCP中文件中心(file-center)模块涉及对文件上传、查询、删除等操作。以集成华为云OBS为例,OBS的几个优势可以帮助开发者通过简单的操作创建稳定可靠的云上存储服务:

  • 数据稳定,业务可靠。可保障数据持久性高达99.%,业务连续性高达99.995%,远高于传统架构;
  • 多重防护,授权管理。通过可信云认证,让数据安全放心;
  • 能够为各场景下用户的千亿对象提供千万级并发、超高带宽、稳定低时延的数据访问体验;
  • 支持多种工具,让业务快速上云。华为云OBS支持在线升级、在线扩容,客户无感知。提供POSIX语言系统,应用接入更简便;
  • 提供按量计费和包年包月两种支付方式,支持数据分层独立计量计费,降低存储成本。

以上方案,打通了开发–测试–部署–运维全生命周期管理,方便开发工程师和运维工程师快速体验上云。从而实现:

  • 与其它产品预集成,开箱即用,简化应用上云、云上开发、云上部署、发布;
  • 运维能力转到华为云侧,不需要开发者再去维护运维服务,只需要使用运维服务即可,云原生运维提供了自动化运维和告警降噪等能力;
  • 全容器化的架构设计,任务调度更灵活,执行效率更高。基于云计算的灵活性、数据安全性、可扩展性,也可以帮助企业节省成本。

华为云DTSE出品云原生改造指南助力轻松实践

基于开源项目open-capacity-platform的云原生改造案例,华为云DTSE团队经过调研,体系化的梳理技术架构,沉淀出一套完整的开发指南。从开发构建到部署再到运维,覆盖了应用上云的大部分流程,可供需要上云的应用或想要开发云上应用做流程参考,帮助应用快速上云。

上手前你需要掌握的云服务知识

在进行OCP上改造之前,小伙伴们首先需要了解华为云相关产品:CSE、CodeHub、CloudBuild、SWR、CCE、RDS、DCS、OBS、ELB、DNS、APM、AOM、LTS等云服务的功能模块文档。我们还准备了相关的云服务学习课程和实验内容,如实验操作数据库服务实践 、云容器快速搭建网站 ,学习两小时玩转华为云日志服务LTS 、CSE等课程 ,详情可见文末 。

9步带你了解上云操作流程

  1. OCP开源项目本地部署运行
  2. OCP接入CSE
  3. 代码上传CodeHub,进行代码托管
  4. RDS+DCS替换原项目中的Mysql和Redis
  5. CloudBuild进行编译构建,构建docker镜像并推送到SWR
  6. CCE中部署应用
  7. CCE接入LTS云日志
  8. DNS实现通过域名访问应用
  9. OCP业务成功访问使用

提供优化方案Tips,助力更高效开发

为了完成更好的开发体验,华为云还提供了相关的优化方案,以及在迁移的过程中会遇到的问题,华为云专家为大家整理了贴心的Tips,如项目启动数据库链接、workflow-center启动、编译构建、打包镜像、验证码生成等,会遇到的各种问题以及解决方案。

多方位资源支持,广邀开发者构建开源for Huawei Cloud

如今,越来越多的开发者选择加入开源for HuaweiCloud,华为云也将面向开源软件工具链与环境、开源应用构建和开源生态组件构建这三大重点场景,提供技术支持、奖金支持、活动支持,邀请更多的开发者,携手构建开源for HuaweiCloud。

Goland激活2023.1.1(GoLand 2023.1 发布)

共建开源生态,打开产业新增长空间

开发者将开源软件工具、开源应用和开源组件与华为云对象存储OBS、数仓DWS、云容器CCE等云服务对接,同时基于Terraform模板,上架到华为云云商店,支持其他开发者一键部署使用开源组件 ,我们称为“开源xxx for HuaweiCloud”。 下图为华为云开源项目仓库的示例,涵盖Dromara社区、Java、Go、Python、C&C++及其他开源类项目,数量超过100。感兴趣的开发者可以:​华为云开源项目仓库 ,了解更多。

不仅如此,参与贡献的开发者将有计划会获得​华为云沃土云创计划激励,领取云服务资源代金券,可用于开发部署。如果您有意愿参与,请在​issues 留下您的邮箱或者主动发送到邮件到​hwcdtse@huawei.com,我们会尽快联系您。

Goland激活2023.1.1(GoLand 2023.1 发布)

100+华为云开源技术项目示例

华为云开源项目仓库:​https://gitee.com/HuaweiCloudDeveloper/huaweicloud-cloud-native-plugins-kits

  • 附件:开源项目open-capaciry-platform云原生改造操作指导.pdf 5.39MB
  • 附件:开源项目open-capacity-platform集成华为云OBS(对象存储服务)SDK.pdf274.17KB

 

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

MongoDB索引优化

img

  • 作者: 博学谷狂野架构师
  • GitHub:GitHub地址 (有我精心准备的130本电子书PDF)

只分享干货、不吹水,让我们一起加油!😄

索引简介

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

什么是索引

索引最常用的比喻就是书籍的目录,查询索引就像查询一本书的目录。本质上目录是将书中一小部分内容信息(比如题目)和内容的位置信息(页码)共同构成,而由于信息量小(只有题目),所以我们可以很快找到我们想要的信息片段,再根据页码找到相应的内容。同样索引也是只保留某个域的一部分信息(建立了索引的field的信息),以及对应的文档的位置信息。

假设我们有如下文档(每行的数据在MongoDB中是存在于一个Document当中)

姓名 id 部门 city score 张三 2 xxx Beijing 90 李四 1 xxx Shanghai 70 王五 3 xxx guangzhou 60

索引的作用

假如我们想找id为2的document(即张三的记录),如果没有索引,我们就需要扫描整个数据表,然后找出所有为2的document。当数据表中有大量documents的时候,这个时间就会非常长(从磁盘上查找数据还涉及大量的IO操作)。建立索引后会有什么变化呢?MongoDB会将id数据拿出来建立索引数据,如下

索引值 位置 1 pos2 2 pos1 3 pos3

索引的工作原理

这样我们就可以通过扫描这个小表找到document对应的位置。

查找过程示意图如下:

img

索引为什么这么快

为什么这样速度会快呢?这主要有几方面的因素

  1. 索引数据通过B树来存储,从而使得搜索的时间复杂度为O(logdN)级别的(d是B树的度, 通常d的值比较大,比如大于100),比原先O(N)的复杂度大幅下降。这个差距是惊人的,以一个实际例子来看,假设d=100,N=1亿,那么O(logdN) = 8, 而O(N)是1亿。是的,这就是算法的威力。
  2. 索引本身是在高速缓存当中,相比磁盘IO操作会有大幅的性能提升。(需要注意的是,有的时候数据量非常大的时候,索引数据也会非常大,当大到超出内存容量的时候,会导致部分索引数据存储在磁盘上,这会导致磁盘IO的开销大幅增加,从而影响性能,所以务必要保证有足够的内存能容下所有的索引数据)

当然,事物总有其两面性,在提升查询速度的同时,由于要建立索引,所以写入操作时就需要额外的添加索引的操作,这必然会影响写入的性能,所以当有大量写操作而读操作比较少的时候,且对读操作性能不需要考虑的时候,就不适合建立索引。当然,目前大多数互联网应用都是读操作远大于写操作,因此建立索引很多时候是非常划算和必要的操作。

查看索引

索引是提高查询查询效率最有效的手段。索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中,所在从索引中检索数据会非常快。如果没有索引,MongoDB必须扫描集合中的每一个文档,这种扫描的效率非常低,尤其是在数据量较大时。

默认主键索引

在创建集合期间,MongoDB 在字段上 创建唯一索引,该索引可防止客户端插入两个具有相同值的文档。您不能将此索引放在字段上。

查看索引

查看集合索引

要返回集合中所有索引的列表可以使用查看现有索引


查看集合的所有索引,我们看到有一个默认的索引,并且是一个升序索引

image-20210421104210510

查看数据库

若要列出数据库中所有集合的所有索引,则需在 MongoDB 的 Shell 客户端中进行以下操作:


这样可以列出本数据库的所有集合的索引

image-20210421105500546

索引常用操作

创建索引

MongoDB使用 createIndex() 方法来创建索引。

注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。

语法

createIndex()方法基本语法格式如下所示:


语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。


这样就根据字段创建了一个升序索引

image-20210421153251472

索引参数

createIndex() 接收可选参数,可选参数列表如下

Parameter Type Description background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为
false。 unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为
false. name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 dropDups Boolean 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为
false. sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为
false. expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.
示例

创建一个名称是的索引,按照字段降序,并且在10秒后删除


这样我们就创建了一个索引

image-20210421153738275

删除索引

MongoDB 提供的两种从集合中删除索引的方法如下:

根据name删除

可以根据索引的名字进行索引删除


这样我们就把一个索引删除了

image-20210421152445676

根据字段删除

还可以根据字段进行删除


删除集合中字段升序的索引,这样就把这个索引删除了

image-20210421152708745

删除所有索引

可以把集合所有索引删除


这样就把非默认的主键索引意外的索引索引删除了

image-20210421152855308

MongoDB索引类型

单键索引

MongoDB为文档集合中任何字段上的索引提供了完整的支持 。默认情况下,所有集合在字段上都有一个索引,应用程序和用户可以添加其他索引来支持重要的查询和操作。

image-20210507172343173

这个是最简单最常用的索引类型,比如我们上边的例子,为id建立一个单独的索引就是此种类型。

创建索引

我们创建一个人数升序的索引


其中中的1表示升序,如果想设置倒序索引的话使用 可

image-20210421110833338

查看执行计划

可以在查询中使用执行计划查看索引是否生效


我们发现索引已经生效了

image-20210421114408602

复合索引

复合索引(Compound Indexes)指一个索引包含多个字段,用法和单键索引基本一致。使用复合索引时要注意字段的顺序,如下添加一个name和age的复合索引,name正序,age倒序,document首先按照name正序排序,然后name相同的document按age进行倒序排序。mongoDB中一个复合索引最多可以包含32个字段。符合索引的原理如下图所示:

image-20210507172449911

上图查询索引的时候会先查询userid,再查询score,然后就可以找到对应的文档。

创建索引

我们创建一个以升序,降序的符合索引


这样我们就把索引创建了

image-20210421114900552

查看执行计划

我们看到我们的查询走了索引

image-20210421150129125

对于复合索引需要注意以下几点:

最左前缀法则

在MySQL中走前缀法则生效,在mongodb中查询同样生效


我们只查询最走侧索引列的时候,索引是生效的

image-20210421150419876

但是如果我们查询不加入最左侧索引列


我们发现索引未生效,走了全表扫描

image-20210421150530311

地理索引

地理索引包含两种地理类型,如果需要计算的地理数据表示为类似于地球的球形表面上的坐标,则可以使用 2dsphere 索引。

通常可以按照坐标轴、经度、纬度的方式把位置数据存储为 GeoJSON 对象。GeoJSON 的坐标参考系使用的是 wgs84 数据。如果需要计算距离(在一个欧几里得平面上),通常可以按照正常坐标对的形式存储位置数据,可使用 2d 索引。

创建平面地理索引

如果查找的地方是小范围的可以使用平面索引


image-20210421151631589

创建球面地理索引

如果是大范围的,需要考虑地球弧度的情况下如果使用平面坐标可能不准确,就需要使用球面索引


image-20210421152004535

常用索引属性

唯一索引

唯一索引(unique indexes)用于为collection添加唯一约束,即强制要求collection中的索引字段没有重复值。添加唯一索引的语法:


这样我们就创建了一个根据ID以及city的唯一索引

image-20210421154955276

局部索引

局部索引(Partial Indexes)顾名思义,只对collection的一部分添加索引。创建索引的时候,根据过滤条件判断是否对document添加索引,对于没有添加索引的文档查找时采用的全表扫描,对添加了索引的文档查找时使用索引。

创建索引

这样就创建了局部索引

image-20210421154406993

查看执行计划

根据索引特性 ,我们知道,只有查找的人数大于10000,才会走索引


我们看到,查询10000以内的数据不走索引

image-20210421154704291

如果查找的条件大于10000就会走索引


image-20210421154854174

执行计划

MongoDB中的函数可以帮助我们查看查询相关的信息,这有助于我们快速查找到搜索瓶颈进而解决它,本文我们就来看看的一些用法及其查询结果的含义。

整体来说,的用法和、用法差不多,不同的是必须放在最后面。

基本用法

先来看一个基本用法:


直接跟在函数后面,表示查看函数的执行计划,结果如下:


返回结果包含两大块信息,一个是 queryPlanner,即查询计划,还有一个是 serverInfo,即MongoDB服务的一些信息。

参数解释

那么这里涉及到的参数比较多,我们来一一看一下:

参数 含义 plannerVersion 查询计划版本 namespace 要查询的集合 indexFilterSet 是否使用索引 parsedQuery 查询条件,此处为x=1 winningPlan 最佳执行计划 stage 查询方式,常见的有COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询 filter 过滤条件 direction 搜索方向 rejectedPlans 拒绝的执行计划 serverInfo MongoDB服务器信息

添加不同参数

也接收不同的参数,通过设置不同参数我们可以查看更详细的查询计划。

queryPlanner

是默认参数,添加queryPlanner参数的查询结果就是我们上文看到的查询结果,so,这里不再赘述。

executionStats

会返回最佳执行计划的一些统计信息,如下:


我们发现增加了一个的字段列的信息


这里除了我们上文介绍到的一些参数之外,还多了executionStats参数,含义如下:

参数 含义 executionSuccess 是否执行成功 nReturned 返回的结果数 executionTimeMillis 执行耗时 totalKeysExamined 索引扫描次数 totalDocsExamined 文档扫描次数 executionStages 这个分类下描述执行的状态 stage 扫描方式,具体可选值与上文的相同 nReturned 查询结果数量 executionTimeMillisEstimate 预估耗时 works 工作单数,一个查询会分解成小的工作单 advanced 优先返回的结果数 docsExamined 文档检查数目,与totalDocsExamined一致

allPlansExecution:用来获取所有执行计划,结果参数基本与上文相同,这里就不再细说了。

慢查询

在MySQL中,慢查询日志是经常作为我们优化查询的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是开启Profiling功能。该工具在运行的实例上收集有关MongoDB的写操作,游标,数据库命令等,可以在数据库级别开启该工具,也可以在实例级别开启。该工具会把收集到的所有都写入到system.profile集合中,该集合是一个capped collection。

慢查询分析流程

慢查询日志一般作为优化步骤里的第一步。通过慢查询日志,定位每一条语句的查询时间。比如超过了200ms,那么查询超过200ms的语句需要优化。然后它通过 .explain() 解析影响行数是不是过大,所以导致查询语句超过200ms。

所以优化步骤一般就是:

  1. 用慢查询日志(system.profile)找到超过200ms的语句
  2. 然后再通过.explain()解析影响行数,分析为什么超过200ms
  3. 决定是不是需要添加索引

开启慢查询

Profiling级别说明

针对数据库设置

登录需要开启慢查询的数据库


查看慢查询状态


设置慢查询级别


image-20210507173942330

如果不需要收集所有慢日志,只需要收集小于100ms的慢日志可以使用如下命令


注意:

  • 以上要操作要是在test集合下面的话,只对该集合里的操作有效,要是需要对整个实例有效,则需要在所有的集合下设置或则在开启的时候开启参数
  • 每次设置之后返回给你的结果是修改之前的状态(包括级别、时间参数)。
全局设置

在mongoDB启动的时候加入如下参数


或则在配置文件里添加2行:


这样就可以针对所有数据库进行监控慢日志了

关闭Profiling

使用如下命令可以关闭慢日志


image-20210507174338080

Profile 效率

Profiling功能肯定是会影响效率的,但是不太严重,原因是他使用的是system.profile 来记录,而system.profile 是一个capped collection, 这种collection 在操作上有一些限制和特点,但是效率更高。

慢查询分析

通过 db.system.profile.find() 查看当前所有的慢查询日志


image-20210507174746188

参数含义

分析

如果发现 millis 值比较大,那么就需要作优化。

  1. 如果nscanned数很大,或者接近记录总数(文档数),那么可能没有用到索引查询,而是全表扫描。
  2. 如果 nscanned 值高于 nreturned 的值,说明数据库为了找到目标文档扫描了很多文档。这时可以考虑创建索引来提高效率。
system.profile补充

‘type’的返回参数说明


对于普通查询,我们最希望看到的组合有这些


不希望看到包含如下的type


最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

本文由教研团队发布。

如果本文对您有帮助,欢迎和;如果您有任何建议也可或,您的支持是我坚持创作的动力。

转载请注明出处!

我们在前几篇文章讨论并展示了使用 Antrea 搭配 NSX Manager 来提供便利且企业等级的容器网络安全机制,以及与原生 Kubernetes Network Policies 的运作方式比较。采用 Antrea 搭配 NSX Manager 是我们在各个不同企业客户介绍容器方案时的主打功能之一,也受到很多客户青睐希望在生产环境内进行部署。因此接下来我想将重点放在如何进行 Antrea 与 NSX Manager 的链接整合流程。但开始前,这里要特别用一篇推文来讨论 Antrea 与 NSX Manager 的方案架构。


下面这张图是在 Kubernetes Cluster 内运用 Antrea 作为 Container Network Interface 件,并且与 NSX Manager 进行整合的架构:

Goland激活2023.1.1(GoLand 2023.1 发布)

相关重点构件讨论如下:

Antrea 构件

与我们之前在讨论 Antrea 本身的架构相同,在每个 Kubernetes Nodes 内都会有一个 Antrea Pod 来负责。

  • 接收来自 Kubernetes API Server 的指示,编写相关的网络与安全需求如 Pod 之间的网络连接;
  • 由 Antrea Controller 端接收 Antrea Network Policy 的要求,提供 Pod 上的安全策略;
  • 透过本地上的 Open vSwitch 来实现上述功能。

而 Kubernetes Cluster 内在 Master Nodes 内也会部署一个 Antrea Controller Pod,这个 Controller Pod 是 Antrea 的安全控制端,负责要与 K8S API Server 那边抓取 K8S Inventories 的相关信息,并取得对应 Antrea Network Policy 的 CRD(Customized Resource Definition)要求。

上述构件都和我们之前描述标准 Antrea 方案一模一样,唯一要注意的是 Antrea 至 少必须采用 1.2.3 的社群版本,或 1.3.1-1.2.3 的商用版本,才会支持与 NSX 整合的功能,这是大家需要特别在使用此功能前注意的。下图是 VMware Container Networking with Antrea 1.3.1-1.2.3 的 release note(注:标注红框部分就是对于 NSX 整合新功能的描述。)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

安特里亚 NSX 适配器

在进行 NSX 集成时,Kubernetes Cluster 内会配置一个独立的 Pod ,在上面架构图内叫做 Antrea NSX Adapter。这个 Pod 一方面负责与 Kubernetes 内的 API Server 以及 Antrea Controller Pod 通信,包含抓取 Kubernetes 相关 Inventory 信息,以及送出从 NSX 那边取得的群组与防火墙政策配置。另一方面则是与 NSX Manager 进行连接,提供上述的信息。

下图内大家看到在做完 Antrea + NSX 整合后, Kubernetes Cluster 内会出现一个开头是 interworking 的这个 pod,就是我们这边讨论的 Antrea NSX Adapter。

Goland激活2023.1.1(GoLand 2023.1 发布)

单纯安装 Antrea 作为 K8S Cluster CNI 时不会有上面这个 Pod 出现,只有在进行 NSX 整合时才需要。在后面我们讨论 Antrea+NSX 的安装步骤时会看到相关的配置流程。

NSX 管理器

这里的 NSX Manager 就是我们熟悉的 NSX Data Center 内的 Manager 构件,可以是一台或三台做丛集均可。这边就是我们真正通过 UI 界面进行群组配置以及防火墙政策的地方。几个重点:

  • NSX Manager 作为管理/控制层来使用,不是数据/转发层。在此架构内,我们通过 NSX Manager 的 UI 界面进行安全政策配置以及查询 Kubernetes Inventory 信息,但是真正的防火墙实现是由 Antrea 呼叫 OVS 来进行。
  • 因此,在此架构内,NSX 仅仅作为管理 / 控制层。不需要连接 vSphere 做 Transport Node Preparation,不需要建 TEP 接口启用 Overlay 网络。各位想要用同一组 NSX Manager 同时管理 SDDC 虚机环境与 Kubernetes 环境当然没问题,但单纯讨论 Antrea + NSX 的整合时,NSX 就只需要安装 Manager 而已。
  • 也因为所有“真正的功能”都是在 Antrea 内通过 OVS 实现,因此 Antrea + NSX 这个安全方案能够或不能够做到什么,重点其实是在 Antrea 内有没有开发出此功能,而不是 NSX 本身有没有支持。比如说我们需要 Pod 之间不仅有 L4 防火墙,还想要 L7 的检查功能,IDPS 方案的整合等等。在方案架构内,这些功能会需要在 Antrea 端先做出来,然后才是于 NSX Manager 端来提供管理的接口。

这里多说一句,在前面我们讨论到 Antrea+NSX 可以提供较传统 Network Policies 更完善的功能,架构上其实要分成两部分:

  • NSX Manager 是管理层,提供简易使用与维运的 UI 界面。
  • Antrea 在转发层实作比传统 Network Policies 更强的安全策略功能。在 Antrea 内这个功能是通过 CRD(Customized Resource Definition)来实现,叫做 Antrea Network Policy。

Goland激活2023.1.1(GoLand 2023.1 发布)

  • 透过这个强化的 CRD 构件,Antrea 可以提供日志、基于 Tier 的防火墙配置顺序、设定明确的 Deny 规则等等。

因此整个内部作业流程是管理者在 NSX UI 内进行了需求的群组及规则配置,在 Kubernetes Cluster 内的 Antrea NSX Adapter Pod 取得这些配置要求,送给 Antrea Controller 后交给每个 K8S Node 里面的 Antrea Agent,编写 Open vSwitch 来实现防火墙配置,大概是这样。

架构讨论完,下一篇开始我们会详细讨论如何进行 Antrea 整合 NSX 的安装步骤。

内容来源|公众号:VMware 中国研发中心

本文作者:Colin Jao (饶康立), VMware 资深技术顾问,主要负责 VMware NSX 产品线,目前致力于网络虚拟化、分布式安全防护技术与新应用递送方案的介绍与推广。

作者:京东零售 周明亮

写在前面

上一期:《带你揭开神秘的 javascript AST 面纱之 AST 基础与功能》

这里我们初步提到了一些基础概念和应用:

  • 分析器
  • 抽象语法树 AST
  • AST 在 JS 中的用途
  • AST 的应用实践

有了初步的认识,还有常规的代码改造应用实践,现在我们来详细说说使用 AST, 如何进行代码改造?

Babel AST 四件套的使用方法

其实在解析 AST 这个工具上,有很多可以使用,上文我们已经提到过了。对于 JS 的 AST 大家已经形成了统一的规范命名,唯一不同的可能是,不同工具提供的详细程度不一样,有的可能会额外提供额外方法或者属性。

所以,在选择工具上,大家按照各自喜欢选择即可,这里我们选择了 babel 这个老朋友。

初识 Babel

我相信在这个前端框架频出的时代,应该都知道 babel 的存在。 如果你还没听说过 babel ,那么我们通过它的相关文档,继续深入学习一下。

因为,它在任何框架里面,我们都能看到它的影子。

  • Babel JS 官网
  • Babel JS Github

作为使用最广泛的 JS 编译器,他可以用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。

而它能够做到向下兼容或者代码转换,就是基于代码解析和改造。接下来,我们来说说:如何使用@babel/core 里面的核心四件套:@babel/parser@babel/traverse@babel/types@babel/generator

1. @babel/parser

@babel/parser 核心代码解析器,通过它进行词法分析及语法分析过程,最终转换为我们提到的 AST 形式。

假设我们需要读取 React  index.tsx 文件中代码内容,我们可以使用如下代码:


当然我不仅仅只读取 React 代码,我们甚至可以读取 Vue 语法。它也有对应的语法分析器,比如:@vue/compiler-dom 

此外,通过不同的参数传入 options,我们可以解析各种各样的代码。如果,我们只是读取普通的 .js 文件,我们可以不使用任何插件属性即可。


通过上述的代码转换,我们就可以得到一个标准的 AST 对象。在上一篇文章中,已做详细分析,在这里不在展开。比如:


2. @babel/traverse

当我们拿到一个标准的 AST 对象后,我们要操作它,那肯定是需要进行树结构遍历。这时候,我们就会用到 @babel/traverse 。

比如我们得到 AST 后,我们可以进行遍历操作:


那么我们访问的第一个结点,打印出 pt 的值,是怎样的呢?


是不是发现,这一个遍历怎么这么多东西?太长了,那么我们进行省略,只看关键部分:


我们可以看出是直接进入到了程序program结点。 对应的 AST 结点信息:


接下来,我们继续打印输出的结点信息,我们可以看出它访问的是 program.body 结点。


 

  • node 当前结点
  • parentPath 父结点路径
  • scope 作用域
  • parent 父结点
  • type 当前结点类型

现在我们可以看出这个访问的规律了,他会一直找当前结点 node 属性,然后进行层层访问其内容,直到将 AST 的所有结点遍历完成。

这里一定要区分 NodePath  Node 两种类型,比如上面:pt 是属于 NodePath类型,pt.node 才是 Node 类型。

其次,我们看到提供的方法除了 进入 [enter] 还有 退出 [exit] 方法,这也就意味着,每次遍历一次结点信息,也会退出当前结点。这样,我们就有两次机会获得所有的结点信息。

当我们遍历结束,如果找不到对应的结点信息,我们还可以进行额外的操作,进行代码结点补充操作。结点完整访问流程如下:

  • 进入> Program
    • 进入> node.body[0]
      • 进入> node.declarations[0]
        • 进入> node.id
        • 退出< node.id
        • 进入> node.init
        • 退出< node.init
      • 退出< node.declarations[0]
    • 退出< node.body[0]
    • 进入> node.body[1]
    • 退出< node.body[1]
  • 退出< Program

3. @babel/types

有了前面的铺垫,我们通过解析,获得了相关的 AST 对象。通过不断遍历,我们拿到了相关的结点,这时候我们就可以开始改造了。@babel/types 就提供了一系列的判断方法,以及将普通对象转换为 AST 结点的方法。

比如,我们想把代码转换为:


首先,我们要分析下,这个代码改了哪些内容?

  1. 变量声明从 const 改为 let
  2. 变量名从 me 改为 you
  3. 变量值从 “我” 改为 “你”

那么我们有两种替换方式:

  • 方案一:整体替换,相当于把 program.body[0]整个结点进行替换为新的结点。
  • 方案二:局部替换,相当于逐个结点替换结点内容,即:program.body.kind, program.body[0].declarations[0].idprogram.body[0].declarations[0].init

借助 @babel/types 我们可以这么操作,一起看看区别:


我们发现,不仅可以进行整体结点替换,也可以替换属性的值,都能达到预期效果。

当然 我们不仅仅可以全部遍历,我们也可以只遍历某些属性,比如 VariableDeclaration,我们就可以这样进行定义:


@babel/types 提供大量的方法供使用,可以通过官网查看。对于 @babel/traverse 返回的可用方法,可以查看 ts 定义:
babel__traverse/index.d.ts 文件。

常用的方法:p.stop() 可以提前终止内容遍历, 还有其他的增删改查方法,可以自己慢慢摸索使用!它就是一个树结构,我们可以操作它的兄弟结点,父节点,子结点。

4. @babel/generator

完成改造以后,我们需要把 AST 再转换回去,这时候我们就需要用到 @babel/generator 工具。只拆不组装,那是二哈【狗头】。能装能组,才是一个完整工程师该干的事情。

废话不多说,上代码:


配置项比较多,大家可以参考具体的说明,按照实际需求进行配置。

这里特别提一下:jsescOption: { minimal: true } 这个属性,主要是用来保留中文内容,防止被转为 unicode 形式。

Babel AST 实践

嘿嘿~ 都到这里了,大家应该已经能够上手操作了吧!

什么?还不会,那再把 1 ~ 4 的步骤再看一遍。慢慢尝试,慢慢修改,当你发现其中的乐趣时,这个 AST 的改造也就简单了,并不是什么难事。

留个课后练习:


大家可以去尝试下,怎么操作简单的 AST 实现代码改造!写文章不易,大家记得一键三连哈~

AST 应用是非常广泛,再来回忆下,这个 AST 可以干嘛?

  1. 代码转换领域,如:ES6 转 ES5, typescript 转 js,Taro 转多端编译,CSS预处理器等等。
  2. 模版编译领域,如:React JSX 语法,Vue 模版语法 等等。
  3. 代码预处理领域,如:代码语法检查(ESLint),代码格式化(Prettier),代码混淆/压缩(uglifyjs) 等等
  4. 低代码搭建平台,拖拽组件,直接通过 AST 改造生成后的代码进行运行。

 

下一期预告

《带你揭开神秘的Javascript AST面纱之手写一个简单的 Javascript 编译器》

作者:京东物流 柳宏

1.前置知识

1.1 基本概念

1.1.1 配载

  • 配载代表着某条线路是否具有发往某个方向(区域、省市县、分拣等)的能力,也可以说是网点(分拣中心)是否具有承载配载所指方向货物的能力。一般网络规划者,在均衡线路间货量时,会通过调整配载来完成。
  • 线路上可允许配载货物的“产品类型、最终妥投目的地”,通过线路的配载,计算 当前网点 到 目的网点 的 下一个网点 ,线路 绑定的配载代表通过当前线路最终可以到达的目的地 。以下图为例
Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 表示:如果放置在整个路由网络资源中,一个标记T1的货物要从北京发往福建,可选的路由有①北京站-北京-武汉-福建-福建站;②北京站-北京-广州-福建-福建站;之所以剔除了北京站-北京-上海-福建-福建站以及北京站-北京-武汉-上海-福建-福建站,正是因为后两条线路中未包含T1的配载代码,只标记了T2 ,说明这条线路只有配载航空的货物,而没有普通陆运的带货能力。
  • 下图就是用于描述配载的树形结构
Goland激活2023.1.1(GoLand 2023.1 发布)

 

1.1.2 班期与生失效日期

  • 班期:指的是发运频率,代表着每周七天中,这个班次的“上线时间”,一般来讲,维护时缺失某个值,会造成路由中断的现象。
  • 生失效日期:指的是该配载有效时间范围
Goland激活2023.1.1(GoLand 2023.1 发布)

 

1.1.3 配载合并逻辑

  • 网点四级地址的关系以配载树的形式展现,勾选节点添加的配载在右侧的配载列表中展示
Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 当某个节点的子节点没有全部勾选时,展示当前勾选的节点到配载列表中
Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 当某个节点的子节点全部勾选时(在符合相关条件时,这里涉及到的算法逻辑后面详述),展示相应的父节点到配载列表中,这个逻辑是递归的
Goland激活2023.1.1(GoLand 2023.1 发布)

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

1.2 现有实现技术

•目前的线路配载前端基于zTree+FixedHeaderTable+JQuery实现,通过zTree监听节点被选中和取消选中,计算该操作后是否触发节点的合并或展开,进而重新渲染配载列表中的数据

 

2. 现状问题

2.1 节点合并算法逻辑有误

  • 如果一个父节点下的所有子节点都被维护,即使子节点下的班期不同、生失效日期不重叠,系统都会自动合并到父节点。合并的展示效果为:
  • 班期:对于纯新增配载显示;对于父节点下有一个子节点,班期显示为已存在配载的班期
  • 生失效时间:统一为该切段线路的生失效日期
  • 例如:X线路被切割成两段,2022-11-02~2023-01-25以及2022-01-26~长久有效两段,在线路视图2022-11-02~2023-01-25 这段的配载维护,X下有A1(配载时间为2022-11-02~长久有效、班期12),其父节点为A,A下还有子节点A2、A3。今天是11.17日,将A2、A3都勾选上(时间任意,班期为12345),配载会立刻合并为A(生效时间2022-11-02~2023-01-25,配载)

2.2 配载保存和显示的值不一致

  • 上面操作触发合并,提交后库中保存的配载记录为:

2.3 本质原因

  • 原有根据zTree节点触发合并的算法有问题,不考虑当前节点下其他子节点的配载的班期和生失效日期,而是根据是否同一个父节点直接合并。导致合并逻辑错误,保存与展示的数据不一致。

 

3. 预期效果

3.1 配载合并班期逻辑

  • 条件:同一个父节点+各个子节点班期一致

3.2 配载生失效日期切断逻辑

  • 新添加节点,生效日期 为 参考日期,失效日期 为 线路失效日期
Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 参考日期选择 大于 当前 同级子节点的某天,当触发合并时
  • 合并后的父节点:生效日期取参考日期,失效时间取 同级子节点列表中失效时间最小的
  • 合并后的子节点:

1)如果 原始生效日期 小于 合并后 父节点的生效日期,则切断 原始生效日期 ~ 父节点的生效日期-1天(相当于保留切断前的生效日期那一段)

2)如果 原始失效日期 大于 合并后 父节点的失效日期,则切断 父节点的失效日期+1 ~ 原始失效日期 (相当于保留切断前的失效日期那一段)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 针对同一个节点的配载生失效日期切断的逻辑,举例

3.3 配载合并后保存逻辑

•采用所见即所的方式保存数据,用户在前端完成切断操作后,保存到数据库的记录与前端展示一致

 

4. 实现逻辑

4.1 整体逻辑

Goland激活2023.1.1(GoLand 2023.1 发布)

 

4.2 定义数据结构及初始化


 

在配载树上监听事件,当触发选中/取消选中时,递归的获取childrenNodes

Goland激活2023.1.1(GoLand 2023.1 发布)

 

维护配载与班期、配载与生失效日期的关系

Goland激活2023.1.1(GoLand 2023.1 发布)

 

将已有配载列表中的数据维护到stowageFrequencyMap、stowageTimeMap、originStowageMapTI中

Goland激活2023.1.1(GoLand 2023.1 发布)

 

4.3 配载合并班期逻辑

1)如果当前节点非禁用 && 勾选 执行 合并逻辑;否则递归遍历节点;最终返回结果集

Goland激活2023.1.1(GoLand 2023.1 发布)

 

2)如果当前节点非半选 && 非父节点,向父节点中查找班期,维护节点属性,加入结果集并返回

Goland激活2023.1.1(GoLand 2023.1 发布)

 

3)根据节点的pid查找stowageFrequencyMap中是否存在班期


 

1.如果是父节点则遍历,按照每个子节点去stowageFrequencyMap中获取班期,分为两种情况如下;找到班期后维护frequencyTreeMap,将同班期的节点维护到list中保存,即形成 班期-节点list的数据结构

2.向父节点中获取班期,同上

3.向子节点中递归获取班期,并将结果保存到新的数据结构frequencyChildMap中,然后合并到frequencyTreeMap中

Goland激活2023.1.1(GoLand 2023.1 发布)

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

对frequencyTreeMap集合进行判断,如果数量为1表示 与该节点同级的节点班期相同,触发了合并,将节点加入结果集返回;否则说明当前节点的同级节点存在不同班期,不能进行节点向上合并,直接遍历frequencyTreeMap中的value集合,加入结果集返回

Goland激活2023.1.1(GoLand 2023.1 发布)

 

对于触发了合并的结果集 frequencyTreeMap 中的每个节点遍历 同 当前线路的生失效日期比较,取出同级节点中的 最大生效时间最小失效时间作为该同级节点中的最大公共时间范围设置到每个节点属性中

Goland激活2023.1.1(GoLand 2023.1 发布)

 

4.4 配载生失效日期切断逻辑

定义变量


循环遍历每个结果集中的节点,判断是否渲染到配载列表中

Goland激活2023.1.1(GoLand 2023.1 发布)

 

根据当前节点id判断是否存在于 stowageList 中,如果存在直接显示;根据节点id删除originStowageMapTI集合

Goland激活2023.1.1(GoLand 2023.1 发布)

 

更新生失效日期,分别判断 原始配载中是否存在需要切断的日期,新添加配载中是否存在需要切断的日期;然后将当前节点添加到配载列表中

Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 遍历 originStowageMapTI ,判断历史的配载节点是否需要进行日期切断,分为以下两种情况;然后根据节点id删除 originStowageMapTI
  • 如果 originEnableTime < enableTime:添加新的配载记录,生效时间取 originEnableTime, 失效时间取newDisableTime
  • 如果 originDisableTime > disableTime:添加新的配载记录,生效时间取 newEnableTime, 失效时间取 originDisableTime
Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 遍历 newStowageMapTI ,判断新添加的节点是否需要进行日期切断;然后根据节点id删除 newStowageMapTI
  • 如果 originDisableTime > disableTime:添加新的配载记录,生效时间取 newEnableTime, 失效时间取 originDisableTime
Goland激活2023.1.1(GoLand 2023.1 发布)

 

5. 总结

•路由线路配载维护业务核心且频繁使用功能,为了实现业务述求,将完全没有关联的树形结构  Dom列表 结合在一起。采用了多种数据模型+数据结构的组合形式,构造两者之间的关系,结合遍历、深度优先搜索、字符串查找等算法进行实现,在春节串点优化专项上线后取得了预期的收益。

作者:京东零售 姜海

灵动岛是苹果在iPhone 14 Pro和iPhone 14 Pro Max上首次提出的全新UI交互形式,创新性的让虚拟软件和硬件的交互变得更为流畅。当有来电、短信等通知时,灵动岛会变化形态,以便让用户能够更直观地接收到这些信息。

而在用户使用一些应用App,比如音乐,并将其切换到后台时,灵动岛也能以另一种形态来显示这些软件,还可以通过轻点,重按等来实现的操作,比如切换歌曲。

苹果在iOS16.1系统对第三方开放了灵动岛的API,并允许开发者基于灵动岛开发相应软件,越来越多的APP开始基于灵动岛的交互进行设计和开发,本文将简单介绍灵动岛开发的流程和将其与业务场景相结合的思考。

接入灵动岛

如果项目之前开发过widget小组件,已经添加过Widget Extension,并有WidgetBundle文件,那么可以直接基于其进行扩展开发。但要注意的是,灵动岛开发用到的是Live Activity,主要包括锁屏通知,顶部通知等样式:

Goland激活2023.1.1(GoLand 2023.1 发布)

而并不是widget开发用到的Time Line形式,两者在UI形态上基本毫无关系,只是需要在WidgetBundle中实例化。如果之前没有开发过widget,可以参见另一篇文章:《Widget开发以及动态配置》

首先给工程添加Widget Extension:

Goland激活2023.1.1(GoLand 2023.1 发布)

勾选Live Activity:

Goland激活2023.1.1(GoLand 2023.1 发布)

建立Extension以后,系统会自动生成三个文件,除了widget开发用到的TimeLine相关内容的文件和WidgetBundle文件外,还会生成一个专门用来开发灵动岛Live Activity的文件:

Goland激活2023.1.1(GoLand 2023.1 发布)

文件中已经自动生成了部分代码大纲,可以直接查看效果并基于其上进行开发:


同时需要在info.plist中添加对Live Activity的支持,在TARGETS – Info – Custom iOS Target Properties中添加NSSupportsLiveActivities并设置为YES:

Goland激活2023.1.1(GoLand 2023.1 发布)

不同展示样式

灵动岛主要包括三种展示样式:

灵动岛被重按后,展开的完整模式(expanded)

Goland激活2023.1.1(GoLand 2023.1 发布)

此模式分为Leading、Trailing、Center和Bottom四个部分,在系统自动为我们生成的代码中,ActivityConfiguration的dynamicIsland中可以分别找到对应控制的代码段:


APP切后台后的长条形展示样式(compact)

此形式分为两个部分:左边的Leading,一般用于放图片icon等;右边的Trailing,一般用与放置文案描述

Goland激活2023.1.1(GoLand 2023.1 发布)

在系统自动为我们生成的代码中,ActivityConfiguration的dynamicIsland部分分别对应compactLeading和compactTrailing,可以在其中编写我们想要的UI展示:


其他APP切后台时,变化为灵动岛将本app挤占后展示的圆点模式(minimal)

此形势一般用于放置图标icon或动态图等

Goland激活2023.1.1(GoLand 2023.1 发布)

在系ActivityConfiguration的dynamicIsland部分对应minimal,可以在其中编写我们想要的UI展示


动态数据更新

上文说灵动岛视图布局是在ActivityConfiguration中编写的,而其上的数据更新依靠的是ActivityAttributes对象。需要注意的是,ActivityAttributes不需要跟ActivityConfiguration写在一起,就像view不需要跟model写在一起一样。

苹果官方建议ActivityAttributes分为两部分:固定不变的属性(比如总数,订单号等等)和会动态变化的属性(比如配送员名称,配送时间等等)。官方给出的demo是披萨配送的app,我们可以参考它的Attributes声明规则:


其中ContentState是会动态改变的部分。在完成布局编写后,实际的工程应用当中可以调用Activity对象的各种方法对灵动岛进行操作,包括开启,更新和关闭:

Goland激活2023.1.1(GoLand 2023.1 发布)

调用Activity<ActivityAttributes>.request成功开启灵动岛后,将APP切到后台,就可以看到效果了,调用request以及Activity<ActivityAttributes>里每一个activity的update方法,都可以触发ActivityConfiguration的闭包调用,从它回掉的context可以获取到Attributes的数据内容,比如context.state.deliveryManName和context.attributes.totalAmount:

Goland激活2023.1.1(GoLand 2023.1 发布)

与到家业务结合的思考

灵动岛提供了一种全新的“通知交互”形式,不再是单调的一个横幅或者提示框,而是一个实时显示,动态更新的UI,就像他的名字“Live Activity”一样,是一场“直播”。

对灵动岛的适配被形象地称为“登岛”,针对到家的业务场景,我们也做了一系列思考,最适用的业务场景也是下单后订单状态的实时更新“直播”,并且编写了Demo展示:

Goland激活2023.1.1(GoLand 2023.1 发布)

灵动岛挂件

灵动岛挂件是我们提出的另一种非常有意思的灵动岛应用。

首先,灵动岛的各项UI数据如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

经过精确布局,可以在灵动岛上动态的展示一个会动的挂件,就像在灵动岛上养了一只可爱的宠物:

Goland激活2023.1.1(GoLand 2023.1 发布)

我们会持续跟进最新的灵动岛技术动态,并且探索其他实用灵动岛的业务场景,利用这项技术带来更多的流量和利益点

目录

如何选择存储模型

如何选择数据分布方式

如何选择分布列

其他最佳设计建议

使用局部聚簇

使用分区表

选择数据类型


 

如何选择存储模型

进行数据库设计时,表设计上的一些关键项将严重影响后续整库的查询性能。表设计对数据存储也有影响:好的表设计能够减少I/O操作及最小化内存使用,进而提升查询性能。

表的存储模型选择是表定义的第一步。客户业务属性是表的存储模型的决定性因素,依据下面表格选择适合当前业务的存储模型。

存储模型

适用场景

行存

点查询(返回记录少,基于索引的简单查询)。

增删改比较多的场景。

列存

统计分析类查询 (group , join多的场景)。

如何选择数据分布方式

复制表(Replication)方式将表中的全量数据在集群的每一个DN实例上保留一份。主要适用于记录集较小的表。这种存储方式的优点是每个DN上都有该表的全量数据,在join操作中可以避免数据重分布操作,从而减小网络开销,同时减少了plan segment(每个plan segment都会起对应的线程);缺点是每个DN都保留了表的完整数据,造成数据的冗余。一般情况下只有较小的维度表才会定义为Replication表。

哈希(Hash)表将表中某一个或几个字段进行hash运算后,生成对应的hash值,根据DN实例与哈希值的映射关系获得该组的目标存储位置。对于Hash分布表,在读/写数据时可以利用各个节点的IO资源,大大提升表的读/写速度。一般情况下大表定义为Hash表。

范围(Range)和列表(List)分布是由用户自定义的分布策略,根据分布列的取值落入满足一定范围或者具体值的对应目标DN,这两种分布方式便于用户灵活地进行数据管理,但对用户本身的数据抽象能力有一定的要求。

策略

描述

适用场景

Hash

表数据通过hash方式散列到集群中的所有DN实例上。

数据量较大的事实表。

Replication

集群中每一个DN实例上都有一份全量表数据。

小表、维度表。

Range

表数据对指定列按照范围进行映射,分布到对应DN。

用户需要自定义分布规则的场景。

List

表数据对指定列按照具体值进行映射,分布到对应DN。

用户需要自定义分布规则的场景。

如图1所示,复制表如图中的表T1,哈希表如图中的表T2。

图1 复制表和哈希表

 

 

如何选择分布列

Hash分布表的分布列选取至关重要,需要满足以下原则:

  1. 列值应比较离散,以便数据能够均匀分布到各个DN。例如,考虑选择表的主键为分布列,如在人员信息表中选择身份证号码为分布列。
  2. 在满足上述条件的情况下,考虑选择查询中的连接条件为分布列,以便Join任务能够下推到DN中执行,且减少DN之间的通信数据量。

对于Hash分表策略,如果分布列选择不当,可能导致数据倾斜,查询时出现部分DN的I/O短板,从而影响整体查询性能。因此在采用Hash分表策略之后需对表的数据进行数据倾斜性检查,以确保数据在各个DN上是均匀分布的。可以使用以下SQL检查数据倾斜性

 

其中xc_node_id对应DN,一般来说,不同DN的数据量相差5%以上即可视为倾斜,如果相差10%以上就必须要调整分布列

GaussDB支持多分布列特性,可以更好地满足数据分布的均匀性要求。

Range/List分布表的分布列由用户根据实际需要进行选择。除了需选择合适的分布列,还需要注意分布规则对数据分布的影响。

其他最佳设计建议

使用局部聚簇

局部聚簇(Partial Cluster Key)是列存下的一种技术。这种技术可以通过min/max稀疏索引较快的实现基表扫描的filter过滤。Partial Cluster Key可以指定多列,但是一般不建议超过2列。Partial Cluster Key的选取原则:

  1. 受基表中的简单表达式约束。这种约束一般形如col op const,其中col为列名,op为操作符 =、>、>=、<=、<,const为常量值。
  2. 尽量采用选择度比较高(过滤掉更多数据)的简单表达式中的列。
  3. 尽量把选择度比较高的约束col放在Partial Cluster Key中的前面。
  4. 尽量把枚举类型的列放在Partial Cluster Key中的前面。 

使用分区表

分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储。这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。分区表和普通表相比具有以下优点:

  1. 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。
  2. 增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。
  3. 方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。

GaussDB支持的分区表为范围分区表。

范围分区表:将数据基于范围映射到每一个分区。这个范围是由创建分区表时指定的分区键决定的。分区键经常采用日期,例如将销售数据按照月份进行分区。

选择数据类型

高效数据类型,主要包括以下三方面:

  1. 尽量使用执行效率比较高的数据类型

    一般来说整型数据运算(包括=、>、<、≧、≦、≠等常规的比较运算,以及group by)的效率比字符串、浮点数要高。比如某客户场景中对列存表进行点查询,filter条件在一个numeric列上,执行时间为10+s;修改numeric为int类型之后,执行时间缩短为1.8s左右。

  2. 尽量使用短字段的数据类型

    长度较短的数据类型不仅可以减小数据文件的大小,提升IO性能;同时也可以减小相关计算时的内存消耗,提升计算性能。比如对于整型数据,如果可以用smallint就尽量不用int,如果可以用int就尽量不用bigint。

  3. 使用一致的数据类型

    表关联列尽量使用相同的数据类型。如果表关联列数据类型不同,数据库必须动态地转化为相同的数据类型进行比较,这种转换会带来一定的性能开销。

昨日我们发布了包含ChatGPT 聊天框(神奇海螺)和需求润色功能的禅道OpenAI插件1.0版本,广受大家欢迎。今天,最新版本1.1发布,新增任务和Bug的润色功能,还修复了权限及图片展示的问题,大家可以更方便、更顺畅地使用OpenAI插件啦!

任务润色

在执行-任务功能下,GPT可帮助团队成员进行任务的润色、完善和优化。

Goland激活2023.1.1(GoLand 2023.1 发布)

它可以:

  • 将任务标题、任务描述转换得更为清晰、具体;
  • 将原有语句转换得更符合语法规则;
  • 转换后不合适的需求可以进行重新转换,直到满意为止;
  • 可以根据转换后的内容再度调整原有任务描述,重新转换。

Bug润色

在测试-Bug功能下,在执行-任务功能下,GPT可帮助测试人员进行Bug的合理优化。

Goland激活2023.1.1(GoLand 2023.1 发布)

它可以:

  • 将Bug标题描述转换得更为清晰、具体,并符合语法规则;
  • 将Bug的复现步骤和期望分解为步骤、结构、期望三个更为清晰的结构;
  • 转换后不合适的Bug可以进行重新转换,直到满意为止;
  • 可以根据转换后的内容再度调整原有Bug描述、复现步骤和期望,重新转换。

插件安装和配置

下载地址:https://www.zentao.net/extension-viewExt-218.html

前提

为了使用这个插件,禅道管理员需要拥有:
1.一个可用的 OpenAI 账户和 API Key;
2.一个可以访问 OpenAI 服务的 SOCKS5 代理服务器(如果你的禅道服务器不能直接访问 OpenAI 服务)。

安装方式

1.在禅道插件管理中安装;
2.下载插件包后,解压并覆盖对应的 extension 目录到禅道的 extension 目录。

配置步骤

1.在后台 – 系统设置中,定位到 OpenAI 设置;
2.填写自 OpenAI 获取到的 API Key,并按照情况填写代理设置;
3.在后台 – 用户 – 权限中,为相应的用户组赋予 OpenAI 功能权限。

本次更新还修复了存在图片的内容可能展示错误的问题,修复了权限问题,欢迎免费下载使用OpenAI插件。更多新功能正紧锣密鼓筹备中,敬请期待~

Goland激活2023.1.1(GoLand 2023.1 发布)

Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper 帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。

总而言之,Mybatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于自己的事情。

Mybatis-Flex 是一个和 Mybatis-Plus 类似的框架,但各有特点。v1.1.0 主要更新内容如下:

  • 新增:Entity 的 onSet、onUpdate、onInsert 添加全局监听器的配置
  • 优化:移除 QueryColumn.isNull 和 isNotNull 的参数
  • 优化:重构 CustomKeyGenerator 的部分代码
  • 修复:UpdateEntity 工具类在某些场景下出错的问题
  • 修复:审计消息 AuditMessage 在 entity 配置 typeHandler 时,获取的参数不正确的问题
  • 文档:添加 entity 全局监听器的相关文档

在上一个版本发布了,Mybatis-Flex 和 Mybatis-Plus 的功能对比后,应一些同学的要求,这个版本也放出了 Mybaits-Flex 和 Mybaits-Plus 性能对比的测试源码以及测试结果。

Goland激活2023.1.1(GoLand 2023.1 发布)

测试方法很简单

使用 h2 数据库,在初始化的时候分别为 flex 和 plus 创建两个不同的数据库, 但是完全一样的数据结构、数据内容和数据量(每个库 2w 条数据)。

直接进行预热,之后通过打印时间戳进行对比,消耗的时间越少,性能越高(每次测试 10 轮)。

测试步骤:

  • 1、clone 代码。
  • 2、直接运行    方法即可。

查询单条数据

Mybatis-Flex 的性能大概是 Mybatis-Plus 的 5 ~ 8 倍。

以下是日志,需要注意的是:每台机器的每次测试的数值肯定有所不同,但是应该会维持一个大概的比例。

 --------------- >>>>>>>testFlexSelectOne:26 >>>>>>>testPlusSelectOneWithLambda:109 >>>>>>>testPlusSelectOne:119 --------------- >>>>>>>testFlexSelectOne:19 >>>>>>>testPlusSelectOneWithLambda:104 >>>>>>>testPlusSelectOne:98 --------------- >>>>>>>testFlexSelectOne:15 >>>>>>>testPlusSelectOneWithLambda:94 >>>>>>>testPlusSelectOne:95 --------------- >>>>>>>testFlexSelectOne:16 >>>>>>>testPlusSelectOneWithLambda:90 >>>>>>>testPlusSelectOne:87 --------------- >>>>>>>testFlexSelectOne:15 >>>>>>>testPlusSelectOneWithLambda:93 >>>>>>>testPlusSelectOne:55 --------------- >>>>>>>testFlexSelectOne:10 >>>>>>>testPlusSelectOneWithLambda:60 >>>>>>>testPlusSelectOne:48 --------------- >>>>>>>testFlexSelectOne:8 >>>>>>>testPlusSelectOneWithLambda:54 >>>>>>>testPlusSelectOne:51 --------------- >>>>>>>testFlexSelectOne:8 >>>>>>>testPlusSelectOneWithLambda:57 >>>>>>>testPlusSelectOne:56 --------------- >>>>>>>testFlexSelectOne:9 >>>>>>>testPlusSelectOneWithLambda:69 >>>>>>>testPlusSelectOne:55 --------------- >>>>>>>testFlexSelectOne:7 >>>>>>>testPlusSelectOneWithLambda:56 >>>>>>>testPlusSelectOne:55
 

查询 List 数据,限制 10 条

Mybatis-Flex 的性能大概是 Mybatis-Plus 的 5 倍左右

 --------------- >>>>>>>testFlexSelectTop10:12 >>>>>>>testPlusSelectTop10WithLambda:56 >>>>>>>testPlusSelectTop10:53 --------------- >>>>>>>testFlexSelectTop10:10 >>>>>>>testPlusSelectTop10WithLambda:57 >>>>>>>testPlusSelectTop10:56 --------------- >>>>>>>testFlexSelectTop10:9 >>>>>>>testPlusSelectTop10WithLambda:51 >>>>>>>testPlusSelectTop10:47 --------------- >>>>>>>testFlexSelectTop10:9 >>>>>>>testPlusSelectTop10WithLambda:50 >>>>>>>testPlusSelectTop10:48 --------------- >>>>>>>testFlexSelectTop10:8 >>>>>>>testPlusSelectTop10WithLambda:51 >>>>>>>testPlusSelectTop10:47 --------------- >>>>>>>testFlexSelectTop10:9 >>>>>>>testPlusSelectTop10WithLambda:50 >>>>>>>testPlusSelectTop10:47 --------------- >>>>>>>testFlexSelectTop10:8 >>>>>>>testPlusSelectTop10WithLambda:50 >>>>>>>testPlusSelectTop10:49 --------------- >>>>>>>testFlexSelectTop10:7 >>>>>>>testPlusSelectTop10WithLambda:50 >>>>>>>testPlusSelectTop10:47 --------------- >>>>>>>testFlexSelectTop10:6 >>>>>>>testPlusSelectTop10WithLambda:46 >>>>>>>testPlusSelectTop10:49 --------------- >>>>>>>testFlexSelectTop10:8 >>>>>>>testPlusSelectTop10WithLambda:48 >>>>>>>testPlusSelectTop10:77
 

分页查询

Mybatis-Flex 的性能大概是 Mybatis-Plus 的 3~5 倍左右

 --------------- >>>>>>>testFlexPaginate:63 >>>>>>>testPlusPaginate:181 --------------- >>>>>>>testFlexPaginate:47 >>>>>>>testPlusPaginate:197 --------------- >>>>>>>testFlexPaginate:37 >>>>>>>testPlusPaginate:115 --------------- >>>>>>>testFlexPaginate:31 >>>>>>>testPlusPaginate:113 --------------- >>>>>>>testFlexPaginate:29 >>>>>>>testPlusPaginate:103 --------------- >>>>>>>testFlexPaginate:27 >>>>>>>testPlusPaginate:111 --------------- >>>>>>>testFlexPaginate:24 >>>>>>>testPlusPaginate:102 --------------- >>>>>>>testFlexPaginate:23 >>>>>>>testPlusPaginate:102 --------------- >>>>>>>testFlexPaginate:23 >>>>>>>testPlusPaginate:104 --------------- >>>>>>>testFlexPaginate:21 >>>>>>>testPlusPaginate:101
 

数据更新

Mybatis-Flex 的性能大概是 Mybatis-Plus 的 5~10 倍左右。

 --------------- >>>>>>>testFlexUpdate:11 >>>>>>>testPlusUpdate:61 --------------- >>>>>>>testFlexUpdate:10 >>>>>>>testPlusUpdate:49 --------------- >>>>>>>testFlexUpdate:6 >>>>>>>testPlusUpdate:39 --------------- >>>>>>>testFlexUpdate:5 >>>>>>>testPlusUpdate:40 --------------- >>>>>>>testFlexUpdate:5 >>>>>>>testPlusUpdate:36 --------------- >>>>>>>testFlexUpdate:5 >>>>>>>testPlusUpdate:34 --------------- >>>>>>>testFlexUpdate:6 >>>>>>>testPlusUpdate:33 --------------- >>>>>>>testFlexUpdate:4 >>>>>>>testPlusUpdate:32 --------------- >>>>>>>testFlexUpdate:4 >>>>>>>testPlusUpdate:34 --------------- >>>>>>>testFlexUpdate:5 >>>>>>>testPlusUpdate:32

相关测试源码放在 gitee 上:https://gitee.com/mybatis-flex/mybatis-benchmark ,大家可以自己运行测试源码查看自己的运行结果。

 

以下是 Mybaits-Flex 和 Mybaits-Plus 以及 阿里云云效团队的 Fluent-Mybatis 的一些功能对比:

功能或特点 MyBatis-Flex MyBatis-Plus Fluent-Mybatis 对 entity 的基本增删改查 ✅ ✅ ✅ 分页查询 ✅ ✅ ✅ 分页查询之总量缓存 ✅ ✅ ❌ 分页查询无 SQL 解析设计(更轻量,及更高性能) ✅ ❌ ✅ 多表查询: from 多张表 ✅ ❌ ❌ 多表查询: left join、inner join 等等 ✅ ❌ ✅ 多表查询: union,union all ✅ ❌ ✅ 单主键配置 ✅ ✅ ✅ 多种 id 生成策略 ✅ ✅ ✅ 支持多主键、复合主键 ✅ ❌ ❌ 字段的 typeHandler 配置 ✅ ✅ ✅ 除了 Mybatis,无其他第三方依赖(更轻量) ✅ ❌ ❌ QueryWrapper 是否支持在微服务项目下进行 RPC 传输 ✅ ❌ 未知 逻辑删除 ✅ ✅ ✅ 乐观锁 ✅ ✅ ✅ SQL 审计 ✅ ❌ ❌ 数据填充 ✅ ✔️
 
(收费) ✅ 数据脱敏 ✅ ✔️
 
(收费) ❌ 字段权限 ✅ ✔️
 
(收费) ❌ 字段加密 ✅ ✔️
 
(收费) ❌ 字典回显 ✅ ✔️
 
(收费) ❌ Db + Row ✅ ❌ ❌ Entity 监听 ✅ ❌ ❌ 多数据源支持 ✅ 借助其他框架或收费,不支持非Spring项目 ❌ 多租户 ✅ ✅ ❌

更多对比细节请移步:https://mybatis-flex.com/zh/comparison.html

进一步了解 MyBatis-Flex 框架,请参考一下链接:

  • 1、快速开始:https://mybatis-flex.com/zh/getting-started.html
  • 2、强大的 QueryWrapper:https://mybatis-flex.com/zh/querywrapper.html
  • 3、逻辑删除:https://mybatis-flex.com/zh/logic_delete.html
  • 4、乐观锁:https://mybatis-flex.com/zh/version.html
  • 5、数据填充:https://mybatis-flex.com/zh/fill.html
  • 6、数据脱敏:https://mybatis-flex.com/zh/mask.html
  • 7、SQL 审计:https://mybatis-flex.com/zh/audit.html
  • 8、多数据源:https://mybatis-flex.com/zh/multi-datasource.html
  • 9、多租户:https://mybatis-flex.com/zh/multi-tenancy.html
  • 10、更多企业级的功能正在路上:https://mybatis-flex.com

UnitAuto – 机器学习零代码单测试平台

机器学习单测试平台,零代码、全方位、自动化 测试 方法 / 函数 的正确性、可用性和性能。
腾讯 IEG (互动娱乐事业群)、WXG (微信事业群) 两大事业群多个部门的多个项目以及快手广告使用中。

已被 互联网教育智能技术及应用国家工程实验室 收录。 

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

特点优势

相比 JUnit, JTest, Mockito, Mockk 等一堆 Compiling testing 工具:
1.其它工具需要每个方法都写一大堆测试代码,需要开发成本、需要解决测试代码的 bug、业务代码更改后需要同步修改测试代码等;
UnitAuto 不需要写任何代码,直接读取方法的属性,自动注入参数,拿到返回值和类成员变量,机器学习零代码自动化断言。

2.UnitAuto 这种 Runtime testing 工具无需 Mock 环境(Application, Context 等),
更不用为 无法有效地 Mock 环境相关类、第三方登录未提供 Mock 支持 等而头疼,
只要被测方法满足 有 return 值、有 interface 回调、改变成员变量 field 这 3 点中至少一点就能测。

 

unitauto-go 是机器学习零代码单测试平台 UnitAuto 的 Golang  版实现

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

1.0 更新内容:

完成 Go 扫描 package, struct, func;
Goland激活2023.1.1(GoLand 2023.1 发布)

新增支持自定义 Struct;
Goland激活2023.1.1(GoLand 2023.1 发布)
新增支持通过 interface { func } 回调的函数;

Goland激活2023.1.1(GoLand 2023.1 发布)

新增支持指针类型,完成断言当前实例成员变量的改动;

Goland激活2023.1.1(GoLand 2023.1 发布)

简化配置;
POST /method/list 自动生成注册 func 和 struct 的代码,方便粘贴到项目使用;
允许传构造方法参数;

解决调用异步回调函数不返回最终结果;
解决实例 this 返回值错误;

对异步回调函数模拟 3s 延迟;
完善使用 Golang 版做单测试的中英文介绍和使用文档;
优化代码和注释;
打包 Mac, Linux, Windows 可执行文件;

Goland激活2023.1.1(GoLand 2023.1 发布)

 

项目主页

https://github.com/TommyLemon/unitauto-go

码云主页

https://gitee.com/TommyLemon/unitauto-go

我要赞赏

创作不易,点右上角 ⭐Star 支持/收藏一下吧,谢谢 ^_^

Kubernetes 1.27 正式发布,这是 2023 年的第一个版本。这个版本包括 60 项增强功能。其中 18 项增强功能进入 Alpha、29 项进入 Beta,还有 13 项升级为 Stable 稳定版。

主题和标识

Kubernetes v1.27 的主题是 Chill Vibes

Goland激活2023.1.1(GoLand 2023.1 发布)

新内容

冻结镜像仓库

用 registry.k8s.io 替换旧的镜像仓库 k8s.gcr.io,后者已经普遍可用了几个月。Kubernetes 项目创建并运行 镜像仓库,完全由社区控制。这意味着旧的镜像仓库 将被冻结,并且不会再发布 Kubernetes 和相关子项目的镜像到旧的镜像仓库。

升级到稳定版

要使用默认的 seccomp 配置文件,你必须在每个要使用它的节点上使用 命令行标志运行 kubelet。如果启用,kubelet 将默认使用 seccomp 配置文件,该配置文件由容器运行时定义,而不是使用 模式。默认配置文件旨在提供强大的安全默认值,同时保留工作负载的功能。容器运行时及其发布版本之间的默认配置文件可能不同。

Jobs 可变调度指令 GA

这是在 v1.22 中引入的,开始是作为 beta 级别,现在已经稳定了。在大多数情况下,并行作业会希望 Pod 在约束条件下运行,例如所有 Pod 在同一区域内,或者所有 Pod 都在 GPU model x 或 y 上运行,而不是混合运行。 字段是实现这些语义的第一步。 允许自定义队列控制器决定何时启动作业。但是,一旦作业被取消挂起,自定义队列控制器就无法影响作业的 Pod 实际放置位置。

新的功能允许在作业开始之前更新 Jobs 的调度指令,这使得自定义队列控制器能够影响 Pod 的放置,同时将实际的 pod-to-node 的分配卸载给 kube-scheduler。这仅适用于以前从未恢复过的已挂起 Jobs。

DownwardAPIHugePages 升级为稳定版

在 Kubernetes v1.20 中,对和的支持被添加到 downward API 中,以便与其他资源如 CPU、内存等一致。这个功能在这个版本中毕业,升级到到稳定版。

Pod 调度进入测试阶段

创建后,Pods 可以进行调度了。Kubernetes 调度器会尽力找到节点来放置所有待定的 Pods。然而,在实际情况中,一些 Pods 可能会长时间处于缺少必要资源的状态。这些 Pod 实际上是以不必要的方式搅乱了调度器(以及下游集成器,如 Cluster Autoscaler)。

通过指定/删除 Pod 的 ,可以控制 Pod 何时可以被考虑进行调度。

通过 Kubernetes API 访问 Node 日志

该功能帮助集群管理员通过允许他们查询服务日志来调试运行在节点上的服务的问题。要使用此功能,请确保在该节点上启用了 ,且 kubelet 配置选项 和 均设置为 true。在 Linux 上,我们假定服务日志可通过 journald 获得。在 Windows 上,我们假定服务日志可在应用程序日志提供程序中获得。你还可以从 Linux 和 Windows 上的 和 目录中获取日志。

ReadWriteOncePod PersistentVolume 进入测试阶段

Kubernetes v1.22 引入了一种新的访问模式 ,用于 PersistentVolumes(PV)和 PersistentVolumeClaims(PVC)。此访问模式使你能够将卷访问限制为集群中的单个 Pod,确保仅有一个 Pod 可以同时写入该卷。这对于需要对存储进行 single-writer 的有状态工作负载特别有用。

ReadWriteOncePod beta 增加了对使用 ReadWriteOncePod PVC 的 Pod 的调度程序抢占支持。调度程序抢占允许更高优先级的 Pod 抢占低优先级的 Pod。

滚动升级后遵循 PodTopologySpread

是一个 Pod 标签键的列表。这些键用于从 Pod 标签中查找值。这些键值标签与 进行 AND 运算,以选择现有 Pod 组,计算传入 Pod 的分布。在 Pod 标签中不存在的键将被忽略。空列表表示仅匹配 。

使用 ,用户无需在不同版本之间更新 。控制器只需为不同版本的同一 键设置不同的值。调度程序将根据 自动假定这些值。

使用挂载加速 SELinux 卷重新标记

在此版本中,应用于 Pod 使用的卷的 SELinux 标签的方式将升级为 beta 版本。该功能通过挂载具有正确 SELinux 标签的卷来加快容器启动速度,而不是递归更改卷上的每个文件。支持 SELinux 的 Linux 内核允许在第一次挂载卷的时候使用 挂载选项在整个卷上设置 SELinux 标签,从而使所有文件在恒定时间内分配给定标签,而无需递归地遍历整个卷。

VolumeManager 重构进入测试阶段

这是一个卷管理器重构,允许 kubelet 在启动期间填充有关现有卷如何挂载的其他信息。一般来说,这使得卷清理更加稳健。如果在节点上启用 ,你将在 kubelet 启动期间获得已挂载卷的增强发现功能。

在 Kubernetes v1.25 之前,kubelet 在启动期间发现已挂载的卷时使用了不同的默认行为。如果你禁用此功能(默认情况下启用),则选择传统的发现行为。

更多详情可查看:https://kubernetes.io/blog/2023/04/11/kubernetes-v1-27-release/

3月30日,openGemini社区发布了v1.0.1版本,较v1.0.0版本,主要修复了一些异常场景下的发现的问题,欢迎大家下载试用和反馈。

v1.0版本新增了多个关键特性,并在数据压缩算法、内存管理、查询引擎等方面做了大量优化工作,整体性能取得进一步提升

由于对数据压缩算法进行了修改,v1.0版本与v0.2版本的数据存在不兼容

社区地址:​​https://github.com/openGemini​​

社区联系方式:​​http://opengemini.org/contact-us​​

性能优化

内存优化

内存优化是性能优化中非常重要的一部分,openGemini的关键优化项如下:

  1. 优化乱序文件合并流程 乱序文件合并不再将乱序文件全部加载到内存,改为流式合并方式,不同数据模型下,内存开销可减少20%-80%不等。
  2. 优化索引搜索流程 一方面在查询场景中,设置时间线内存分配上限,避免因无节制对内存索取,对其他查询请求造成影响;另一方面在查询数据组装过程中,放弃内存拷贝,改为数据原地更新,相比优化前,单次查询可减少40%内存空间使用。
  3. 查询场景优化

通常一个查询请求到来后,在openGemini内部会生成相关时间线的迭代器,时间线越多,一次性加载时间线数据和迭代器占用的内存空间越大,采用延迟加载技术,根据需要加载指定时间线的数据和迭代器,有效提升了内存的利用率,降低内存开销达80%以上。

查询优化

查询优化是性能优化中最为直接的优化源头,但查询优化是一个复杂的工程,需要多方面的数据库领域专家知识和经验,它使用了非常多的优化策略来生成一个最优的查询计划。通过性能测试,openGemini整体的性能较优化前再次提升了30%-80%,主要优化项如下:

  1. 简化DAG构建流程和编码 在openGemini内部,查询请求被生成为一棵树形的查询计划,为了将查询计划中各个操作尽可能并发起来,以达到查询效率提升的目的,需再转换成表示分布式执行计划的DAG关系图,由ts-sql分发到不同的ts-store节点执行。通常一个简单查询的DAG关系图序列化之后大小为1-2KB,其序列化和网络传输开销却成为了简单查询的性能瓶颈。通过对DAG进行编码,有效降低了网络数据传输数据量,降低网络开销达95%
  2. 时间范围查询优化 针对时间范围的查询,进行了预裁剪,提升了时间跨度较大场景下的查询性能
  3. 文件句柄优化 随着系统长期的运行,数据文件越来越多,这对操作系统的文件句柄资源带来较大的消耗,优化采用按需打开的方式进行文件句柄管理,极大的节约了系统文件句柄资源。
  4. 进程启动RTO优化 ts-store进程重启时,优化了immutable的open速度,支持WAL异步回放机制。优化后,500万时间线,存储共50.4亿条数据(Metrics),进程重启RTO为1.96s,提升400%
  5. castor服务优化

增加失败重试、连接池以提升可靠性;支持返回更详细的错误信息;castor算子支持Group By time和tags

数据压缩算法优化

openGemini采用列式数据存储,针对每一列数据,根据不同数据类型使用不同的数据压缩算法,从而实现较好的数据压缩效率。 Float类型数据在运维监控等场景下应用非常广泛,当前业界比较常用的是基于Facebook的Gorilla浮点数压缩算法,openGemini亦是如此。

但实际分析来看Gorilla算法在部分数据模型下,压缩率并不理想,存在优化空间,因此在openGemini中采用了自适应的压缩处理方式,根据Float数据特征的不同,选择不同的压缩算法。优化后,openGemini采用了Snappy,Gorilla,RLE三种压缩算法的组合,相比于单独使用Gorilla,压缩率提升了60%,解压耗时减少38%

新增特性

支持多表full join

在某些场景下,为了更灵活地分析时序数据,我们需要使用full join操作。例如:

 

用户可以编写以下查询语句来使用full join,并得到以下结果:

 

全连接查询语句以关键字ON后的等效条件连接左右子查询表中的所有行,并可以使用Group BY分组

支持流式聚合计算

海量数据场景下,传统CQ需要从磁盘读取大量数据进行计算,再写回磁盘文件。这种方式会出现一些问题

  • 磁盘I/O消耗过大,影响其他业务
  • 如果对同一张表做多种降采样,数据重复拉取
  • I/O放大效应明显,对内存、磁盘以及网络带宽造成巨大压力

流式聚合计算,采用5级Pipeline,stream阶段负责任务管理,数据接入以及初步过滤。window阶段负责时间窗口过滤、计算、以及数据下盘。该方式具有高性能、网络开销小等优点,能有效降低数据降采样的资源消耗。

创建流式聚合语句如下:

 

支持多级降采样

降采样(Downsampling)在此是指对时序数据进行降频,将原本较细粒度的数据降频后得到较粗粒度的数据。这样一来可以成倍减少历史数据规模,使得粗粒度的数据能够以更小的成本保存更长时间。

降采样后的数据点只保留原始数据的一些统计特征,openGemini支持七种统计特征:

  • max:采样周期内样本值的最大值
  • min:采样周期内样本值的最小值
  • mean:采样周期内样本值的平均值
  • sum:采样周期内样本值的和值
  • count:采样周期内样本数个数
  • first:采样周期内样本按时间序的第一个值
  • last:采样周期内样本按时间序的最后一个值

可见降采样会造成原始数据失真,而不同场景对数据失真的容忍程度不同,在查询一年趋势的场景下,数据只需要大致的趋势正确即可。

与其他数据库中降采样功能不同的是,openGemini可同时自定义多个降采样时间范围和策略。

创建降采样任务的示例语句如下:

 

上述语句中,针对表mst进行降采样,降采样分为三级,从第3天的数据开始做第一级降采样,采样周期为1分钟,采样对象为浮点和整形的字段,采样方法为上述7种统计方法。第6天开始做第二级降采样,以此类推。该功能可有效减少存储空间50%,节约计算资源90%。

支持近似分位数查询

在时序数据分析的场景中,有时需要能够有效的理解数据分布(例如,P50,P90,P95),而无需对庞大的时间序列数据集执行昂贵的计算,则可以使用近似分位数查询。

较多数据库使用 TDigest 算法计算百分位数,例如InfluxDB、ClickHouse,ElasticSearch等,该算法在数据分布末端精度较高,计算速度快,内存开销小。但其缺点是数据非末端时精度可能会降低。openGemini设计的OGSketch近似统计算法,全范围的近似分位数查询能达到更高的精度,并同时考虑了数据增量更新问题,大幅提升每次算法构建与查询的效率,有效降低查询时延。

查询语句示例如下:

 

支持holtWinters()时序预测算子

时序预测是一类经典的问题,在学术界和工业界都有着广泛的研究和应用。例如根据过去一段时间的数据预测存储空间何时达到水位线,或者预测一个设备何时可能老化进入故障维修期等。

holtWinters函数可在指定的间隔内预测给定Field Key的n个预测值,但该方法适用于具有周期性规律的时序数据。

使用示例如下:

 

节点间RPC通信支持数据压缩

openGemini各个节点之间使用RPC通信,当频繁查询大量数据时,可通过配置项打开该功能,可有效减少数据传输带宽,提高数据传输效率。

总结

本文主要介绍了openGemini v1.0新版本为用户提供的特性和性能优化,帮助大家更清楚了解新版本提供的能力,以及如何更好使用好这些能力。

欢迎大家试用和反馈,openGemini将一如既往提供更多更好用的功能,不断推动时序数据库的技术向前发展!

未来还将提供:

  • 高可靠性:支持数据多副本
  • 可观测性:支持openTelemetry的OLTP协议
  • 高时间序列基数:数据库不再受限于时间线规模
  • 标准SQL:支持标准SQL,降低学习成本
  • 软硬件结合:将DPU技术与openGemini相结合,打造openGemini极致性能

openGemini 共创新,赢未来!

渠成 DevOps 平台

渠成 DevOps 平台企业版1.0 正式发布,这是一套基于开源软件的 DevOps 平台。它包含禅道项目管理软件、 GitLab、Gitea、Jenkins 、SonarQube 等组件,能够实现从需求管理到代码托管,从持续集成到持续交付,从质量检测到自动化测试等完整的 DevOps 流程。

渠成 DevOps 平台不仅提供了 DevOps 解决方案的一键安装和配置,还提供了统一的用户管理和权限控制,并拥有丰富的数据分析和报表功能,可帮助企业提高 DevOps 效率和质量,实现敏捷开发和快速交付。

平台功能

DevOps 模块

DevOps 模块集成了持续集成、持续交付、持续部署、持续监控等功能。它可以帮助开发团队实现敏捷开发、快速交付、高效协作、质量保障等目标,提升软件开发的效率和质量。

image

DevOps 模块包含以下应用:

  • 项目管理:禅道开源版、禅道企业版、禅道旗舰版
  • 源代码管理:GitLab、Gitea
  • 流水线引擎:Jenkins
  • 代码扫描:SonarQube

解决方案

解决方案市场是一个为用户提供多种应用组合的平台,支持用户根据自己的需求选择最适合的解决方案。企业版用户还可以将应用组装成解决方案,并发布到内部的解决方案市场。

  • 极速安装
  • 自定义配置
  • 解决方案组装与发布

应用市场

提供官方的开源、商业软件,支持一键安装,数秒内就可以安装完成。企业版用户可以将自己的应用封装并发布到内部应用市场。

  • 极速安装
  • 自定义安装
  • 应用发布

服务管理

软件从应用市场安装后,运行在平台上,我们称之为服务。

  • 服务关闭、启动、重启、删除
  • 服务访问控制
  • 服务备份
  • 服务升级
  • 服务导出
  • 自定义域名

高可用

平台组件、平台上运行的服务原生具备高可用特性。

  • 内置K3s
  • 对接现有Kubernetes
  • 应用高可用
  • 平台组件高可用

仪表盘

展示平台资源使用情况与服务运行情况,一个页面了解全局。

  • 平台全局资源概况
  • 平台动态信息
  • 平台安装的应用详情

监控与告警

平台支持硬件资源、应用状态以及平台自身组件的状态监控与告警。

  • 资源监控
  • 组件监控
  • 行为审计监控
  • 应用指标监控
  • 告警配置

安全审计

平台内置行为与安全审计模块,同时为运行在平台中的应用提供WAF安全防护功能。

  • 平台行为审计
  • Web应用防火墙
  • 应用安全扫描

团队管理

提供团队创建、成员维护以及权限的配置。

  • 成员管理
  • 权限管理

集群管理

支持集群节点的维护、平台模块的监控与伸缩。

优势与价值

低成本

学习成本 维护成本 硬件成本 应用一键安装

降低技术概念

对接现有服务 一条命令安装

原生支持高可用

一键升级

手动/自动数据备份与恢复 4核心8G内存

单节点可运行

高集成

应用与平台 应用与应用 国产信创 应用与平台功能集成

应用→平台LDAP

应用→平台SMTP

应用→平台负载均衡 应用组合成解决方案

集成第三方SaaS应用 支持CentOS/Rocky

支持 Debian/Ubuntu

支持国产Linux系统

支持龙芯架构CPU

支持ARM架构CPU

易交付

在线安装 离线安装 对接现有系统 在线一条命令安装

在线升级

10分钟内安装完成 全组件离线安装

离线升级

5分钟内安装完成 平台可对接现有服务

平台可对接现有Kubernetes

迁移现有服务到平台

安装方式

渠成平台企业版安装方式

近日,北京奕斯伟计算技术股份有限公司(以下简称“ 奕斯伟计算”)签署openKylin社区CLA(Contributor License Agreement 贡献者许可协议),正式加入openKylin开源社区。

Goland激活2023.1.1(GoLand 2023.1 发布)

奕斯伟计算是一家以RISC-V为核心的新一代计算架构芯片与方案提供商,围绕智慧家居、智慧园区、智能交通、无线通信、工业物联网等应用场景,为客户提供显示交互、多媒体系统、智慧连接、车载系统、智能计算、电源管理等芯片及解决方案。

奕斯伟计算于2019年开始发力RISC-V计算架构自主研发,已完成系列化的32位嵌入式内核处理器开发,并应用于数十款自主研发芯片产品中;64位应用处理器内核已完成验证,相关芯片产品将用于多媒体、边缘计算、可穿戴设备等场景。

Goland激活2023.1.1(GoLand 2023.1 发布)

奕斯伟计算拥有全球半导体领域经验丰富的技术研发和经营管理团队。加入openKylin社区后,奕斯伟计算将积极参与社区建设,与社区开展更多方面、更深度的合作,共同推动RISC-V生态发展。

社区会员持续招募中

目前,openKylin社区会员招募正在火热进行中,欢迎更多企业伙伴加入,携手共建,打造桌面操作系统顶级社区,推动国产操作系统产业生态健康发展。详情可查看:【https://sigusoft.com/s/yk82DEQSG0knaQNKyc-vsg 

Goland激活2023.1.1(GoLand 2023.1 发布)

openKylin(开放麒麟)社区旨在以“共创”为核心,在开源、自愿、平等、协作的基础上,通过开源、开放的方式与企业构建合作伙伴生态体系,共同打造桌面操作系统顶级社区,推动Linux开源技术及其软硬件生态繁荣发展。

社区首批理事成员单位包括麒麟软件、普华基础软件、中科方德、麒麟信安、凝思软件、一铭软件、中兴新支点、心科技、中国电科32所、技德系统、北京麟卓、先进操作系统创新中心等13家产业同仁和行业机构。

 

 

审核:openKylin

因子挖掘是量化交易的基础。近年来,Python 是很多研究员进行数据分析和因子挖掘的主流工具。但是通过 Python 挖掘的有效因子在投产时,通常需要由 QUANT 团队的研究员将代码提交给 IT 团队,IT 团队用 C++ 代码转写后部署到生产环境,以满足实盘低延时的要求。这种做法虽然通过维护两套系统解决了产研一体化的问题,但开发周期较长,成本也相对较高。

量化金融是一个高度市场化、多方机构高度博弈的领域,因子的有效时间会随着博弈程度的加剧而缩短。如何使用更高效的工具和流程,更快地找到新的有效因子并投产部署到实盘交易,是每一个交易团队必须面对的问题。

本教程旨在指导用户基于 DolphinDB 快速搭建一个方便、快捷、扩展性好和兼容性强的流批一体因子计算平台原型,提供基于快照数据计算分钟因子进一步加工分钟因子为复杂因子的功能。

因子业务开发人员无需理解 DolphinDB 流计算框架的底层架构,仅需根据业务因子计算逻辑编写函数表达式,然后调度因子计算平台的计算接口,便可完成因子计算。

基于这一平台,开发人员无需再转写代码,因子投研和生产只需一套系统、一种脚本即可无缝切换,极大降低了开发运维成本,提高了因子投产的全流程效率。

1. 概述

在基于 Level-2 快照数据做实时分钟因子加工的时候,比如实时做 K 线,常常会面临以下几个问题:

  • 以机器时间还是事件时间作为窗口关闭的信号?
  • 如果使用事件时间作为窗口关闭的信号,如何保证及时关闭不活跃股票的计算窗口?
  • 如果使用事件时间作为窗口关闭的信号,如何保证及时关闭 11:30(午间休市)、14:57(连续竞价结束)的计算窗口 ?
  • 计算时窗口边界的开闭是左闭右开还是左开右闭?
  • 计算输出结果的时间是计算窗口起始时间还是结束时间?
  • 如果在某个计算窗口内,分组内没有数据,如何用前值或者指定值填充?

在基于分钟因子进一步加工有状态的复杂因子的时候,比如实时计算 MACD、RSI 等,常常会面临以下几个问题:

  • 计算因子是有状态的:不仅与当前的多个指标有关,而且与多个指标的历史状态相关,如何开发有状态的算子?
  • 有状态的算子如何实现增量计算,提高计算效率?
  • 在一次响应计算过程中,如果计算 1000 个因子,这 1000 个因子依赖一个共同的中间变量,如何避免重复计算?

DolphinDB 内置的时间序列流计算引擎可以满足 Level-2 快照数据实时分钟因子计算,响应式状态流计算引擎可以满足分钟因子进一步加工有状态的复杂因子的计算。上述问题会在本教程中逐一解答。本教程的示例内容只涉及分钟频的因子计算,但是 DolphinDB 的计算能力不局限于分钟频的因子,后续我们会陆续发布快照频率、1s 频率甚至更高频率的因子计算平台构建最佳实践教程。

2. Level-2 快照数据流批一体因子计算平台

2.1 因子计算平台业务使用流程

按照本教程部署完基于 DolphinDB 搭建的因子计算平台后,基于历史数据的因子开发阶段的调试流程如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

因子业务开发人员只需要在 DolphinDB 提供的集成开发环境中编写因子计算的函数表达式,然后调用因子计算平台的计算接口就可以完成调试。如果编写因子符合 DolphinDB 的语法,就可以成功执行并返回计算结果。如果编写因子不符合 DolphinDB 的语法,就会报错中断。

在已经开发了一定数量的因子后,需要在生产环境部署实时计算业务,部署流程如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

因子业务开发人员只需通过客户端调用封装好的实时因子计算服务执行函数,便可以完成部署。执行完以后,DolphinDB server 会出现该流计算服务的入口,是一个表对象,可以通过 DolphinDB 提供的实时数据接入工具来接入数据。同时也会自动创建流计算服务的出口,也是一个表对象,存储计算结果。

2.2 因子计算平台框架

本教程示例 Level-2 快照数据流批一体因子计算平台的架构如下图所示:

Goland激活2023.1.1(GoLand 2023.1 发布)

主要包括以下功能模块

  • 实时数据低延时接入功能模块
    • DolphinDB API 实时数据写入接口:C++ API, Java API 等
    • DolphinDB 实时行情接入插件:amdQuote, Insight, NSQ 等
    • DolphinDB 消息中间件订阅插件:Kafka, zmq, MQTT 等
  • 历史数据回放功能模块:因子开发阶段的调试和因子回测都需要基于历史数据,DolphinDB 提供了单表和多表的严格按照时序的控速回放功能,能够便捷高效地把已经存储在 DolphinDB 数据库中的历史数据回放成流。
  • 内置流计算引擎功能模块:DolphinDB 根据各种时序数据流式计算场景,开发了多个流计算引擎。本教程中,对快照数据做滚动窗口的聚合计算(计算生成不同分钟频的因子)使用了时间序列聚合流计算引擎,进一步加工成复杂因子用了响应式状态流计算引擎。
  • 集成开发环境功能模块:因子业务开发人员可以把 DolphinDB GUI 和 DolphinDB Vscode 作为集成开发环境,进行因子表达式代码的开发和调试。同时可以通过各种语言的 DolphinDB API 与 DolphinDB server 进行交互,进行任务的调度和作业的执行。
  • 低延时消息总线发布模块:DolphinDB 提供了对接各种消息队列中间件的插件,可以把实时计算结果推送到 Kafka, zmq, RabbitMQ, MQTT 等。

2.3 因子计算平台的计算能力

本教程示例 Level-2 快照数据流批一体因子计算平台拥有计算下述两类因子的能力:

(1)第一类:基于快照数据计算分钟因子

第一类因子是指直接对快照数据,做指定窗口大小的滚动窗口聚合计算,比如任意分钟的 K 线等聚合指标计算。第一类因子使用了 DolphinDB 内置的时间序列引擎(createTimeSeriesEngine),具体教程可参考时间序列引擎(createTimeSeriesEngine)。

(2)第二类:进一步加工分钟因子为复杂因子

第二类因子是指对第一类因子做进一步加工,做步长为1行、窗口为 n 行或者指定时间的滑动窗口计算,比如 EMA、RSI 等有状态因子的计算。第二类因子使用了 DolphinDB 内置的流计算引擎(createReactiveStateEngine),具体教程可参考响应式状态引擎(createReactiveStateEngine)。

2.4 用户二次开发自定义因子表达式

2.4.1 自定义分钟因子表达式

第一类因子是指直接对快照数据,做指定窗口大小的滚动窗口聚合计算,用了 DolphinDB 内置的时间序列引擎。时间序列引擎对以下聚合计算算子进行了优化,实现了增量计算,显著提升了性能:corr, covar, first, last, max, med, min, percentile, quantile, std, var, sum, sum2, sum3, sum4, wavg, wsum, count, firstNot, ifirstNot, lastNot, ilastNot, imax, imin, nunique, prod, sem, mode, searchK。所以,如果分钟因子可以直接用 DolphinDB 内置聚合算子表达,就可以实现增量计算。如果分钟因子复杂程度较高,无法直接用 DolphinDB 内置聚合算子直接表达,那么就需要用  函数声明自定义聚合计算函数来表达。

下面我们以分钟 K 线计算和指定窗口内的买卖压力指标计算为例,说明增量计算的因子表达式编写方式和非增量计算的因子表达式编写方式。

增量计算因子表达式

def High(){ return "max(LastPx)" }

函数名对应因子名称,表示分钟 K 线的最高价,业务上的计算逻辑是对计算窗口内发生的所有价格求最大值,可以用 DolphinDB 内置的聚合算子直接表达,所以用字符串直接表示,表示最新成交价格。因子计算平台会自动解析字符串为代码的格式 <max(LastPx)>,并传入时间序列引擎。 同理,分钟 K 线的开盘价、收盘价和最低价可以这样表示:

def Open(){ return "first(LastPx)" }

 

def Close(){ return "last(LastPx)" }

 

def Low(){ return "min(LastPx)" }

非增量计算因子表达式

defg Press(BidPrice0,BidPrice1,BidPrice2,BidPrice3,BidPrice4,BidPrice5,BidPrice6,BidPrice7,BidPrice8,BidPrice9,BidOrderQty0,BidOrderQty1,BidOrderQty2,BidOrderQty3,BidOrderQty4,BidOrderQty5,BidOrderQty6,BidOrderQty7,BidOrderQty8,BidOrderQty9,OfferPrice0,OfferPrice1,OfferPrice2,OfferPrice3,OfferPrice4,OfferPrice5,OfferPrice6,OfferPrice7,OfferPrice8,OfferPrice9,OfferOrderQty0,OfferOrderQty1,OfferOrderQty2,OfferOrderQty3,OfferOrderQty4,OfferOrderQty5,OfferOrderQty6,OfferOrderQty7,OfferOrderQty8,OfferOrderQty9){ bidPrice = matrix(BidPrice0,BidPrice1,BidPrice2,BidPrice3,BidPrice4,BidPrice5,BidPrice6,BidPrice7,BidPrice8,BidPrice9) bidQty = matrix(BidOrderQty0,BidOrderQty1,BidOrderQty2,BidOrderQty3,BidOrderQty4,BidOrderQty5,BidOrderQty6,BidOrderQty7,BidOrderQty8,BidOrderQty9) offerPrice = matrix(OfferPrice0,OfferPrice1,OfferPrice2,OfferPrice3,OfferPrice4,OfferPrice5,OfferPrice6,OfferPrice7,OfferPrice8,OfferPrice9) offerQty = matrix(OfferOrderQty0,OfferOrderQty1,OfferOrderQty2,OfferOrderQty3,OfferOrderQty4,OfferOrderQty5,OfferOrderQty6,OfferOrderQty7,OfferOrderQty8,OfferOrderQty9) wap = (bidPrice[0]*offerQty[0] + offerPrice[0]*bidQty[0])(bidQty[0]+offerQty[0]) bidw=(1.0(bidPrice-wap)) bidw=bidw(bidw.rowSum()) offerw=(1.0(offerPrice-wap)) offerw=offerw(offerw.rowSum()) press = log((bidQty*bidw).rowSum())-log((offerQty*offerw).rowSum()) return avg(press) }

函数名  对应因子名,表示买卖压力指标,, , ,  表示买卖方向的十档量价,其函数表达式如下:

Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)

该因子的表达式复杂度较高,无法直接用 DolphinDB 内置的聚合算子表示,需要用  函数声明自定义聚合计算函数来表达。因子计算平台会自动解析聚合函数  为代码的格式 <Press()>,并传入时间序列引擎。

2.4.2 自定义复杂因子表达式

第二类因子是指对第一类因子做进一步加工,做步长为1行、窗口为 n 行或者指定时间的滑动窗口计算,用了 DolphinDB 内置的响应式状态引擎。状态算子计算时需要用到历史状态。如果每一次计算都使用全量数据,性能不佳。状态函数的优化,也就是增量方式的流式实现非常关键。下列状态函数在 DolphinDB 的响应式状态引擎中的实现均得到了优化:

  • 累计窗口函数:cumavg, cumsum, cumprod, cumcount, cummin, cummax, cumvar, cumvarp, cumstd, cumstdp, cumcorr, cumcovar, cumbeta, cumwsum, cumwavg
  • 滑动窗口函数:ema, mavg, msum, mcount, mprod, mvar, mvarp, mstd, mstdp, mskew, mkurtosis, mmin, mmax, mimin, mimax, mmed, mpercentile, mrank, mcorr, mcovar, mbeta, mwsum, mwavg, mslr
  • 序列相关函数:deltas, ratios, ffill, move, prev, iterate, ewmMean, ewmVar, ewmStd, ewmCovar, ewmCorr

上述函数除了  返回两个值以外,其余函数均只有一个返回值。在后续的版本中,DolphinDB 将允许用户用插件来开发自己的状态函数,注册后即可在状态引擎中使用。

下面我们以进一步加工分钟收盘价为 MACD 为例:

@state def MACD(Close, SHORT_ = 12, LONG_ = 26, M = 9) { DIF = ewmMean(Close, span = SHORT_, adjust = false) - ewmMean(Close, span = LONG_, adjust = false) DEA = ewmMean(DIF, span = M, adjust = false) MACD = (DIF - DEA) * 2 return round(DIF, 3), round(DEA, 3), round(MACD, 3) }

函数名 MACD 对应因子名,Close 是指分钟收盘价,必须包括在时间序列聚合引擎的输出结果中。

在定义复杂因子表达式的时候,如果定义的函数是有状态的,即当前行返回值基于之前行的数据,则需要在定义函数前用  声明。

3. 部署和因子开发

3.1 因子计算平台部署

第一步

把本教程功能模块代码导入本地集成开发环境(DolphinDB GUI),功能模块源码见附录 SnapshotFactorCalculationPlatform。导入的目录结构必须严格按照下图所示结构:

Goland激活2023.1.1(GoLand 2023.1 发布)

第二步

右击 SnapshotFactorCalculationPlatform 目录,把本地模块代码同步到 DolphinDB server 端。

Goland激活2023.1.1(GoLand 2023.1 发布)

第三步

在 DolphinDB GUI 的 scripts 目录创建脚本文件,执行下述代码进行功能验证

use DolphinDBModules::SnapshotFactorCalculationPlatform::JsonConfig::JsonConfigLoad / 计算服务部署传参 testConfig.dos 是示例 Json 配置文件 parallel 指定计算的并行度 */ jsonPath = "https://www.xujun.org/modules/DolphinDBModules/SnapshotFactorCalculationPlatform/testConfig.dos" parallel = 2 // 执行计算服务部署函数 loadJsonConfig(jsonPath, parallel)

执行成功后,可以在 DolphinDB GUI 的右下角变量栏看到流计算相应的入口和出口的表变量:

Goland激活2023.1.1(GoLand 2023.1 发布)

此时,只需要把实时数据或者库内历史数据注入到入口  中,就会在出口(结果表)中看到相应的输出。

3.2 第一类分钟因子开发和调试

第一步

在 DolphinDB GUI 的 SnapshotFactorCalculationPlatform 模块的 Factor1 目录定义第一类分钟因子的表达式,按照 3.1 部署完因子计算平台后,内置了如下分钟因子,以调试 Close 和 Press 为例:

Goland激活2023.1.1(GoLand 2023.1 发布)

定义完新的因子表达式后,手动把修改后的模块文件同步到 DolphinDB server,如下图所示:

Goland激活2023.1.1(GoLand 2023.1 发布)

第二步

在 DolphinDB GUI 的 scripts 目录创建脚本文件,执行下述代码,生成 Json 格式的配置文件:

use DolphinDBModules::SnapshotFactorCalculationPlatform::JsonConfig::JsonGetFileString // 第一类分钟因子配置参数 FactorLevel1 = `Close`Press`Close`Press isInc = `true`false`true`false barMinutesLevel1 = 1 1 5 5 useSystemTime = `false`false`false`false // 指定存储 Json 配置文件的路径 jsonPath = "https://www.xujun.org/test.json" JsonFileString = JsonGetFileString(FactorLevel1, isInc, barMinutesLevel1, useSystemTime) saveTextFile(JsonFileString, jsonPath)

代码说明:

  • :指定需要计算的分钟因子名称,必须在 step1 中定义,并同步到 DolphinDB server。
  • :与  的长度相同,表示计算的分钟因子是否需要按照增量计算解析,“true” 表示计算因子按照增量计算函数解析,“false” 表示计算因子按照非增量计算函数解析。
  • :与  的长度相同,表示计算的分钟因子的频率,单位是“分”。
  • :与  的长度相同,表示计算的分钟因子的窗口关闭方式,“true” 表示用机器时间触发窗口,“false” 表示用事件时间触发窗口。同一个频率的计算因子窗口关闭方式必须一致。

执行完毕后,会在 DolphinDB server 部署目录生成一个 Json 格式的配置文件 test.json,内容如下:

[{"factor": "Close", "isInc": true, "barMinute": 1, "level": 1, "useSystemTime": false}, {"factor": "Press", "isInc": false, "barMinute": 1, "level": 1, "useSystemTime": false}, {"factor": "Close", "isInc": true, "barMinute": 5, "level": 1, "useSystemTime": false}, {"factor": "Press", "isInc": false, "barMinute": 5, "level": 1, "useSystemTime": false}]

第三步

在 DolphinDB GUI 的 scripts 目录创建脚本文件,执行下述代码,部署计算服务:

// 初始化流计算环境 use DolphinDBModules::ops clearAllStreamEnv() go // 执行计算服务部署函数 use DolphinDBModules::SnapshotFactorCalculationPlatform::JsonConfig::JsonConfigLoad jsonPath = "https://www.xujun.org/test.json" parallel = 1 loadJsonConfig(jsonPath, parallel)

注意,ops 功能模块中的  函数会把当前节点的所有订阅、引擎和共享表都会清除,所以在多人协作开发的环境中使用时需要注意。

第四步

把测试的 csv 数据文件放到 DolphinDB server 端服务器的指定位置,例如本教程放在 /hdd/hdd9/tutorials/SnapshotFactorCalculationPlatform/test.csv,测试的 csv 数据可在教程附录下载。然后在 DolphinDB GUI 的 scripts 目录创建脚本文件,执行下述代码,把 csv 数据按照流的方式回放进来:

use DolphinDBModules::SnapshotFactorCalculationPlatform::snapshotReplay csvPath = "/hdd/hdd9/tutorials/SnapshotFactorCalculationPlatform/test.csv" snapshotCsvReplayJob(csvPath, snapshotStream)

此时可以在 DolphinDB GUI 中执行函数 ,起到刷新客户端的效果,可以看到右下角变量栏的结果表不断地在更新,查看结果表中的数据,以 1 分钟计算结果表为例,具体内容如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

3.3 第二类复杂因子开发和调试

第一步

在 DolphinDB GUI 的 SnapshotFactorCalculationPlatform 模块的 Factor2 目录定义第二类复杂因子的表达式,按照 3.1节 部署完因子计算平台后,内置了如下复杂因子,以调试 RSI 和 MACD 为例:

Goland激活2023.1.1(GoLand 2023.1 发布)

定义完新的因子表达式后,手动把修改后的模块文件同步到 DolphinDB server。

第二步

在 DolphinDB GUI 的 scripts 目录创建脚本文件,执行下述代码,生成 Json 格式的配置文件:

use DolphinDBModules::SnapshotFactorCalculationPlatform::JsonConfig::JsonGetFileString // 第一类分钟因子配置参数 FactorLevel1 = `Close`Press`Close`Press isInc = `true`false`true`false barMinutesLevel1 = 1 1 5 5 useSystemTime = `false`false`false`false // 第二类复杂因子配置参数 FactorLevel2 = `RSI`MACD`RSI`MACD barMinutesLevel2 = [[1, 1], [1], [5], [5]] colNameLevel2 = [`RSI, `DIF`DEA`MACD, `RSI, `DIF`DEA`MACD] paramsName = [`N, `SHORT_`LONG_`M, `N,`SHORT_`LONG_`M] paramsValue = [[[24], [30]], [[18, 30, 10]], [[24]], [[9, 25, 6]], [[12, 26, 9]]] // 指定存储 Json 配置文件的路径 jsonPath = "https://www.xujun.org/test.json" JsonFileString = JsonGetFileString(FactorLevel1, isInc, barMinutesLevel1, useSystemTime, FactorLevel2, barMinutesLevel2, colNameLevel2, paramsName, paramsValue) saveTextFile(JsonFileString, jsonPath)

代码说明:

  • :指定需要计算的复杂因子名称,必须在 step1 中定义,并同步到 DolphinDB server。
  • :与  的长度相同,例子中第一个素  表示对 (RSI )做两个 1 分钟频率的计算,其窗口大小通过  配置。
  • :与  的长度相同,表示因子计算函数输出的列名。
  • :与  的长度相同,表示因子计算函数的参数名字。
  • :与  的长度相同,与  对应,如  对应 ,即 ,表示对 RSI 做两个 1 分钟频率的计算,其窗口大小分别是 24 和 30。

执行完毕后,会在 DolphinDB server 部署目录生成一个 Json 格式的配置文件 test.json,内容如下:

[{"factor": "Close", "isInc": true, "barMinute": 1, "level": 1, "useSystemTime": false}, {"factor": "High", "isInc": true, "barMinute": 1, "level": 1, "useSystemTime": false}, {"factor": "Low", "isInc": true, "barMinute": 1, "level": 1, "useSystemTime": false}, {"factor": "Close", "isInc": true, "barMinute": 5, "level": 1, "useSystemTime": false}, {"factor": "High", "isInc": true, "barMinute": 5, "level": 1, "useSystemTime": false}, {"factor": "Low", "isInc": true, "barMinute": 5, "level": 1, "useSystemTime": false}, {"factor": "RSI", "level": 2, "colName": `R_1, "barMinute": 1, "N": 24}, {"factor": "RSI", "level": 2, "colName": `R_2, "barMinute": 1, "N": 30}, {"factor": "MACD", "level": 2, "colName": `DIF_1`DEA_1`MACD_1, "barMinute": 1, "SHORT_": 18, "LONG_": 30, "M": 10}, {"factor": "RSI", "level": 2, "colName": `R_1, "barMinute": 5, "N": 24}, {"factor": "MACD", "level": 2, "colName": `DIF_1`DEA_1`MACD_1, "barMinute": 5, "SHORT_": 9, "LONG_": 25, "M": 6}]

第三步

在 DolphinDB GUI 的 scripts 目录创建脚本文件,执行下述代码,部署计算服务:

// 初始化流计算环境 use DolphinDBModules::ops clearAllStreamEnv() go // 执行计算服务部署函数 use DolphinDBModules::SnapshotFactorCalculationPlatform::JsonConfig::JsonConfigLoad jsonPath = "https://www.xujun.org/test.json" parallel = 1 loadJsonConfig(jsonPath, parallel)

注意,ops 功能模块中的  函数会把当前节点的所有订阅、引擎和共享表都会清除,所以在多人协作开发的环境中使用时需要注意。

第四步

把测试的 csv 数据文件放到 DolphinDB server 端服务器的指定位置,例如本教程放在 /hdd/hdd9/tutorials/SnapshotFactorCalculationPlatform/test.csv,测试的 csv 数据可在教程附录下载。然后在 DolphinDB GUI 的 scripts 目录创建脚本文件,执行下述代码,把 csv 数据按照流的方式回放进来:

use DolphinDBModules::SnapshotFactorCalculationPlatform::snapshotReplay csvPath = "/hdd/hdd9/tutorials/SnapshotFactorCalculationPlatform/test.csv" snapshotCsvReplayJob(csvPath, snapshotStream)

此时可以在 DolphinDB GUI 中执行函数 ,起到刷新客户端的效果,可以看到右下角变量栏的结果表不断地在更新,查看结果表中的数据,以 1 分钟复杂因子计算结果表为例,具体内容如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

 表示单次响应的计算耗时,单位是微秒。

3.4 Python 客户端调度任务和订阅结果

本教程用 jupyter 环境调试,具体测试软件版本如下:

  • DolphinDB server 版本:2.00.9.2
  • DolphinDB Python API 版本:1.30.21.1
  • Python 的版本:3.7.6

第一步

导入依赖的 Python 包,并与 DolphinDB server 建立连接:

import dolphindb as ddb import numpy as np s = ddb.session(host="localhost", port=8892, userid='admin', password='',enablePickle=False)

第二步

部署因子计算服务:

jsonPath = "https://www.xujun.org/modules/DolphinDBModules/SnapshotFactorCalculationPlatform/testConfig.dos" parallel = 1 scripts = """ use DolphinDBModules::ops clearAllStreamEnv() go use DolphinDBModules::SnapshotFactorCalculationPlatform::JsonConfig::JsonConfigLoad loadJsonConfig("{0}", {1}) """.format(jsonPath, parallel) s.run(scripts)

 路径是指 DolphinDB server 端的相对路径,是调试用的默认测试配置文件。

第三步

执行数据回放服务:

csvPath = "/hdd/hdd9/tutorials/SnapshotFactorCalculationPlatform/test.csv" scripts = """ use DolphinDBModules::SnapshotFactorCalculationPlatform::snapshotReplay snapshotCsvReplayJob("{0}", snapshotStream) """.format(csvPath) s.run(scripts)

 路径是指 DolphinDB server 所在服务器的绝对路径,需要用户自己下载测试数据(见附录),并放到相应目录。例如,本教程测试环境数据文件所在路径是 /hdd/hdd9/tutorials/SnapshotFactorCalculationPlatform/test.csv

第四步

查询数据至 python 客户端:

queryDate = "2021.12.01" SecurityID = "" scripts = """ select * from resultTable1Min where date(DateTime)={0}, SecurityID="{1}" """.format(queryDate, SecurityID) resultdf = s.run(scripts) resultdf

 的内容如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

第五步

Python 客户端订阅 DolphinDB server 端的结果表:

s.enableStreaming(0) def handler(lst): print(lst) s.subscribe(host="localhost", port=8892, handler=handler, tableName="aggr1Min", actionName="sub1min", offset=0, msgAsTable=False, filter=np.array(['']))

此处  设置为 0,表示从结果表的第一行数据开始订阅,订阅返回结果如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

如果想取消订阅,可以执行下述代码:

s.unsubscribe(host="localhost", port=8892,tableName="aggr1Min",actionName="sub1min")

调试完毕后,建议手动关闭 Python 客户端会话:

s.close()

其它语言的客户端,如 C++, Java 等,与 DolphinDB server 交互的方式与 Python 客户端相似,具体参考官方的教程文档即可。

3.5 计算结果实时推送至 Kafka

DolphinDB server 计算的结果,也可以实时推送到客户本地的低延时消息总线。本教程以推送至 Kafka 为例。开始调试下述功能的前提条件是在 Kafka 中创建好  的 topic,同时 DolphinDB server 已经加载 Kafka 插件。

在 DolphinDB GUI 的 scripts 目录创建脚本文件,执行下述代码,把 1 分钟因子计算结果表中的数据推送至 Kafka:

use DolphinDBModules::SnapshotFactorCalculationPlatform::resultToKafka producer = initKafkaProducer("localhost:9092") subscribeTable(tableName="aggr1Min", actionName="aggr1MinToKafka", offset=0, handler=aggr1MinToKafka{producer, "aggr1Min"}, msgAsTable=true)

其中,是指 Kafka 服务的部署 IP 和 Port。

Kafka 的消费者可以及时消费这些数据,如下图所示:

Goland激活2023.1.1(GoLand 2023.1 发布)

从 DolphinDB server 的监控日志可以看到,计算结果推送至 Kafka 的平均耗时约 180 微秒:

Goland激活2023.1.1(GoLand 2023.1 发布)

4. 流计算相关问题解答

4.1 时间序列引擎计算分钟因子

在基于 Level-2 快照数据做实时分钟因子加工的时候,比如实时做 K 线,常常会面临以下几个问题:

  • 以机器时间还是事件时间作为窗口关闭的信号?

本教程示例因子计算平台默认以事件时间作为窗口关闭的触发信号。DolphinDB 内置的时间序列引擎的 useSystemTime 参数可以控制以机器时间还是事件时间作为窗口关闭的信号。

  • 如果使用事件时间作为窗口关闭的信号,如何保证及时关闭不活跃股票的计算窗口?

本教程示例因子计算平台以股票为分组,不同组(即不同股票)之间没有触发窗口关闭的机制。DolphinDB 内置的时间序列引擎的 forceTriggerTime 参数设置后,可以通过活跃股票的数据强制触发不活跃股票的计算窗口关闭。

  • 如果使用事件时间作为窗口关闭的信号,如何保证及时关闭 11:30(午间休市)、14:57(连续竞价结束)的计算窗口 ?

本教程示例因子计算平台没有配置该功能。DolphinDB 内置的日级时间序列引擎的 forceTriggerSessionEndTime 参数可以满足上述场景。

  • 计算时窗口边界的开闭是左闭右开还是左开右闭?

本教程示例因子计算平台的规则是左闭右开。DolphinDB 内置的时间序列引擎的 closed 参数可以控制窗口边界规则。

  • 计算输出结果的时间是计算窗口起始时间还是结束时间?

本教程示例因子计算平台的规则是计算窗口起始时间。DolphinDB 内置的时间序列引擎的 useWindowStartTime 参数可以输出规则。

  • 如果在某个计算窗口内,分组内没有数据,如何用前值或者指定值填充?

本教程示例因子计算平台没有设置填充规则。DolphinDB 内置的时间序列引擎的 fill 参数可以指定填充规则,若(某个分组的)某个窗口无数据时,支持以下几种填充的规则:none 表示不输出结果;null 表示输出结果为 NULL;ffill 表示输出上一个有数据的窗口的结果;具体数值,需要和对应的 metrics 计算结果的类型保持一致。

4.2 响应式状态引擎计算复杂因子

在基于分钟因子进一步加工有状态的复杂因子的时候,比如实时计算 MACD、RSI 等,常常会面临以下几个问题:

  • 计算因子是有状态的:不仅与当前的多个指标有关,而且与多个指标的历史状态相关,如何开发有状态的算子?

DolphinDB 内置了大量有状态的算子,并进行了增量计算的优化,具体已经内置算子如下所示。

  • 累计窗口函数:cumavg, cumsum, cumprod, cumcount, cummin, cummax, cumvar, cumvarp, cumstd, cumstdp, cumcorr, cumcovar, cumbeta, cumwsum, cumwavg。
  • 滑动窗口函数:ema, mavg, msum, mcount, mprod, mvar, mvarp, mstd, mstdp, mskew, mkurtosis, mmin, mmax, mimin, mimax, mmed, mpercentile, mrank, mcorr, mcovar, mbeta, mwsum, mwavg, mslr。
  • 序列相关函数:deltas, ratios, ffill, move, prev, iterate, ewmMean, ewmVar, ewmStd, ewmCovar, ewmCorr。

DolphinDB 也允许用户用插件来开发自己的状态函数,注册后即可在状态引擎中使用。

  • 在一次响应计算过程中,如果计算 1000 个因子,这 1000 个因子依赖一个共同的中间变量,如何避免重复计算?

比如在上述因子计算平台的复杂因子计算处,有两个因子,分别叫 factor1 和 factor2,表达式如下:

@state def factor1(price) { a = ema(price, 20) b = ema(price, 40) tmp = 1000 * (a-b)(a+b) return ema(tmp , 10) - ema(tmp , 20) }

 

@state def factor2(price) { a = ema(price, 20) b = ema(price, 40) tmp = 1000 * (a-b)(a+b) return mavg(tmp, 10) }

可以看到,两个因子的计算都依赖了相同的中间变量。如果要避免中间变量的重复计算,可以先定义一个的函数,表达式如下:

@state def tmpFactor(price) { a = ema(price, 20) b = ema(price, 40) tmp = 1000 * (a-b)(a+b) return tmp }

然后把 factor1 和 factor2 的表达式用如下方式表示:

@state def factor1(price) { tmp = tmpFactor(price) return ema(tmp , 10) - ema(tmp , 20) }

 

@state def factor2(price) { tmp = tmpFactor(price) return mavg(tmp, 10) }

DolphinDB 内置的响应式状态引擎在解析复杂因子的计算表达式的时候,就会自动避免不同因子相同中间变量的重复计算。

5. 路线图(Roadmap)

  • 进一步完善 Level-2 快照数据流批一体因子计算平台的功能模块:
    • 开放更多配置参数,解决基于 Level-2 快照数据做实时分钟因子加工的时候遇到的问题
    • 补充 Factor1 和 Factor2 下的内置因子,丰富内置因子库
  • 开发 Level-2 快照频率流批一体因子计算平台功能模块
  • 开发 Level2 多数据源融合流批一体因子计算平台功能模块

附录

功能模块源码: SnapshotFactorCalculationPlatform

按照教程,把module内容同步到server后,测试所需脚本: test_scripts.zip

测试的 csv 数据: Level2_Snapshot_Factor_Calculation

 

RocketMQ消息投递策略

img

  • 作者: 博学谷狂野架构师
  • GitHub:GitHub地址 (有我精心准备的130本电子书PDF)

只分享干货、不吹水,让我们一起加油!😄

前言

RocketMQ的消息投递分分为两种:一种是往MQ Broker中投递;另外一种则是MQ broker 往 投递(这种的说法是从消息传递的角度阐述的,实际上底层是从MQ broker 中Pull拉取的)。本文将从模型的角度来阐述这两种机制。

RocketMQ的消息模型

RocketMQ 的消息模型整体并不复杂,如下图所示:

RocketMQ 消息模型

一个可能对应多个实际的消息队列(MessgeQueue)

在底层实现上,为了提高MQ的可用性和灵活性,一个Topic在实际存储的过程中,采用了多队列的方式,具体形式如上图所示。每个消息队列在使用中应当保证先入先出(FIFO,First In First Out)的方式进行消费。

那么,基于这种模型,就会引申出两个问题:

  • 生产者 在发送相同Topic的消息时,消息体应当被放置到哪一个消息队列(MessageQueue)中?
  • 消费者 在消费消息时,应当从哪些消息队列中拉取消息?

消息的系统间传递时,会跨越不同的网络载体,这会导致消息的传播无法保证其有序请

生产者投递策略

轮询算法投递

默认投递方式:基于轮询算法投递

默认情况下,采用了最简单的轮询算法,这种算法有个很好的特性就是,保证每一个的消息投递数量尽可能均匀,算法如下图所示:


代码示例

RocketMQ默认采用轮询投递策略


打印结果


消息投递延迟最小策略

默认投递方式的增强:基于轮询算法和的策略投递

默认的投递方式比较简单,但是也暴露了一个问题,就是有些可能由于自身数量积压等原因,可能在投递的过程比较长,对于这样的会影响后续投递的效果。

基于这种现象,RocketMQ在每发送一个MQ消息后,都会统计一下消息投递的,根据这个,可以知道往哪些投递的速度快。

在这种场景下,会优先使用的策略,如果没有生效,再使用的方式。


顺序投递策略

上述两种投递方式属于对消息投递的时序性没有要求的场景,这种投递的速度和效率比较高。而在有些场景下,需要保证同类型消息投递和消费的顺序性。

例如,假设现在有TOPIC ,该 Topic下有4个,该Topic用于传递订单的状态变迁,假设订单有状态:、、、、。

在时序上,生产者从时序上可以生成如下几个消息:


消息发送到MQ中之后,可能由于轮询投递的原因,消息在MQ的存储可能如下:

消息顺序性

这种情况下,我们希望消费消息的顺序和我们发送是一致的,然而,有上述MQ的投递和消费机制,我们无法保证顺序是正确的,对于顺序异常的消息, 即使有一定的状态容错,也不能完全处理好这么多种随机出现组合情况。

基于上述的情况,采用了这种实现方案:对于相同订单号的消息,通过一定的策略,将其放置在一个 ,然后再采用一定的策略(一个线程独立处理一个,保证处理消息的顺序性),能够保证消费的顺序性

消息顺序性问题

至于消费者是如何保证消费的顺序行的,后续再详细展开,我们先看是如何能将相同订单号的消息发送到同一个的:

生产者在消息投递的过程中,使用了 作为队列选择的策略接口,其定义如下:


相应地,目前RocketMQ提供了如下几种实现:

在这里插入图片描述

默认实现
投递策略 策略实现类 说明 随机分配策略 SelectMessageQueueByRandom 使用了简单的随机数选择算法 基于Hash分配策略 SelectMessageQueueByHash 根据附加参数的Hash值,按照消息队列列表的大小取余数,得到消息队列的index 基于机器机房位置分配策略 SelectMessageQueueByMachineRoom 开源的版本没有具体的实现,基本的目的应该是机器的就近原则分配

现在大概看下策略的代码实现:


代码示例

实际的操作代码样例如下,通过订单号作为hash运算对象,就能保证相同订单号的消息能够落在相同的。


打印结果如下


消费者分配队列

如何为消费者分配?

RocketMQ对于消费者消费消息有两种形式:

  • :广播式消费,这种模式下,一个消息会被通知到每一个
  • : 集群式消费,这种模式下,一个消息最多只会被投递到一个上进行消费 模式如下:

消费者分配队列

的消息模式比较简单,下面我们介绍下。对于使用了消费模式为进行消费时,需要保证一个在整个集群中只需要被消费一次。实际上,在RoketMQ底层,消息指定分配给消费者的实现,是通过分配给的方式完成的:也就是说,分配的单位是消息所在的。即:

将指定给特定的后,内的所有消息将会被指定到进行消费。

RocketMQ定义了策略接口,对于给定的,和、,应当被分配到哪些,定义如下:


相应地,RocketMQ提供了如下几种实现:

消费者分配策略

算法名称 含义 AllocateMessageQueueAveragely 平均分配算法 AllocateMessageQueueAveragelyByCircle 基于环形平均分配算法 AllocateMachineRoomNearby 基于机房临近原则算法 AllocateMessageQueueByMachineRoom 基于机房分配算法 AllocateMessageQueueConsistentHash 基于一致性hash算法 AllocateMessageQueueByConfig 基于配置分配算法

为了讲述清楚上述算法的基本原理,我们先假设一个例子,下面所有的算法将基于这个例子讲解。

假设当前同一个topic下有queue队列 个,消费者共有个,如下图所示:

消费者队列分配

下面依次介绍其原理:

平均分配算法

这里所谓的平均分配算法,并不是指的严格意义上的完全平均,如上面的例子中,10个queue,而消费者只有4个,无法是整除关系,除了整除之外的多出来的queue,将依次根据消费者的顺序均摊。

按照上述例子来看,,即表示每个平均均摊2个queue;而,即除了均摊之外,多出来2个还没有分配,那么,根据消费者的顺序、、、,则多出来的2个将分别给和。

最终,分摊关系如下:

  • :3个
  • :3个
  • :2个
  • :2个

平均分配算法

其代码实现非常简单:


演示效果
消费者A

消费者B

基于环形平均算法

环形平均算法,是指根据消费者的顺序,依次在由组成的环形图中逐个分配。具体流程如下所示:

基于环形平均算法

这种算法最终分配的结果是:

  • : #0,#4,#8
  • : #1, #5, # 9
  • : #2,#6
  • : #3,#7

其代码实现如下所示:


演示效果
设置算法

消费者A

消费者B

一致性hash分配算法

使用这种算法,会将作为Node节点构造成一个hash环,然后通过这个hash环来决定被分配给哪个。

其基本模式如下:

一致性hash分配算法

一致性hash算法用于在分布式系统中,保证数据的一致性而提出的一种基于hash环实现的算法

算法实现上也不复杂,如下图所示:


演示效果
设置算法

消费者A

消费者B

机房临近分配算法

该算法使用了,对分配策略进行了增强。一般在生产环境,如果是微服务架构下,RocketMQ集群的部署可能是在不同的机房中部署,其基本结构可能如下图所示:

机房临近分配

对于跨机房的场景,会存在网络、稳定性和隔离心的原因,该算法会根据的部署机房位置和的位置,过滤出当前相同机房的,然后再结合上述的算法,如基于平均分配算法在子集的基础上再挑选。相关代码实现如下:


基于机房分配算法

该算法适用于属于同一个机房内部的消息,去分配queue。这种方式非常明确,基于上面的的场景,这种更彻底,直接指定基于机房消费的策略。这种方式具有强约定性,比如名称按照机房的名称进行拼接,在算法中通过约定解析进行分配。

其代码实现如下:


基于配置分配算法

这种算法单纯基于配置的,非常简单,实际使用中可能用途不大。代码如下:


消费者如何指定分配算法

消费者构造方法

在DefaultMQPushConsumer构造方法中可以传入分配策略

默认情况下,消费者使用的是算法,也可以自己指定:


我们看到默认使用了平均分配策略

使用其他分配策略

如果需要使用其他分配策略,使用方式如下

本文由教研团队发布。

如果本文对您有帮助,欢迎和;如果您有任何建议也可或,您的支持是我坚持创作的动力。

转载请注明出处!

本文整理自字节跳动基础架构工程师何润康在 Flink Forward Asia 2022 核心技术专场的分享。Flink OLAP 是数据仓库系统的重要应用,支持复杂的分析型查询,广泛应用于数据分析、商业决策等场景。本次分享将围绕字节 Flink OLAP 整体介绍、查询优化、集群运维和稳定性建设、收益以及未来规划五个方面展开介绍。

 

一、字节 Flink OLAP 介绍

业务落地情况

Goland激活2023.1.1(GoLand 2023.1 发布)

字节 Flink OLAP 上线以来接入了包括 User Growth、飞书、电商和幸福里等 12 家以上核心业务方,集群规模达到 1.6 万 Core 以上,每天的查询规模超过 50w 次,单集群支持了复杂查询高峰期的 200 QPS,同时 Query Latency P99 控制在 5s 以内,较好的满足了业务的性能需求。

架构

Goland激活2023.1.1(GoLand 2023.1 发布)

Flink OLAP 的总体架构分为 Flink SQL Gateway 和 Flink Session Cluster 两部分。

首先,用户通过 Client 提交一个 Query,先经过 Gateway 的 SQL 解析和优化过程,生成作业的执行计划,再提交给 Flink Session Cluster 的 JobManager,JobManager 的 Dispatcher 组件会创建一个对应的 JobMaster,并根据特定的调度规则将 Task 部署到对应的 TaskManager 上执行,最后将执行的结果返回给 Client。

Goland激活2023.1.1(GoLand 2023.1 发布)

Flink OLAP 是作为内部自研的高性能 HTAP 产品 — ByteHTAP 的 AP 引擎,用于支持内部的核心业务。通过支持双机房部署提高容灾能力,每个新接入的业务可以在双机房垂直部署两套 AP 集群,在线上集群出现严重故障时,可以通过 Proxy 快速切流到另一个集群,从而提高服务的可用性。

业务落地挑战

Goland激活2023.1.1(GoLand 2023.1 发布)

Flink 在流式场景的应用已经十分成熟,在批式场景的应用也在逐步扩大,但是在 OLAP 场景下的打磨和使用则较少。字节 Flink OLAP 在真实的业务落地过程中遇到了很多问题和挑战,主要分为对性能和运维稳定性的挑战。

在性能方面的一大挑战是 OLAP 业务要求亚秒级的作业 Latency,这和流批有很大的不同,流式和批式主要关注数据的处理速度,而不需要关注 Plan 构建、Task 初始化等阶段的耗时。但是在 OLAP 场景下,优化这些阶段的耗时就变得非常重要。另外,字节 Flink OLAP 基于存算分离架构,有更加强烈的算子下推需求。

另一个挑战是,OLAP 业务要求较高的 QPS,所以当 OLAP 集群频繁地创建和执行作业,某些情况下会导致集群出现严重的性能问题,但是在流式和批式下只需要执行一次通常不会出现问题。因此,针对以上不同,在 OLAP 场景下进行了很多查询相关的优化,比如 Plan 的构建加速和初始化等相关优化。

Goland激活2023.1.1(GoLand 2023.1 发布)

在业务的落地过程中,OLAP 和流批场景有很大的不同,运维、监控和稳定性都需要针对 OLAP 场景单独构建。

在运维方面,OLAP 是在线服务,对可用性的要求很高,所以完善测试流程和测试场景是非常必要的,可以减少线上 Bug 的概率。另外在运维升级时,不同于流批作业的直接重启升级,OLAP 集群的运维升级因为不能中断用户使用,所以如何做到无感知升级是一个挑战。

在监控方面,为了保障在线服务的可用性,线上集群出现问题后,需要及时进行故障恢复和定位。因此针对 OLAP 下的监控体系就尤为重要。除了流批的集群状态监控外,OLAP 场景下特有的慢查询分析和监控,是需要额外构建的。

在稳定性方面,第一个挑战是建设 OLAP 容灾能力。流批和 OLAP 的故障恢复策略不同,流式作业通过 Failover 来恢复,批式作业通过作业重跑或 Failover 来恢复。在 OLAP 下,多个作业同时运行在一个在线集群上,单个作业失败可以重试,但是整个集群出现无法恢复的故障时,如果采用重启恢复,分钟级别的耗时对于线上服务是无法接受的。第二个挑战是 Full GC 的治理,流批作业对 Full GC 的容忍度相对较高,但是 OLAP 下业务对 Latency 非常敏感,而且 Full GC 还会导致同时运行的其它作业变慢,严重影响用户体验。

 

二、查询优化

Query Optimizer 优化

Plan 缓存

Goland激活2023.1.1(GoLand 2023.1 发布)

在 OLAP 场景下,Query 有两个典型的特点:业务上重复的 Query 和亚秒级的查询耗时。通过分析发现,Plan 阶段的耗时为几十到几百毫秒,占比较高。因此支持了 Plan 缓存,避免相同 Query 的重复 Plan。此外也支持了 Catalog Cache,加速信息的访问,还支持 ExecNode 的并行 Translate,使 TPC-DS Plan 的耗时降低了 10% 左右。

算子下推

Goland激活2023.1.1(GoLand 2023.1 发布)

在存算分离架构下,算子下推是一类非常重要的优化。核心思路是尽可能的将一些算子下推到存储层进行计算,大幅减少 Scan 的数据量,降低外部的 IO,同时也能够减少 Flink 引擎需要处理的数据量,从而明显提升 Query 的性能。

TopN 下推:在字节内部的一个典型业务上,大部分 Query 都是取 TopN 的数据。通过支持 TopN 的下推优化,把 Local SortLimit 算子,也就是 Local 的 TopN 算子,下推到了 Scan 节点,最终在存储层做 TopN 计算,从而大幅降低从存储读取的数据量。经过优化后,读取数据量降低了 99.9%,业务 Query 的 Latency 降低了 90.4%。 除此之外,也支持了包括 Aggregate、Filter、Limit 等更多的算子下推。

Goland激活2023.1.1(GoLand 2023.1 发布)

跨 Union All 的常见算子下推:字节内部某个业务的数据是按照典型的分库分表存放的,在该场景下,用户如果需要查询全量数据,会对多张表进行 Union All 后再进行计算。目前,Flink Planner 缺乏对常用算子跨 Union All 下推的支持,导致用户查询会从 Source 读取大量的数据,并且处理这些数据也会占用大量的资源,最终导致资源消耗和 E2E Latency 都较高。因此支持了常用算子跨 Union All 下推的优化,包括 Aggregate,SortLimit 和 Limit 算子。

以 Aggregate 为例,从图中可以看出,在优化之前,Union All 节点的下游是一个 Local Aggregate 节点。由于当前 Flink Planner 不支持跨 Union All 的算子下推,导致这里的 Local Aggregate 节点无法下推到 Union All 的上游,也无法进一步下推到 Scan 节点,导致从存储读取了大量的数据。优化之后把 Local Aggregate 节点推到了 Union All 的上游,最终下推到了存储做计算。经过优化后,业务查询的 E2E Latency 降低 42%,Flink 集群的 CPU 消耗降低 30%。

Join Filter 传递

Goland激活2023.1.1(GoLand 2023.1 发布)

在线上业务的查询中,带 Join 的查询是非常多的,其中大部分的查询是 Equal Join,并且带一个 Filter 条件。但是由于 Join 一侧的 Filter 没有传递到 Join 的另一侧,从而导致 Scan 的数据量较大,进而影响查询性能。

因此支持了 Join Filter 的传递。从上图中可以看出,t1 表的 Filter t1.id > 1,可以通过 Equal 的 Join 条件 t1.id=t2.id,推导出 t2.id>1。因此可以推到 t2 Scan 节点的上游,同时由于支持了 Filter 传递,最终 t2.id>1 会被下推到存储做计算,那么从 t2 的 Scan 节点读取的数据会大幅减少,从而提升查询性能。

Query Executor 优化

Classloader 复用优化

Goland激活2023.1.1(GoLand 2023.1 发布)

在线上集群持续运行的过程中,我们发现了JM / TM 进程频繁创建 Classloader,导致 CPU 占用过高的问题。通过火焰图分析,JVM Dictionary::find 占据了 70% 以上的 CPU,进一步分析 JVM 源码发现,JVM 在加载了 class 之后,为了加速从 class name 到 Classloader 的查找,会维护一个名叫 SystemDictionary 的哈希表。在 Classloader 数量非常多的时候,哈希表中存在大量的冲突,导致查找过程非常缓慢,同时整个 JM 大部分的 CPU 都消耗在这个步骤。

通过定位发现,这些 Classloader 都是 UserCodeClassloader,用于动态加载用户的 Jar 包。从图中看出,新 Job 的 JobMaster 和 TM 上该 Job 的 Task 都会创建新的 UserCodeClassloader,导致 JM 和 TM 上的 Classloader 过多。除此之外,Classloader 过多还会导致 JVM Metaspace 空间不足,进而频繁地触发 Metaspace Full GC。

Goland激活2023.1.1(GoLand 2023.1 发布)

因此支持了 Classloader 复用的优化,分为两步:首先优化依赖 Jar 包的方式,由于 OLAP 场景下依赖的第三方 Jar 包是相对固定的,可以直接放在 JM 和 TM 启动的 Classpath 下,并不需要每个作业单独提交 Jar 包。其次,对于每个作业在 JobMaster 和 Task 初始化时,直接复用 System Classloader。经过优化后,JM 中 Dictionary::find 所占的 CPU 使用从 76% 下降到 1%,同时,Metaspace Full GC 的频率显著降低。

Codegen 缓存优化

Goland激活2023.1.1(GoLand 2023.1 发布)

在 OLAP 场景下,Codegen 源代码编译的 TM CPU 占比较高,同时耗时较大。为了避免重复编译,当前的 Codegen 缓存机制会根据 Codegen 源代码的 Class Name 映射到 Task 所用的 Classloader,再映射到编译好的 Class 中,一定程度上缓解了该问题。但在当前缓存机制下,存在两个明显的问题:

  • 当前的机制只实现了同一个作业内部,同一个 Task 不同并发的复用,但是对于同一个 Query 的多次执行,依然存在重复编译;
  • 每次编译和加载 Class 都会创建一个新的 ByteArrayClassloader,频繁创建 Classloader 会导致 Metaspace 碎片严重,并引发 Metaspace Full GC,造成服务耗时的抖动。
Goland激活2023.1.1(GoLand 2023.1 发布)

为了避免跨作业代码的重复编译,实现跨作业的 Class 共享,需要优化缓存逻辑,实现相同源代码到编译 Class 的映射。存在以下两个难点:

如何保证相同逻辑的算子所生成的代码相同?

在 Codegen 代码生成的时候,把类名和变量名中的自增 ID,从全局粒度替换为 local context 粒度,使相同逻辑的算子能生成相同的代码。

如何设计 cache key 唯一识别相同的代码?

通过设计基于 Classloader 的 Hash 值 + Class Name + 代码的长度 + 代码的 MD5 值的四组。并将其作为 cache key 来唯一识别相同的代码。

Codegen 缓存优化的效果非常明显,TM 侧代码编译的 CPU 使用率 46% -> 0.3%,Query 的 E2E Latency 降低了 29.2%,同时 Metaspace Full GC 的时间也降低了 71.5%。

反序列优化

Goland激活2023.1.1(GoLand 2023.1 发布)

在优化 Task 部署性能时,通过火焰图发现,TM Task 初始化阶段的 CPU 占用比较高,进一步分析发现在做 Task 部署信息的反序列化时,同一个 Task 的多个 Subtask 存在冗余的反序列化。Task 部署信息 TaskInfo 主要包含 Head Operator、Chained Operators 信息,在作业构建时会分别被序列化为 TaskInfo 中的 SerializedUDF 和 ChainedTaskConfig。为了减少冗余的反序列化,有以下两个可优化的方向:

其一是 Chained Operators 的嵌套序列化结构,主要是去掉对 Map 结构不必要的序列化和反序列化,使得同一 Task 的多个 Subtask 可以复用同一个反序列化后的 Map。

Goland激活2023.1.1(GoLand 2023.1 发布)

其二是 Codegen 算子的优化。在占比较大的 Codegen 算子在初始化时,也存在较高的反序列化开销。经过分析,该类算子部署信息主要包含 Codegen 源代码,但是一个 TM 上的多个 Subtask 都需要反序列化一遍同样的源代码,存在大量的冗余,因此把 Codegen 源代码拆分出来,单独反序列化一遍后,给所有 Subtask 共享。

以上反序列化优化的效果非常明显,在同一个 Task 的 Subtask 个数等于 3 的时候,TaskInfo 整体的序列化和反序列化 QPS 分别提升了 102% 和 163%。

其他更多优化

Goland激活2023.1.1(GoLand 2023.1 发布)
  • Join Probe 提前输出:Probe / Full Outer Hash Join 支持在 Probe 阶段,基于 Build 端的 Bloom Filter 提前输出结果,减少 Probe 端数据的落盘,从而提升性能。
  • 内存池化:在算子启动的时候,从 Managed Memory 申请内存,并初始化内存分片。在 OLAP 场景下,这部分的时间和资源消耗占比较大,因此支持了 Cached Memory Pool,即在 TM 维度内共享内存池,而不需要在算子启动的时候初始化内存。
  • 内存使用优化:在并行执行包含大量 Aggregate / Join 算子的 Query 时,发现即使数据量非常小,TM 的Managed Memory 使用也很高。经过排查,对于需要使用 Managed Memory 的算子,每次申请内存的步长是 16 MB,因此这些算子的每个并发都至少需要申请 16 MB 内存,导致内存的实际利用率很低,因此支持了可配置步长,并设置较小的默认值以节省大量内存。

 

三、集群运维和稳定性建设

运维体系完善

Goland激活2023.1.1(GoLand 2023.1 发布)

构建运维发版流程:在进行完善的测试后,使用自动化流水线,对上下游依赖的所有组件统一发版,最后对线上集群进行平滑的升级。

完善测试方式:支持 CI、准确性测试、性能测试、长稳和故障测试。CI 可以及时发现 UT 失败的问题;准确性测试选择 Query 丰富的 TPC-DS 测试集;性能测试主要包括 TPC-H 性能测试和调度 QPS 性能测试;此外,由于在线服务对稳定性要求比较高,因此支持了长稳和故障测试,在服务长时间运行,并注入各种故障场景的情况下,判断集群的状态、测试 Query 的执行结果等是否符合预期。其中故障测试包含了丰富的故障场景,包括异常 SQL,JM / TM 退出和网络故障等,帮助发现内存泄露等问题,提高了服务的稳定性。

平滑升级线上集群:支持 SQL Gateway 滚动升级。具体的实现过程是通过先启动一个新版本的 Flink 集群,再把线上的多个 Gateway 实例逐个滚动地切流到新的集群,实现无感升级,使得服务中断时间从之前的 5 min 降低到接近为 0。同时在滚动切流时,会进行小流量验证,在发现问题后能够快速回滚,降低上线风险。

监控体系完善

Goland激活2023.1.1(GoLand 2023.1 发布)

监控体系的完善过程中,除了流批的集群监控,比如对 CPU 等资源使用的监控、GC 时间等进程状态的监控外,还增加了细粒度的 CPU 监控,用于明确在短 Query 的情况下,集群是否存在 CPU 瓶颈。与此同时,通过增加查询负载监控,判断业务负载和 Flink 集群的负载是否正常。

在集群监控之外,又增加了 OLAP 下所特有的作业监控,完善了全链路的 Latency,方便快速定位慢查询出现耗时问题的阶段,比如 Parse、Optimize、Job 执行阶段等。此外,还增加了更多的慢查询和失败查询的监控,以及对依赖的外部 IO 的监控等。

稳定性治理

Goland激活2023.1.1(GoLand 2023.1 发布)

Flink OLAP 作为在线服务对稳定性要求很高,但是在落地初期,由于服务缺乏容灾、JM / TM FGC 频繁等问题,线上稳定性较差。我们分别从 HA、限流、GC 优化和 JM 稳定性提升四个方面进行治理。

  • HA:支持双机房热备,提高在线服务的可用性。支持双机房容灾后,可以通过切流快速恢复。其次,通过支持 JM HA,解决 JM 单点的问题,提升线上服务的可用性。
  • 限流和熔断:虽然在流式和批式下,没有作业的限流需求,但在 OLAP 场景下,用户会持续提交 Query。为了避免查询高峰集群被打挂,支持了 SQL Gateway 的 QPS 限流。为了避免多作业同时运行导致的 JM 和 TM 的负载过高、查询过慢的问题,我们限制了 Flink 集群最大运行的作业数。除了限流之外,还支持了在 OLAP 下,使用 Failfast 的 Failover 策略,避免失败作业堆积,造成集群雪崩。
  • GC 优化:OLAP 场景下,业务对 Latency 非常敏感,Full GC 会导致耗时抖动。因此优化了 JM 和 TM 的 Full GC。首先移除 Task / Operator 级别的 Metric,使 JM 的 Full GC 频率降低 88%。其次,支持 Codegen 缓存优化,使 TM 的 Metaspace Full GC 次数降低为接近 0。
  • JM 稳定性提升:在 OLAP 场景下,支持 JobMaster 去除 ZK 依赖,因为在高 QPS 下,ZK 依赖会导致作业的 Latency 抖动。同时限制 Flink UI 展示的作业数,因为在 OLAP 场景下持续提交大量的作业,会使整个 JM 的内存过大,影响 JM 的稳定性。与此同时,关闭 Flink UI 的自动刷新,避免自动刷新导致 JM 负载上升引起页面的卡顿。

 

四、收益

Goland激活2023.1.1(GoLand 2023.1 发布)

Benchmark 收益:通过上述对 Query Optimizer 和 Query Executor 的查询优化,在 TPCH 100G 的Benchmark 中,Query Latency 降低了50.1%。其次对三类不同复杂程度的小数据量查询(点查类 Source-Sink、较复杂的 WordCount 和更加复杂的三表 Join),进行了 E2E Benchmark,优化效果非常明显,E2E QPS 平均提升 25 倍,E2E Latency 平均降低 92%,降低了超过 10倍。

Goland激活2023.1.1(GoLand 2023.1 发布)

业务收益:性能和稳定性都有明显的提高。性能方面,Job 平均 Latency 降低了 48.3%,TM 平均 CPU 降低了27.3%;稳定性方面,JM Full GC 频率降低了 88%,TM Full GC 时间降低了 71.5%。

 

五、未来规划

  • 产品化完善:包括 History Server 的支持和慢查询的智能分析。
  • 向量化引擎:充分利用 CPU 的并行化能力,提升计算性能。
  • 物化视图:对于大数据量的计算,现查现算的耗时和资源开销都非常大,所以未来考虑引入物化视图加速用户的查询,节省资源使用。
  • Optimizer 演进:持续跟进业界和学术界的最新进展,比如基于 Learning-based 实现 SQL Optimization 的 AI4DB 等。

 

背景

Dapr 是一个开源的分布式应用运行时,帮助开发者构建松耦合的分布式应用程序,具有良好的可扩展性和可维护性。Rainbond 是一款企业级的云原生应用管理平台,提供了丰富的功能和工具,方便开发者管理和部署应用。Rainbond 和 Dapr 结合可以提供以下价值点:

  1. 为Dapr扩展云原生支持:Rainbond 提供了一套完整的云原生应用支持方案,包括应用开发、应用编排、应用交付、应用运维等应用全生命周期管理能力,而 Dapr 只是应用开发框架,包括应用开发模型、服务发现、事件驱动等功能。将 Rainbond 和 Dapr 结合起来可以提供更完整的云原生应用支持,帮助开发人员更快地构建和部署应用。
  2. 让Dapr应用可移植性增强:Rainbond提供应用模版能力,Dapr开发的应用以模版的方式打包,可以方便交付和迁移到其他平台运行。
  3. 为Rainbond扩充服务治理能力:Rainbond 支持通过插件扩展服务治理能力,和 Dapr结合,可以通过Dapr的方式实现服务治理。将二者结合起来,可以提供更完整的服务治理功能,帮助开发人员更好地管理和控制应用中的服务。
  4. 为Rainbond增加BaaS能力:在Rainbond上开发软件,需要自己安装后端数据库和中间件,而Dapr将后端能力以API的方式对外提供,开发者只需要通过API统一访问后端能力,实现了BaaS体验。

总之,Dapr和Rainbond能互相补充能力不足,Rainbond 解决了应用生命周期管理的问题,开发者不需要懂底层技术,但还是需要了解后端服务, Dapr 补足了这块能力,让开发者更加专注业务。

Rainbond和Dapr的整合思路

Goland激活2023.1.1(GoLand 2023.1 发布)

在 Dapr 微服务框架的业务体系中,Daprd 是整个业务的核心,应用程序通过运行时 API 发送请求给 Daprd,Daprd 负责处理这些请求,并与底层服务进行交互。Daprd 是由 Dapr Services 中的 dapr-sidecar-injector 服务进行注入的,当 Pod 满足注入条件后进行注入。同时 Dapr Services 中的 dapr-operator 会监听整个集群下的 Dapr 配置资源(CRD),当捕获到有 Dapr 配置类资源的创建后,会记录在内存中,再次注入的 Daprd 如果 Pod 声明了使用该配置,则会提供对应的能力。

  • Dapr Service 的安装:Rainbond 将 Dapr Services 资源进行了整合,作为一个插件应用上架到了应用商店,通过安装便可以快速让我们的集群具备 dapr 微服务架构能力,避免了集群中执行命令,同时解决了国外镜像拉取的问题。
  • DaprD注入:传统注入方式我们需要手动添加注入条件字段,费时费力且不易维护还容易出错;Rainbond 支持通过切换应用的治理模式的方式,为我们的 Pod 添加不同属性字段以满足不同微服务架构的注入条件,从而达到批量注入,快速使用、便于管理的效果。
  • Dapr配置:Dapr 提供了四种配置 Daprd 的资源来扩展我们的服务治理能力,分别为Configuration、Component、Resiliency、Subscription,我们需要通过编写 Yaml 的形式在集群中创建这些资源供业务组件使用,Rainbond 平台在应用的 k8s 资源的管理入口,其效果与有些类似但比更易于管理。其中 Configuration 资源用于存储应用程序的配置信息,例如连接字符串、密钥、证书等,需要为 Pod 配置的 属性去声明才可使用,Rainbond 的组件视图提供对属性配置,简化了我们配置的流程。
  • Dapr Component安装和对接:Rainbond 的应用商店已经有很多后端实现,如 MySQL、Redis等,在Rainbond里可以一键安装便可使用。在Dapr应用的K8s资源管理里配置Component的yaml,绑定后端服务的地址。
  • Dapr应用开发:Dapr开发的应用可以用源码、镜像、yaml部署到Rainbond平台上,然后根据Dapr的API规范访问后端服务,Rainbond提供对Dapr应用的持续集成、持续交付、环境管理、配置管理、日志和性能监控、访问网关、应用运维等能力,辅助Dapr应用的开发和管理。

部署和使用流程

基于 Rainbond 使用 Dpar 的目标:

  • 一键部署 Dapr Service,让集群具备 Dapr 微服务架构能力。
  • 自动为业务组件注入 Daprd。
  • 可视化管理 Dapr 配置。
  • 简化 Daprd 属性参数配置流程。
  • 多种方式交付你的 Dapr 业务。

下面我通过部署一个发布订阅的示例,供大家快速了解并掌握 Dapr 在 Rainbond 中是如何使用的

前提条件

  1. Rainbond 版本大于 v5.13。
  2. Rainbond 已经对接过开源应用商店并拥有推送权限。

实践步骤

Goland激活2023.1.1(GoLand 2023.1 发布)

1. 安装 Rainbond Service Mesh 插件

Rainbond ServiceMesh 插件负责按照指定治理模式对应用组件进行加工调整,以满足微服务治理插件注入的基本条件。通过在

2. 安装Dapr 应用插件

创建一个以 dapr-system 为英文名的团队,安装 Dapr Services 。通过在。

3. 绑定 Component

Dapr 支持对接多种 Component 实现,如 Redis、Mysql、Oauth等,在 Rainbond 平台中安装也非常简单,大部分实现都可以在 Rainbond 应用商店中找到,少数不支持的存储也欢迎大家参与应用制作发布到应用商店中来。本次示例我们需要安装的是 Redis 通过在。安装完成后,在进行绑定。


如果是 MySQL ,步骤是,安装完成后在进行绑定。


4. 切换应用治理模式

将业务应用的治理模式切换至 Dapr 。通过在。其中 dapr 治理模式会为我们组件的 属性添加字段以及 其中 xxx 为组件的英文名,由于是Dapr 体系中的唯一标识,Rainbond 支持自行配置,如果检测到有该属性字段,则优先使用原配置。满足注入条件后,dapr-sidecar-injector 服务开始工作,为我们的业务组件注入 Daprd。

5. 部署业务

Rainbond 提供了多种方式部署你的业务,镜像、Helm、Yaml、源码等等。这里我选择使用镜像部署,具体步骤为:。


由于 Dapr 中消息队列需要为组件 属性设置 字段,切换治理模式的时候并没有自动生成,所以我们需要在。同理其他扩展的 属性字段均在此处配置。

6. 部署最终效果

在便可实现访问消息发布组件,向订阅 A、B、C中发布消息,通过观察和组件的日志可看到订阅的内容,日志位置:。

7. 通过Dapr控制台管理

访问 dapr dashboard 可以查看到我们的微服务组件在 Dapr 中的注册信息。

Goland激活2023.1.1(GoLand 2023.1 发布)

8.发布应用模版

Rainbond提供应用一键发布应用模版的能力,在Dapr开发应用的应用视图,来发布应用模版,并通过应用模版在线和离线快速安装到其他环境。不过在其他环境使用时需要先安装Rainbond和Dapr基础环境。

在Rainbond上扩展Dapr

链路追踪

链路追踪是一种网络监控和故障排除技术,用于追踪数据包在网络中的路径和经过的节点,以便优化网络性能和发现问题,在 Dapr 中是通过配置绑定追踪器实现进行工作的。下面是以 Zipkin 追踪器实现的资源配置示例。更多详见 Dapr Observability。


熔断限流

限制每秒允许的最大 HTTP 请求数,速率限制可以保护您的应用程序免受拒绝服务 (DOS) 攻击。我们需要配置资源作为中间件,然后通过进行绑定,然后在业务组件中配置挂载使用。

在作为中间件,设置每秒的最大请求数为 10。


在绑定中间件。


在绑定 Configuration 。

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

广受欢迎的禅道OpenAI插件又双叒叕更新啦,今日,1.2版本新增AI一键拆用例功能。测试人员可以通过需求详情的“一键拆用例”按钮,让ChatGPT为你识别并生成对应的用例标题,大幅提升效率。

在研发-需求功能下,进入需求详情,一键拆用例,即可自动生成ChatGPT一系列用例标题;

Goland激活2023.1.1(GoLand 2023.1 发布)

衍生出的不合适的用例可以“重新拆”,直到满意为止;

Goland激活2023.1.1(GoLand 2023.1 发布)

选择“使用该结果创建用例”后进入批量建用例的页面,可以对生成的用例标题进行编辑,也可以进行所属模块、用例类型的选择等常规操作。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

本次更新功能可以节省测试人员编写测试用例的时间和精力,将测试人员从繁琐工作中解放出来,以基于这些用例进行后续的用例整理和测试工作,进行更高价值的创造性测试工作。同时,AI与人工的结合也能保证理解的准确性,减少AI的理解能力对用例的干扰。这样,就可以快速、准确、全面地生成测试用例,提高测试效率及质量。

插件安装和配置

下载地址:https://www.zentao.net/extension-viewExt-218.html

前提

为了使用这个插件,禅道管理员需要拥有:
1.一个可用的 OpenAI 账户和 API Key;
2.一个可以访问 OpenAI 服务的 SOCKS5 代理服务器(如果你的禅道服务器不能直接访问 OpenAI 服务)。

安装方式

1.在禅道插件管理中安装;
2.下载插件包后,解压并覆盖对应的 extension 目录到禅道的 extension 目录。

配置步骤

1.在后台 – 系统设置中,定位到 OpenAI 设置;
2.填写自 OpenAI 获取到的 API Key,并按照情况填写代理设置;
3.在后台 – 用户 – 权限中,为相应的用户组赋予 OpenAI 功能权限。

截至本版本发布,禅道OpenAI已经拥有了神奇海螺(ChatGPT聊天)、需求润色、任务润色、Bug润色及本次的需求一键生成用例功能,仍有更多功能正在筹备开发中,让我们继续期待工具解放生产力!

查看此前版本功能:
OpenAI1.1:禅道OpenAI插件1.1版本来啦,新增任务和Bug润色功能,需求、任务、Bug都可以通过GPT来润色优化啦!
OpenAI1.0:跟ChatGPT聊天、需求润色优化,禅道OpenAI 插件发布!

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Hi,各位 Tducker 小伙伴。

这篇文章是我们和NewBing共创,为了跟你介绍填鸭表单开源版的v4版本。

V4更新概览:

  • 集成Pro版本最新的表单编辑器,非常稳定。
  • 增加用户管理模块,轻松管理整站用户。
  • ‍ 增加系统配置,文件/公众号配置更方便了。
  • 优化整站UI效果,简洁&美。
Goland激活2023.1.1(GoLand 2023.1 发布)
 

1.升级表单设计器

本次升级集成了pro版本的最新表单编辑器,创建表单后,拖拽生成表单,填写更稳定,表单效果更美观。

Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)

2.新增用户管理

增加用户管理,支持admin账号查看并管理系统的用户,支持新增、修改、删除用户。

Goland激活2023.1.1(GoLand 2023.1 发布)

3.新增系统配置‍

新增了系统管理,支持手动开启三方登录、查看版本号、文件存储的界面配置操作。

Goland激活2023.1.1(GoLand 2023.1 发布)

4.优化整站样式‍

本次更新中,针对整个站点进行了全局优化;新版系统更显简洁美观清爽。

5.增加Docker部署‍

相比宝塔jar部署,docker部署会更加快捷方便,部署速度快上加快。

Goland激活2023.1.1(GoLand 2023.1 发布)

TDUCK表单相比于其他的表单收集系统,有以下几个优势和价值:

  • 节省成本:TDUCK表单是开源免费的,你不需要支付任何费用,就可以拥有一套完整的表单收集系统。你也不需要依赖于第三方平台,就可以保证数据隐私。你只需要自己的服务器,就可以部署和使用TDUCK表单。
  • 提高效率:TDUCK表单是易于使用和管理的,你可以快速创建和发布各种类型的表单,无需编程或设计。你也可以方便地查看和分析数据,及时获取反馈和结果。你可以用更少的时间和精力,完成更多的数据收集工作。
  • 增加互动:TDUCK表单是多渠道和多终端的。你也可以通过短信、邮件等方式通知用户填写或回复表单,增加用户的忠诚度和信任度。

TDUCK表单已经有超过10000个用户使用,涵盖众多行业,展示了它的广泛适用性和用户认可度。如果你有数据收集或问卷调查的需求,你可以试试TDUCK表单。

漏洞描述

Apache Linkis 是一个用于将上层应用与底层数据引擎解耦,提供标准化接口的中间件。

该项目受影响版本存在存在反序列化漏洞,由于SqlConnection.java中未对host、port、username,、password等参数进行充分过滤,当恶意用户完全控制应用程序连接的 MySQL 服务并设置 jdbc url 中的 autoDeserialize 参数为 true(默认false)时,可通过控制 MySQL 服务在客户端执行任意远程代码。

漏洞名称 Apache Linkis <1.3.2 存在反序列化漏洞 漏洞类型 反序列化 发现时间 2023-04-11 漏洞影响广度 一般 MPS编号 MPS-2023-9422 CVE编号 CVE-2023-29216 CNVD编号 –

影响范围

org.apache.linkis:linkis-metadata-query-service-jdbc@(-∞, 1.3.2)

修复方案

将组件 org.apache.linkis:linkis-metadata-query-service-jdbc 升级至 1.3.2 及以上版本

参考链接

https://www.oscs1024.com/hd/MPS-2023-9422

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

https://github.com/apache/linkis/commit/7005c01d7f7bcaf4f2f32b#diff-fbdc1d6eb3a29efe4862c0bbe5b66ed986f327bae43da9adafd0c4b743、 Commit

https://www.openwall.com/lists/oss-security/2023/04/10/5

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

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

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)

漏洞描述

Apache Linkis 是一个用于将上层应用与底层数据引擎解耦,提供标准化接口的中间件。

该项目受影响版本存在反序列化漏洞,由于ConnectionManager.java中未对dbUrl、username、password等参数进行充分过滤,当恶意用户完全控制应用程序连接的 MySQL 服务并设置 jdbc url 中的 autoDeserialize 参数为 true(默认false)时,可通过控制 MySQL 服务在客户端执行任意远程代码。

漏洞名称 Apache Linkis JDBC EngineConn 插件<1.3.2 存在反序列化漏洞 漏洞类型 反序列化 发现时间 2023-04-11 漏洞影响广度 一般 MPS编号 MPS-2023-9421 CVE编号 CVE-2023-29215 CNVD编号 –

影响范围

org.apache.linkis:linkis-engineplugin-jdbc@(-∞, 1.3.2)

修复方案

将组件 org.apache.linkis:linkis-engineplugin-jdbc 升级至 1.3.2 及以上版本

参考链接

https://www.oscs1024.com/hd/MPS-2023-9421

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

https://github.com/apache/linkis/commit/7005c01d7f7bcaf4f2f32b#diff-d9f1daccf16be38b1c2a2b946ea9e8b27f5d7713b3981afef222ffe00e3b4a67

https://www.openwall.com/lists/oss-security/2023/04/10/4

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

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

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)

漏洞描述

Apache Linkis 是一个用于将上层应用与底层数据引擎解耦,提供标准化接口的中间件。Gateway 是 Linkis 接受客户端和外部请求的主要入口点,

在 Apache Linkis 受影响版本中,由于在 Linkis Gateway 部署时产生的Token默认为LINKIS_CLI_TEST,攻击者可以利用该token绕过Linkis平台身份验证。该漏洞已在Apache Linkis 1.3.2版本修复,将原有固定的Token改为随机生成,并增加Token长度。

漏洞名称 Apache Linkis Gateway模块存在身份验证绕过漏洞 漏洞类型 使用捕获-重放进行的认证绕过 发现时间 2023-04-11 漏洞影响广度 一般 MPS编号 MPS-2023-7468 CVE编号 CVE-2023-27987 CNVD编号 –

影响范围

org.apache.linkis:linkis-computation-client@(-∞, 1.3.2)

修复方案

升级org.apache.linkis:linkis-computation-client到 1.3.2 或更高版本

参考链接

https://www.oscs1024.com/hd/MPS-2023-7468

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

Commit

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

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

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)

本次更新特性:

1、操作日志-super

        我们把审计日志做的对审计人员和开发更友好,具体见下图:

Goland激活2023.1.1(GoLand 2023.1 发布)

   测试或者客户出bug了,如何快速复现呢? 只要在表单页面按CTRL+Q 就可以通过日志快速调出最近的请求记录,一键填充参数到表单,更方便复现和调试。

Goland激活2023.1.1(GoLand 2023.1 发布)

2、表单填充器

   一个表单开发出来 前端和测试要录入多少次呢,这么麻烦的事当然交给程序来做咯!要根据规范填写? so easy! 我们可以根据正则反向生成字符串。

  我们提供了姓名,手机号,邮箱,用户名等默认生成规则,其他的可以通过正则自己扩展,规则越多,生成的数据越好看。

Goland激活2023.1.1(GoLand 2023.1 发布)

 3、Excel导入组件

  大家做excel导入什么代码写的最多呢?当然是参数校验,反向翻译(张三->userid 1 ,男->gender 1),什么 你还自己用poi解析excel?只能说原始人你好了。

  翻花绳提供的excel导入工具类,复用了Easy Trans注解自动做反向翻译、swagger注解做自动列对应,Hibernate Validator注解自动做校验。一个用户导入我只写了下面这些代码。

Goland激活2023.1.1(GoLand 2023.1 发布)

 4、重复校验

 一个简单的CURD,本来代码生成器就搞定了,只是重复校验很常见,做软删除时候写起来又挺麻烦。翻花绳提供了2个注解分别标记到PO和不能重复的字段上,剩下的框架帮你搞定。

 5、Mybatis Plus4提前用

  MP4从去年年底一直在我司孵化,新功能基本开发完了,现在剩下MP3.5.X的代码merge到新仓库,优化一波代码即可发版,MP4有哪些新特性可以在翻花绳提前体验到呢?

  a、多表支持

    MP4提供了表关联查询,支持inner left right 多种姿势,大家可以把关联关系配置到PO中也可以在wrapper中指定。

  b、函数支持

   MP4支持常见的函数查询支持,如果内置不满足,亦可自行扩展。

  c、mapper 级批处理

    在mapper中提供了批量插入和批量更新的方法,性能比原来的Service批处理高很多。

  d、PO增强

    可替代80%的wrapper使用场景,一路点下去是不是更舒服呢。

 new User().userId().eq(1).innerJoin(School.class).list();

 e、前端高级查询

   /user/list?name=王&name-op=like 等于 select * from user where name like ‘%王%’ 

  注意:MP并没有直接提供直接给前端的API,而是提供了前端参数转Wrapper的工具。感谢Bean Seacher 提供的思路。

翻花绳差异性老特性:

翻花绳提供了很多其他脚手架也提供的比如代码生成器之类的功能不讲,只讲特殊的:

1、Easy-Trans

   总有一些数据从DB读取无法直接在页面展示,gender 0需要翻译为男,user id 1需要翻译为小明。Easy-Trans 一个注解搞定翻译,减少SQL-JOIN。

  本组件已经单独开源并且贡献给dromara https://gitee.com/dromara/easy_trans。

输入图片说明

2、Easy-Cloud

 2个注解搞定微服务发布,service即服务,无需controller。

https://gitee.com/fhs-opensource/easy_cloud

3、PAGE-X JSON驱动VUE组件集

Avue和amis是vue和react中的JSON化驱动组件的佼佼者,page-x 更注重前后端搭配,好的前端组件需要配套友好的后端接口,pagex语法更精简。

4、ALL-IN-ONE

很多项目部署的时候是微服务,开发的时候微服务会给开发者造成很多困扰,比如使用同一个注册中心的时候debug不方便,自己全部启动占用又比较大。

翻花绳支持 一套代码,发布的时候微服务,开发的时候单体直接启动。

翻花绳介绍:

翻花绳是一款基于Springboot Cloud SA-Token Mybatis Plus Vite  VUE Element UI的低代码脚手架。我们致力于让开发者在不推到性改变工作方式的情况下减少开发者工作量,减少代码量,减少BUG量 达到企业开发者都happy的目标。

 

 

 

 

 

 

 

 

    

    

 

 

 

 

 

EverythingToolbar 是由 Everything 提供支持的 Windows 任务栏的即时文件搜索集成,可以替换操作系统任务栏上的 Windows 搜索,使 Windows 上的文件搜索更快、更可靠。

EverythingToolbar 目前支持 Windows 7/8/10 和最新的 Windows 11。

Goland激活2023.1.1(GoLand 2023.1 发布)

变化

  • 重新设计了设置助手
  • 更新了搜索框的样式,以适应最新的 Windows 11 版本
  • 在 Windows 11 上安装后,EverythingToolbar 不再被添加到自动启动程序中
  • 修正了当剪贴板被另一个应用程序阻止时复制文件的问题
  • 修正了各种窗口放置问题
  • 修正了 Windows 7 上的崩溃问题
  • 当在第二屏幕上使用 deskband 时,搜索窗口现在可以正确放置
  • 修正了一个问题,当重复搜索图标时,搜索窗口可能会重新打开。
  • 修正了实例名称在启动时未被设置的问题
  • 通过 Crowdin 改进了翻译
  • EverythingToolbar 现在直接从 Everything 获取文件大小和最后修改日期
  • 修正了 Windows 10 旧版本上的崩溃
  • 修正了详细紧凑视图中文件大小栏的错位问题
  • 当设置助手打开时,系统托盘图标现在会保持隐藏状态,以减少设置过程中的歧义。
  • 搜索窗口现在会在活动屏幕上打开
  • 增加了对 Everything 1.5a 中定义的过滤器的支持
  • 改进了对第三方文件管理器的支持
  • 修正了一个罕见的错误,即可能启动不正确的可执行文件

更多详情可查看:https://github.com/srwi/EverythingToolbar/releases/tag/1.0.5

htmx 1.9.0 已发布。

htmx 是增强 HTML 的工具包,支持使用属性 (attributes) 直接在 HTML 中访问 AJAX、CSS Transitions、WebSockets 和 Server Sent Events,因此开发者能够使用超文本的简单性和强大功能构建现代用户界面。

htmx 体积很小(压缩后大小为~10k ),无依赖项,可扩展,且和 IE11 兼容。

主要变化

  • 支持 view transitions,该特性基于 Chrome 111+ 中可用的实验性 View Transitions API,并将很快用于其他浏览器
  • 支持“naked” 属性,其中出现在没有定义等的素上。相反,它将触发新的事件,可以通过首选的脚本解决方案对其进行响应
  • 通过新的属性支持通用内联事件处理,解决了 HTML 中有限的 properties属性的缺点

改进和错误修复

  • 修复内存泄露问题
  • 将 htmx 网站从 11ty 迁移到 zola,减少了 JavaScript 依赖项的数量

详情查看发布公告。

 

Nuxt 是使用简便的 Web 框架,用于构建现代和高性能的 Web 应用,可以部署在任何运行 JavaScript 的平台上。去年发布的 Nuxt 3 基于 Vue 3 构建,为 TypeScript 提供了 “一等公民” 支持,并进行了一次彻底的重构,对内核进行了精简,速度更快,体验更好。

近日发布的 Nuxt 3.4.0 则是 Nuxt 3 的最新版本,带来了令人兴奋的新功能,包括对 View Transitions API 的支持将丰富的 JavaScript 有效负载 (JavaScript payload) 从服务器传输到客户端等等。

Goland激活2023.1.1(GoLand 2023.1 发布)

Nuxt 3.4.0 主要变化

  • 支持 View Transitions API

基于 Chromium 的浏览器提供了一个新的 Web 平台 API:View Transitions API。这是原生浏览器转换的新功能,可以在不同页面上的不相关素之间进行转换。

Nuxt 现在提供了一个实验性实现,它将在 v3.4 发布周期中积极开发。

 
  • Payload 增强

新版本对 Nuxt 处理有效负载的方式进行了重大更改(需启用实验性 flag)。有效载荷用于在进行服务器端渲染时将数据从服务器发送到客户端,并避免在 hydration 阶段重复获取数据。

 
  • 支持对象语法 (Object-syntax) Nuxt 插件

现在已支持对象语法 Nuxt 插件,以便更好地控制插件顺序,并更轻松地注册钩子。

 

未来将根据开发者在 Nuxt 插件中传递的数据启用构建优化。

  • 简化开发工具配置

现在在项目启用 Nuxt DevTools 变得更容易:只需在文件中设置即可启用开发者工具。

 

如果尚未安装,Nuxt 将提示在本地安装它。这意味着无需全局启用 Nuxt DevTools。

  • 优化 Layers
  • 更好的上下文切换
  • ……

详情查看发布公告。

 

.NET 8 Preview 3 现已推出,这个预览版包括对构建路径、工作负载、Microsoft.Extensions 和容器的更改,还包括针对 Arm64 的 JIT 和动态 PGO 的性能改进。

以下为该预览版的部分改动:

SDK 改动

对 SDK 进行了多项改进,并进行了重大更改。

有关重大更改的更多信息,请参阅 .NET SDK 不再更改退出时的编码。

简化输出路径 

.NET SDK 引入了一个选项来创建更统一、更简化的输出路径结构。新的输出路径侧重于:

  • 将所有构建输出收集在一个公共位置
  • 在公共位置下按项目分隔构建输出
  • 将整体构建输出布局展平到最多三层深度

要选择新的输出路径布局,需要在  文件中设置  属性。

开始的最简单方法是在存储库的根目录中运行  ,打开生成的  文件,然后将以下内容添加到该文件中的  :

 

此后,所有项目的构建输出都将放入存储库根目录中的 .artifacts 目录中,该目录可配置,只需将 Directory.Build.props 文件中的 ArtifactsPath 属性设置为其他目录。

 目录的布局将采用  形式。

新的 命令 

新的命令,可帮助清理剩余的工作负载包(工作负载所包含的实际功能、工具和模板单):

 

clean 有两种操作模式,分别是:

 

这个模式为基于文件或基于 MSI 的工作负载运行工作负载垃圾收集。在这种模式下,垃圾收集行为正常,只清理孤立的包本身。

 

与 workload clean 不同, workload clean –all 不定期运行垃圾回收,这意味着它会清除机器上所有,不是来自 Visual Studio 且属于当前 SDK 工作负载安装类型(基于文件或基于 MSI)的现有包。

运行时改动

引入验证选项结果生成器 (ValidateOptionsResultBuilder)

新的 ValidateOptionsResultBuilder 使创建 ValidateOptionsResult 对象变得更容易,这是实现 IValidateOptions.Validate(String, TOptions) 所必需的。

此构建器允许累积多个错误,然后一次查看所有问题,并相应地解决它们。

使用示例:

 

引入配置绑定源码生成器(the configuration binding source generator)

使用新的配置绑定源代码生成器,可自动生成无反射和 AOT 友好的绑定实现。

该生成器会探测 Configure 、 Bind 和 Get 调用,可以从中检索类型信息。

 

在项目中启用生成器时,编译器会隐式地选择生成的方法,而不是预先存在的基于反射的框架实现。

要启用该源代码生成器,请下载 Microsoft.Extensions.Configuration.Binder 的最新预览版。生成器默认关闭。要使用它,请将以下属性添加到项目文件中:

 

.NET 8 将在第四个预览版向 .NET SDK 添加启用机制,不需要 NuGet 包引用也可以使用源代码生成器。

本机代码生成 Native code generation

对 JIT 编译器进行了以下改进:

Arm64 

  •   转换为  。它允许 JIT 在 arm64 上发出  以进行按位或关系比较。PR#83089 
  • 为 arm64 优化了     PR #83176 
  • 优化了除法在某些场景的溢出检查。PR #82924

配置文件引导优化

  • 启用了基本块计数的互锁分析 runtime #82775
  • 支持配置文件合成  runtime #82926, runtime #83068, runtime #83185, runtime #83567
  • 在 Tier0 中启用了更多内在函数,例如 get_IsValueType runtime #83002 

 

其他容器镜像等优化可在微软博客中了解详情。

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

作者:京东物流 柳宏

1.前置知识

1.1 基本概念

1.1.1 配载

  • 配载代表着某条线路是否具有发往某个方向(区域、省市县、分拣等)的能力,也可以说是网点(分拣中心)是否具有承载配载所指方向货物的能力。一般网络规划者,在均衡线路间货量时,会通过调整配载来完成。
  • 线路上可允许配载货物的“产品类型、最终妥投目的地”,通过线路的配载,计算 当前网点 到 目的网点 的 下一个网点 ,线路 绑定的配载代表通过当前线路最终可以到达的目的地 。以下图为例
Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 表示:如果放置在整个路由网络资源中,一个标记T1的货物要从北京发往福建,可选的路由有①北京站-北京-武汉-福建-福建站;②北京站-北京-广州-福建-福建站;之所以剔除了北京站-北京-上海-福建-福建站以及北京站-北京-武汉-上海-福建-福建站,正是因为后两条线路中未包含T1的配载代码,只标记了T2 ,说明这条线路只有配载航空的货物,而没有普通陆运的带货能力。
  • 下图就是用于描述配载的树形结构
Goland激活2023.1.1(GoLand 2023.1 发布)

 

1.1.2 班期与生失效日期

  • 班期:指的是发运频率,代表着每周七天中,这个班次的“上线时间”,一般来讲,维护时缺失某个值,会造成路由中断的现象。
  • 生失效日期:指的是该配载有效时间范围
Goland激活2023.1.1(GoLand 2023.1 发布)

 

1.1.3 配载合并逻辑

  • 网点四级地址的关系以配载树的形式展现,勾选节点添加的配载在右侧的配载列表中展示
Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 当某个节点的子节点没有全部勾选时,展示当前勾选的节点到配载列表中
Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 当某个节点的子节点全部勾选时(在符合相关条件时,这里涉及到的算法逻辑后面详述),展示相应的父节点到配载列表中,这个逻辑是递归的
Goland激活2023.1.1(GoLand 2023.1 发布)

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

1.2 现有实现技术

•目前的线路配载前端基于zTree+FixedHeaderTable+JQuery实现,通过zTree监听节点被选中和取消选中,计算该操作后是否触发节点的合并或展开,进而重新渲染配载列表中的数据

 

2. 现状问题

2.1 节点合并算法逻辑有误

  • 如果一个父节点下的所有子节点都被维护,即使子节点下的班期不同、生失效日期不重叠,系统都会自动合并到父节点。合并的展示效果为:
  • 班期:对于纯新增配载显示;对于父节点下有一个子节点,班期显示为已存在配载的班期
  • 生失效时间:统一为该切段线路的生失效日期
  • 例如:X线路被切割成两段,2022-11-02~2023-01-25以及2022-01-26~长久有效两段,在线路视图2022-11-02~2023-01-25 这段的配载维护,X下有A1(配载时间为2022-11-02~长久有效、班期12),其父节点为A,A下还有子节点A2、A3。今天是11.17日,将A2、A3都勾选上(时间任意,班期为12345),配载会立刻合并为A(生效时间2022-11-02~2023-01-25,配载)

2.2 配载保存和显示的值不一致

  • 上面操作触发合并,提交后库中保存的配载记录为:

2.3 本质原因

  • 原有根据zTree节点触发合并的算法有问题,不考虑当前节点下其他子节点的配载的班期和生失效日期,而是根据是否同一个父节点直接合并。导致合并逻辑错误,保存与展示的数据不一致。

 

3. 预期效果

3.1 配载合并班期逻辑

  • 条件:同一个父节点+各个子节点班期一致

3.2 配载生失效日期切断逻辑

  • 新添加节点,生效日期 为 参考日期,失效日期 为 线路失效日期
Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 参考日期选择 大于 当前 同级子节点的某天,当触发合并时
  • 合并后的父节点:生效日期取参考日期,失效时间取 同级子节点列表中失效时间最小的
  • 合并后的子节点:

1)如果 原始生效日期 小于 合并后 父节点的生效日期,则切断 原始生效日期 ~ 父节点的生效日期-1天(相当于保留切断前的生效日期那一段)

2)如果 原始失效日期 大于 合并后 父节点的失效日期,则切断 父节点的失效日期+1 ~ 原始失效日期 (相当于保留切断前的失效日期那一段)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 针对同一个节点的配载生失效日期切断的逻辑,举例

3.3 配载合并后保存逻辑

•采用所见即所的方式保存数据,用户在前端完成切断操作后,保存到数据库的记录与前端展示一致

 

4. 实现逻辑

4.1 整体逻辑

Goland激活2023.1.1(GoLand 2023.1 发布)

 

4.2 定义数据结构及初始化


 

在配载树上监听事件,当触发选中/取消选中时,递归的获取childrenNodes

Goland激活2023.1.1(GoLand 2023.1 发布)

 

维护配载与班期、配载与生失效日期的关系

Goland激活2023.1.1(GoLand 2023.1 发布)

 

将已有配载列表中的数据维护到stowageFrequencyMap、stowageTimeMap、originStowageMapTI中

Goland激活2023.1.1(GoLand 2023.1 发布)

 

4.3 配载合并班期逻辑

1)如果当前节点非禁用 && 勾选 执行 合并逻辑;否则递归遍历节点;最终返回结果集

Goland激活2023.1.1(GoLand 2023.1 发布)

 

2)如果当前节点非半选 && 非父节点,向父节点中查找班期,维护节点属性,加入结果集并返回

Goland激活2023.1.1(GoLand 2023.1 发布)

 

3)根据节点的pid查找stowageFrequencyMap中是否存在班期


 

1.如果是父节点则遍历,按照每个子节点去stowageFrequencyMap中获取班期,分为两种情况如下;找到班期后维护frequencyTreeMap,将同班期的节点维护到list中保存,即形成 班期-节点list的数据结构

2.向父节点中获取班期,同上

3.向子节点中递归获取班期,并将结果保存到新的数据结构frequencyChildMap中,然后合并到frequencyTreeMap中

Goland激活2023.1.1(GoLand 2023.1 发布)

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

对frequencyTreeMap集合进行判断,如果数量为1表示 与该节点同级的节点班期相同,触发了合并,将节点加入结果集返回;否则说明当前节点的同级节点存在不同班期,不能进行节点向上合并,直接遍历frequencyTreeMap中的value集合,加入结果集返回

Goland激活2023.1.1(GoLand 2023.1 发布)

 

对于触发了合并的结果集 frequencyTreeMap 中的每个节点遍历 同 当前线路的生失效日期比较,取出同级节点中的 最大生效时间最小失效时间作为该同级节点中的最大公共时间范围设置到每个节点属性中

Goland激活2023.1.1(GoLand 2023.1 发布)

 

4.4 配载生失效日期切断逻辑

定义变量


循环遍历每个结果集中的节点,判断是否渲染到配载列表中

Goland激活2023.1.1(GoLand 2023.1 发布)

 

根据当前节点id判断是否存在于 stowageList 中,如果存在直接显示;根据节点id删除originStowageMapTI集合

Goland激活2023.1.1(GoLand 2023.1 发布)

 

更新生失效日期,分别判断 原始配载中是否存在需要切断的日期,新添加配载中是否存在需要切断的日期;然后将当前节点添加到配载列表中

Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 遍历 originStowageMapTI ,判断历史的配载节点是否需要进行日期切断,分为以下两种情况;然后根据节点id删除 originStowageMapTI
  • 如果 originEnableTime < enableTime:添加新的配载记录,生效时间取 originEnableTime, 失效时间取newDisableTime
  • 如果 originDisableTime > disableTime:添加新的配载记录,生效时间取 newEnableTime, 失效时间取 originDisableTime
Goland激活2023.1.1(GoLand 2023.1 发布)

 

  • 遍历 newStowageMapTI ,判断新添加的节点是否需要进行日期切断;然后根据节点id删除 newStowageMapTI
  • 如果 originDisableTime > disableTime:添加新的配载记录,生效时间取 newEnableTime, 失效时间取 originDisableTime
Goland激活2023.1.1(GoLand 2023.1 发布)

 

5. 总结

•路由线路配载维护业务核心且频繁使用功能,为了实现业务述求,将完全没有关联的树形结构  Dom列表 结合在一起。采用了多种数据模型+数据结构的组合形式,构造两者之间的关系,结合遍历、深度优先搜索、字符串查找等算法进行实现,在春节串点优化专项上线后取得了预期的收益。

LoRA 是 Low-Rank Adaptation of Large Language Models 的简写,即大型语言模型的低秩适应。它冻结了预训练模型的权重,并将可训练的秩分解矩阵注入到 Transformer 架构的每一层中,大大减少了下游任务的可训练参数数量。

与使用 Adam 微调的 GPT-3 175B 相比,LoRA 可以减少 10,000 倍的可训练参数数量和 3 倍的 GPU 内存需求。LoRA 在 RoBERTa、DeBERTa、GPT-2 和 GPT-3 上的模型质量表现与微调相当或更好,尽管可训练参数更少,训练吞吐量更高,而且与适配器不同,没有额外的推理延迟。

使用 RoBERTa (Liu et al., 2019) base and large 和 DeBERTa (He et al., 2020) XXL 1.5B 在 GLUE 基准上获得了与完全微调相当或优于完全微调的结果,同时只训练和存储了一小部分参数。

单击下面的数字下载 RoBERTa 和 DeBERTa LoRA 检查点

Goland激活2023.1.1(GoLand 2023.1 发布)

在 GPT-2 上,LoRA 优于完全微调和其他高效调优方法,例如适配器(Houlsby 等人,2019 年)和前缀调优(Li 和 Liang,2021 年)。下面是 E2E NLG Challenge、DART 和 WebNLG 的评估:

Goland激活2023.1.1(GoLand 2023.1 发布)

 

很多科技公司都会推出漏洞悬赏计划,为的是让外部安全研究人员能够积极发现和报告漏洞,以此来提升企业安全。

日前,正处于变革漩涡最中心的 AI 研究公司 OpenAI 宣布推出一项漏洞悬赏计划(Bug Bounty Program),该计划的目的也一样,就是希望研究人员可以帮助解决语言模型在日益强大的同时所带来的网络安全风险。

Goland激活2023.1.1(GoLand 2023.1 发布)

该计划由 OpenAI 与网络安全公司 Bugcrowd 合作运营,研究人员可以将找到的漏洞报告给 OpenAI,之后 OpenAI 将根据漏洞严重程度给予 200 到 2 万美不等的经济奖励。该计划也是 OpenAI 为开发更安全和更先进 AI 的一种承诺,也符合 OpenAI 的宗旨 ——「我们的使命是确保通用人工智能造福全人类」。

在这类 AI 产品帮助用户提高效率的同时,人们对可以生成文本、图像和其他媒体内容的人工智能系统的漏洞和安全性也越来越关注。

上个月,ChatGPT 曾因为开源库 redis-py 中的一个漏洞导致包括用户的姓名、电子邮件地址、账单地址、信用卡号码的最后四位数和信用卡到期日等信息泄漏。近日,还有一个名叫 Alex Albert 的大学生通过 “越狱” 绕过了 ChatGPT 内置的安全措施,让 AI 可以教唆犯罪、发表仇恨言论等,这也暴露出 AI 潜在的安全漏洞。

虽然 OpenAI 推出的漏洞悬赏计划看似很好,不过这个悬赏计划适用的范围却比较有限。例如,该计划的官方网站就指出:”与模型提示词和 AI 回复内容有关的问题严格来说不在范围之内,除非它们对范围内的服务产生了额外的可直接验证的安全影响,否则不会得到奖励。”因此让模型告诉你如何做坏事、编写恶意代码等都不在悬赏范围内。

这项计划对安全研究员也同样有着限制,比如研究人员只能与自己的帐户进行交互,不能访问、修改或使用属于他人的数据。如果漏洞暴露了此类数据,则需要停止测试,立即提交报告,并删除所有信息副本。研究人员还需要对发现的任何漏洞保密,直到 OpenAI 的安全团队授权后才能公布。

截至发稿,目前 OpenAI 已经奖励了 15 个漏洞,漏洞的平均验证时间是 5 个小时。

前几天,我国网信办发布了《生成式人工智能服务管理办法(征求意见稿)》,向社会征集对 AI 服务的管理意见。而据路透社报道,美国政府也在就 AI  系统的监管规则和问责措施征求公众意见,以制定完备的 AI 服务管理规则。

美国国家电信和信息管理局 (NTIA)是美国商务部的一个机构,负责向白宫提供电信和信息政策方面的建议。近日 NTIA 向白宫提出了询问,理由是“人们对 AI 监管/问责机制的兴趣越来越大”,是否可以采取措施来保证“人工智能系统是合法的、有效的、合乎道德的、安全的,并且在其他方​​面值得信赖。”

NTIA 管理员 Alan Davidson 称:

负责任的 AI 系统可以带来巨大的好处,但前提是我们要解决它们的潜在后果和危害。为了让这些 AI 系统充分发挥其潜力,公司和消费者需要对 AI 有足够的信任度。

美国总统拜登上周回应了 AI 监管问题,认为人工智能是否危险还有待观察, 称“在我看来,科技公司有责任确保其产品在公开之前是安全的”,但除此之外并未提供更多有关 AI 监管规则的具体信息。

目前,NTIA 计划起草一份报告,该计划将着眼于“确保人工智能系统按要求工作的努力——并且不会造成伤害”。并表示该计划将为拜登政府正在进行的 AI 监管工作提供更多有用的信息,以确保”联邦政府对人工智能的相关问题采取一致和全面的管理方法。”

Hare Lang 作者 Drew DeVault 发文称,历时近 40 年,自由软件基金会 (Free Software Foundation,FSF) 正在走向消亡。

他们的成就是毋庸置疑的:我们必须对他们几十年来在建立和推进我们的事业方面取得的成就表示感谢和钦佩。软件自由的原则比以往任何时候都更加重要,这些机构的产品仍然是必要和有用的 —— GPL 许可系列、GCC、GNU coreutils 等等。然而,这些工作背后的组织正在举步维艰。

Drew 认为,FSF 没有重视起 传播自由软件理念,开发、发布和推广 copyleft 许可证,监督自由软件运动的健康发展 这几个核心理念的发展,同时还分心将资源投入到了其他的闲散工作中。

Goland激活2023.1.1(GoLand 2023.1 发布)

他指责称,首先,作为自由软件哲学的思想领袖,FSF 的信息影响范围很窄;并将其形容为“聋哑、无效且目光短浅的”。同时对 FSF 此前抨击“GNU/Linux”命名法、对抗在开源运动中的盟友、诋毁受众为“useds”而不是“users”的这些行为表达了不赞同。“一页又一页密集的哲学论文和组织不当的 FAQ 并不能为社区提供有用的切入点或参考。信息不能这样传播。”

其次,在 copyleft 的发展方面 FSF 也没有做到尽职尽责。Drew 称,GPL 系列许可证对自由软件运动至关重要,但其密集而晦涩的用词加剧了大众的理解难度(尽管有 16000 字的 FAQ 作为补充)。且现如今,一些新项目对 copyleft 的采用也不乐观:超过 100 万个 npm 软件包使用 permissive license,使用 GPL 的不到 2 万个;cargo 有 50 万个 permissive packages ,另有 2 万个左右的 GPL。

最后,虽然目前的自由软件运动在健康发展。但这主要归功于开源运动以及自由软件和开源软件之间的近乎等同。“自由软件比以往任何时候都多,几乎所有新软件都含有自由软件的成分,而且大多数人将其称为开源。”

FOSS 社区现在被那些 FSF 信息无法触及的人所主导。更广泛的社区正在享受所代表的背景和价值观多样性的增长,而信息并没有传达给这些人。 FSF 无法理解它在整个世界中的地位,或者它与生态系统内外发生的进步运动的关系。基金会没有接触社区中的新领导者,让他们在没有中央领导的情况下形成孤立的、薄弱的机构,使我们很容易被像开放核心 (Open Core) 这样不断发展的运动和对自由和开源软件品牌的商业攻击所利用。

“FSF 迫切需要改革以完成其基本使命”。Drew 呼吁基金会进行以下更改:

  • 改革领导班子。理查德·斯托曼 (Richard Stallman) 该走了。他所代表的人群排斥所有其他人,正在成为自由软件运动中的少数群体。我们需要更多有色人种、女性、LGBTQ 代表等方面的领袖。目前的领导层,尤其是来自 RMS 的领导层,在包容和代表性对运动的成功很重要的地方创造了一个排他性的环境。
  • 改革机构。FSF 需要纠正其对生态系统的短视观点,接触整个 FOSS 世界的新兴领导者,并要求他们负责 FSF 的使命。正是这些领导者掌控着当今的自由软件运动缰绳 —— 而不是 FSF。如果 FSF 仍想参与这项运动,他们需要认可并授权推动这项事业向前发展的领导人。
  • 改革信息。人们依赖 FSF 在社区内建立强大的自由软件理念和实践背景,而 FSF 并未提供此服务。信息需要更易于理且语气更平和,自由软件和开源之间的关系需要改革,以便 FSF 和 OSI 共同成为我们生态系统基础的支柱。
  • 将 FSF 与 GNU 项目分离。几十年来,FSF 和 GNU 携手合作,从无到有,但他们的特权关系已经过时了。GNU 项目代表了当今自由软件生态系统的一小部分,自由软件基金会有必要独立于任何特定项目并关注整个生态系统的健康。
  • 开发新的 copyleft 许可证。 在 GPL 和 MPL 之外,FSF 应该编写新的许可证来填补市场上的其他空白。并应该向社区展示自由软件对许可证的看法,将其作为项目负责人可以依赖的资源,以了解他们的许可证选择的重要性。

“自由软件运动需要一股强大的力量将其团结起来:我们面临来自多方面的挑战,而今天的自由软件基金会无法胜任这项任务。FOSS 生态系统正在蓬勃发展,现在是 FSF 站出来以软件自由的名义指导其即将到来的成功的时候了。”

Microsoft PowerToys 仓库的 PR 显示,该工具集即将以插件的形式集成 ChatGPT 服务。

PowerToys 是 Windows 系统实用程序,供高级用户调整和简化其 Windows 体验,可最大限度地提高生产力。

PowerToys 有一个适用于 Windows 的快速启动器应用: PowerToys Run ,可用于快速运行程序或检索内容。PowerToys Run 支持插件,目前已有计算器、文件搜索、OneNote 笔记本搜索等功能。

Microsoft PowerToys 的 ChatGPT 插件由社区中名为 Simone Franco 的开发者创建,据其描述,该插件的开发时间不足两个小时。目前该插件的原型已经可以正常工作,但要将其集成到 PowerToys 的预览版或发布版中还需要一些时间。

Goland激活2023.1.1(GoLand 2023.1 发布)

根据 PR 中的讨论和描述,该 ChatGPT 插件默认关闭,意味着 PowerToys 用户需要打开 PowerToys Run 的设置,并手动启用该功能才能使用。另一个限制是用户需要输入 OpenAI API 密钥,这算是 ChatGPT 服务的通用前置条件,小编就不多介绍。

不过将 ChatGPT 集成到 PowerToys 中,似乎只是对 ChatGPT 浏览器端用法的一种替代方法,实际的使用感受应该是没什么改变。

目前 PowerToys 的最新版本是 4 月 8号 发布的 v0.69 版本,按照其正常发版节奏,下一个 0.70 版本将在一个月后发布,有望在该版本看到 ChatGPT 插件。

作者

metaapp-推荐广告研发部:臧若舟,朱越,司灵通

1 背景

推荐场景大模型在国内的使用很早,早在 10 年前甚至更早,百度已经用上了自研的大规模分布式的 parameter server 系统结合上游自研的 worker 来实现 TB 级别的万亿参数的稀疏模型。后来,各家平台也陆续基于这种方案,开发了自己的分布式训练系统,普遍特点是大量使用 id embedding,因此参数量巨大,模型大小也非常夸张。当然,随着开源训练工具 TensorFlow/Pytorch 的流行,使用 TensorFlow/Pytorch 作为 worker,结合自研 ps 的方案也十分流行。究其原因,以 TensorFlow 为例,虽然内置了分布式训练系统,但是对于大规模 id embedding 的支持却非常糟糕,无法作为完整的平台使用。而使用 TensorFlow+ 自研 ps 的方案也存在不少问题,比如自研 ps 一般对于特征输入都有特定的要求、二次开发成本比较高等。

Goland激活2023.1.1(GoLand 2023.1 发布)

一个典型的分布式 worker-ps 架构

2 业务介绍

metaapp- 推荐广告研发部,主要负责 metaapp 拳头产品 233 乐园的首页信息流的推荐和广告系统,是比较传统的推广搜组。我们在 2020 年之前也是采用了 TensorFlow+ 自研分布式 ps 的方案,模型大小在接近 TB 级别(业务体量较小),整个方案的迭代和维护成本都比较高。

在这种背景下,经过多方考量,阿里云机器学习平台 PAI 开源的 DeepRec(脱胎于 PAI-TF),作为支持了淘宝搜索、猜你喜欢、定向、直通车等核心业务的训练平台,直接基于 TensorFlow 做二次开发,针对稀疏模型在分布式、图优化、算子、Runtime 等方面进行了深度的性能优化,并且完全开源。

而因为我们公司本身跟阿里云有着深度的合作,阿里云也主动介绍了当时还是内部项目的 DeepRec 给我们尝试。在近 2 年的工作后,DeepRec 已经全量用于我们的模型训练和线上 inference,并且取得了显著的性能提升和成本下降。

3 稀疏模型训练

3.1 EmbeddingVariable 多级存储

由于模型参数量大,一些特征的 embedding 大小达到了接近 TB 级别,完全基于内存存储对于成本的要求过高,因此自然而然就会想到多级存储:将最热的 embedding 放在显存或者内存里,其余的可以分级放在 PMEM、SSD 等成本较低的存储介质中。而 DeepRec 中 提供了基于 EmbeddingVariable 的 Embedding 多级存储功能。DeepRec 目前对于 embedding 存放在各种存储介质的支持已经相当完善。

下面介绍下我们团队升级 DeepRec 在存储这一块的过程和经验:

3.1.1 compaction 的性能问题

我们原本基于自研的分布式 parameter server,而当时 PMEM 类的存储介质还不普及,因此我们选择了比较高性能的 SSD 作为多级存储介质。于是我们自然而然采用了类 leveldb(rocksdb)的方案作为 SSD 存储方案。但这种方案在模型训练时,由于参数不断增加和更新,后台会进行频繁的 compaction,此时会有严重的写放大问题导致 ps 的读取时间大大延长,从而导致模型训练的瓶颈几乎都在 ps 侧。ps:据说 rocksdb 在 2022 年底的 7.5.3 版本大幅改进了 compaction 的性能,在后台 compaction 时几乎不会影响读取的性能。

3.1.2 DeepRec 的方案

而在早期我们试用 DeepRec 时,DeepRec 的 EmbeddingVariable 对于 SSD 存储的方案同样是基于 leveldb,因此同样遇到了跟我们自研的方案类似的问题。后续我们将此问题的测试结果反馈给了 DeepRec 相关的同学,他们基于此后续推出了基于 SSDHASH 的存储方案,大大提升了 compaction 时的读取性能,因此模型训练基于不再受困于 ps 的读取性能问题。后续又进一步了基于 SSDHASH 的同步和异步两种 compaction 的方式。使用同步 compaction 时,向 SSD 写入数据和 compaction 将会使用同一个线程,异步时则各使用一个线程。这里也推荐大家使用这种方案。

3.1.3 压缩模型大小

进一步的,如果能把模型大小控制在数十 GB,那 ps 的性能就可以进一步提升了。因为采用 DeepRec,自定义各种压缩方式的算子变得非常轻松。我们调研并实现了了多篇 embedding 压缩方向的 paper,最后采用了 binary code 的方式实现了 embedding 的 multihash 方案,可以自由控制 embedding 的大小。我们尝试在最大的特征 uid embedding 上使用了 multihash,把模型大小从 800GB 降低到 40GB 以下,auc 的损失仅在千分之三左右,线上率下降了 1.5%;进一步的,我们通过优化序列推荐模型,更好的通过序列特征建模了用户的个性化,可以发现在序列模型的基础上把 uid embedding 换成 multihash 的方案,对于线上率的影响仅有 0.3% 左右,因此可以放心全量 multihash 方案。我们也把基于 multihash 的 embedding variable 算子以 pr 的形式提交给了 DeepRec。

3.2 基于 GPU 的分布式训练

在解决了 ps 的性能瓶颈后,模型训练的速度就和模型 Tensor 计算的算力近似线性相关了。而近几年随着序列模型的发展,搜广推的矩阵计算复杂度也在显著提升。此时使用 gpu+ 大 batch size 来代替 cpu 作为 worker 的方案,无论在性能还是成本控制上都有巨大的优势。而阿里云机器学习平台 PAI 开源的 HybridBackend 平台就支持了基于 GPU 的分布式训练方案,并且深度支持了 DeepRec。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

可以看到使用 hb 的方案在训练速度上对比 TF-PS 原生方案的优势。

3.2.1 模型参数完全放在显存里

想要充分释放 gpu 的算力,减少因为数据拷贝带来的性能损耗,最好的方案自然是把所有参数都放在 gpu 显存里。上面 2.1.3 提到的压缩模型大小,为这种方案提供了可能性。调大 batch size 则可以进一步提高显卡的利用率。经过测试,在这种情况下,单张 V100 显卡的算力可以超过 20 台 40core worker 节点的算力。

3.2.2 解决了多卡训练丢失数据的问题

在单机多卡训练时,我们发现和单卡训练相比有近 1/3 的数据被丢弃,这是由于 hybridbackend 默认使用所有 worker 按照 row group 平分数据的策略,以提高读取效率。当 group 数目不够均分时,多余的数据会被丢弃,当 parquet 文件较多且比较小时,该问题尤为严重。我们通过使用每个 worker 加载所有的 group,再按照 batch 平分数据的策略,极大地缓解了数据丢失的情况,读取压力也在可接收范围内,后续可考虑将两策略结合降低 worker 的读取压力。

4 模型 inference

4.1 痛点

在我们的实际场景里,线上 inference 的痛点大部分来自于维护成本。因为推荐广告业务场景,需要大量尝试各种模型在线上分配流量做 AB test,因此线上存在的模型量级大概是 10 倍的基线模型量级。而每次上线一个模型,都需要给对应的模型分配相应的资源,并且这个资源跟 AB test 的流量正相关;而每次调整 AB test 流量(比如模型效果不错,放大流量观察)的时候,又需要调整该模型分配的资源。这个过程比较难实现自动化,往往需要算法工程师手动扩缩容。

4.2 基于 Processer 库的 inference 方案解决痛点

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

上面这个图是我们线上实际的 inference 方案。

4.2.1 单机器运行所有模型

基于上面的痛点,我们给出的方案是使用大规格机器(比如 128C,512G 内存)来做线上 inference,然后每台机器都会有线上所有的模型实例。每台机器运行一个 serving-proxy 会自动的管理所有的模型进程,包括模型上下线、模型更新等。这种方案的好处是整个维护成本基本没有了,所有事情基本都自动化完成了。因为线上整体的流量相对稳定(比如扩大 AB test 模型的流量,自然基线模型流量就减少了,整体是稳定的),所以各个模型之间资源竞争也不需要重新分配资源。

4.2.2 基于 DeepRec 提供的 Processer 库

DeepRec Serving Processor 是用于线上高性能服务的 Library,可以参考文档。因为本身是一个独立的 so 包,我们可以很方便的对接到自己的 Serving RPC 框架中。我们采用 golang 语言来完成了我们自己的 serving rpc 项目,优点自然是开发成本低并且性能不错。

4.2.3 使用 DeepRec 的 Session Group

直接使用 TensorFlow 提供的 C++ 接口调用 Session::Run,无法实现多 Session 并发处理 Request,导致单 Session 无法实现 CPU 的有效利用。如果通过多 Instance 方式(多进程),无法共享底层的 Variable,导致大量使用内存,并且每个 Instance 各自加载一遍模型,严重影响资源的使用率和模型加载效率。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

DeepRec 中 SessionGroup 可配置一组 Session,并且通过 Round Robin (支持用户自定义策略)方式将用户请求分发到某一个 Session。SessionGroup 对不同 Session 之间的资源进行隔离,每个 Session 拥有私有的线程池,并且支持每个线程池绑定底层的 CPU Core(numa-aware),可以最大程度地避免共享资源导致的锁冲突开销。SessionGroup 中唯一共享的资源是 Variable,所有 Session 共享底层的 Variable,并且模型加载只需要加载一次。

我们使用 session group 后,实测调整到合适的 group 数量,可以提高 50% 的 inference 性能。

4.2.4 基于 oneDNN 的优化

DeepRec 集成了英特尔开源的跨平台深度学习性能加速库 oneDNN(oneAPI Deep Neural Network Library),并且修改 oneDNN 原有的线程池,统一成 DeepRec 的 Eigen 线程池,减少了线程池切换开销,避免了不同线程池之间竞争而导致的性能下降问题。oneDNN 已经针对大量主流算子实现了性能优化,包括 MatMul、BiasAdd、LeakyReLU 等在业务场景中使用到的常见算子,为业务模型提供了强有力的性能支持。更值得一提的是, oneDNN 的算子支持 BF16 数据类型,与搭载 AMX(Advanced Matrix Extensions)指令集的第四代英特尔® 至强® 可扩展处理器同时使用,可显著提升模型训练和推理性能。在 DeepRec Serving Processor 编译选项中,只需加入“–config=mkl_threadpool”,便可轻松开启 oneDNN 优化。

4.2.5 子图优化

子图融合是推理性能优化的常用方法。但是对于本模型中左图所示的子图结构含有 Reshape 算子,原生 tensorflow 并没有对应结构的图优化器以及算子实现,我们通过手动融合来实现,融合前后的子图构成如下图所示。这样减少了多余算子的运行开销,减少了内存访问,提升了计算效率。再结合 oneDNN 加速融合算子,最终业务端到端加速了 10%,CPU 利用率下降 10%。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

 

4.2.6 cost model 的设计

由于大机器的 cpu core 数较多,而我们是一台机器有所有模型的进程,那么所有模型都共享所有 cpu core 显然会造成不必要的资源竞争等。因此给不同模型设计合理的 cost model 就很有必要。我们目前采用比较简单的方式,因为基线模型和需要做 AB test 的模型资源差别较大(流量差距大),我们会给每个基线模型分配对应的 core,然后让所有非基线模型共享一组 core(总体 AB test 的流量有上限)。虽然这个方案很简单,但是取得了非常好的效果,大概有 30% 的性能提升。

5 后续规划

1、cost model 的优化,显然有更好的方案来动态的调整每个模型需要的 core。我们打算开发更好的 cost model 并提供给 DeepRec。

2、开源我们的 inference 架构方案,因为在我们的业务里,基于 DeepRec processor 设计的 inference 架构带来了巨大的便利,并且性能很好,我们预计在上半年会开源我们的 inference 架构方案,欢迎大家到时关注。

回顾大数据的发展历程,一句话概括就是海量数据的高效处理。在当今快节奏、不断变化的市场环境下,优秀的开发效率已经成为企业数字化转型的必备条件。

数栈离线开发BatchWorks 是一款专注离线数据ELT开发的产品,采用先进的大数据生态底层技术,具备高性能且功能丰富的大数据处理能力,对大数据离线计算、数据仓库建设提供有效支撑,是企业建设数据中台、数据仓库,加速数字化转型的基础设施。

BatchWorks 经过6年多的打磨已经服务于包括金融、教育、政企、零售等多个行业在内的300+客户,在开发效率提升方面发挥了巨大的价值。本文将从多个项目实施过程中遇到的6个典型场景来介绍一下离线开发BatchWorks 在开发效率提升上的一些解决方案,与大家共同探讨。

场景一:大批量数据快速迁移

问:客户数仓计划从 Oracle 迁移到 Hadoop,初始化需要完成几万张表的数据同步,如何快速进行大批量 hive 表的创建并做数据抽取?

答:BatchWorks 支持连接数据源进行关系型数据库到包括 Hive 在内的多目标数据库之间的整库同步,可一次性完成大批量表的自动创建和同步任务的生成,支持按日期增量和全量两种数据同步方式。考虑到同一时间点启动大量数据同步任务会造成数据库压力过大,还可支持任务并发数的配置。

file

场景二:SQL 逻辑的复用和批量管理

问:一条业务线上有20+产品,每个产品的数据分析由一个 SQL 任务完成,所有产品的任务逻辑完全一致且需要保持变更同步,而实际业务在快速变化,数据开发每次调整业务逻辑都需要每个 SQL 任务分别手动变更,经常出现调整错漏的情况,如何解决?

答:增加“组件”功能,用户可把在大量任务中通用的业务 SQL 逻辑抽象出来作为组件进行维护,不同的产品只需引用组件并配置输入输出表和字符参数,即可快速完成任务配置。当业务变更时只要调整组件的逻辑就能实现所有引用此组件任务的同步变更。

一个简单例子:业务方需要对不同产品的用户群体做年龄分层,可创建组件做年龄筛选,配置以下输入输出参数:

• 输入参数:数据来源表

• 输出参数:年龄层中的最大最小值(字符串)、数据输出表

file 实现从产品1中筛选出年龄为20-30的用户数据,在创建任务时选择上述组件配置年龄输入参数和数据来源表,并指定写入的结果表:

file

场景三:计算结果跨任务复用

问:任务存在上下游依赖时,下游任务可能需要直接使用上游部分任务的计算结果,同时用户不希望建太多临时表,或产生一些额外的重复计算,如何解决?

答:BatchWorks 支持了任务上下游参数传递功能,上游任务的计算结果可进行周期性存储,直接被下游计算引用。

一个简单例子:从业务库完成销售明细表数据采集清洗,按天汇总后将销售金额最高的门店数据输出 sales_1d 任务,从 sales_details 中通过输入参数获取日期数据,然后将当天最高销售数据对应的门店通过输出参数输出传递至下游的同步任务,同步任务筛选此门店数据同步至 oceanbase。

file file

场景四:任务依赖自动解析

问:当任务较多且依赖关系复杂时,依赖关系的配置会占用一定的工作量,尤其在对任务做了修改后,依赖关系可能会有更新不及时/漏更新的情况,发现问题时往往已经到了下游环节,如何解决?

答:BatchWorks 支持了上游任务依赖自动解析推荐/自动依赖功能,选择此功能进行依赖任务配置时,平台将对当前任务进行 SQL 解析,得到来源表和结果表,并寻找来源表的产出任务,用户可从这些推荐任务里选择全部或部分任务添加到上游依赖,也可直接选择自动依赖,当 SQL 调整时自动进行上游依赖的更新。

file

场景五:任务异常快速排查

问:离线实例的运行流程涉及实例上游依赖检查、到达计划时间检查、资源检查、质量校验等多个环节,运行过程出现异常时仅通过日志难以直观地进行问题溯源,问题处理不及时直接影响下游业务,如何解决?

答:BatchWorks 支持实例诊断功能对实例的运行过程进行分析,将实例调度流程及每个流程当前的状态、节点时间全部展示,用户可直观地看到当前实例的运行阶段和异常原因。

比如在进行上游依赖异常检查时,BatchWorks 将构建以当前实例为末位节点的异常依赖树,寻找直接导致其未运行的根源任务组,快速直达阻塞点。此外针对 SparkSQL,可监控其指标健康状况并给出调参建议,针对 HiveSQL 可观测运行过程中资源使用变化情况,从而可进一步进行任务调优。

file file

场景六:以用户组为单位的用户管理

问:某公司的数据开发团队不定期会有一些人员调整,因业务量大、开发项目比较多,人员调整后开发平台上的维护十分繁琐。例如有新员工入职,需要将其添加到相关的多个开发项目中并赋予不同的角色,任务告警值班时需要添加进对应的告警规则中等等,增加管理员的用户管理成本且容易缺漏,如何解决?

答:BatchWorks 的用户中心支持以用户组为单位的用户管理,每个用户可被添加进一个或多个用户组。项目添加用户、告警圈选用户时均可以用户组的方式进行配置。后续增删用户时仅需在用户中心的用户组内进行操作,即可完成人员->项目/角色等的快速调整。

file

《数据治理行业实践白皮书》下载地址:https://fs80.cn/380a4b

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=szkyzg

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术qun」,交流最新开源技术信息,qun号码:,项目地址:https://github.com/DTStack

摘要:回溯的处理思想,有点类似枚举搜索。

本文分享自华为云社区《深入浅出回溯算法》,作者:嵌入式视觉。

一,如何理解回溯算法

深度优先搜索算法利用的就是回溯算法思想,但它除了用来指导像深度优先搜索这种经典的算法设计之外,还可以用在很多实际的软件开发场景中,比如正则表达式匹配、编译原理中的语法分析等。

除此之外,很多经典的数学问题都可以用回溯算法解决,比如数独、八皇后、0-1 背包、图的着色、旅行商问题、全排列等等。

回溯的处理思想,有点类似枚举搜索。暴力枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程分为多个阶段。每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走法继续走。

回溯算法的模板代码总结如下:


二,回溯算法的经典应用

2.1,八皇后问题

有一个 8×8 的棋盘,希望往里放 8 个棋子(皇后),每个棋子所在的行、列、对角线都不能有另一个棋子。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

解决思路:可以把这个问题划分成 8 个阶段,依次将 8 个棋子放到第一行、第二行、第三行……第八行,每一行都有 8 中放法(8 列)。在放置的过程中,我们不停地检查当前放法,是否满足要求。如果满足,则跳到下一行继续放置棋子;如果不满足,那就再换一种放法,继续尝试。这里用的是回溯思想,而回溯算法也非常适合用递归代码实现。


2.2,0-1 背包问题

0-1 背包是非常经典的算法问题。0-1 背包问题有很多变体,这里介绍一种比较基础的。我们有一个背包,背包总的承载重量是 W kg。现在我们有 n 个物品,每个物品的重量不等,并且不可分割,即对于每个物品来说,都有两种选择,装进背包或者不装进背包,对于 n 个物品来说,总的装法就有 2^n 种。

我们现在期望选择几件物品,装载到背包中。在不超过背包所能装载重量 W 的前提下,如何让背包中物品的总重量最大?

0-1 背包问题为什么不能用贪心算法求解?

因为不可分割,所以无法判断当前情况下,哪种物品对期望值贡献更大,即不存在当前最优的选择,所以就无法使用贪心算法了。

0-1 背包问题的高效解法是动态规划算法,但也可用没那么高效的回溯方法求解。我们可以把物品依次排列,整个问题就分解为了 n 个阶段,每个阶段对应一个物品怎么选择。先对第一个物品进行处理,选择装进去或者不装进去,然后再递归地处理剩下的物品。


要理解 0-1 背包问题回溯解法的关键在于:对于一个物品而言,只有两种情况,不装入背包和装入背包两种情况。对应的就是 f(i+1, cw, items, n, w) 和 f(i+1, cw + items[i], items, n, w) 两个函数。

2.3,通配符匹配

假设正则表达式中只包含 “*” 和 “?” 这两种通配符,并且对这两个通配符的语义稍微做些改变,其中,“*” 匹配任意多个(大于等于 0 个)任意字符,“?” 匹配零个或者一个任意字符。基于以上背景假设,如何用回溯算法,判断一个给定的文本,是否和给定的正则表达式匹配?

如果遇到特殊字符的时候,我们就有多种处理方式了,也就是所谓的岔路口,比如 “*” 有多种匹配方案,可以匹配任意个文本串中的字符,我们就先随意的选择一种匹配方案,然后继续考察剩下的字符。如果中途发现无法继续匹配下去了,我们就回到这个岔路口,重新选择一种匹配方案,然后再继续匹配剩下的字符。


2.4,leetcode 正则表达式匹配

在 leetcode 也有变形题(leetcode10:正则表达式匹配)如下:

其他变形题:leetcode44-通配符匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。

  • ‘.’ 匹配任意单个字符
  • ‘*’ 匹配零个或多个前面的那一个素

所谓匹配,是要涵盖整个字符串 s 的,而不是部分字符串。

方法一:回溯(分阶段分情况讨论,暴力搜索和剪枝)

首先,考虑特俗字符只有 ‘.’ 的情况。这种情况会很简单:我们只需要从左到右依次判断 s[i] 和 p[i] 是否匹配。


最后,考虑有 ’*’ 的情况,它会出现在 p[1] 的位置,匹配过程中会出现两种情况:

  • 星号代表匹配 0 个前面的素。如 ‘##’ 和 a*##,这时我们直接忽略 p 的 a*,比较 ## 和 ##,也就是继续递归比较 s 和 p[i + 2:]
  • 星号代表匹配一个或多个前面的素。如 aaab 和 a*b,这时我们将忽略 s 的第一个素,比较 aab 和 a*b,也就是继续递归比较 s[i + 1:] 和 p。(这里默认要检查 s[0] 和 p[0] 是否相等)。

Python3 代码如下:


C++ 代码如下:


直接递归时间复杂度太大(指数级),可以把之前的递归过程记录下来,用空间换时间。记忆化递归的 C++ 代码如下:


方法二:动态规划法

  • [ ] 算法思路
  • [ ] 代码

三,总结

回溯算法的思想非常简单,大部分情况下,都是用来解决广义的搜索问题,也就是,从一组可能的解中,选择出一个满足要求的解。回溯算法非常适合用递归来实现,在实现的过程中,剪枝操作是提高回溯效率的一种技巧。利用剪枝,我们并不需要穷举搜索所有的情况,从而提高搜索效率。

尽管回溯算法的原理非常简单,但是却可以解决很多问题,比如我们开头提到的深度优先搜索、八皇后、0-1 背包问题、图的着色、旅行商问题、数独、全排列、正则表达式匹配等等。

回溯算法能解决的问题,基本用动态规划也能解决,其时间复杂度更低,空间复杂度更高,用空间换时间。

参考资料

  • leetcode 8皇后问题题解
  • 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想
  • 腐烂的橘子题解-回溯和动态规划

 

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

摘要:不同于传统的卷积,八度卷积主要针对图像的高频信号与低频信号。

本文分享自华为云社区《OctConv:八度卷积复现》,作者:李长安 。

论文解读

八度卷积于2019年在论文《Drop an Octave: Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convol提出,在当时引起了不小的反响。八度卷积对传统的convolution进行改进,以降低空间冗余。其中“Drop an Octave”指降低八个音阶,代表频率减半。

不同于传统的卷积,八度卷积主要针对图像的高频信号与低频信号。首先,我们回忆一下数字图像处理中的高频信号与低频信号的概念。图像中的低频信号和高频信号也叫做低频分量和高频分量。图像中的高频分量,指的是图像强度(亮度/灰度)变化剧烈的像素点,例如边缘(轮廓)、图像的细节处、噪声(即噪点)(该点之所以称为噪点,是因为它与周边像素点灰度值有明显差别,也就是图像强度有剧烈的变化,所以噪声是高频部分)。图像中的低频分量,指的是图像强度(亮度/灰度)变换平缓的像素点,例如大片色块的地方。例如当我们在读书的时候,我们会聚焦于书上的文字而不是书纸本身,这里的文字就是高频分量,白纸即为低频分量。

下图是论文中给出的例子,左图是原图,中图表示低频信号,右图表示高频信号。

Goland激活2023.1.1(GoLand 2023.1 发布)

在论文中,作者提出较高的频率通常用精细的细节编码,较低的频率通常用全局结构编码。所以作者认为那么既然图像分为高低频,那么卷积产生的特征图自然也存在高低频之分。在图像处理中,模型通过高频特征图去学习图像包含的信息,因为它包含了轮廓、边缘等的信息,有助于进行显著性检测。相反,低频特征图包含的信息较少。如果我们用相同的处理方法来处理高频特征图和低频特征图,显然,前者的效益是远大于后者的。这就是特征图的冗余信息:包含信息较少的低频部分。所以在论文中作者提出了一种分而治之的方法,称之为Octave Feature Representation,对高频特征图与低频特征图分离开来进行处理。如下图所示,作者将低频特征图的分辨率降为1/2,这不仅有助于减少冗余数据,还有利于得到全局信息。

Goland激活2023.1.1(GoLand 2023.1 发布)

根据尺度空间理念,我们可以知道特征具有尺度不变性和旋转不变性。

  • 尺度不变性:人类在识别一个物体时,不管这个物体或远或近,都能对它进行正确的辨认,这就是所谓的尺度不变性。
  • 旋转不变性:当这个物体发生旋转时,我们照样可以正确地辨认它,这就是所谓的旋转不变性。
    当用一个机器视觉系统分析未知场景时,计算机没有办法预先知识图像中物体尺度,因此,我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。例如,高分辨率的图是人近距离的观察得到的,低分辨率的图是远距离观察得到的。

2、复现详情

2.1 Oct-Conv复现

为了同时做到同一频率内的更新和不同频率之间的交流,卷积核分成四部分:

  • 高频到高频的卷积核
  • 高频到低频的卷积核
  • 低频到高频的卷积核
  • 低频到低频的卷积核

下图直观地展示了八度卷积的卷积核,可以看出四个部分共同组成了大小为 k*k 的卷积核。其中,in和out分别表示输入和输出特征图的相关属性,在这篇文章中,输入的低频占比、通道数量都和输出的一致。

Goland激活2023.1.1(GoLand 2023.1 发布)

在了解了卷积核之后,下面介绍输入如何进行八度卷积操作得到输出结果。如下图所示,低频和高频的输入经过八度卷积操作得到了低频和高频的输出。红色表示高频,蓝色表示低频。绿色的箭头表示同一频率内的更新,红色的箭头表示不同频率之间的交流。

H和W分别表示特征图的长宽,可以看出低频特征图的长宽都是高频特征图的一半。因为分辨率不同,所以不同频率之间交流之前需要进行分辨率的调整:高频到低频需要进行池化(降采样)操作;低频到高频需要进行上采样操作。

Goland激活2023.1.1(GoLand 2023.1 发布)

2.2 Oct-Mobilnetv1复现

Oct-Mobilnetv1的复现即将Mobilnetv1中的原始的Conv2D替换为Oct-Conv,其他均保持不变,在后面打印了Oct-Mobilnetv1的网络结构以及参数量,方便大家查看。


2.3 OctResNet的复现

Oct-ResNet的复现即将ResNet中的原始的Conv2D替换为Oct-Conv,其他均保持不变,在后面打印了Oct-ResNet的网络结构以及参数量,方便大家查看。


3、对比实验

实验数据:Cifar10

CIFAR-10 是由 Hinton 的学生 Alex Krizhevsky 和 Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含 10 个类别的 RGB 彩色图 片:飞机( a叩lane )、汽车( automobile )、鸟类( bird )、猫( cat )、鹿( deer )、狗( dog )、蛙类( frog )、马( horse )、船( ship )和卡车( truck )。图片的尺寸为 32×32 ,数据集中一共有 50000 张训练圄片和 10000 张测试图片。 CIFAR-10 的图片样例如图所示。

Goland激活2023.1.1(GoLand 2023.1 发布)

3.1 Oct_MobilNetv1模型网络结构可视化


3.2 Oct_MobilNetV1模型训练


3.3 MobileNetV1模型网络结构可视化


3.4 MobileNetV1模型训练


3.5 Oct_ResNet50模型网络结构可视化


3.6 Oct_ResNet50模型训练


3.7 ResNet50模型网络结构可视化


3.8 ResNet50模型训练


3.9 实验结果

本小节提供消融实验的结果以及可视化训练结果,共计包含四个实验,分别为octmobinetv1、mobinetv1、octresnet50以及resnet50在数据集Cifar10上的结果对比。

<style> table { margin: auto; } </style>

Goland激活2023.1.1(GoLand 2023.1 发布)

图1:Oct_MobileNetV1对比实验结果图

Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)

图2:Oct_ResNet50对比实验结果图

Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)

4、参考资料

 

d-li14/octconv.pytorch

神经网络学习之OctConv:八度卷积

 

Drop an Octave: Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convolution

5、总结

目前我们得到的结论与论文中的结论不符,论文提供的代码为MXnet框架,本复现参考了PyTorch版本的复现,不能确定是否为框架原因,或者一些训练设置原因,比如初始化方式或模型迭代次数不够,有待查证,大家感兴趣的也可以就这个问题与我在评论区进行交流。

 

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

Goland激活2023.1.1(GoLand 2023.1 发布)

本文系图技术在大型、复杂基础设施之中 SRE/DevOps 的实践参考,并以 OpenStack 系统之上的图数据库增强的运维案例为例,揭示图数据库、图算法在智能运维上的应用。本文所有示例代码开源。

最近,有些尚未使用过图技术、DevOps/Infra 领域的工程师在 NebulaGraph 社区询问是否有「图技术在运维的应用」相关案例参考。于是,我又可以“借题发挥”来实践下如何利用图的能力与优势去帮助运维工程师们基于复杂基础设施上构建辅助运维系统。如果你对本文有任何看法,欢迎评论区或者来论坛和我交流下,非常感谢。

通常,我们说的复杂的基础设施运维环境指的是资源(manifest)繁多且分布在不同层面的系统。为了让实践更加真实、贴近实际的运维情况,让运维问题复杂又可控,这里我选择了用一个基础设施平台:OpenStack。在 OpenStack 系统上,我分别利用 Push 和 Pull 两种模式将资源在图模型中对应点、边信息加载到 NebulaGraph 的 Graph ETL 管道的路径中。

在我们基于运维资源构建的图谱,会做如下用例图探索:

  • 告警、状态的推理与传导;
  • 网络直连与互联关系;
  • 镜像、云盘、快照血缘管理;
  • 高相关性虚机预警;
  • 秘钥泄漏的图上风控分析;
  • 镜像、云盘漏洞范围分析;
  • 宿主机逃离影响范围分析;
  • 脆弱依赖资源检测;

实验环境搭建

背景知识

OpenStack 是一个开源的云计算平台,提供了类似于 AWS 的云服务。它提供了一组可插拔的模块,包括了计算,存储和网络等功能,可以帮助用户构建和管理云环境。OpenStack 采用分布式架构,支持多种操作系统和硬件平台,可以在企业级和服务提供企业级环境中使用。

OpenStack-overview-diagram-new

最初,OpenStack 是由 NASARackspace Inc. 发起的 Nova(虚拟化计算项目)和 Swift(兼容 S3 的对象存储)项目组成。随着项目的发展,OpenStack 现在已经有非常多不同的子项目:

openstack-map-v20221001

本次实践中涉及到 OpenStack 的主要项目有:

  • Nova 是 OpenStack 的计算服务,用于管理虚拟机;
  • Cinder 是 OpenStack 的块存储服务,用于管理云存储;
  • Neutron 是 OpenStack 的网络服务,用于管理云网络;
  • Glance 是 OpenStack 的镜像服务,用于管理云镜像;
  • Horizon 是 OpenStack 的可视化控制台服务。

除此之外,我还引入了 Vitrage 项目辅助我们收集部分资源数据:

  • Vitrage 是 OpenStack 的一个高级分析和可视化工具,用于分析和可视化 OpenStack 环境中的资源和事件。它可以汇集来自 OpenStack 各个服务的数据,并以可视化的方式呈现。Vitrage 能发现和诊断问题,提高 OpenStack 环境的可用性和可维护性。

得益于 OpenStack Decouple 的设计理念,Vitrage 可以很容易、无侵入式(只用修改要收集的服务的两行配置)就可以在 OpenStack 的消息队列中订阅资源信息的 Push 消息。

不过,介于 Vitrage 许久没有大更新,且维护维艰,比如:在 zed 里 Vitrage Dashboard 作为 Horizon 插件已经无法正常工作了。所以,本实践只利用它的资源收集能力。

环境准备搭建

NebulaGraph 集群

快速试玩 NebulaGraph 的话,安装有这么几个选项:

  • 30 天免费试用的阿里云上的 NebulaGraph 企业版,含有配套的可视化周边工具。使用 https://market.aliyun.com/isv-nebulagraph
  • 有 Docker 环境,Nebula-Up 一键安装:https://github.com/wey-gu/nebula-up
  • RPM、TAR 包、源码编译等安装方式,可参考文档:https://docs.nebula-graph.com.cn/

OpenStack 集群

本文需要的 OpenStack 集群是一个多机的环境,因此我在 Linux Server 上用 Libvirt 和 Linux Bridge 搭建了多个虚拟机来模拟 OpenStack 的物理机。得益于 CPU 的嵌套虚拟化和 QEMU,我们完全可以在虚拟机搭建的实验环境中模拟可正常工作的 OpenStack Nova instance 虚机。

虚拟机搭建完成后,还需要模拟真实的多资源 Infra 环境。这边略去具体的操作步骤,感兴趣的小伙伴可以阅读本文的参考文献,当中有详细的实践过程。

完成 OpenStack 环境的搭建后,我们通过 Horizon Dashboard 查看集群和资源:

虚拟机情况:

nova_instance

网盘情况,其中四个挂载在不同的虚拟机上

cinder_volume

集群租户的网络拓扑:

neutron_topology

通过 OpenStack Vitrage 的 API/CLI 可获得部分主要资源的拓扑:


这个结果是一个 JSON,数据已经是边(links)和点(nodes)的序列化图结构了。


图谱建模

将资源映射成图谱:

  • nova instance 是 Nova 服务中的虚拟机实例,每个 nova instance 都有自己的配置信息(如 CPU、内存、磁盘等),有时候我们就叫它 server 或者 VM、虚机。
  • nova host 是 Nova 服务中的物理主机,是 nova instance 运行的物理环境。nova host 上面会运行 nova-compute 服务,这个服务负责管理和调度 nova instance。nova host 上面还可能运行其他服务,如网络服务等。
  • nova keypair 是 Nova 服务中的密钥对,用于访问 nova instance。
  • cinder volume 是 Cinder 服务中的云存储卷,可以 attach 到 nova instance 上做为硬盘。
  • cinder snapshot 是 Cinder 服务中的云存储快照,可以在 cinder volume 上做快照。
  • glance image 是 Glance 服务中的镜像,可以作为创建 nova instance 时候的启动硬盘。
  • neutron network 是 Neutron 服务中的网络,可以用于配置 nova instance 的网络连接。
  • neutron port 是 Neutron 服务中的端口,用来连接 nova instance 和 neutron network 之间。在 nova instance 虚拟机上,如果不是 trunk port 的话,一个 port 常常对应一个网卡。

它们之间的关系如下:

schema_draft

基础设施图 ETL

接下来我们解决从基础设施中抽取资源数据的问题:

push 模式

这里的 push 指的是以基础设施为出发点,通过事件驱动主动地发出资源变动的信息。它的好处是实时掌握资源情况,坏处是过于依赖基础设施,很多非常瘦的、软件定义/可编程程度不高的组件、某些硬件设备是没有 push 机制的。比如:有些年份的软件系统不一定能存在 push 的接口,改造起来有侵入性。

前面提及过,OpenStack 自身是存在 Push Hook 机制的,它的子项目 vitrage 就利用这个机制很优雅地收集系统资源、告警等信息进入图中,类似的机制在其他平台中也是可以实现的。

本实验中我们就利用 vitrage 的机制去收集一部分图谱中的资源信息,如下图,可以看到 vitrage 会在 OpenStack message bus 中订阅 nova/cinder/neutron 等服务中的资源时间,把事件传入 Entity Queue,经过处理,存储到 Entity Graph 中。

在此之上,我们可以通过 vitrage API 获取图谱的拓扑,来消费它。

注意:实际上 Vitrage 服务还提供了推理告警、推理状态、定义决策事件的能力,这里我们并没有采用,后边我们在图上做的一些事情甚至还和它的能力有一些重叠。

vitrage_arch

这里我只是用它来展示 push 模式的工作机制,如果没有 Virtrage 这个项目存在,我们也可以比较容易通过 OpenStack 的 oslo.messaging 这个库很容易写出在 Message Bus(可能是 Kafka, RabbitMQ 等不同底层实现)上订阅资源时间的应用,然后把事件通过 Flink/ Kafka/ Pulsar 等方式接驳 NebulaGraph。

因为 Vitrage 的存在,我就偷懒不用去实现这部分逻辑,只消写一小部分代码调用 Vitrage API 取这个数据就可以了,讽刺的是,从这个角度来看,这其实是一种 pull 的模式了,不用拘泥它本质上算是哪一种方式,至少在资源发起测,我们把它当做 push 模式的例子看待吧。

这部分从 Vitrage 抓取的代码我放在 https://github.com/wey-gu/openstack-graph/blob/main/utils/vitrage_to_graph.py 了,调用方式很简单,在有 OpenStack 客户端的环境中,执行它就可以了,比如:


执行之后,会生成如下文件:

  • 图数据的 Schema 定义
  • 点数据的文件夹
  • 边数据的文件夹

pull 模式

反过来,pull 模式是从资源外部定期或者事件驱动地拉取资源,存入图谱的方式。刚好,本实验中 Vitrage 抓取的资源是有限,部分额外的资源单独写了 Python 的代码来主动全量抓取。pull 模式的好处是对资源方没有任何侵入性,只需要调用它的接口获取信息就可以,坏处则是有的系统不太容易获得增量变化,可能只能全量去取。

这部分我抓取的关系如下:

  • glance_used_by:
  • glance_created_from:
  • nova_keypair_used_by:
  • cinder_snapshot_created_from:
  • cinder_volume_created_from:
  • cinder_volume_created_from:

代码在 https://github.com/wey-gu/openstack-graph/blob/main/utils/pull_resources_to_graph.py。在真实场景下,我们可能会用 Apache Airflow、Dagster 甚至是 Cron Job 等方式定期执行它。

手动执行的方式也很简单:


执行之后,会生成点、边的 nGQL 语句在两个文件夹下:

  • 点数据的文件夹
  • 边数据的文件夹

加载数据到 NebulaGraph

我们只需要在 NebulaGraph Studio Console,Explorer Console 或者 NebulaGraph 命令行 Console 中执行上边生成的 文件就好了:


之后,在 NebulaGraph 中我们会有一个叫做 的图空间,用这个查询可以查到所有数据:


在 NebulaGraph Explorer 中渲染,手动设置一下数据的图标,就可以看到 OpenStack 集群里的所有租户的资源图了:

all_graph_view

接下来,我们终于可以在图上看看有意思的洞察了!

基于图谱的基础设施运维示例

作为非 SRE、DevOps 人员,我尝试藉由自己在 OpenStack 和图技术的理解模拟出以下实例,希望对你有所帮助。

告警、状态的推理与传导

受启发于 Vitrage 项目,我们可以借助资源图谱实时图查询、图计算甚至图可视化能力,在图上推理、传导信息,把重要的事件藉由图上组织好的知识分发给需要收到通知的人、组织、系统。

一个简单的例子,我们在 nova host(虚拟机的宿主机、Hypervisor 机器,以下简称宿主机)中获得了一个告警、事件的时候,可能是网卡失败、物理硬盘预警、CPU 占用过高之类的告警。借助图谱查询获得所有相关联的虚机后,再把 WARN 级别的告警发出去或者设置它们为亚健康 unhealthy 状态。

获得通知的对象,往往是一些用户系统,它们可以根据预先定义好的策略做些自动化运维,或者通知 Hook:

  • 收到“宿主机 CPU 过高”的告警情况,根据用户自己设定的不同策略把虚机迁移走,或者采用更高级、复杂的撤离方式,像是开始不接受新流量,创建新的替代 workload,再优雅地关闭这个 workload;
  • “控制面网络故障”告警情况,这时候往往无法成功进行主机的撤离、迁移,故可以考虑触发备份主机、启动新 workload、关机;
  • 其他“亚健康状态”,可以作为负载层面出问题的根因分析 RCA 依据。

这里给出一个在图谱上进行告警、状态传递的查询例子。假设 vid 为 的宿主机出现了高 CPU 告警,下面这个查询可以得到所有该宿主机上的虚机,获得时间、告警通知列表:


这条语句的查询图模式是从 这个 向外经由 这个关系指向 这个 的。


它的结果是:

VM_to_raise_CPU_alarms server-4 server-3 server-1 server-0

如果我们把查询改动一下,选择输出全路径,则可以看到这个信息传递的方向:


我们在 Explorer 中渲染下, N 跳检测:

all_graph_view

这个例子比较简单,甚至用不到图能力。因为一跳查询在表结构中也能很轻松地用一、两个 nova API call 搞定。实际上,图上是可以做很多更 Graphy(具有图属性的)、复杂、独特的工作的,我们慢慢来看:

网络可达检测

考虑下这样的场景,在 OpenStack 中,不同的主机可以连接到相同的子网 VPC,主机也可以连接到多个子网之中。这样,主机之间的网络连通性信息、与网络联通相关的推理、传导都可以在图上进行。

在真实世界中,这里可能还要考虑 Security Group、Router、Switch 等因素。本示例中我们用到的 OpenStack 是比较简化的 L2 only Setup。

我们要获得与虚机 同一 VPC 的所有其他虚机很容易表达:


结果如下:

L2_connected_server server-1

看起来很初级,接下来我们再查询与虚机 同一 VPC、有可能通过跨网络虚机而互联的主机的所有其他虚机。这时候,我们除了共享 neutron network(VPC) 的情况,还要查询所有二层直连的虚机可能通过其他 VPC 连出去的的虚机。下面的例子,我们用到了 的表达,表示可能匹配到的模式:


可以看到结果里,跨网络潜在的相连主机还有 server-3:

L2_connected_server cross_vpc_server server-1 server-3

可视化下,同样,我们修改输出为路径 和 。


它可能的连接路径一目了然了:

cross_vpc_vm

有了获得这些信息的能力,我们可以可编程地连接告警、状态、安全风控、网络等方方面面系统。当然这不是本文的重点,就不加以赘述了,你有相关的实践想要分享的话,记得来 NebulaGraph 社区。

下面,我们来看看存储相关的例子。

镜像、云盘、快照的血缘

在基础设施中,云盘(iSCSI、Ceph、NFS)、镜像、快照之间有多重复杂的关系,比如:

  • 一个系统镜像可能从某一个虚拟机挂载的云盘或者一个快照创建
  • 一个云盘可能是从一个系统镜像、一个快照或者另一个云盘创建
  • 一个快照是从一个云盘创建的

这种血缘信息的识别和管理是很有必要的。下面的查询可以获得指定虚机 的所有存储血缘:


我们可以看到结果中:

  • 的启动镜像(这里它是从本地盘启动的,没有挂载云盘)是从 创建的;
  • 是从 这个镜像创建的;

此外,还有其他有分叉关系的存储资源和它们也息息相关:

storage_lineage_0

下面,我们不只考虑存储资源,看下涉及云盘 cinder_volume 挂载 attached 这层关系下的血缘关系:


storage_lineage_1

我们可以从渲染图中读出这样的洞察:

  • 的启动镜像(这里它是从本地盘启动的)是从 创建的
    • 而 现在挂载在 上
    • 是从 这个镜像创建的
    • 同样 镜像被很多其他虚机在采用
  • 同时挂载了数据盘
    • 而 是一个多挂载的盘,它同时挂载在 之上
    • 的系统启动盘是从快照 克隆创建的
    • 快照 是曾经从 创建的
    • 现在挂载在 上,快照不一定是从 而来,因为镜像可能被重新挂载过。而这些血缘信息可以被用在资源生命周期管理、根因分析、安全告警、状态传递上,这里不加以赘述。

高相关性虚机预警

下面这个例子,会给出一个节点相似度的应用。在全图或者子图上,利用图算法找到与指定虚机图拓扑结构最相似的其他虚机,并在这种相关性基础上增加新的关系,做风险事件预警。

本次实践,我们会按照一个典型的从「快速子图验证」到「全图生产应用」的工作流。

子图快速验证:浏览器内算法

从 的三度子图上做算法的验证:


将结果渲染在画布上,我们可以看到子图中包含了其他几个虚机:

server_subgraph

我们利用 Explorer 中的浏览器内图算法,可以非常方便地验证我们的想法。这里,我们使用 Jaccard Similarity 相似性算法,让 与 迭代分别得到相似性:

jacc_sim_browser

可以看出,在 3 步子图内,和 最近接的虚机是 。进一步,我们可以简单在子图上看看两者之间的路径作为相似性的解释:

sim_explain

在这个可解释结果中,我们知道 与 相似的原因可能是:

  • 坐落在同一个宿主机:node-0
  • 使用同一个镜像:cirros_mod_from_volume-1

因此,我们最终落地的预警机制可能是,当 出现某一问题、告警时候,给相似的 server-4 也设定预警,预警理由就是它们在同样主机、同样镜像。

全图生产应用

有了上面的快速实验,借助 Workflow + NebulaGraph Analytics 把它落地为全图上的算法,利用 Analytics 分布式能力去执行。

在生产上,我们利用 Workflow 的 DAG 编排能力,创建两个前后相连的任务:

  • 取临近虚机
  • 全图算相似度

第一个任务如下,实时从指定虚机出发给出其他虚机 vid。这里查询语句写死了 server-0,但是在 Workflow 里可以参数化,并封装任务为可被 API 触发的异步服务:


query_sim_server

而在 Jaccard Similarity Job 中,我们选择 ids1 为 server-0,ids2 从上游(上面的 Query Job)取,选择在 OpenStack 全图扫描所有边类型。

jacc_sim_workflow

保存、运行。结果如下,这次它运算了更多的目标虚机,并且迭代作用范围是全图而非一个子图。可以看到同上次的结果是一样,因为子图上关联度大的点和相近的边在 Jaccard 算法里起到了更主要的作用。

jacc_result

安全相关场景

基础设施资源中的关联关系和金融、内容系统、电商领域的风控场景有相似的地方,很多场景本质上利用到了图谱关系中的知识,在图库上实时获取这些复杂但又天然可解释的安全洞察。

秘钥泄漏风控分析

先看一个秘钥泄漏的场景:假设 被安全部门确定被泄漏了,我们可以在毫秒内获得如下查询:

  • 直接使用该密钥的虚机
  • 与使用该秘钥的虚机网络直连的机器
  • 与使用该秘钥的虚机跨网络相连的机器

贴一下部分结果,我们知道 server-4 采用了这个 keypair,并且 server-6 和它在同一个网络。同时,有一定几率通过 server-6、server-1、server-2、server-0、server-5 也受到了影响。针对这种情况,相关的机器可以设置不同告警级别来降低安全事故的影响。

with_key l2_vms cross_vpc_vms server-4 server-6 server-1 server-4 server-6 server-2 server-4 server-6 server-0 server-4 server-6 server-5

这个查询改造为可视化结果:


在 Explorer 中应用 Dagre-LR 的布局,相关的关联关系可以很清晰地被展示出来。介于可视化展示的直观性,我们可以考虑把这个图放入安全报告,随同其他安全信息一同分发给虚机租户。

key_leaked

镜像、云盘漏洞范围分析

类似的,一个镜像被扫出漏洞,我们可以瞬间查到波及的资源,并做出相应应对之策。

镜像文件有漏洞:


image_vulnerability

某个云盘有漏洞:


volume_vulnerability

潜在宿主机逃离影响范围分析

最后,我们讨论一个严重的安全问题:宿主机逃离。

在极端的情况下, 发生了有可能影响宿主机的安全事件,此时仅仅关闭这个宿主机是不够的,因为受影响的范围可能已经扩大。但我们又不能因为这样不知影响范围多广的安全事件来关闭整个机房。所以,利用图谱辅助找出受影响范围就非常有用了。

下面的查询模式是:

  • 找出可能被影响的子网(VPC),标记最高级别风险子网为后续定位做准备
  • 找到可能被控制了的宿主机
  • 从宿主机触发,找出同主机的其他虚机
  • 从其他虚机触发,找到它们的子网(VPC)
  • 从其他虚机触发,找到可能已经被影响的网盘。这是为了防止被挂载到其他机器,这会扩大影响。

下面的结果集中,列出了 server-0 被控制之后,考虑宿主机逃离的情况下可能受影响的扩散范围。

impacted_subnet_high hypervisor_compromised impacted_subnet server_same_host impacted_volume shared node0 shared [“server-0”, “instance-00000001”]
Empty shared node0 shared [“server-1”, “instance-00000002”] ffaeb199-47f4-4d95-89b2-97fba3c1bcfe shared node0 private [“server-1”, “instance-00000002”] ffaeb199-47f4-4d95-89b2-97fba3c1bcfe shared node0 private [“server-3”, “instance-00000005”] c9db7c2e-c712-49d6-8019-14b82de8542d shared node0 private [“server-3”, “instance-00000005”] volume-2 shared node0 public [“server-4”, “instance-00000006”] volume-2

咱们再看看它的可视化结果。


还是和之前一样,我们在可视化图探索工具 Explorer 中选择 Dagre 布局,它能比较清晰看出影响资源的范围。从这些可能受影响的虚机、网络、网盘出发,可以进一步采取需要的安全措施了。

hypervisor_escape

重点关注资源检测

最后,利用 Betweenness Centrality 算法,我们可以获得基础设施中影响面大的那些”脆弱环节“。这些资源不一定真的处在危险的状态,只是说,它们处在了比较重要的资源之间的交汇处,一旦它们出问题,出问题的代价可能会非常大。

因此,识别关键资源后,我们可以考虑下面的安全机制:

  • 有针对性采用更激进、昂贵的健康检查策略;
  • 设定更高的支持、关注级别;
  • 主动迁移相关联的资源,以降低”脆弱环节“对整体基础设施可用性的影响范围;

在这里,我们只在浏览器内部的子图上做算法流程验证。机智的你,可以自己试着利用开源的 NebulaGraph Algorithm 或者付费的 NebulaGraph Workflow + Analytics 做全图上的等价操作。

首先,我们用之前的方式去扫描图上 1,000 个点,并且从它们出发,跳一跳,获得一个比较随机的子图。实际上,由于我们的数据集并不是很大,这个操作是捞取了全图的数据:


随机子图搞定之后,我们运行 Betweenness Centrality 算法,得到 是分值最大的”脆弱一环“。的确,它是我们当前实验中负载最大的宿主机,可以想象它确实是故障之后全局影响最大的一个资源。

bwteeness_centrality

总结

在海量数据、企业云、混合云的复杂基础设施运维场景下,利用图数据库图算法的能力做高效的辅助运维工作是一个十分值得的尝试与技术投资。

NebulaGraph 作为高性能、开源、分布式的新一代云原生图数据库,是一个很值得考虑的图基础设施选型目标。

欢迎大家在文末留言讨论,本文的可复现环境和示例的 ETL 管道的代码、示例数据全都在 https://github.com/wey-gu/openstack-graph/ 开源,欢迎大家来一起完善。

本文用到的可视化图探索工具为 NebulaGraph Explorer,目前可以免费试用 30 天。

此外,我把本实验中的图谱放在了 NebulaGraph Studio/Explorer 的示例数据集中,大家也可以在里边下载试玩。

Goland激活2023.1.1(GoLand 2023.1 发布)

参考文献

  • OpenStack 环境搭建:https://github.com/wey-gu/openstack-graph/#environment-setup
  • Infra 资源创建:https://github.com/wey-gu/openstack-graph/#create-resources-on-openstack
  • Vitrage 示例文档:https://github.com/openstack/vitrage/blob/master/doc/source/contributor/vitrage-templates.rst

谢谢你读完本文 (///▽///)

NebulaGraph Desktop,Windows 和 macOS 用户安装图数据库的绿色通道,10s 拉起搞定海量数据的图服务。通道传送门:http://c.nxw.so/7CcNV

想看源码的小伙伴可以前往 GitHub 阅读、使用、(^з^)-☆ star 它 -> GitHub;和其他的 NebulaGraph 用户一起交流图数据库技术和应用技能,留下「你的名片」一起玩耍呢~

华为运动健康服务(HUAWEI Health Kit)6.10.0 版本新增的能力有哪些?

阅读本文寻找答案,一起加入运动健康服务生态大家庭!

一、 支持三方应用查询用户测量的连续血糖数据

符合申请Health Kit服务中开发者申请资质要求的企业开发者,可申请访问用户的心率、压力、血糖等健康数据。

在新版本中,血糖数据类型在原有指尖血糖数据开放的基础上,新增支持用户连续血糖数据的开放。获得用户授权的开发者,可通过对应的数据开放接口,获取用户在一段连续测量过程中产生的多个时刻的血糖值。

二、 支持开发者获取用户对华为运动健康App开放授权的结果

开发者若想访问华为运动健康App的数据,需要引导用户开启华为运动健康App对华为运动健康服务的开放授权。用户开启华为运动健康服务授权操作如图所示:

Goland激活2023.1.1(GoLand 2023.1 发布)

开发者在以往的集成过程中,通常会拉起用户华为运动健康服务连接页面,在用户连接后开启授权,但是开发者往往无法感知用户是否真实有效的完成授权。在最新版本的功能中,我们提供了新的机制,用于开发者感知用户华为运动健康App开放授权的结果,并针对返回结果做相应的处理,详情请参见华为运动健康App开放授权章节。

三、 新增支持健康预警事件订阅

Health Kit云侧提供了订阅通知机制,当用户数据发生变化时,我们会实时通知开发者,以便开发者应用及时获取用户最新运动健康数据。

Goland激活2023.1.1(GoLand 2023.1 发布)

针对关注用户心脏健康的开发者,我们提供了对于不同心律失常类型进行订阅的健康预警事件。当前支持的订阅的心律失常健康预警类型包含:房性早搏、室性早搏、房颤。当用户出现此类心律失常现象时,开发者可通过数据订阅进行感知。

四、 路线数据/跑步课程写入功能正式上线

支持生态单个路线数据自动导入至华为运动健康App,并下发到穿戴设备(当前支持的设备:HUAWEI WATCH GT 3系列、HUAWEI WATCH GT RUNNER)。用户可以在设备上直接使用下发的路线导航,进行跑步、爬山等活动,无需掏出手机,利用手表即可轻松导航。

支持生态应用的跑步课程数据写入至华为运动健康App,并在已有的华为智能穿戴设备连接并支持课程导入时,直接将课表推送到设备上,用户可以轻松便捷地投入到跑步课程训练中。

想了解更多HUAWEI Health Kit开发指导?链接直达。

了解更多详情>>

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee

关注我们,第一时间了解 HMS Core 最新技术资讯~

Zadig/开源版 v1.17.0 登场

恰逢 Kubernetes 1.27 发布,而 Zadig v1.17.0 正式登场,支持到  Kubernetes 1.26!

新版本优化了工作流、权限配置、环境页面等方面的问题,让开发者的工作更加高效。同时,新增了很多实用的功能,例如自定义工作流内置输出变量、个人收藏、通用触发器等 30+ 个优化项。此外,我们还修复了一些问题,优化了用户体验。

让大家用得「清」楚,更能用得「明」白。

工作流一目了然

你们一起上吧,我赶时间

工作流列表展示优化,任务运行状态一目了然,要看得清,更要用得明。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

工作流任务列表支持阶段信息显示,无需进入详情即可感知每个任务步骤。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

自定义工作流操作记录添加到操作日志,审计追踪更加方便。

Goland激活2023.1.1(GoLand 2023.1 发布)

开发者仪表盘更上一层楼

新增全局任务运行状态展示

那个熟悉的运行状态,它回来了。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

环境页面支持收藏

你的环境,一触即达

即使环境再多,妈妈也不用担心我找不到我的环境了。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

权限配置 UI 调整    优化权限项显示

治愈你的老花眼

拒绝眼花缭乱,配置更加清晰便捷。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

全局权限新增项目新建和删除

权限细粒化

非管理员也可以创建项目,操作超灵活。

Goland激活2023.1.1(GoLand 2023.1 发布)

配置构建时支持设置

代码库执行时不显示

过滤噪声,关注我想关注的

服务的构建依赖很多万年不变的代码库,执行时代码库列表超级长,担心点错?

别怕,勾上它执行时就会隐藏,即使代码库再多,也不会「蕉绿」。

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

新增功能详情列表

Release notes

工作流

  • 自定义工作流增加内置输出变量(服务/代码信息/环境名称等)

  • 自定义工作流支持个人收藏

  • 自定义工作流支持通用触发器

  • 自定义工作流支持操作日志

  • 自定义工作流执行支持全选服务组件

  • 自定义工作流添加待审批状态

  • 工作流支持 Helm 服务并行部署

  • 工作流 Git 触发器 Push 事件支持自动取消

  • 工作流任务超时时间包含准备环境阶段

  • 工作流构建支持配置代码库执行时不显示

  • 工作流任务缓存配置默认关闭

  • 测试任务支持文件存储能力

  • 安全扫描支持配置多个仓库

  • 仪表盘新增工作流运行状态

工作流体验优化

  • 工作流部署任务状态优化,增强 Pod 事件检查

  • 工作流列表页面显示效率优化

  • 工作流列表页面显示近十条任务信息

  • 工作流任务列表页面支持阶段信息

  • 工作流任务详情页面 UI 优化

  • 工作流配置和执行错误信息优化

  • 工作流日志 /r 换行显示优化

  • 工作流任务必填内容增加校验

  • 自定义工作流审批人数检查优化

服务及环境

  • 下线共享服务

  • 环境支持个人收藏

  • 环境页面服务列表滚动交互优化

  • Helm Chart 项目添加服务交互优化

其他优化及问题修复

  • 项目搜索支持中文

  • 镜像仓库集成增加地址校验

  • 权限配置 UI 优化

  • 修复自定义工作流执行跨项目测试报错问题

  • 修复 Gerrit patch set 事件无法触发工作流问题

  • 修复工作流多 PR 执行时通知信息中丢失 PR 问题

  • 修复基于非 master 分支创建 tag 无法正常触发工作流问题

  • 若干体验优化和交互优化

Workflow

  • Custom workflows now support adding built-in output variables (service/code information/environment name, etc.).

  • Custom workflows now support personal favorites.

  • Custom workflows now support generic triggers.

  • Custom workflows now support operation logs.

  • Custom workflows now support executing services/components in bulk.

  • Custom workflows now have a pending approval status.

  • Workflows now support parallel deployment of Helm services.

  • Git trigger push events now support automatic cancellation.

  • Workflow task timeout now includes environment preparation stage.

  • Workflow build now supports hiding code repository execution settings.

  • Workflow task caching is now disabled by default.

  • Test tasks now support file storage capabilities.

  • Security scanning now supports configuring multiple repositories.

  • Dashboard now includes workflow runtime status.

Workflow experience optimization

  • Deployment task status in workflows has been optimized with enhanced Pod event checks.

  • Workflow list page now displays recent task information.

  • Workflow task list page now supports phase information.

  • Workflow task details page UI has been optimized.

  • Workflow configuration and execution error messages have been optimized.

  • Workflow logs now have improved line break displays.

  • Workflow task mandatory content now has added verification.

  • Custom workflow approval number check has been optimized.

Services and environments

  • Shared services is deprecated.

  • Environments now support personal favorites.

  • Environment page service list has improved scrolling interaction.

  • Helm Chart projects now have improved service interaction.

Other optimizations and issue fixes

  • Project search now supports Chinese.

  • Image repository integration now has added address verification.

  • Permission configuration UI has been optimized.

  • Fixed issue where executing custom workflows across projects caused testing errors.

  • Fixed issue where Gerrit patch set events couldn’t trigger workflows.

  • Fixed issue where workflow notification information was missing PR during multiple PR execution.

  • Fixed issue where creating tags based on non-master branches couldn’t trigger workflows.

  • Several experience and interaction optimizations.

说到这里是不是有点心动了呢?赶紧下载安装用起来吧~

Zadig v1.17.0 完整的功能列表和升级过程详情见 https://docs.koderover.com/zadig/v1.17.0/release-notes/v1.17.0

 

特别感谢以下社区小伙伴,提出的宝贵建议:

@moon @乔克 @luo @西红熊 @Sn @胡生生 @张冬冬

Zadig,让工程师更加专注创造

 

欢迎加入 开源吐槽群🔥

Zadig on Github

Zadig on Gitee

 

 

作者:京东物流 赵勇萍

前言

上个月我负责的系统SSO升级,对接京东ERP系统,这也让我想起了之前我做过一个单点登录的项目。想来单点登录有很多实现方案,不过最主流的还是基于CAS的方案,所以我也就分享一下我的CAS实践之路。

什么是单点登录

单点登录的英文名叫做:Single Sign On(简称SSO)。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。之前我做的系统,需要需要设计一套支持单点登录的鉴权认证系统,所有系统都基于一套鉴权系统进行登录,并且可以实现各个系统之间的互信和跳转。所以就采用了CAS架构。

什么是CAS

CAS架构的核心是需要搭建一个CAS Server,该服务独立部署,拥有独立三级域名,主要负责对用户的认证工作。他主要组成包括WEB前端提供登录页面,票据模块,认证模块。

核心票据:

a. TGT(Ticket Grangting Ticket):TGT是CAS为用户签发的登录票据,有TGT就表明用户在CAS上成功登录过。用户在CAS认证成功后,会生成一个TGT对象,放入自己的缓存中(Session),同时生成TGC以cookie的形式写入浏览器。当再次访问CAS时,会先看cookie中是否存在TGC,如果存在则通过TGC获取TGT,如果获取到了TGT则代表用户之前登录过,通过TGT及访问来源生成针对来源的ST,用户就不用再次登录,以此来实现单点登录。

b. TGC(Ticket-granting cookie):TGC就是TGT的唯一标识,以cookie的形式存在在CAS Server三级域名下,是CAS Server 用来明确用户身份的凭证。

c. ST(Service Ticket):ST是CAS为用户签发的访问某一客户端的服务票据。用户访问service时,service发现用户没有ST,就会重定向到 CAS Server 去获取ST。CAS Server 接收到请求后,会先看cookie中是否存在TGC,如果存在则通过TGC获取TGT,如果获取到了TGT则代表用户之前登录过,通过TGT及访问来源生成针对来源的ST。用户凭借ST去访问service,service拿ST 去CAS Server 上进行验证,验证通过service生成用户session,并返回资源。

基于CAS的系统实践方案

1. 业务背景

在我负责的项目系统中,后台业务采用的是微服务架构,有统一的业务网关,所以基于统一的业务网关,整合客户其他系统登录鉴权流程。具体业务架构图如下:

Goland激活2023.1.1(GoLand 2023.1 发布)

在此说明一下,因为登录系统的用户体系在不同的系统中,所以我在设计SSO统一登录认证的时候,把SSO系统与业务系统结构出来。而用户体系有两套,一套叫做采方用户体系,一套叫做供方用户体系。所以才会有如图所示的SSO Server服务,他本身不负责用户管理,但会通过统一标准接口的方式实现控制反转,实现对用户服务的调用。

2. 单点登录时序图

时序图如下:

Goland激活2023.1.1(GoLand 2023.1 发布)



如图所示,时序图标识的是两个系统通过SSO服务,实现了单点登录。

3. 单点登录核心接口说明

3.1 sso认证跳转接口

调用说明:

由应用侧发起调用认证中心的接口。

URL地址:

 

请求方式:302重定向

参数说明:

appId: 对接SSO认证中心的应用唯一标识,由SSO认证中心通过线下的方式颁发给各个应用系统。

tenantType: 标记是供方登录还是采方登录。采方为1,供方为2.

RedirectUri: 应用回调地址。

3.2 重定向获取临时令牌code接口

调用说明:

有认证中心发起,应用侧需实现的接口。认证中心通过302重定向,将code传给应用侧,应用侧自行发起通过临时令牌code换取accessTokenInfo。

URL地址:

 

请求方式:GET

参数说明:

Code: 临时令牌,有效时间5min

3.3 获取accessTokenInfo接口

调用说明

由应用侧发起调用认证中心的接口。通过该接口可以获取accessTokenInfo信息,然后系统自行生成本系统session信息。

URL地址:

 

请求方式:GET

参数说明:

appId: 对接SSO认证中心的应用唯一标识,由SSO认证中心通过线下的方式颁发给各个应用系统。

code: 临时令牌,需加密

加密规则如下:

1.
Code先进行base64加密
2.
用认证中心给的privateKey进行加密(RSA加密)。
3.
加密后进行URLCode转码。

返回参数:

 

3.4 刷新Token接口

调用说明:

由应用侧发起调用认证中心的接口。当token快到失效期时,通过该接口可以刷新accessTokenInfo信息,然后系统自行生成本系统session信息。

URL地址:

 

请求方式:GET

参数说明:

appId: 对接SSO认证中心的应用唯一标识,由SSO认证中心通过线下的方式颁发给各个应用系统。

accessToken: 需要刷新的token值。

4. 单点登出逻辑

有单点登录,也会有单点登出,这样才会形成业务闭环,对于单点登出逻辑,基本类似登录的逆操作,时序图如下:



Goland激活2023.1.1(GoLand 2023.1 发布)



5. 单点登出核心接口说明

5.1 登出sso认证中心跳转接口

调用说明:

由应用侧发起调用认证中心的接口。

URL地址:

 

请求方式:GET

参数说明

RedirectUri: 应用回调地址。

5.2 应用系统退出接口

调用说明

有认证中心发起,应用侧需实现的接口。通过该接口触发个应用系统清除缓存和session相关信息,实现系统登出。

URL地址:

 

请求方式:GET

 

总结

对于CAS这种单点登录的架构,他是非常依赖于cookie的安全性的。所以CAS的安全性也在一定程度上取决于cookie的安全性,所有增强cookie安全性的措施,对于增强CAS都是有效的。

最后提一句,一定要使用HTTPS协议哦。

作者:京东物流 陈维

一、引言

本文我们将以围绕系统安全质量提升为目标,讲述在功能安全测试&安全渗透测试上实践过程。

希望通过此篇文章,帮助大家更深入、透彻地了解安全测试。

二、安全渗透测试实践

安全前置扫描主要是识别白盒漏洞、黑盒漏洞问题,针对JSRC类问题,需要通过渗透测试进行漏洞发现。

1.安全测试类别

安全测试根据开展的阶段不同,测试对象不同,可以分为:功能安全测试、安全渗透测试

以下是两者定义、两者的区别:

Goland激活2023.1.1(GoLand 2023.1 发布)

具体内容:

功能安全测试:

在功能测试阶段进行,由各业务线测试工程师进行,主要包括以下几个方面:

• 人员权限设置,是否满足需求文档中的说明:

1). 是否初始化好所有的角色;

2). 每个角色是否按最小权限进行功能配置;

• 权限测试:水平越权、垂直越权、交叉越权;

• 敏感信息处理是否符合规范;

1). 加密存储;

2). 显示屏蔽;

3). 脱敏导出;

4). 操作安全日志记录;

安全渗透测试:

Goland激活2023.1.1(GoLand 2023.1 发布)

1.功能安全测试

(1)开展功能安全测试

Step1:确定项目是否需要安全评审

参考标准(来源安全部):

• 公司重点战略项目

• 外网新系统

• 大量外部人员使用的内网系统(建议15人以上)

• 含重大商业机密,特殊敏感性的系统;

• 新采购的乙方项目或外包项目;

• 上面几类系统在重大升级时。

Step2:依托SDL流程开展安全测试:

Step3:测试阶段的功能安全测试:

安全用例设计->测试执行->漏洞报告

Step4:上线前的提交渗透测试

(2)功能安全在项目中开展

SDL测试阶段开展功能安全测试:

①确定测试方案:功能安全测试、安全渗透测试、代码白盒扫描、应用黑盒扫描。

②安全用例设计

③功能安全用例:基于功能点,从权限控制、越权类、数据类 维度进行用例设计。

SDL上线前提交安全渗透测试.

2.安全渗透测试

(1)开展渗透测试

Step1:使用测试工具:

• BurpSuite安装:

下载地址:https://portswigger.net/burp/communitydownload

Proxy SwitchyOmega(代理插件):代理插件下载地址

• 浏览器代理配置:

Goland激活2023.1.1(GoLand 2023.1 发布)

• BurpSuite -Proxy监听配置:

Goland激活2023.1.1(GoLand 2023.1 发布)

• BurpSuite使用:

浏览器启用Proxy进行代理,通过BurpSuite进行数据抓取:

Goland激活2023.1.1(GoLand 2023.1 发布)

Proxy-Repeater进行请求包的重发:

Proxy-Intruder进行暴力爆破:

选定变量参数–参数化–批量重发请求–结果获取分析。

Step2:测试执行

Step3:整理报告

(2)常见漏洞测试

权限绕过

定义:指权限控制功能不严谨,系统用户可以访问或者操作未授权的功能或者数据。

水平越权场景:当系统存在多个相同权限的用户时,A用户越权访问或操作到B用户的资源。

垂直越权场景:当系统存在不同权限的用户时,低权限用户越权访问或操作到高权限用户的资源。

未授权访问:用户在没有通过认证授权的情况下能够直接访问需要通过认证才能访问的页面或者信息。

提交了大量的举证单信息:

SSRF(服务端请求伪造)

定义:由攻击者构造请求,由服务端发起请求的安全漏洞,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)。

存储XSS漏洞

定义:跨站脚本攻击是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。允许恶意用户将代码注入网页,其他用户在浏览网页时会受到影响。恶意用户利用XSS代码攻击成功后,很可能获得很高的权限。

XSS分为:反射型,存储型,DOM型。

三、总结

本文主要讲述了功能安全测试&安全渗透测试 的定义、区别、开展方案,以及实践举例。

这两中安全测试既可在项目开展SDL流程的过程中开展,同时也可将安全渗透测试单独拿出来,针对组内外网系统,专项进行渗透测试。

通过这样的测试,可以降低遗漏到JSRC外部白帽问题数。

作者:京东科技 李俊兵

各位看官好,我是球神(江湖代号)。

自去年11月30日ChatGPT问世以来,迅速爆火出圈。

起初我依然以为这是和当年Transformer, Bert一样的“热点”模型,但是当一篇篇文章/报告不断推送到我的眼前,我后知后觉地发现这次真的不一样。

很直接的一点是,ChatGPT已经影响到非AI、非互联网、非计算机的每一个人了。

你会看到,众多科技界大佬,马斯克、纳德拉、李开复、李彦宏、周鸿祎等,都在发声称 ChatGPT 将改变世界;

太多的互联网公司,如微软、谷歌、百度、阿里、腾讯等正在抢占商业先机;

还有更多的学术机构、高校也开始讨论 ChatGPT 生成论文是否符合学术规范;

突然之间各行各业从业者开始担忧被 ChatGPT 替代……

初看以为是热点,再看已成经典…

于是我决定好好研究它一番,并力争把它写得全面而通俗易懂一点,最终就有了这篇万字长文报告,建议收藏、慢慢阅读。

文章主题关于:ChatGPT背后的AI背景、技术门道和商业应用。

image.png

以下是目录和正文内容:

引言

我和聊天机器人的小故事

一、 AI背景

1.1 ChatGPT的出圈和能力圈

1.2 人工智能发展简史

1.3 ChatGPT背后的NLP和Transformer

二、技术门道

2.1 GPT-1到ChatGPT的演进和技术原理

2.2 ChatGPT的局限性

2.3 ChatGPT的优化和探索方向

三、商业应用

3.1 国内外资本投入层层加码

3.2 ChatGPT商业化序幕已经拉开

3.3 ChatGPT助力AIGC浪潮再起

后记

ChatGPT会引领第四次科技革命吗?

ChatGPT会给人类带来失业潮吗?

ChatGPT适合下海创业吗?

ChatGPT以及AIGC产业链有值得投资的机会吗?

参考文献

笔者相关背景简介

引言

我和聊天机器人的小故事

早在2017年末至2018年上半年,我刚拿到计算机专业研究生的入场券,同时需要完成本科毕业设计。因此,我选择提前进入研究生实验室并带回一个毕设课题:中文文本对话系统(俗称:聊天机器人)。

没错,从研究方向来说,今天文章的主角ChatGPT正好属于我那会的研究范畴—自然语言处理(NLP)。只不过后来因为一些不可控因素,我更加关注于机器学习和计算机视觉领域。

记得最后写本科毕业论文和答辩的时候,我的中文文本聊天机器人(基于Seq2Seq + Attention架构)还很low:只能保持4-5轮对话逻辑;稍微问难点答案就面目全非;对话的文本不能太长…

虽然同样在2017年,Transformer架构已经问世,但站在那个时间节点,即便是一线研究人员和工程师,恐怕也很难想象到5年后的2022年,就会有ChatGPT这样的现象级通用聊天机器人程序出现。

“科技的发展不是均匀的,而是以浪潮的形式出现”。—《浪潮之巅》,吴军

一、AI背景

1.1 ChatGPT的出圈和能力圈

尽管ChatGPT已经火爆到让很多人疯狂,我们还是希望静下心来仔细看看它现在到底能做什么,它的边界又在哪里。

1677726527064.png

各大热门平台产品月活跃用户数破亿所需时长

先看产品实际应用测试的效果:

1677726500577.png

image.png

再看产品表现背后抽象出的深层次能力:

image.png

所以,从发布到现在2个多月来,ChatGPT已经证明了它的能力圈包括:自动问答、多轮聊天、文章创作、语言翻译、文本摘要、编写和debug代码等,同时这些表层能力背后反映了其具备理解人类意图、敢于质疑、承认不知道、不断学习进化等深层次ability。

并且这些能力表现已经远超过往其他AI机器人,也已经得到了包括AI研究者、工程师和各行各业产业专家们的一致认可。

不得不承认,从单项性能表现、整体功能覆盖、稳定性、时效性、鲁棒性等多个维度评价,目前的ChatGPT已经足够颠覆,它让通用AI研究和产业落地成为可能。

1.2 人工智能发展简史

提起人工智能和计算机科学,有个名字总是无法绕开。

他是英国人艾伦·图灵(Alan Turing)

图灵(Alan Turing,1912-1954)出生的那年,他的祖国正处在“日不落”的全盛时期,占有的殖民地是本土面积的百倍有余。而在遥远的东方,中华民国临时政府在南京成立,中山先生就职临时大总统,属于中华民族的革命复兴才刚刚开始(ChatGPT应该写不出这段)。

1950年,时年38岁的图灵在数学和逻辑学领域已经成就颇丰,但当他在《计算机与智能》论文中提出著名的“图灵测试”构想时,后世的人们更加不会忘记他对人工智能和计算机科学领域做出的杰出贡献。

“如果第三者无法辨别人类与人工智能机器反应的差异,则可以论断该机器具备人工智能”。— 图灵, 人工智能之父

时间来到1956年8月,在美国达特茅斯学院,约翰·麦卡锡、马文·闵斯基、克劳德·香农、艾伦·纽厄尔、赫伯特·西蒙等科学家 一起讨论了用机器来模仿人类学习以及其他方面的智能等问题,首次提出了“人工智能”这个概念,也就此标志了人工智能学科的诞生。

此后,人工智能的发展经历了四次大的浪潮。

第一次浪潮(1956-1980):初次繁荣到低谷

初代AI中计算机被用于证明数学定理、解决代数应用题等领域。这一时期感知机(1957)、模式识别(1961)、人机对话(1966)、专家系统(1968)、视觉计算(1976)等理论先后被提出来。

好景不长,专家和学者们发现仅仅具有逻辑推理能力远远不够实现人工智能,许多难题并没有随着时间推移而被解决,很多AI系统一直停留在了玩具阶段。之前的过于乐观使人们预期过高,又缺乏实质性的进展,许多机构逐渐停止了对AI研究的资助。人工智能遭遇了第一次低谷。

第二次浪潮(1980-1995):二次复苏到萧条

AI 2.0时代专家系统和多层神经网络得到推广应用,人机对话机器人、语音控制打字机逐渐问世,这一时期贝叶斯网络(1985)、反向传播(BP,1986)、支持向量机(SVM,1995)等算法先后被提出来。

但是很快,专家系统所存在的应用领域狭窄、知识获取困难、维护费用居高不下等问题开始暴露出来。AI发展遭遇了一系列财政问题,进入第二次低谷。

第三次浪潮(1995-2010):平稳中积蓄力量

上个世纪90年代中期以来,随着计算机性能的高速发展和海量数据的累积,人工智能的发展正式进入现代AI时代。

1997年,IBM的国际象棋机器人深蓝(Deep Blue)战胜国际象棋世界冠军卡斯帕罗夫,引起世界范围内轰动。 随后,条件随机场(CRF,2001)、深度学习(Deep Learning, 2006)、迁移学习(Transfer Learning,2010)等理论先后被提出来。

第四次浪潮(2010-至今):爆发中走向高潮

进入21世纪的第二个十年以来,工业界开始陆续推出实打实的人工智能产品/应用。

2011年2月,IBM的问答机器人Watson在美国问答节目《Jeopardy!》上击败两位人类冠军选手;

2012年10月,微软就在“21世纪的计算”大会上展示了一个全自动同声传译系统,它将演讲者的英文演讲实时转换成与他的音色相近、字正腔圆的中文;

2016年3月,谷歌的围棋人工智能系统AlphaGo与围棋世界冠军、职业九段选手李世石进行人机大战,并以4:1的总比分获胜;

随后在2016年末-2017年初,AlphaGo又先后与中日韩数十位围棋高手进行快棋对决,连胜60局无一败绩,包括3:0完胜世界第一、中国选手柯洁。

与之对应的是,AI学术界在这十多年来可谓百家争鸣,各显神通。

2012年,Hinton(深度学习三巨头之一)和他的学生Alex Krizhevsky设计了第一个深度卷积神经网络— AlexNet,并摘得了当年ImageNet图像分类比赛的冠军;

此后,CV人相继提出了VGGNet(2014)、Inception Net(2014)、ResNet(2015)、Fast RCNN(2015)、 YOLO(2015)、 Mask RCNN(2017) 、MobileNet(2017)等base model,引领了图像分类、人脸识别、目标检测、图像分割、视频理解等领域的快速发展;

NLP人不甘示弱,他们先设计了Word2Vec(2013)类能将单词转化为向量表示的工具,随后利用LSTM(1997)系列循环神经网络,基于Seq2Seq(2014) + Attention(2015)的架构实现了机器翻译、对话系统等复杂任务,并进一步在2017年提出了Transformer这一大杀器,同时进阶产生了BERT(2018)系列性能更优更稳定的大模型。

还有另一群执着的AI者,他们更focus深度生成式网络模型。从变分自编码器(VAE,2013)到生成对抗网络(GAN,2014),再到去噪扩散模型(DDPM,2020)和生成式预训练Transformer (GPT系列,2018-至今),这些具有开创性的模型真正带动了产业界AIGC(生成式人工智能技术)的快速发展。

2017年,微软“小冰”推出世界首部由人工智能创作的诗集《阳光失了玻璃窗》; 2018年,英伟达发布StyleGAN模型可自动生成高质量图片; 2019年,Deep Mind发布DVD-GAN模型可生成连续性视频; 直到2022年11月30日,OpenAI发布ChatGPT,本文的主角终于正式登场。

image.png

一部人工智能发展史也是一部信息技术革命发展史。

不同的是,当人工智能发展到一定阶段,它或许终将颠覆“机器帮助人”的信息化时代,引领“机器代替人”的智能化时代。

多年以后,也许我们会看到,ChatGPT正是第四次科技革命开始的标志性事件之一。

1.3 ChatGPT背后的NLP和Transformer

在了解ChatGPT的能力圈和人工智能的发展史之后,非AI从业者也能明白ChatGPT的研究属于自然语言处理(Natural Language Processing, NLP)领域范畴。

自然语言处理(Natural Language Processing, NLP) 被誉为“人工智能皇冠上的明珠”,一方面表明了它的重要性,另一方面也突出了它的技术难度。

简单来说,NLP要做的事就是利用计算机实现自然语言数据的智能化处理、分析和生成,以期让计算机实现听、说、读、写、译这些人类所具备的语言能力。

更具体一点,NLP领域根据下游任务不同主要包括以下几类研究方向:

image.png

细心的读者已经发现了,ChatGPT基本已经实现了以上7大类任务的中阶目标,所以NLP研究员和工程师们担心自己发明工具却抢了自己饭碗不是没有道理,其他技术含量不高的行业工作者也就更加战战兢兢。

NLP的发展也经历了三个大的阶段,即以规则学习为代表的第一阶段(1960-1990)、以统计学习为代表的第二阶段(1990-2010)和以深度学习为代表的第三阶段(2010-至今)。

image.png

而其中真正影响ChatGPT和其他大语言模型产生的无疑是Transformer架构。

可以说,Transformer的出现完全打开了大规模预训练语言模型(Pre-trained Language Model , PLM)的空间,并且奠定了生成式AI的游戏规则。

2017 年,Google 机器翻译团队在机器学习顶级会议NIPS上发表了《Attention is All You Need》论文,文章的核心正是 Transformer 模型。

Transformer相比之前论文的novalty在于:大胆地抛弃了传统的CNN和RNN基础模型,整个网络结构完全是由Attention机制组成。更准确地说,Transformer由且仅由自注意力(self-Attenion)机制和前馈神经网络(Feed Forward Neural Network)组成。

而从实际应用的角度来看,Transformer的主要贡献(contribution)在于以下几个方面:

1.突破了 RNN 模型不能并行计算的限制

2.精度和模型复杂度相比RNN/CNN + Attention系列模型更优

3.Transformer本身也可以作为base model扩展

我们站在此刻回想,ChatGPT背后的Transformer,其思想和架构恰恰印证了那句: 大道至简

它首先在机器翻译任务中取得SOTA,而后成功被应用到NLP和CV等各个任务中,并获得了稳定优异的性能表现。

1677736492369.png

Transformer 模型架构图

后来的故事很多人都知道了,Google人再接再厉, 他们在2018年10月提出来的BERT(Bidirectional Encoder Representation from Transformers)模型再次轰动业界。

BERT在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩: 全部两个衡量指标上全面超越人类,并且在11种不同NLP测试中创出SOTA(业界最佳)表现,包括将GLUE基准推高至80.4% (绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进5.6%),成为NLP发展史上的里程碑式的模型成就。

就当所有人以为Google会在大语言模型赛道中一骑绝尘时,最终率先让世人熟知的却是来自OpenAI的GPT系列模型。

image.png

二、技术门道

2.1 GPT-1到ChatGPT的演进和技术原理

GPT(Generative Pre-training Transformer)系列模型首先选择和BERT绕道而行,尽管GPT-1(2018/06)发布的时间比BERT(2018/10)还要早。

BERT仅使用了Transformer的编码器(Encoder)部分进行训练,而GPT-1则只使用了Transformer的解码器(Decoder)部分。

由此二者各自走上了不同的道路。

GPT-1: 预训练+微调模式,117M参数、12层、2亿单词

原文:Improving Language Understanding by Generative Pre-Training

image.png

预训练阶段:基于Transformer Decoder架构,以语言建模作为训练目标(自监督,根据已知的词预测未知的词)。

image.png

微调阶段:将训练好的Decoder参数固定,接上一层线性层,通过有监督训练任务微调线性层的参数,从而进行预测。

image.png

GPT-1的局限:微调只能用到特定任务中,如果fine-tune一个分类任务,就不能用到句子相似度任务中去。

所以能不能用一个模型去做所有NLP的任务?

这就是后续GPT-2和GPT-3的改进目标。

GPT-2: 多任务学习 + zero-shot learning,1542M参数、48层、400亿单词

原文:Language Models are Unsupervised Multitask Learners

GPT-2的目标是试图用一个模型去做多个NLP任务,它的核心思想就反映在论文标题里:语言模型=无监督多任务学习

通俗地解释一下: 语言模型实际上是一种自监督的方式,根据已知的词预测未知的词,只是不需要显示地定义哪些字段是要预测的输出。 那如何用无监督多任务的训练方式实现语言模型自监督训练+多任务微调的效果呢? 我们只需要将input、output和task都表示为数据,例如在一个英文翻译成法语的机器翻译任务中,我们只需要将样本、标签和任务表示成如下格式,就实现了对的建模。

image.png

重要的是,这种方式可以实现无监督训练,并且里面的task可以变化,也就是说现在GPT-2可以实现无监督多任务训练而不需要第二阶段分不同任务有监督的微调!

所以最后我们看到,GPT-2相对于GPT-1,最大的改进就是去掉了第二阶段的微调(fine-tune)层,实现了多任务训练和zero-shot方式(Zero-shot learning,零样本学习)直接接诸多的下游任务,在多个任务下都可以取得很好的效果。

当然肉眼可见的还有数据集、网络层数、参数量、词汇表大小、初始化和LN(layer normalization)的调整。

GPT-3:in-context learning + few-shot learning,1750亿参数、96层、5000亿单词

原文:Language Models Are Few-shot Learners

GPT-3 基本继承了GPT-2的模型架构和训练模式,除了大力出奇迹的海量数据和巨型参数之外,GPT-3在模型设计层面相对于GPT-1和GPT-2主要的改进点在于:in-context learning(上下文情境学习,ICL) 和 few-shot learning(小样本学习,FSL)配合服用。

我们已经知道,GPT-1和BERT都需要对下游任务进行微调,而GPT-2通过无监督多任务和零样本学习舍弃了微调,并且验证了性能更加优越,那能否在不需要微调的前提下继续提升呢?

答案是可以,引入in-context learning(上下文情境)学习机制。

这种机制可以理解为给模型加一定的先验知识,适当对模型进行引导,教会它应当输出什么内容。

比如你希望GPT3帮你把中文翻译成英文,你可以这么向他提问:

如果你希望GPT3回答你的问题,你可以换个方式问:

这样模型就可以根据用户提示的情境,进行针对性的回答了。

这里只是告诉了模型怎么做,能不能先给个示例呢?

其中回答球神帅不帅就是一个示例,用于让模型感知应该输出什么。

基于以上,只给提示就是zero-shot,给一个示例叫做one-shot,给少量多个示例就是few-shot。

专业的读者应该能发现,这里给提示的in-context learning(上下文情境)学习跟prompt learning(提示学习)的思想很相似。

GPT-3论文里提供了3个版本的性能比较:

image.png

显然,in-context learning(情境学习)搭配few-shot learning(小样本学习)效果更好。

InstructGPT: RLHF(人类反馈强化学习)+ PPO(近端策略优化)

原文:Training language models to follow instructions with human feedback

InstructGPT相对GPT-3要解决的是大模型的alignment(对齐)问题。其背景是:大型语言模型会生成一些不真实、有毒(不符合人类道德伦理等)或对用户毫无帮助的输出,显然这些与用户期待的不一致。

大模型在预训练过程中见识了各种各样的数据,因此针对一个prompt/instruct(提示)会输出什么东西,也可能是多种多样的,但是预训练数据中出现的数据模式,不代表都是人类在使用模型时希望看到的模式,因此需要一个alignment(对齐)的过程,来规范模型的“言行举止”。

而实现这个过程InstructGPT引入了RLHF机制(人类反馈强化学习),实际上6年前的AlphaGo正是充分利用了强化学习,才在围棋领域实现了所到之处无敌手。

简单点说,InstructGPT就是在GPT-3基础上利用RLHF机制(人类反馈强化学习)做了微调,以解决大模型的alignment(对齐)问题。

我们不妨先想一下,应该如何解决模型输出跟人类期待不匹配的问题?

最直接的办法,就是人工构造一大批数据(标注员自己写prompt和期待的输出),完全符合人类的期待的模式,然后交给模型去学。然而,这代价显然太大了。因此,我们得想办法怎么让这个过程变得更轻松一点,RLHF机制(人类反馈强化学习)做到了这一点。

下面是InstructGPT的流程图,看懂了它也就能明白RLHF机制是如何实现的。

image.png

Step-1: 称初始模型为V0,也就是GPT-3。我们可以先人工构造一批数据,不用数量很大,尽其所能,然后先让模型学一学,称这个时候模型为V1。

Step-2: 然后让模型再根据一堆prompt(提示)输出,看看效果咋样,我们让模型V1对一个prompt进行多个输出,然后让人对多个输出进行打分排序,排序的过程虽然也需要人工,但是比直接让人写训练数据,还是要方便的多,因此这个过程可以更轻松地标注更多数据。然而,这个标注数据,并不能直接拿来训练模型,因为这是一个排序,但我们可以训练一个打分模型,称为RM(reward-model,也即奖励模型),RM的作用就是可以对一个<prompt,output> pair打分,评价这个output跟prompt搭不搭。

Step-3: 接下来,我们继续训练V1模型(被一个策略包装并且用PPO更新),给定一些prompt,得到输出之后,把prompt和output输入给RM,得到打分,然后借助强化学习的方法,来训练V1模型(打分会交给包着V0模型内核的策略来更新梯度),如此反复迭代,最终修炼得到V2模型,也就是最终的InstructGPT。

整体理解一下:整个过程就是老师(人类标注员)先注入一些精华知识,然后让模型试着模仿老师的喜好做出一些尝试,然后老师对模型的这些尝试进行打分,打分之后,学习一个打分机器,最后打分机器就可以和模型配合,自动化地进行模型的迭代,总体思路称为RLHF:基于人类反馈的强化学习。

其中,PPO机制( Proximal Policy Optimization,近端策略优化) 是强化学习中AC类(Actor/Critic)的经典算法,由OpenAI 2017年提出,既有Policy Gradient方法的优势,同时基于importance sampling实现experience buffer的利用,发挥类似DQN类算法的数据利用优势。

PPO是OpenAI常用的baseline方法,理论部分相当复杂,感兴趣的专业读者可以阅读原文和相关博客。

原文:Proximal policy optimization algorithms

非专业读者只需要理解到这是一种适应人类反馈强化学习(RLHF)机制完成整个流程训练的策略优化算法即可。

通过以上流程拆解,我们不难发现InstructGPT能通过这种RLHF机制实现更好的性能,有一个大的前提:就是初始模型GPT-3已经足够强大。

只有初始模型本身比较强大了,才能实现人类提供少量的精华数据,就可以开始进行模仿,同时在第二步产出较为合理的输出供人类打分。

image.png

image.png

ChatGPT: 聊天升级版InstructGPT

根据OpenAI官方介绍,2022/11 发布的ChatGPT和2022/02 发布的InstructGPT在模型结构,训练方式上都完全一致,只是采集数据的方式上有所差异,但是目前没有更多的资料表明数据采集上有哪些细节不同。

所以,ChatGPT的技术原理与他的小兄弟InstructGPT基本一致,相当于InstructGPT是ChatGPT的预热版,也被称为GPT3.5,而传言即将发布的GPT-4是一个多模态模型(可以处理图片+文本+语音等多模态数据),期待。

至此,从GPT-1到ChatGPT的演进和技术原理就解释得差不多了。

 

最后来一张Instruct/ChatGPT中文架构流程图,更加清晰易懂。

image.png

2.2 ChatGPT的局限性

尽管ChatGPT已经足够人工智能了,但是在众多真实智能人类的鉴定下,它目前还存在不少局限。

功能局限

1.有时答案会出现事实性错误

2.仍然会产生有偏见、与人类道德伦理不对齐的内容

3.没有与实时信息建立关联

4.有时对输入的表达方式表现敏感

5.有时回答过于冗长

以上限制主要基于以下几点复合原因:

1.ChatGPT乃至所有机器学习模型都是基于已有的数据、知识、关联、标签等做出的预测,因此只要它有所依赖和基于概率预测,错误、不准、有偏见的答案理论上都是存在的,只是精度和召回的问题;

2.ChatGPT的人工标注(包括指示和输出)准确度、表达层度、“价值观”等还可以提升,目前的AI对齐方式–RLHF机制也未必是最优;

3.ChatGPT的信息更新停留在了 2021年,它目前还无法连接搜索引擎,将最新、最实时的信息反馈给用户。

技术局限

1.再大的模型都不能无限大

2.模型受奖励模型和人工标注影响较大

这是ChatGPT技术架构的两大痛点,也是目前深度学习和强化学习研究领域的两大难点问题。

其他局限

1.数据和算力带来技术的垄断

ChatGPT训练需要的这种数据和算力体量,使得玩家基本就国外和国内那些科技巨头企业。而且目前ChatGPT也不会开源,这就使得学校和中小AI企业没得研究,这并不利于ChatGPT本身的进步。

2.模型轻量化和性能的平衡

ChatGPT的参数量已经到达千亿级,如此大的模型显然不适合大规模真实场景应用,后续的模型轻量化研究不可回避,而轻量化和性能的平衡也是一个巨大的挑战。

3.可解释性背后的AI可信

即使目前的ChatGPT在各项NLP任务上表现惊人,但是模型本身还像一个黑盒,可解释性依然是专业算法人需要深入探索的点,用户的期待依然是更加可信的AI。

2.3 ChatGPT的优化和探索方向

1.多模态扩展

ChatGPT目前所展示出来的能力还主要在文本域和少部分跨模态/域的内容生成。

下一步的趋势已经很明显,统一集成文本、图像、语音、视频等多模态理解和生成能力,像人一样,多模态思考、多模态处理。

2.不止于RLHF,探索其他AI对齐方式 RLHF(人类反馈强化学习)并不是唯一的AI对齐技术,针对强化学习的AI对齐还有很多方法、很多策略可以探索。

3.提升指示的泛化和纠错能力

除了人工标注的标签(ground truth),ChatGPT对指示(prompt)的依赖也非常明显,进一步提升模型对指示的泛化能力以及对错误指示的纠错能力,不仅能提升用户使用模型的体验,也能使模型能够适应更广泛的应用场景。

4.模型轻量化技术探索

自深度学习框架效果被广泛验证以来,CV界和NLP界为了追求性能,过去10年的研究工作总体趋势是模型层数越来越深、参数越来越多、数据量越来越大。

但是在圈里的每个人其实又都知道,到了某个阶段必须得破圈,如今,ChatGPT虽然性能爆棚,但其模型之大之深显然不适合大规模真实场景甚至在端上应用,未来对模型轻量化的研究不可回避,而轻量化和性能的平衡也非常考验AI技术是否真的走向成熟。

5.数据+算力+人工标注的降本增效

数据、算力和算法作为AI三要素,ChatGPT成功地把其中的数据、算力附加人工标注的资源成本打到高校、研究机构、其他小AI公司无法承受的水平,所以即便众多专家学者吐槽“大力出奇迹”却也无可奈何。

技术似乎又一次走在了科学的前面,这对科技本身的长期进步显然并不有利。

然而,从OpenAI等大型资本加持的巨头企业角度来看,他们也同样希望在未来能够逐步降本增效,毕竟AI开发者的终极目标还是“AI,让生活更美好”,只不过这其中会有诸如技术垄断、商业竞争等因素夹杂在其中更影响实现的时间。

三、商业应用

3.1 国内外资本投入层层加码

除了ChatGPT能做什么以及背后的技术门道,人们或许更关心它未来的产品化和商业化的过程。

而复杂且高投入的技术要想能够大规模产品化和商业化,离不开资本的助力。

事实上,OpenAI的发展历程首先证明了这一点。

OpenAI由创业家埃隆·马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始人彼得·蒂尔等人于2015年12月在旧金山创立。

起初它的定位是一家非盈利的AI研究公司,而后在2019年3月,OpenAI成立了一家叫做 OpenAI LP 的有限合伙公司,正式过度到“封顶盈利”性质。

转折点在2019年7月,微软向OpenAI豪注10亿美金,并获得了OpenAI技术商业化的授权。

所以2020年5月OpenAI成功发布了1750亿参数+45TB数据量的GPT-3语言模型,仅仅训练阶段就花费了大约 1200 万美。

真就Money is all you need.

image.png

而在ChatGPT大放异彩的2023年初,微软、谷歌、亚马逊、百度、腾讯等国内外科技巨头更加不愿意错过机会,随之而来的是资本和研发投入的层层加码,烧钱 + 烧人。

image.png

image.png

3.2 ChatGPT商业化序幕已经拉开

2月1日,微软宣布推出由ChatGPT提供技术支持的视频会议及远程协作平台Teams的高级付费版Microsoft Teams Premium,订阅者可享用OpenAI GPT提供支持的大型语言模型技术,用AI自动生成会议笔记。

2月2日,OpenAI宣布,推出其人工智能聊天机器人ChatGPT的付费订阅版本,新的订阅服务名为ChatGPT Plus,月费为20美。订阅包括在高峰使用时间访问聊天机器人。目前的免费版本在使用率高的时间段将限制对用户的服务。

2月8日,微软推出了由OpenAI提供最新技术支持的新版搜索引擎必应(Bing)和Edge浏览器。

ChatGPT 已经被亚马逊用于各种不同的工作职能中,包括回答面试问题、编写软件代码和创建培训文档等。

文案自动生成平台Jasper,其技术底层是 OpenAI 的 GPT-3,在成立仅 18 个月后就达到了 15 亿美的高估值。

2月7日,百度宣布将在3月份完成其ChatGPT产品的内测,面向公众开放,该项目名字为文心一言(ERNIE Bot)。

image.png

image.png

ChatGPT应用场景广泛,商业价值巨大,有望赋能传媒、影视、营销、教育、金融、医疗、科研、游戏等多个行业。

ChatGPT赋能传媒:实现智能新闻写作,提升新闻的时效性

ChatGPT可以帮助新闻媒体工作者智能生成报道,将部分劳动性的采编工作自动化,更快、更准、更智能地生成内容。

image.png

ChatGPT赋能影视:拓宽创作素材,提升作品质量

ChatGPT可以根据大众的兴趣身定制影视内容,从而更有可能吸引大众的注意力,获得更好的收视率、票房和口碑。 ChatGPT可以为剧本创作提供新思路,创作者可根据ChatGPT的生成内容再进行筛选和二次加工,从而激发创作者的灵感,开拓创作思路,缩短创作周期。

image.png

ChatGPT赋能营销:打造虚拟客服,助力售前和售后

image.png

ChatGPT赋能教育金融医疗:促进数实共生,助力产业升级

ChatGPT+教育:赋予教育教材新活力,让教育方式更个性化、更智能;

ChatGPT+金融:帮助金融机构降本增效,让金融服务更有温度;

ChatGPT+医疗:赋能医疗机构诊疗全过程。

image.png

另外,ChatGPT和之前热炒的宇宙显然还不太一样。

宇宙到目前为止更像是一个美好的想法,还没有实际的产品和成熟的模式产生,大众甚至查阅资料都无法明白宇宙是要做什么。

但ChatGPT以及背后的生成式人工智能(AIGC),不仅有ChatGPT这样To C触感非常强烈的产品,而且已经能看到如上述一些比较清晰的商业化模式。

现在缺的就是资本加速和技术突破

3.3 ChatGPT助力AIGC浪潮再起

AIGC(Artificial Intelligence Generated Context),是指利用人工智能技术来生成内容,常见如AI绘画、AI写作、AI生成图片、代码、视频等。

image.png

AIGC顺着AI发展的脉络,大致经历了三个大的阶段:

image.png

2010年以来,随着深度学习的快速突破以及数字内容的海量增长,AIGC领域相关技术打破了预定义规则的局限性,算法模型结构不断创新,使得快速便捷且智慧地输出多模态的数字内容成为可能。

从2017年微软小冰作诗到2018年英伟达StyleGAN生成高质量图片,再到2019年谷歌DeepMind DVD-E2生成连续视频,AIGC正在经历一波蓬勃发展。

直到本文的主角ChatGPT 2022年年底出场,AIGC终于迎来了突破式的拐点,新一轮的浪潮正在徐徐展开。

AIGC应用场景

AIGC按内容生成类别可划分为文本、代码、图像、音视频四大类,而跨模态生成技术是真正实现生成式智能的核心。

AIGC的意义在于提高内容生产力、打开内容创作想象空间,这或许也是巨头争相加码AIGC的原因所在。从现有的应用场景来看,AIGC已经可以替代部分重复劳动力,并协助部分创造性劳动,未来AI技术的发展有望不断降低内容生产成本、提高生产效率并拓展内容边界。

image.png

image.png

image.png

AIGC市场空间

2023年人工智能从学术研究逐渐走向产业化,商业与AI技术的融合形成互为支点的发展格局,进入产业规模商用期。人工智能技术将不断地对AI数字商业的各个领域进行渗透。

据量子位预测,2030年AIGC市场规模有望超过万亿。在内容领域,人机协同,对于存量业务,AIGC的价值在于降本增效,对于增量业务,其价值在于跨模态的内容生成等。

据Gartner的“人工智能技术成熟度曲线”,生成式AI仍处于萌芽期,但其广阔的应用场景和需求空间吸引大量资本和技术的投入,预计将在2-5年内实现规模化应用。

AIGC有潜力产生数万亿的经济价值,AIGC繁荣发展,将促进资产服务快速跟进,通过对生成内容合规评估、资产管理、产权保护、交易服务等构成AIGC完整生态链,并进行价值重塑,充分释放其商业潜力,至2025年中国生成式AI商业应用规模至2070亿。

image.png

AIGC商业模式

过去AI发展多年,虽然在诸多领域也取得一些显著成果,但从整个AI产业来看,过去的应用更多的像是经过专业学习的“专科生”,不具备通用场景的泛化性。

但ChatGPT的问世,证明了基于大模型的AIGC已经像是一位接受过通识教育的“本科生”,虽然在发展初期在特定专业领域功能有限,却有着更强的可拓展性,能够赋能和落地各个商业领域。 并且直观来看,ChatGPT告诉世人,AI变成了一个普通人也可以轻松运用、提升效率的工具。

这意味着AIGC的商业模式更加显式化,不仅可以To B也可以To C。

AIGC To B模式主要希望解决的痛点问题在于:用AI代替人工生产,帮助企业实现降本增效。因为对B端带来的效果是快而显著的,因此客户的付费意愿较强。

而 To C模式下,对于个人用户来说,一方面AIGC应用可以作为效率工具,能够在信息获取、格式整理和工作流等各个流程提高个人用户的效率,并且AI模型作为基础设施能够集成到现有的工作流程中;另一方面可以作为创作工具,类似剪辑、修图软件一样,AIGC能够在用户原创流行的今天,大幅度降低大众用户的创作门槛,强化个人媒体的IP价值。

从商业角度而言,将AIGC作为底层基础设施的SaaS订阅将成为中长期趋势。用户选择付费的逻辑在于:更高效的信息获取方式;从辅助表达到替代表达;集成到已有的工作流;扩大用户创造力。

AIGC产业链

一方面,AIGC产业链可根据模型层次划分为基础层、中间层、应用层三层架构。

image.png

(1) 基础层:利用预训练模型搭建基础设施,该环节具备最高的进入门槛,参与者以头部企业为主

预训练模型是众多小模型的通用基底,为开发者降低AI开发与应用的门槛。预训练模型初始投入成本高、运行成本高,对软件、硬件均提出较高要求,因此涉足该环节的企业以微软、谷歌、英伟达、Meta等科技巨头以及OpenAI、Stability.ai等AI研究机构为主。

以OpenAI为例,2020年该机构训练GPT-3的硬件及电力成本达1200万美;以Meta为例,为了提供更强大的算力支撑,Meta携手英伟达、Penguin Computing及Pure Storage打造AI超级计算机RSC,其测试数据显示,RSC训练大型NLP模型的速度提升3倍,运行计算机视觉工作的速度提升20倍。

(2) 中间层:基于预训练模型开发垂直化、场景化、个性化的模型和应用工具

中间层厂商基于预训练的大模型生成场景化定制化的小模型,帮助不同行业和垂直领域实现 AIGC 的快速部署。在预训练模型基础之上,开发者可根据不同行业、不同功能场景生成相应的小模型,基础层企业向中间层延伸为顺势而为。

此外,基础层企业还可扮演MaaS(Model-as-a-Service)服务提供方,将其模型开源给更多企业以二次开发模型,如Novel AI基于Stability.ai的开源模型Stable Diffusion开发出二次风格AI绘画工具。

(3) 应用层:面向C端用户提供文本、图像、音视频等内容生成服务

应用层是指面向 C 端提供 AIGC 相关服务,典型企业包括微软、Meta、百度、腾讯,阿里巴巴等。基于基础层、中间层的模型及工具,应用层企业可将其重心放在满足用户需求乃至创造内容消费需求上,AI写作、AI绘画等AIGC应用已在营销、娱乐、艺术收藏等领域落地。

以国内企业为例,视觉中国依托其数字版权内容优势布局AIGC数字藏品,借力AI持续扩充艺术多性,截至目前多轮发售的AIGC数字藏品均已售罄;蓝色光标机器人小蓝博面向广告主推出AI绘画、AI写作工具,其中AI绘画工具创意画廊可生成抽象风格画作以适配不同营销场景。

另一方面,数据算力、算法模型和上层应用又构成了AIGC产业链的直接上中下游关系。

AIGC上游主要包括数据供给方、算法机构、创作者生态以及底层配合工具等,中游主要是文字、图像、音频和视频处理厂商,其中玩家众多;下游主要是各类内容创作及分发平台以及内容服务机构等。

image.png

后记

ChatGPT,作为一项影响力出圈的AI技术应用,是近10年来人工智能和计算机技术快速发展、不断更新迭代、多种技术叠加在一起形成质变的产物,是自然语言处理(NLP)领域近年来研究的结晶。

ChatGPT实现了一种使机器获得语言智能的完整有效技术路线,但这个研究方向仍然面临诸多挑战,需要在科学和技术上进一步探索。

同时展望未来,它对AIGC、产业互联网、数字经济等领域的长足发展也将影响深远。

最后附上几个有争议性的话题,供读者思考和交流。

ChatGPT会引领第四次科技革命吗?

关键词:生产力、规模、效率

ChatGPT会给人类带来失业潮吗?

关键词:情感、创造力、稀缺性

ChatGPT适合下海创业吗?

关键词:技术、资金、团队、商业模式

ChatGPT及AIGC产业链有值得投资的企业吗?

关键词:纳指100、中概互联、腾讯、百度、科大讯飞

参考文献

学术论文:

证券研报:

1.国泰君安-计算机行业:ChatGPT 研究框架(2023)

2.华西证券-计算机行业深度研究报告:ChatGPT,开启AI新纪

3.银河证券-计算机行业:聊天机器人顶流ChatGPT,开启自然语言处理领域新篇章

4.招商证券-计算机行业:ChatGPT快速流行,重构AI商业模式

5.国联证券-计算机行业:ChatGPT风口已至,商业化落地加速

6.东方证券-计算机行业:ChatGPT引领AI新浪潮,AIGC商业化启程

7.兴业证券-计算机行业:从AIGC到ChatGPT,原理、前景和机会

8.华泰证券-计算机行业:ChatGPT:深度拆解

9.招银国际-中国互联网行业:ChatGPT & AIGC在中国市场的发展前景

公众号文章:

慧博资讯:《ChatGPT行业深度报告》

慧博资讯:《AIGC行业深度报告》

TJUNLP:《对ChatGPT的二十点看法》,作者:熊得意老师

知乎文章:

Goland激活2023.1.1(GoLand 2023.1 发布)

作者 | 百度移动生态质效工程师们

导读

在降本增效、以chatGPT为代表的大模型技术横空出世的背景下,对软件质量和软件测试的领域也带来了巨大冲击,也使得软件质量工作者开始变得焦虑,主要体现在:公司对软件质量从业者的不重视加剧,一些追求临时交付的开发或质量行为屡见不鲜。基于此,近期对10多年以来从事软件质量工作的相关思路总结起来,希望帮助从业者在复杂多变的环境下看清楚些方向和做出更加合理的判断。

文章希望能够用通俗的语言,来阐述对软件质量和测试的理解,以便更好的引导从业者开展软件质量和测试工作,也可以理解作为软件质量工作者平时工作的内容和意义,甚至理解为什么这样做,先说明以下几点:

1、文章不会大规模的讲测试技术实现;

2、文章局限在软件质量和测试,对其余相关事宜不会具体展开。

希望阅读这篇文章会给你带来:

1、从软件质量角度,准确的判断做的事情究竟在贡献什么、价值在哪里;

2、从软件质量角度,理解做的事情为什么而做,为什么目标服务;

3、客观的认识软件质量和测试关系;

4、重视软件质量和测试技术,一些短期看不到收益的事情,不代表不重要;

5、测试技术充满挑战,有深度也有广度,作为测试工作者应该需要有这份自信;

6、能够促使从业者更多的思考。

全文19098字,预计阅读时间48分钟。

01 什么是质量

百度百科定义:客体的一组固有特性满足要求的程度。

在人们的意识中,不符合事物的预期表现都和质量相关,但要穷举又非常困难,主要原因质量是个非常抽象的词。但作为质量工作者,仍然需要提升对质量的理解,来指导质量工作者的工作,为此需要让对质量的理解从抽象变得可描述、具体。

下面基于对近些年来从事软件质量工作的总结,简要介绍对质量理解的内容。

02 从可用、好用、爱用三层理解软件质量

软件质量是比较抽象的词语,在软件工程领域,一般质量的好坏都会用问题数,bug数去衡量,而bug数与测试召回有很大关系,所以很多时候,大家聊到质量,都会直接想到测试、想到QAer,因此认为质量=测试=QA,这很正常。接下来更多的是从“价值”驱动的视角,讲下关于软件质量的几个不同理解,可能对后续的工作有一定帮助:

软件质量第一层理解—可用

保障软件服务可用,也就是提供的产品或服务,让用户/客户能够正常的用起来。用可用这种方式去描述质量,就会变得更加具体。这层理解就会驱使质量保障或者测试活动的重心是放在服务的稳定性、SLA和功能的正确性、策略是否符合初衷等方面,这是软件质量领域目前投入最多的,这个理解和投入没错,因为这给予质量保障者最基本的职能。再者推敲一下,站在提供服务的公司视角看质量可用,保障软件可用核心目标是降低服务不可用带来的损失,其实最终需要看质量问题给业务带来的损失,因此从业者行话是控损:即控制业务损失和不符合预期的功能带来的体验问题。此阶段QAer的工作价值在于保交付,控业务损失,这样看到的就不是简单的问题数,任何问题对业务损失的影响才是从业者要去追求和研究的。

软件质量第二层理解—好用

从质量驱动更多价值的角度,质量在保障服务可用的前提下,其实可以做的更进一步,即好用:也就是提供的产品或服务,不仅满足了用户/客户的基本诉求,更多的是关注服务对他们的满足、体验情况如何,这个层面质量的重心从保障服务的稳定性和正确性方面会逐渐转移到用户/客户体验提升的角度。该角度看质量其实会给业务带来更多损失之外的实际价值,比如留存、时长、生态闭环提升等等,目标是稳业务,由控损到稳业务的转变。特别强调的是,软件质量层面做的留存和业务PM做的留存方式不一样,业务PM更多的是从功能完整性的角度设计用更多好用的功能吸引用户,质量层面是从用户体验的视角去抽象出潜在问题,驱动产品和技术改进。比如对客户端APP来说,梳理出来的对好用的理解:

1、产品对用户打扰-升级弹窗是否合理;

2、产品对用户硬件和物理体感的影响——CPU、内存、网络、磁盘等损耗和性能较差;

3、产品对用户需求满足情况——如发布的功能与用户习惯的偏差等。

此阶段QAer的价值在于保交付,稳业务发展。

软件质量第三层理解—爱用

爱用就是让用户/客户成为服务的代言人,主动推荐服务给周边。这个核心理解如何挖掘用户、挖掘潜在需求进而转化成业务追求的价值,这个目标逐渐与PM工作殊途同归,但是做的工作方式不一样,比如软件质量从业者可以发挥更多技术优势,在竞品数据抓取、用户行为画像和分析方面提供服务等。因此,在爱用这个层面质量关注的重点也就不一样,手段是保证可用和好用的前提下,如何挖掘出更多潜在的用户和需求,促使业务持续增长。此阶段QAer的价值在于保交付,促业务增长。

综上所述,提到了软件质量从可用、好用、爱用的三层理解,稍微做个总结:

1、可用核心是控制问题带来的业务损失,QAer的工作价值在于保交付,控业务损失;好用核心是提升体验,驱动业务可持续发展,QAer的价值在于保交付,稳业务发展;爱用核心是挖掘用户驱动业务正增长,QAer的价值在于保交付,促业务增长;

2、从用户/客户的视角,三者的层次依次是:服务好已有用户/客户、留下更多用户/客户和挖掘潜在用户/客户;

3、这种划分赋予了质量这个抽象的词,在软件工程领域更加形象的理解,方便大家理解软件质量的工作。

从质量发展的角度,三者依次进行,所以目前一般聊的质量还是在可用层面,下面的文章也主要是从保障服务可用的角度去展开阐述的。

03 软件质量建模过程解读

为什么要做软件质量模型主要是希望通过模型的拆解,能够看到影响软件质量因素有哪些,方便软件质量工作者更好的安排工作和找到质量做好的工作归因,最终形成正循环,基于保障可用的目标是控制业务损失的思考,构建出来的软件质量模型为:

图片

假设有一套如上图的软件系统,有A、B、C、D、E、F六个子服务,关系图如上图描述要算出子服务E的各类变更带来损失期望E,公式如下:

图片

质量模型即问题给业务带来的损失:(变更数_问题密度(概率)_(研发漏出率)*(测试漏出率)*问题处理水平)

(E):质量模型即问题给业务带来的损失:表示一段时间内所有变更对业务带来的损失,可能是商业损失、用户流失等;

(M):代表某段时间服务的总变更数,i表示第i个变更,变更类型可能不同。包含需求变更、线上词表变更、运维操作、业务操作、硬件/业务变化、依赖业务变化等,这层考虑决定质量关注的广度,应该做到尽量别漏,任何的变更都可能会对系统造成破坏;

(S_{i}):表示第i次变更,此处一般用1表示;

( ho _{i}):第i次变更,产生问题的概率(即问题密度),特别注意,随着系统复杂性增加,产生问题的概率不仅包含对自身的,也包含对其余服务影响的,如图中服务E的问题密度,应该要把对C和A的问题影响算进去,该值是通过后验回归出来的,类似总问题数/变更次数;此值反映了研发对系统的生成bug水平;

(gamma _{i}):研发漏出率: 研发漏出问题数/总问题数

研发漏出问题数:线上问题+提测后QA测试召回问题,1-研发漏出率即为研发召回;此值可以反映出研发人员的自测水平;

(lambda _{i}):测试漏出率,线上问题总数/研发漏出问题数,1-测试漏出率即为测试召回率,此值反映了测试人员的召回问题水平;

(D_{i}):故障影响面,单位时间造成损失;

(MTTR_{i}):故障处理时长,从问题发生到最终止损完成的操作时长。

故障影响面(单位时间造成损失)* 故障处理时长(MTTR)统称为问题处理水平。

问题密度和研发召回的综合结果可以称为研发质量,是一个比较虚的概念。

质量成本:为了控制某个变更带来业务损失,所消耗的资源成本,包括人力资源、IT资源等,具体形态上包括:开发者投入到质量活动的成本(为了质量考虑的设计、开发)、问题召回成本、定位和修复成本、为了提升鲁棒性额外增加的IT资源成本等。这里要特别提下召回成本:应该是包含所有为了保障该变更的质量活动,与定位、修复成本还有一定区别,因为这两项成本是已经确定了有质量问题的前提下进行的,无需考虑无效因素。

3.1 变更因素

变更因素包含需求变更、线上词表变更、运维操作、业务操作、硬件/业务变化、依赖业务变化影响等,这些因素均会直接或间接对系统带来影响,进而可能带来业务损失的影响,质量工作者需要尽量考虑更全面的变化因素,有以下几个好处:

1、从质量角度,质量除了代码影响本身,还有更多的考量因素,需要召回的面更加全面,不至于那么被动。

2、从效能角度,QAer职责不只是“需求”交付,还在保障线上系统的正常运转和“需求”变化带来的对整个业务系统正常运转。

这里特别要提是:有些变更是对线上系统直接操作,所以线下仿真起来特别困难且不现实,因此对线上操作的必要审批、流程和checker需要加强。

3.2 问题密度

问题密度从物理上反映的一个系统产生缺陷的水平,问题密度与很多因素相关如:架构设计、技术债务、开发能力、系统韧性、业务复杂性、依赖程度等,该指标真正反映了一个研发团队在质量的技术水平,因此从研发的角度,应该多重视该指标的建设与提升,质量内建是一件非常值得研究的事情,尤其是架构、技术债务潜移默化的影响,容易被人忽视。

3.3 研发召回

研发召回反映了一支研发团队对生产代码的质量问题的召回水平,该指标可以反映出质量意识,业务因历史或紧急等情况不得不接受短期实现,因此就需要有比较好的质量意识进行自测,QA在此时可提供测试服务、测试用例和评估等辅助工具,辅助研发进行自测。需要说明的是,不是导向研发要召回所有问题,但基本的功能正确性和系统健壮需要保障,而回归、相互影响等消耗较大的工作可以交给专业QA进行,研发则更加专注架构和技术创新,两者应该各司其职,做好明确的分工,因此需要这么一个指标。

问题密度+研发召回:可以统称为研发质量,即研发可以通过降低问题密度+自测提升交付质量

3.4 测试召回

前面提到研发召回有自身专注的召回问题类型,而QAer则是作为新功能的兜底和回归测试的主力。针对新功能更多的是查漏补缺;而随着业务和模块复杂性提升,对回归需要足够重视和加强,这是开发和QAer很容易忽视的地方。而在质量模型变更类型更加丰富的情况下,测试召回不能将视野只局限在线下进行,所以需要特别提三点:

1、加强线上测试;

2、加强线上操作的审核和完善流程;

3、加强线上风险检测力度。

为什么?首先系统会随着外部环境、代码积累和硬件老化而逐渐出现一些潜在的新问题,系统问题可能会爆发,很典型的性能瓶颈问题;其次线下测试的仿真性天然会存在很大差异,因此必要的线上测试和风险巡检是不可避免的。关于测试召回是QAer一直以来投入的大头,因此在后面的章节专门会对测试进行展开介绍。

3.5 处理水平

故障的发生无论召回的大网有多严密都会出现。在故障不可避免发生的前提下,QAer要做的是尽可能降低故障对业务造成的损失。控制好故障对业务造成的损失反映的就是系统对故障的处理水平,造成损失有两个主要因素:

1、故障影响面:定义为单位时间对业务造成的损失量;尽量控制故障影响的范围,这里也包括流量、机房对其余业务的扩散。因此在传统意义上,有单沙盒、单机、单机房的checker和线上监控,这些手段都是希望尽早的感知到,控制好影响面。因此当系统不可避免会产生很多问题,或者线下召回体系不那么健全时,对故障影响面的控制,一般都会成为团队首选。但是这种情况不可取,“毕竟常在水边走,哪有不湿鞋”的道理,大家均是懂的,而且即使影响面控制到小范围,仍然是对业务造成了影响。

2、故障的恢复时长:顾名思义就是让故障快速止损,以降低业务损失,为了更好拆解对应的事情,一般会把故障的恢复时长,进行进一步拆解MTTR为MTTA、MTTI、MTTO等一系列指标,分别反映故障感知时间(发生到人开始跟进处理)、故障止损操作开始时间(即发生故障到开始决定要干什么止损操作的时间)、故障操作时间(即开始操作到故障最终恢复时间)

MTTA:故障感知时间,从发生到被人开始跟进处理的时间,基本的技术方向投入,其实checker和监控,这是QAer一直以来投入的技术方向,如何更全面、阈值更灵活的报警并且触达到该触达的人,一直是该方向研究的关键。

MTTI:故障止损决策时间,也即根据故障表象、系统关联关系、变更等情况,决策研发或OP要进行的止损行为,这块依赖策略,更依赖系统表现行为数据,更方便的做决策。

MTTO:故障开始操作到恢复的时间,这块反映的是操作人员的专业性和系统自恢复的能力,和架构很大关系,比如故障的启动时间、启动是否有依赖等等,任何1min可能都会造成巨大损失,架构上需要特别注意。

站在控制业务损失的角度,处理水平,需要逐渐进入QAer整体视野,并开始加强导向和技术投入,目前对该方向的研究和理解也在逐步加深,在此文中暂时不展开讲相关内容。

3.6 质量成本

质量成本:定义为了让对象的有更好质量,在此过程中消耗的人力和资源成本。

从定义上成本包括:研发架构开发和维护、测试召回(QAer和机器)、线上问题报警、决策和运维、故障定位和问题修复成本,这些均需要考虑进去,站在QAer团队的视角,可能考虑更多的是测试召回成本、线上问题报警和决策的成本。

为什么要在此提出质量成本,主要有两个原因:

1、在降本增效的大背景下, 任何事情都不可能无限制的投入,尤其需要特别注意两点:一个是无效投入,一个是低效投入,在保障质量可用的世界里,这两个现实的状态是存在的:不是所有变化都有质量问题;不是所有的行为都会揭错,这就要求QAer尽量杜绝这类的工作浪费。关于低效就是希望需要找到ROI更高的方式去召回,比如明明可以追求自动化,却一直不肯投入。

2、如果要让质量绝对的好,那么就意味着需要无限时间的进行测试,但是这显然是不现实,核心是降低故障发生的概率和故障发生时的快速处理,因此里面需要有个平衡,这个平衡可能就是要把质量成本考虑进去的。

从上述过程可以看出,要做好质量控制,所有环节均可开展工作,那么如何选择最合理的方式开展质量工作,这就要考虑成本因素,因此如何调整质量的召回分布,进而去保障质量而控制投入,将会是在降本增效的大背景下,QAer一直需要研究的话题,即回归出一个质量成本和损失量的ROI控制公式。

总结一下,质量章节内容主要包括:

1、从服务可用、好用、爱用三个层次,更加具象化的描述软件质量,以加深对质量的实际理解;

2、从控制业务损失的视角,建立了从“需求”、开发、自测、测试和问题控制等多方面影响损失的质量模型,让大家更加清晰的看到影响质量的因素和角色,方便从业者更好的理解自身在质量领域的定位和工作内容;

3、在降本增效的大背景下,质量成本是不可忽视的一个因素,需要逐渐降质量成本考虑进去,以更好的去判断用什么样的方式去召回才能发挥最好的效果。

04 聊聊测试

从下面的章节,开始重点介绍测试内容。

4.1 什么是测试

定义:为了揭露对象的潜在问题的行为集合或采用各种方式尽可能早和多的暴露被测对象问题的行为活动集

软件领域,对象一般包括:可以是函数、类、模块(可单独运行的实体)、局部子系统、后端全系统、APP、SDK等。

一般有两个理解:

VE(Verification):验证

  • 正不正确,偏客观

  • 比如是不是符合需求

  • 一般指各类功能性测试

VA(Validation):确认

  • 符不符合预期,偏主观

  • 比如是不是用户想要的

  • 一般指各类用户体验评估

4.2 质量与测试的关系

  • Quality≠Test

  • 测试只是用来反馈质量,并不能直接提升质量

  • 测试反馈当前质量情况,间接推动质量改进

  • 测试是质量保证工作中的重要一环

  • 质量不是测出来的,质量保证工作存在于每个环节,每个成员都要为质量负责

  • 如何更早的发现问题核心是调节分布,质量成本的内在驱动

所有这些关系,在理解完质量的前提下,看完测试章节,应该就能够建立起关系。

4.3 影响测试效果的关键因素

从测试的定义上看测试过程:

1、让对象在设定对应的条件下运行起来

2、为对象设定对应的指令集或行为集

3、对对象发送对应的指令集并收集对象表现的返回或行为数据

4、依托返回或数据,观测对象在对应环境和行为集的表现,发现问题

5、出现问题,进行问题的定位,找到问题根因

6、最后再评估还有哪些条件、行为等缺失,来弥补手段

把1和2叫做测试输入,3叫做测试执行,4叫做测试分析,5叫做测试定位,6叫做测试评估,因此就把测试拆分成了五个阶段:测试输入、测试执行、测试分析、测试定位和测试评估。

4.4 测试输入

定义:对对象运行时的仿真和指令集合构造,最大程度的覆盖和仿真对象实际服务状态;通常的理解是测试方案、测试用例集合包括功能、UI等、环境、流量和接口等。

物理意义:决定了召回问题的上限。

具体的测试行为包括:

如果对象是函数:函数的入参+组合,函数依赖的组合。

如果对象是模块:功能逻辑的测试用例、UI用例、测试方案、配置真实性+异常组合、流量真实性和异常组合、环境的仿真性(硬件、软件、连接配置、词表、配置等维度)。

如果对象是子系统/APP:所有子系统的配置真实性、流程真实性、环境的仿真性(硬件、软件、连接配置、词表、配置等维度)。

如果对象是客户端APP:用例反映的行为真实性与线上的差异、APP的配置真实性等。

要做好测试输入,首先要对对象进行客观的刻画,其次是要在刻画的前提下构建起对系统仿真度足够高的测试系统,最后针对系统的输入进行指令集的构建,传统上这三步中最后一步是人为主导的测试过程关注最多的,但是对测试召回的影响还存在刻画和仿真的研究,这两点人在其中能够发挥的作用是有限的,因此需要用技术来解决,如软件知识图谱的构建、环境仿真性提升等。

4.5 测试执行

定义:对被测对象运行对应的指令集并收集对象的行为表现数据过程。

物理意义:决定了召回的效率,即需要消耗多少资源和时间去召回问题。

具体的测试行为包括:发压、采集数据和存储、执行用例等。

当用例和环境设计好,枯燥的执行完全依靠人去进行,大家天然会想到这种方法是可不取的,因此一般都会引入技术,进行自动化执行,这也是当前测试技术领域研究最多的方面,即如何用技术让测试自动化起来。

4.6 测试分析

定义:通过各种维度的分析,观测对象的表现,以发现潜在的问题。

物理意义:在对应测试输入的前提下,决定了达到召回问题上限的水平。

具体的行为包括:

层级一:是否正常:主要是分析对象是否还健康的存活,这是对象发挥作用的先决条件;常见的是:是否退出、是否夯死、是否拒绝等

层级二:有没有:主要是分析对象的输出属性是否符合预期的存在;常见的是:输出必须有时间、广告或有某个素等

层级三:对不对:主要是分析对象的输出属性是否符合预期的正确;常见的是:输出1+1必须是2等

层级四:好不好:主要是分析对象的输出属性是否有体验上的偏差;常见的是:性能变差、资源泄露、策略效果变差、符合用户预期等

针对不同对象,可能要分析的行为也不一样,因此在实际过程中需要综合考虑。

四个层级,分析起来的难度依次增大,也更加抽象,分析能力也是测试AI化最难突破的地方。

从定义上可以看到,测试分析是观测系统的表现,来判断系统的问题,以人为中心一般只能看到系统肉眼可见的表现,但是在问题已经出现但是还没有显性出来或人忽略的情况下,这种问题就经常会被忽略,因此需要用技术,通过抓取系统的各类表现数据,进行数据分析,最终得出是否有问题的判断。

4.7 测试定位

定义:当测试分析发现对象有问题的时候,根据变更行为和环境等因素,定位出对象出问题的原因,方便快速修复

物理意义:决定了修复效率,即出现了问题后准确找到问题根因所在。

具体的测试行为包括:问题根因定位、构建失败识别与自愈等。

定位是项非常高投入的工作,该工作做好了会极大的提升工作效率,因此也是技术一直想去突破的方向。

4.8 测试评估

定义:根据潜在的风险分析、揭错活动的行为覆盖集合,通过模型,指出可能潜在的风险;

物理意义:以第三方视角进行问题的查漏补缺。

具体的行为包括:

1、基于变更、系统topo等刻画,判断存在的风险大小

2、获取测试输入、分析的行为活动数据

3、利用模型,预估潜在的未充分揭错的风险,配以可视化的报告进行展现,指导测试者增加召回活动

测试评估是在做最后一步的风险决策和召回。

但是测试评估往往会被测试工作者忽略,主要是因为随着自动化水平的不断提升,形成了看报告是否pass的惯性,而往往会忽视其实自动化执行更多的是之前经验的积累(在没有智能测试生成的情况下)很难完全揭错新的变化或者随着系统的开发积累的变化带来的问题,因此测试评估要逐渐走入测试工作者的视野,但是评估工作需要充分的数据来进行分析和判断,因此测试评估更多要依赖技术+模型进行,最后依托人不断挖掘特征进行持续的准确决策。

4.9 从测试召回看测试投入

1、研究被测对象,即哪些指令集和运行环境会影响被测对象的行为,从而做好测试输入,如之前所说,测试输入决定了测试活动召回问题的上限,因此这是召回的起点,比如流量的完备性仿真性,topo的仿真性等;

2、研究被测对象,即从哪些潜在变化会影响被测对象的行为,进而给测试评估输入,只有充分理解风险引入,才能更好的评估风险,如代码变化对被测对象不同程度的影响;

3、研究被测对象,即被测对象哪些维度可以反映出其异常行为,这是测试分析的起点,也是尽可能达到召回上限问题数量的核心环节,如内存泄露的曲线拟合、性能波动等。

因此,围绕对象进行研究非常关键,其次才是用各种生成、分析、评估工具去想办法揭错。

所以从这个角度的去理解传统自动化,即执行更多偏向的是测试执行和测试定位,是不会提升召回能力的,测试召回的水平还是被撰写的用例、流量的仿真等决定了,这块往往会被自动化三个词而忽略。自动化就等于自动化执行,很多时候自动化执行起来了,大家关注的重心就是覆盖率、成功率、召回能力等,但其实应该包括测试生成、测试分析和评估的持续投入,然后用自动化技术将所有这些能力例行化的跑起来(历史自动化都是人写好了,但是需要持续的进行技术投入得到提升,不然召回能力就一直会停留在某个过去的时间,随着时间的推移就会导致自动化成为鸡肋)。为什么仍然进行自动化测试,从质量成本角度可能更好的理解,后面会有更加详细的介绍。

4.10 客观看待测试

测试不可能召回所有问题,主要原因如下:

1、对象因所处的时间、环境不一,造成测试时与对象实际服务时环境存在不可避免的差异;

2、测试的投入是有限制的,不能无时间、不考虑资源的无限投入去召回所有问题;

3、人受限于经验、精力盲区,偶然犯错误不可避免。

但是对于QAer不能放弃对问题的尽量多召回。

从测试召回的问题类型上看其实测试召回分为显性和隐性的,其中显性的叫做新功能测试,这个是测试的热点,也是一直以来业务赋予QAer最基本的职能,保障新功能的正确性和交付,但是其实QAer也要看到随着系统尤其是微服务架构的扩散,系统的复杂性逐渐提升,新功能带来对老功能和周边业务的影响不可避免,这块隐性的测试逐渐变得至关重要,但是因为精力、能力和关注的焦点等很容易被忽略,而且将人力投入在回归的浩瀚集合中,显然会是ROI比较低的手段,因此技术可能是解决回归测试的关键所在。

05 关于测试分类

5.1 从召回问题类型的角度分类

从召回问题的具体类型的角度,测试可以分为性能测试、功能测试、安全测试、接口测试、稳定性测试、UI测试、兼容性测试等,这样分的目标就是针对不同问题的表现,测试的方法是不一样的,可以更好的去理解对不同问题的召回手段重点。

5.2 从测试对象层级的角度分类

从召回问题级别的角度,测试可以分为白盒测试、单测试、模块测试、系统级测试等,这个划分的标准是对测试对象的层级进行划分,比如白盒的对象可能是函数或类,模块测试可能是一个服务,这种划分方式,有助于指导合理的问题在合理的模块进行召回。

5.3 从技术的角度分类

从技术手段的角度,测试可以分为精准测试、自动化测试、压力测试、探索性测试、fuzzing测试、遍历测试、线上测试、手工测试,这种划分更多的看技术驱动,体现的是技术在测试作用,而不侧重分发现哪些类的问题。

5.4 从召回问题职责的角度分类

从召回问题职责进行划分,可以分为新功能测试和回归测试两大类。

通常新功能测试和回归测试这种划分在业界会说的比较少,因此下面重点介绍下这两种类型的划分的定义和好处。

5.5 新功能测试

定义:验证代码的实现是否符合业务需求。

建议:RD尽量先保证实现的正确性和合理性,所以理论上新功能测试的验证研发是主角,QA提供测试服务保障。

QA可研究的领域:测试服务化(环境、单测)、用例自动生成、白盒扫描、用例设计和评估等。

5.6 回归测试

定义:验证升级的代码对本服务或周边业务带来的影响

建议:回归测试建议是QA的主责,让RD花更多精力在新功能和价值创造上。

新功能测试和回归测试从测试方法论上,都符合测试输入、分析和评估的拆解,但是职责上有所侧重,正因为如此,处理方式应该有所不同:

1、新功能作为基础的保障,应该有RD进行,RD有职责验证自己的功能是否符合预期;

2、回归测试应该是QA的主责,以便RD更加专注新特性的研发。

QA可研究的领域:手工集成回归;接口自动化回归;业务影响的回归;联调等。

新功能测试和回归测试,其实可以很清晰的区分不同角色在召回问题这块的主要重点,方便角色有自身的定位,各司其职做好分工。

06 聊聊召回成本

定义:对质量造成的损失进行控制或召回过程需要消耗的总成本。

基本包括:单位时间成本*占用时长

为什么要提召回成本:

1、无止境的投入去控制质量(不代表不去追求更多的召回问题),会造成业务迭代效率和资源的浪费,进而可能产生的损失比问题造成的损失要小。

2、不同范围、阶段和角色对质量的控制和召回,所消耗的成本差异会很大,要追求ROI较高的召回,因此需要研究如何调节质量成本。

6.1 成本计算

单问题成本:问题召回成本+定位成本+修复成本 = 召回时间*单位召回资源成本 + 定位时间*单位定位资源成本 + 修复时间*单位修复成本

所有问题召回成本:就是所有单问题成本的总和

可以看到:同一个问题,在越小范围的召回比大范围的召回从定位时间、修复时间对应的单位人力成本(均是同一个人)是一样的,但是修复时间、定位时间会大大缩短,因此也可以降低召回成本,其实这就是质量前置的基本由来。

为了计算出召回成本,QAer对不同召回级别的召回成本的大体进行了分类划分:

偏白盒级的召回:此类的召回成本基本就等于人力成本,而修复和定位时间基本可以忽略。

偏模块级的召回:此类的召回成本基本就等于人力+自动化成本,而修复和定位时间适中。

偏系统级的召回:此类的召回成本基本就等于人力+自动化成本,而修复和定位时间比较高。

可以看出不同级别的召回,召回成本的差异非常大,因此需要将问题级别在映射到合理的召回级别上。

6.2 降成本方法——降工作量

要降低召回成本,首先要做的就是尽量减少无效的揭错行为集或重复的揭错行为集,因为存在两个真实的前提:

1、不是所有变更都有质量问题;

2、不是所有的行为都能揭错。

这就要求QAer需要“看”准了再测,也就是后续讲的基于风险的测试由来,所以QAer就提出智能构建:用于智能裁剪自动化任务;质量度模型:用于判断是否需要人工介入等。

6.3 降成本方法——调分布

其次同一个问题的发现希望投入的成本更低,包括定位、修复和发现,因此希望可以调节问题的合理分布,如尽可能的在代码层级召回、再在单模块、再是集成召回;其次尽量用机器去召回(一般认为人的成本比机器成本高),所以调分布这里面有几个理解:

调质量分布理解一,调手段:尽量用技术去调节召回的分布,让召回的技术成分提升;

调质量分布理解二,调阶段:合理的问题在合适的”阶段”召回,如新功能就应该在提测前尽量召回,复杂的跨系统问题尽量在集成测试阶段召回;

调质量分布理解三,调级别:问题在合理的级别召回,如低级的逻辑问题尽量在代码级别召回,功能性问题在模块级。

再回过头来说下质量前置:应该想办法让在对应级别的问题在该级别发现,而非一定是系统集成的问题要在开发环节召回,也并不是简单的将测试任务放到开发阶段、提交阶段。

无论是理解一、二、三,要实现它,离不开一个关键词就是技术:

1、理解一字面意思就是技术,用技术去调分布;

2、理解二想要通过阶段进行自动调整的前提就是要自动化,因为自动化可以随时随地进行;

3、理解三要用更加偏白盒级的方法召回也离不开技术。

6.4 技术是调问题分布的重要载体

PS:这里面说的技术,不只是自动化执行

1、自动化执行可以将用例所蕴含的召回经验积累和传递给其余角色,形成角色召回的穿插。

2、自动化执行可以将召回经验随时随地执行,因此可以将任务穿插在各个阶段、各个角色。

3、用质量度模型将召回经验训练成模型,进行风险预测做综合判断,进而进行拦截。

4、具备代码级、模块级和系统级的召回,天然就要求有更多的技术进行召回,尤其是代码层面的。

总结一下,测试章节的内容主要包括:

1、介绍了测试的概念,从测试概念出发,质量与测试的异同,以更好的开展测试工作;

2、对测试过程进行剖析,理解影响测试召回的关键环节和因素,以及技术在各个环节的关键作用;

3、对测试的分类,尤其是新和回归测试的分类,更好的做好角色区分;

4、从召回成本的角度去考虑测试工作的方式和技术召回的必要性。

综合对测试的介绍,提升技术在测试召回和测试效率的成分至关重要,也是做好测试的必然选择,下面章节主要和大家聊聊测试技术相关的理解。

07 聊聊测试技术

从下面的章节,就开始聊测试技术,也是前面推导出来的,传统上大家聊到测试技术,一般第一反应就是自动化,甚至有时候自动化就是测试技术好坏的代名词,但是通过上面关于质量、测试的本质进行剖析和分解:

1、发现自动化并不是那么回事,甚至传统自动化”本质”上不能提升测试召回能力的,更多的是可以通过调节分布和替代人的执行,因此只是提升效率的手段

2、一个非常有趣的现象:正因为理解的测试技术等于自动化,所以有测试平台、甚至测试平台就是QAer技术的代表,造成了测试技术在召回能力提升的研究变少,进而QAer看家本领丢失了,因此需要逐渐纠正这点。

在下面的章节,会去介绍在测试技术不只是自动化(执行),可以看到,为了提升测试召回,测试技术将更大有可为。

7.1 测试技术主要职责是高召回,提效率

如前面介绍,测试技术不等于自动化,所以测试技术的主要职责不只是提效,而是要先提召回,其次将整个过程自动执行起来替代人执行和调分布进而提升效率。

传统的自动化在下面图中:核心在执行,即将依赖人的测试先验知识,通过技术用机器执行起来,主要表现在测试召回的执行层面。但测试技术其实在辅助人、调动人和模拟人方面还可以做更多,尤其是chatGPT的加持情况,将极大的提升这方面的可能性。

图片

  • 测试技术作用一:提升测试召回效果

这就要回到之前对测试本质的洞察上来,影响测试召回的核心要素包含测试输入、分析和评估三层,想要提升测试召回效果,测试技术就应该在这里做更多的投入,下面分别举几个例子,可以更加理解在对应领域加强对测试召回的投入:

1、测试输入:被测系统准确刻画的前提下:进行系统仿真能力建设或直接在线上进行测试活动,如流量仿真性涵盖引流、录制和回放;环境仿真性:包含词表、配置和上下游关系等。然后是测试行为集的构建:如接口的fuzzing能力、流量的筛选能力等。

这里特别提下客户端测试,可能更好理解测试输入中仿真能力和行为集的构建的关键作用:客户端的测试特点就是不确定性,主要原因有两个:

一、APP应用部署的容器是在用户的个人手机上,不是可控的、标准化的、随环境变化而变化的;

二、APP应用的行为是由用户控制的,随机性和不可预期性很强,而服务端是通过接口提供服务的,接口提前开发者设计好的,标准化的。

这些就会带来:

一、测试者的测试用例,与用户真实行为存在差距,测试者只能保障功能基本可用或正确;

二、测试者执行,没法穷举所有操作行为和部署的非标准带来的回归成本;

三、出了问题,没法做到容器级别的快速回滚,而只能打扰用户做APP替换;

因此客户端的测试需要考虑机型的抽取(环境)、用例集合的设计和选取(测试活动集)得更加深入,技术在这里的空间也会是很大的。

2、测试分析:前面提到测试分析是对象在输入情况下的表现行为,进而发现潜在的问题,这里面就涉及到对问题的表现形式进行分析;比如服务core的表现形式是什么;内存泄露的表现形式;脏数据的表现形式,可以基于此做,对象存不存在、特性有没有、逻辑对不对,功能好不好的判断和分析,尤其是好不好的判断,更加需求策略基于统计和概率做分析判断。没有分析就没有召回,比如单测没有任何校验点那单测就是形同虚设。

所有这些其实综合起来,可以概括为:通过拿到更多的系统表现数据+策略做出出问题的判断,这就是测试分析。只是有些判断是显性的,有些是隐形的,有些看单指标就行,有些需要聚类,所以这就要求QAer做更多的研究。

3、测试评估:以前容易忽视的环节,认为测试执行完成,如果报告没问题就万事大吉,但是殊不知,问题在底下暗流涌动,因此需要对变更风险进行评估、测试准出评估,所以这个领域就存在变更特征挖掘、变更影响面挖掘、测试行为数据采集(覆盖率)、质量度模型做最终决策等相关技术得到涌现,甚至通过测试评估去决策生成后续的召回行为。

上述技术投入均有利于提升测试召回且需要持续投入,因为对象在不断变化,这也是促使QAer不断革新和变化的驱动力。

上述视角是从影响测试召回的三个关键因素去做的技术投入和分析的,下面从另一个视角,去分析测试技术在测试召回的不可替代作用。

前提一:靠“人”召回是经验和问题驱动的测试,人有视野、职责、经验、精力的限制,会导致测试漏出;

前提二:人能“看”到的往往是系统表面的表现形式,真正系统内部可能存在问题,但又未发生的是观测不到的。

基于这两点,技术可以帮助弥补上诉不足,因此从这两点也可以研究出对应的召回技术,如主动召回技术:智能UT、AISA(智能化代码缺陷检测)、线上风险检测(线上系统的风险实时检测,如单点部署风险、超时配置不合理风险等)等。

从测试召回对依赖“人”程度的层面,一般会把技术对召回的影响程度进行划分:

1、完全不依赖于“QAer”的召回技术或在人的职责之外的:如智能UT、AISA、遍历、质量模型、全用例生成等;

2、辅助人提升测试召回:覆盖率评估、用例辅助生成等。

线上测试的必要性分析

线下测试两个天然的弊端:

1、对象运行环境的仿真性(如拓扑、数据和状态)没法做到100%,而在某些极端情况下的问题出现恰好依赖这种仿真能力;

2、很多干预操作带来的不确定性,是线下测试的case构造无法穷举和拟合的,比如线上流量的特殊性、PM的操作、扩缩容等,这些操作在线下的缺少,往往也会导致一定问题的出现。

基于此在有条件的情况下,可以对线上系统进行有针对性的测试,提升系统的召回能力,以前线上测试存在安全、影响等问题,相关的实践比较少,但随着微服务云原生技术的兴起,为线上测试提供的基础技术保障,因此线上测试变成了可能, 尤其是针对重大活动或高流量场景变得尤为重要。

  • 测试技术作用二:实现不依赖“人”执行——即自动化提效

前面说自动化–即狭义上理解的自动化执行,不会提升召回,那为什么还有提自动化,这里面需要做如下拆解:

1、测试输入、测试分析和测试评估技术研究,是从召回的角度考虑,但是这些过程如果能够自动化串联起来就会提效,所以要研究自动化;

2、测试执行如果全靠人工也是非常耗人力的,因此站在测试召回成本角度,要去研究自动化。

聊聊自动化

自动化本质:将成员的集体智慧转化为整个团队的利益,并将测试行为用机器运转起来。

整个过程包含测试的整体:含测试输入、分析、执行、定位和评估,自动化是这些测试召回技术跑起来的技术载体,先有前者,汇聚起来就是自动化。

从上述定义的角度看,自动化有以下几个特性:

1、自动化,可以不依赖人的精力,可以随时随地执行,这给质量前置、质量分布提供的前提条件。

2、自动化,可以用机器代替人,可以提升人效,进而让人有更多精力进行创造性的工作。

3、自动化,也是非常关键的,就是可以将团队从成立起来的智慧得到传承和积累,进而避免经验只在某个人身上,从这个角度上看其实也可以召回更多问题,但是召回能力还是依赖人的不断积累和输入。因此一定要做好自动化的沉淀,这是团队集体智慧的持续体现。这个对系统的回归至关重要。

4、大量的回归是可以增强信心。

自动化从召回问题类型的角度进行拆分:

1、新功能自动化:可以在辅助写好用例、环境自动化等方面做好支持,进行自动化执行;

2、回归自动化:新对老功能和业务影响的自动化,平时讲的比较多的就是自动化回归。

新功能自动化

新功能需要做到完全自动化,目前看还是非常困难的,需要根据功能点,进行测试用例的自动生成和执行,但是做辅助还是有可能的。

1、辅助用例生成

2、辅助环境生成、测试数据生成等

这块重点可以先focus在如何提供测试服务,而不是全自动化或一次行多次回放的单次可获得性的研究。

回归测试的重要性

原因一业务发展新要求:当前的测试热点是新功能,新功能带来对历史债的冲击和对外界业务的影响,靠人很难评估出来,而且从漏出的角度看确实这种问题增多,自动化回归的持续积累,因此不会依赖人判

原因二组织行为新挑战:人员变动包括离职、转岗、内部轮岗、池化等,基于业务经验的测试能力会得到挑战,需要让经验持续的得到积累

原因三近年来在召回技术投入的有限:从测试输入,测试分析和评估,三个影响召回能力的核心因素看,目前评估做的比较多,但是输入和分析的技术投入相比之前有明显不足,如环境仿真、配置仿真、流量等

原因四业务发展要求需要增强:降本增效大背景下,自动化召回尤其是回归比例需要提升(热点型测试,回归其实需要巨大投入)

原因五自动化回归水平体现测试技术水平:真正牛的自动化,在有效性、召回和ROI方面都需要AI的加持,可以提升质量信心和降本增效。

受限于测试技术的自动执行:回归测试其实包含手工回归和自动化回归,自动化回归的重要性上面也提到过,那么手工回归是亦是如此,其实本质是一样的,无非是执行者是机器还是人的区别,本质上也需要要做好沉淀、刻画、评估等工作,沉淀至关重要。因此手工回归测试也更需要做技术赋能的探索,比如用例推荐、在线化支持、准出评估等。

技术是实现高ROI回归测试的必然路径

回归测试的目标是通过测试活动召回变更对本业务历史功能和周边业务功能带来的问题,如果回归测试通过手工执行,那么人首先要搭好环境、运行所有已有的本业务功能和周边业务相关的功能的用例,然后观测系统的表现,这样就会带来几个问题:

1、随着系统的不断迭代,系统自身的功能逻辑变得非常复杂,那么用例数量肯定会随着增加

2、随着业务的发展,系统间的交互也会变得频繁而复杂,测试人员需要评估出对相关业务的影响,并执行对应用例,而且这类场景会变得越来越多

3、通常回归测试的召回问题数量比新功能问题的数量要少很多,而且有时候不一定会影响老功能,这就导致回归测试如果全铺进去做回归,ROI会变得特别低

上述的原因综合起来体现出来的就是:

1、回归测试需要高ROI的方式进行,靠人执行行不通;

2、回归测试依赖人评估影响,存在人的差异性,很容易导致评漏,需要用技术做沉淀,打平人的差异性。

因此只有技术才能够解决回归测试,而且是有可能的,因为回归是测试人员已经将用例撰写出来,核心就是自动化执行的问题,如果评估影响、选出用例、自动化的执行,这些均和技术息息相关。

综上自动化的总结:经验通过自动化得到沉淀,使得经验可以通过技术无差异的得到传承,进而解除对人的依赖,让新品快速达到高水平,而人的召回能力一直在这个高水平的情况下不断迭代,进而促使召回能力一直在上升。

  • 聊聊百度一直做的基于风险的测试技术 Risk-based Testing Technology

定义:根据潜在的风险分析,决策测试输入和分析的行为,以ROI较高的方式进行揭错。

从理论推导的角度,首先测试召回是要考虑召回成本的,其次就是基于人的经验测试,其实存在盲区,因此要用机器帮忙做风险判断。

从收益的角度,为什么要Risk-based Testing Technology:

1、防止资源浪费,基于风险做测试行为的决策,如跑与不跑,跑多大力度;

2、弥补召回欠缺,基于风险做质量风险评估,召回更多潜在问题等;

3、追求执行高效,基于风险控制测试时长、测试频率等,测试实时指导,供测试人员准确判断测试结束行为。

理论上,基于风险的决策如果风险模型得到有效和持续沉淀,其召回能力不会低于人的基本水平,甚至会在某些场景下更高,其次可以达到ROI较高的手段。

基于风险的测试测试与精准测试测试区别:

1、数据源:精准测试重在覆盖率,基于风险的推荐:覆盖率只是其中的一个数据源;

2、策略上:风险的推荐含有模型等策略,精准测试一般不包含;

3、对测试的影响:精准测试重在“选”和“看”;基于风险的测试技术,重在决策,如决策行为是否执行,执行的行为到什么程度,以及仿真需要到什么程度和决策是否补充测试;

4、能力上:精准测试还包含定位,基于风险的测试技术不含定位能力。

7.2 聊聊TestGPT

最后这个环节,基于最近非常火的chatGPT,而衍生下来的Code-GPT等很多领域,做了些比较浅显的思考,后续会不断加强这块的沉淀,完善这块理解。

意义

chatGPT,对人类社会确实带来了很多变化,其成功理解其实有两个核心原因:

1、自然语言的表达,进一步降低普通人入局的门槛,使得大众均能够参与;

2、生成式的输出,使得人工智能有生命力、有结论性的输出,而非静态和信息的展现,激发了兴趣,真正可以帮助人类。

从技术上两个关键因素:

1、大量结构化数据和反馈闭环形成了正循环;

2、大模型的技术突破。

给软件测试的启发:

1、大模型、大数据这么复杂的事情均可以有较好的效果,如果垂直到软件测试领域,做对应基于code的大数据模型训练和基于应用的模型微调,是有可能做成的,这块增强了一定信心。

2、软件测试,按照之前说的分新功能和回归测试,新功能测试,如果代码生成、推荐都能搞定,那么就基本说明机器已经能够理解代码了,那么按照一定的标准生成用例也不在话下;其次是回归测试,回归测试本质上就是基于系统刻画和团队智慧的持续积累去决策和揭错,这些其实在软件领域就是数据的沉淀+大模型,基本上就可以形成最佳的回归方案。

因此TestGPT,暂且叫TestGPT是有可能做出来的,而且也有一定信心。

可行性分析

TestGPT,如果这两个假设一直持续下去,可以执行下去:

1、有非常强大的自动化体系以及内部的数据结构化能力,如果增加人工的在线化收集数据会变得更加完整。

2、有近几年对基于风险的测试的投入和基建,其实已经有了决策的影子存在,需要把对应实现的技术,与文心一言、chatGPT存在的差异性总结出来,站在巨人的肩膀,做好微调模型和数据的结构化。

3、需要解放思想,QA不能靠“经验“的竞争力去生存,而是靠”创造力“去生存,这样才能人在驱动机器,不然迟早会被AI淘汰。

具体场景——百度智能测试第三阶段

关于如何做,这边更多的是从可以投入的方向做了几个思考:

1、代码是产生质量问题的最前线。代码级质量技术包含:含代码理解、代码插桩、单测用例代码生成、静态缺陷智能识别、动态缺陷智能识别、风险度预测、缺陷智能定位、基于代码理解下的自然语言用例生成,这些前提都是可以充分理解代码逻辑基础上进行,从19年开始就有一定投入,希望抓住机会,可以在这些领域去研究,应该会产生意想不到的效果,进而提升开发和代码质量。

2、为每个模块,系统,业务训练出TestGPT:

  • TestGPT会有以下几个功能:感知:感知到对象相关的各类变化和可能带来的影响;决策:基于感知结合已有的召回能力决策揭错行为集,决策具体的测试行为结果可能是:已有的行为集进行合理分发或新生成行为集或两者兼顾;反应:已有行为集的执行或实时生成行为集与执行;评估:结合变化+揭错行为集进行准出风险评估、最后进行必要的测试补充。

  • QAer未来的主要工作去调优服务和训练风险模型(TestGPT,QAer负责训练对应模块、服务和业务的大模型,进行测试生成、决策(AI)和执行(自动化)),弱化经验型的流水线、测试任务概念。工作形态上:感知输入变更和需求信息,TestGPT输出测试方案、用例集合、执行结果,最终评估准出,当然也有可能通过全自动化会不用人员执行的过程,但是测试方案、用例集合等还是会沉淀下来。以模型和数据为本:测试人员基于业务系统的大模型的日常工作,包括模型创建、训练、调优、使用等。

3、TestGPT作为某团队的知识沉淀和积累,不再有知识库、文档等,成为每个QAer的工作秘书。

总结一下,测试技术章节的内容主要包括:

1、测试技术不只有测试自动化,其实在召回方面,测试技术更应该有广阔的空间;

2、随着业务持续迭代,带来的软件复杂性和依赖的持续增加,回归测试尤其是自动化回归测试变得尤为重要;

3、LLM时代下,TestGPT的可行性分析,相信会有很大空间;

4、在降本增效与LLM的双重加持下,测试技术将大有可为。

08 至关重要,可以看下面几句话

1、加强质量技术的研究,质量技术远非是当前的广度和深度

架构鲁棒性、服务闪回、软件可持续性、测试召回技术、测试自动化技术、代码检测技术、监控召回技术等领域远远没达到理想的状态,需要从业者思考、研究和切实的解决。

2、加强对被测对象的研究

一切的基础,知己知彼,方能主动,研究好和刻画出测试对象,理解测试对象非常关键。

3、加强测试技术的研究,测试技术远非是当前的广度和深度

测试技术不等于自动化执行,想提升测试召回,测试输入、分析、评估,技术上还可以做很多。

4、重视回归测试,加强对经验的持续沉淀

随着业务复杂性增强,模块和跨业务的积累和交叉会变得负责和不可控,需要用持续智慧的沉淀,进行准确的回归进行相互影响的召回,不能只是面向“新需求的功能验证测试“。

5、提升对主动召回技术的投入,弥补人的盲区

受限于客观条件,人有其经验、精力等盲区,用不依赖人的技术做召回,是查漏补缺的关键。

6、技术是调节召回成本分布的重要载体

  • 自动化执行可以将用例所蕴含的召回经验积累和传递给其余角色,形成角色召回的穿插。

  • 自动化执行可以将召回经验随时随地执行,因此可以将任务穿插在各个阶段、各个角色。

7、相信TestGPT,QAer应该靠“创造”力生存而非“经验”生存

某某对这个业务非常熟悉,不能成为个人竞争力的理由,经验会被AI或其余人替代。

09 总结

质量和测试不只是“点点点”,而且很多质量问题不能完全靠“点点点”能解决的,需要用技术的思路去解决问题就会发现有很多值得研究的技术,不只是软件工程领域,类似在人类社会都是永恒不变值得研究课题如前几年的精准防控等。加强思考,以未来已来的心态去拥抱变化。

——END——

推荐阅读

百度APP iOS端包体积50M优化实践(一)总览

基于FFmpeg和Wasm的Web端视频截帧方案

百度研发效能从度量到数字化蜕变之路

百度内容理解推理服务FaaS实战——Punica系统

精准水位在流批一体数据仓库的探索和实践

视频编辑场景下的文字模版技术方案

唱衰 Java 的声音由来已久。
 
尤其是近几年,云原生时代的到来,软件的交付方式发生了根本性变化,Java 遭受了诸多质疑。
 
传统领域的 Java 开发,交付的是 Java 应用本身,具体体现在以“jar”“war”的形式交付, 而云原生最佳实践,则是基于微服务形式,以容器为基本交付单位,并在K8S中编排。云原生应用要求更快速的启动、强调资源按量消费,弹性扩展,以及可观测性等。就这一层面而言,在云原生时代,Java 的缺陷确实是天然存在的。
 
“事实上,Java 技术在云原生时代也在不停地进化。” 面对唱衰 Java 的诸多论调,阿里云程序语言与编译器团队负责人、Java Champion 李三红选择理性看待。
 
Goland激活2023.1.1(GoLand 2023.1 发布)
阿里云程序语言与编译器团队负责人、Java Champion 李三红
 
”比如更多支持容器部署的特性已经加入到 OpenJDK 版本。 一直被人诟病的 Java 启动慢的问题,目前基于 OpenJDK 技术的几个创新项目正在多个不同方向探索,包括 CRaC(Coordinated Restore at Checkpoint) 、Leyden,以及由阿里和 Google 作为主要贡献者的 Fast Startup Incubator 等项目。在资源弹性使用方面,由 Alibaba Dragonwell 提供的 ElasticHeap 功能,主要目的是解决云计算环境下 Java 内存资源使用的弹性问题。 最后,OpenJDK 的 JFR 以及 JFR Streaming 技术为构建 Java 云原生可观测工具提供了重要的技术支撑。“
 
Java 面临的挑战,不仅仅是云原生。
 
李三红认为,从 1995 年 Java 1.0 发布算起, Java 技术这二十多年的发展,大致存在一明一暗两条线的驱动。“一条暗线,是指 Java 或者说支撑 Java 的底层 JVM 技术适配计算机架构的演进与发展。一条明线,是指 Java 作为一个开发者工具,本质是要面向业务领域解决业务问题的,所以自然而然地推动了 Java 在云原生,AI 等方向的演进,解决这些领域内碰到的问题与挑战。”
 
后摩尔时代,算力增长放缓,更多利用多核,SIMD(单指令多数据流)等并行计算技术,以及异构来释放更大的算力。相较于 C/C++这些传统编译型语言,Java 处在软件栈的更高抽象级别,自带 Java 标准库,以及运行时环境,这也给 Java 创新带来了更多的空间以及可能性。
 
李三红指出,
Java 在多核、异构加速领域做了多方面的探索,适应与优化。比如,OpenJDK 孵化的 Vector API 项目, 依赖 CPU 的 SIMD 指令,获得计算性能的成倍提升。即将发布的 OpenJDK 19 引入了Virtual Threads (Preview),旨在帮助 Java 开发者高效处理并发(尤其针对IO密集型场景) 。而在异构领域,早2014年JVM技术峰会,AMD 就分享了 Sumatra 项目,尝试实现 JVM 与 Heterogeneous System Architecture 目标硬件交互。由 The University of Manchester 发起的 TornadoVM 项目,目标是帮助 Java 开发者不需要了解 GPU 编程语言或者相关的GPU体系结构知识就可以编写面向异构的并行程序。
 

AI
方向上,Java 也在与时俱进。据李三红介绍,在企业计算领域,Java是被使用最多的语言之一,但对于机器学习领域的开发,Java一直缺乏标准支持,这个方向其实在 JCP-EC 讨论也比较多。
 
基于 Java SE 技术,在 JCP 流程内推动并最终在 2022 年定稿的 JSR 381规范,其目标就是为不同领域的Java机器学习开发提供通用的可重用设计。JSR 381 定义了标准的 Java API,提供了基本机器学习、图像分类和对象识别方面的处理能力。“依赖于不同的机器学习平台,如 TensorFlow, MXNet 以及 DeepNett 等,JSR-381 提供了不同的实现。对于 Java 生态内的开发者来说,不必再去学习 Python, 可以依赖 JSR-381 VisRec API 去构建你的 AI 应用。”
 
现实中,Java 应用的版本升级是较为缓慢的。Java 11(OpenJDK11)距离 2018年发布已经过去四年多,目前国内大多数的用户仍然停留在 Java 8。李三红认为,动力不足是多方面的,对开发者来说最直接的原因可能是担心升级后兼容性带来的稳定性问题,会直接影响业务的连续性。
 
这种问题并不罕见。令人振奋的是,处于 Java 生态中的企业正在贡献自己的力量。阿里内部在大规模地往 Java 11、 Java 17 迁移的时候,总结了不少的经验,并且将这些经验通过工具的方式沉淀下来。最后阿里开源了 EMT4J (Eclipse Migration Toolkit for Java) ,能够帮助 Java 应用无缝升级最新版本 JDK, 主要支持从 Java 8 到 Java 11,以及 17 的升级。
 
李三红还补充道,对于Java版本的升级问题,还可以从另一个角度——Software Sustainability——来进一步探讨。
 
“由 Titus Winter 等编写的《Software Engineering at Google – Lessons Learned from Programming Over Time》一书中,谈到了组织的 Codebase Sustainability 概念,强调了两个核心理念: 第一,无论应对的是技术需求,还是业务需求,软件代码应当可以做一切应该做的改变。 第二,这些改变带来的影响是安全的。
 
“回到 Java 版本升级这个问题,我们在开发 Java 应用的时候,建议应用架构师们把 Java 版本升级纳入到 Software Sustainability 这个维度下考量,对代码开发规范进行相关的约束。例如,不要让你的代码依赖 JDK 内部不公开的 API,不要让你的实现依赖特定的 JDK 版本行为,不要使用被 Deprecated 的 API 等等。架构的目标应当考虑 Code Sustainability,让你的 Java 应用可以在任何时候根据实际需要平滑升级到不同 JDK 版本,不应当因为代码缺乏 Sustainability 而导致的尽量少的版本升级。”
 
李三红
对 Java 的未来充满信心,源于他在
JVM
领域耕耘多年,不仅深入了解 Java 特性,并且有能力进行创新性研究。
 
在加入阿里之前,李三红一直在 IBM Java 技术中心, 参与 J9 虚拟机开发,期间领导了 JVM 多租户项目。目前就职于阿里云,领导程序语言与编译器团队,主要的工作是结合阿里、蚂蚁及云上各业务的需求,在编译器、语言运行时等基础领域进行研究创新。目前,在语言工具链这块,已经形成 Alibaba Dragonwell(Java生态), Alibaba Cloud Compiler(C++生态) 等多个产品来支撑其业务,语言工具链相关的开源技术也在为龙蜥社区的开发者提供支持。
 
2020年,李三红获得了Java 技术领导者社区 Java Champions 推荐,被授予 Java Champion 荣誉。Java Champion 由 Java 社区成员提名,并且必须得到现有 Java Champions 成员的一致同意。唯有为 Java / JVM 生态系统做出重要贡献的专家才能获此荣誉。
 
去年,阿里云第三次入选 JCP 最高执行委员会(JCP-EC), 作为阿里云在 JCP-EC 的代表,李三红一直在参与 JCP-EC 领导下的相关Java标准讨论制定工作。
 
GOTC 2023 很荣幸邀请到李三红担任“基础设施与软件架构”分论坛的出品人。该分论坛入选的议题,是经过了李三红和大会组委会深入讨论,精心安排的。希望从多个维度,最大程度覆盖了基础软件各领域的介绍分享。既有最底层芯片技术 (RISC-V) 的话题, 也包括了像 C++、Java 语言运行时的内容,还包含了应用最广泛的中间件Dubbo、RocketMQ、 Kafka 等内容的分享。
 
2023 年 5 月 28 日,GOTC 2023 “基础设施与软件架构” 分论坛将为开发者们提供基础架构领域最丰富、最前沿、以及最具技术性的内容分享。期待各位的莅临。
 
Goland激活2023.1.1(GoLand 2023.1 发布)
 
全球开源技术峰会(Global Open-source Technology Conference),简称 GOTC,是由开放原子开源基金会、 Linux 基金会亚太区、上海浦东软件园和开源中国联合发起的,面向全球开发者的一场盛大开源技术盛宴。 5 月 27 日至 28 日,GOTC 2023 将于上海举办为期 2 天的开源行业盛会。大会将以行业展览、主题发言、特别论坛、分论坛的形式展现,与会者将一起探讨宇宙、3D 与游戏、eBPF、Web3.0、区块链等热门技术主题,以及开源社区、AIGC、汽车软件、开源商业化、开源教育培训、云原生等热门话题,探讨开源未来,助力开源发展。
 
GOTC 2023 由一个主论坛、十五个分论坛组成,在线下举办的同时,还将在线上直播。GOTC 2023
报名通道现已开启,诚邀全球各技术领域开源爱好者共襄盛举!
 
参会报名,请访问:
https://www.bagevent.com/event/
 
进入官网了解更多信息,请访问:
https://gotc.oschina.net/

适配版本:V4.6+

介绍 :  重要功能更新!对于媒体功能要求高的用户,增加阿里云视频转码及截取封面支持,增加编辑器视频以及资源库直传OSS和自动转码mp4功能。优化大视频上传机制, 不再保存大视频文件在本地。解决以下痛点:

    1. 视频素材较大时, 转码mp4文件依赖服务器硬件过于消耗CPU等资源,多人协作时无法较好处理。

    2. 视频文件编辑器上传或资源库上传云存储,无法直传OSS,需要先存CMS内部,导致传输效率不高。

    3. 本地大视频文件过多,消耗巨大硬盘空间从而影响备份。

云视频转码及网页直传

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

系统特色

1.支持集群管理 系统支持集群化部署,可任意增加和较少CMS服务节点,根据业务需要独立部署服务节点,加强系统容错性 并发能力及扩展能力。

2.站点支持静态化发布 内容静态化发布,不但支持生成html,更可通过生成shtml方式,精确控制页面局部静态化,最大限度提高站点并发访问性能以及可维护性。

3.内容模型自定义支持 支持自定义模型功能,内置完善的字段类型,所定义字段还可参与联合查询,高级搜索,使您的站点具备高度扩展能力,方便应对各种业务需要。

4.强大可扩展权限系统 支持等级化的按部门划分的子站点管理,下级无法越权,明确权限职责。支持粗(菜单级)、细(业务数据)粒度权限控制,可按照组织、角色、用户进行授权, 有效划分权限范围,收放自如,职责清晰。并支持二次开发功能整合

5.安全防护能力 系统能自动拦截并记录分析各种非法访问,及时通知站点管理员进行处理,对于恶意访问者,以黑名单制度自动进行阻止,为您的站点安全保驾护航。

6.高级搜索支持 支持类似百度的高级搜索功能,支持大数据下的快速搜索,具有可配置性,结合自定义模型功能,可快速打造符合你需求的信息模型搜索。

7.网站群架构支持 一套CMS产品可支持部署多个站点,由JTopcms统一管理,但各站点彼此数据和逻辑性完全独立,且又可相互进行数据共享交流,为用户提供最大价值

8.实施网站开发简单 JTopcms提供了完善的标签体系,只需要使用者具备html和美工知识储备,在CMS标签的帮助下,即可高效的制作出可管理的动态站点。

9.灵活的数据组织方式 支持基本栏目和专题分类,TAG标签分类,更支持页面区块化碎片管理,自定义推荐位,数据组合方式灵活强大,满足各种数据组织需求。

10.二次开发高效 JTopcms基于J2EE核心模式自主研发,立项之初即考虑二次开发支持,扩展新模块只需具备Java web开发基础以及SQL能力, 就可快速上手,高效无侵入方式开发功能。

11.支持资源发布点 支持自动将图片 视频 文件 以及静态发布html发布到各资源服务器,动静分离,静态前端访问和动态后端访问独立处理,提升性能和安全性。

联系方式

主页: http://www.jtopcms.com/

Solon 是一个高效的 Java 应用开发框架:更快、更小、更简单。它不是 Spring、没有使用 Servlet、JavaEE 接口,是一个有自己接口标准的开放生态。可以为应用软件国产化提供支持,助力信创建设。

150多个生态插件,覆盖各种不同的应用开发场景:

Goland激活2023.1.1(GoLand 2023.1 发布)

相对于 Spring Boot 和 Spring Cloud 的项目:

  • 启动快 5 ~ 10 倍。 (更快)
  • qps 高 2~ 3 倍。 (更高)
  • 运行时内存节省 1/3 ~ 1/2。 (更少)
  • 打包可以缩小到 1/2 ~ 1/10;比如,300Mb 的变成了 23Mb。 (更小)
  • 同时支持 jdk8, jdk11, jdk17, jdk19。

似曾相似的体验,入门更简单,迁移很方便:

 

入门探索视频(用户录制):

本次更新:

  • 新增 mybatis-flex-solon-plugin 插件
  • 插件 solon.cloud.tracing 将 traceId 和 spanId 存入日志全局变量,方便在日志中打印
  • 插件 solon.scheduling 增加 @Async 运行器创建扩展机制
  • 调整 “@Init will be discarded” 打印时机,改由 debug 时打印
  • 调整 solon.web.sso 插件的用法
  • 调整 mybatis 相关的适配包名,基于2.0规范
  • 调整 @SolonTest 注解为可继承
  • 优化 mybatis-solon-plugin 去掉关闭连接时的 connection.setAutoCommit(true)。此段代码会导致查询速度增加20~30ms
  • 优化 solon.boot.jlhttp 插件 JlHttpServer 类,实现接口公用性!!!
  • 优化 solon.boot.jdkhttp 插件 JdkHttpServer 类,实现接口公用性!!!
  • 优化 solon.boot.smarthttp 插件 SmHttpServer 类,实现接口公用性!!!
  • snack3 升为 3.2.65,支持 File 类型注入

项目仓库:

  • gitee:https://gitee.com/noear/solon
  • github:https://github.com/noear/solon

野火IM 1.1.3 已经发布,即时通讯系统。

Release note 1.1.3:

  1. 添加服务器和客户端时间检查功能。
  2. 解决用户被block后session失效的问题。
  3. 添加消息撤回回调。
  4. 优化群组撤回逻辑。
  5. 解决用户离开群组后还能修改群昵称的问题。
  6. 修改server api修改好友关系回调数据错误问题。
  7. 同步超级群组数据库和数据。

如果附件的版本下载不下来,可以去Github下载,或者下载我们发布最新版本,通用Java包deb格式安装包rpm格式安装包
* 0.42 版本增加了群成员数限制,默认为2000。如果您想修改默认值,可以在升级版本之后,修改t_setting表,把默认的大小改为您期望的。另外修改t_group表,把已经存在的群组max_member_count改成您期望的,然后重启。*
* 0.46和0.47版本升级到0.48及以后版本时,可能会提示flyway migrate 38错误,请执行 修复脚本 进行修复。0.46和0.47版本之外的版本不会出现此问题。*
* 0.50版本添加了是否允许客户端发送群操作通知的配置。如果您在客户端自定义群通知,需要在服务器端配置允许,没有使用自定义群操作通知的不受影响。*
* 从0.54之前版本升级到0.54及以后版本时,会提示flyway migrate错误。因为0.54版本删除了sql脚本中默认敏感词的内容,flyway checksum失败。请执行来修复。*
* 从0.59之前的版本升级到之后的版本执行数据库升级时间比较长,请耐心等待提示运行成功,避免中途中断。 *
* 0.62/0.63 版本有严重的问题,请使用0.64及以后版本,或者0.61版。 *
* 从0.68 版本起添加了pc在线是否默认手机接收推送的开关,默认为开,与以前版本作用相反,请注意兼容(可以关掉与之前保持一致或者升级客户端) *
* 从0.78 版本起把MySQL数据库中关键字都改为大小写敏感,另外生成id的方法也做了改变,只生成小写的id,避免出现id重复的问题,建议所有客户都升级 *
* 从0.79 版本起把log4j升级到log4j2,因为log4j已经不再维护而且还有已知的漏洞,建议所有客户都升级,升级时注意更新log4j2的配置文件 *
* 0.97版本更改了启动脚本,如果是升级服务,请注意更新启动脚本。*

历史更新记录

请参考附件的 release_note.md

详情查看:https://gitee.com/wfchat/im-server/releases/1.1.3

经过几个月的开发,FerretDB 现在已经达到生产可用了,这是一个开源的 MongoDB 替代品,建立在 PostgreSQL 之上,并在 Apache 2.0 许可下发布。

https://sigusoft.com/wp-content/uploads/2024/06/4l9aFt926.jpg

FerretDB 希望将 MongoDB 数据库的工作负载带回其开源的本源,使 PostgreSQL 和其他数据库后端能够运行 MongoDB 工作负载,保留 MongoDB 现有生态所提供的机会。

  • 在任何地方部署 + 保持对你的数据的控制
  • 在基于云的项目中自由使用它
  • 使用现有的 PostgreSQL 基础设施来运行 MongoDB 工作负载

GA 的主要功能补充

在这个 GA 版本中,FerretDB 现在支持命令。这将使你能够指定你想要索引的字段,以及要使用的索引类型(例如,升序、降序等)。

例如,假设你有一个 集合,包含几个字段,包括 “age”、”name”和 “email”,你想为 “age” 字段创建一个索引。现在你可以运行下面的命令:

 

这将在 “age” 字段上创建一个升序索引,这将加快对该字段进行过滤的任何查询。

还添加了命令,它允许你从一个集合中删除索引。下面是一个例子:

 

这将从 “users” 集合中删除索引。

FerretDB 1.0 扩展了聚集管道的功能,除了在 阶段内的 累加器外,还包括其他阶段,如 、 和 。通过这些补充,可以对采集数据进行更精细的计算和操作。除了这些,还在聚合管道阶段增加了对和字段的支持。

为了帮助你收集更多关于集合、数据库和服务器性能的信息,FerretDB 1.0 启用了对几个服务器命令的部分支持,包括、和。

要检索一个集合的统计数据,请使用命令:

 

如果是关于数据库的统计,运行下面的命令:

 

对于集合的总数据量,运行下面的命令:

 

项目状态

FerretDB 现在拥有:

  • 超过 40 位代码贡献者,有超过 130 个来自我们社区的 PR
  • 在 GitHub 上有超过 5.6k Stars 和 200 次 Forks
  • 超过 100 个运行中的实例
  • FerretDB 下载超过 10000 次

随着 FerretDB 1.0 的发布,这些数字还会继续增长。

更多详情可查看:https://blog.ferretdb.io/ferretdb-1-0-ga-opensource-mongodb-alternative/

v1.0.0 更新内容:
1、设计、规划和研发基础 RBAC 权限架构;
2、编写框架核心底层代码,设计基于 Layout 布局的模板,设计并编写自定义模板 html 文件;
3、对系统模板进行架构设计及模板继承相关设计;
4、研发框架基础模块,如字典、配置、行政区划管理等等常规基础模块;
5、设计并研发代码生成器,根据表结构动态解析并生成模块文件和增删改查功能;
6、设计并研发一系列其他配套功能很常规使用函数;
7、设计并研发框架核心组件 widget;

一款 Python 语言基于Flask、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。

 

软件信息

  • 软件名称:DjangoAdmin敏捷开发框架Flask+Layui版本
  • 官网网址:https://www.djangoadmin.cn
  • 文档网址:http://docs.flask.layui.djangoadmin.cn
  • 演示地址:http://manage.flask.layui.djangoadmin.cn

版本说明

版本名称 版本说明 版本地址 Django+Layui混编版 采用Django、Layui等框架研发 https://gitee.com/djangoadmin/DjangoAdmin_Django_Layui Flask+Layui混编版 采用Flask、Layui等框架研发 https://gitee.com/djangoadmin/DjangoAdmin_Flask_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 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 Tornado+AntdVue前后端分离版 采用Tornado、Vue、AntDesign等框架研发前后端分离版本 https://gitee.com/djangoadmin/DjangoAdmin_Tornado_AntdVue

核心组件

  • 单图上传组件
 {{ "avatar|头像|90x90|建议上传尺寸450x450|450x450"|image(data.avatar, "jpg|png|gif", 0) }}
 

  • 多图上传组件
 {{ "imgs|图集|90x90|20|建议上传尺寸450x450"|album(data.imgsList, "jpg|png|gif", 10) }}
 

  • 下拉选择组件
 {{ "gender|1|性别|name|id"|select("1=男,2=女,3=保密", data.gender) }}
 

  • 单选按钮组件
 {{ "gender|name|id"|radio("1=男,2=女,3=保密", 1) }}
 

  • 复选框组件
 {{ "gender|name|id"|checkbox("1=男,2=女,3=保密", 1) }}
 

  • 城市选择组件
 {{ data.district_code|default("")|city(3, 1) }}
 

  • 开关组件
 {{ "status"|switch("在用|禁用", data.status|default(1)) }}
 

  • 日期组件
 {{ "birthday|1|出生日期|date"|date(data.birthday) }}
 

  • 图标组件
 {{ "icon"|icon(data.icon|default("layui-icon-component")) }}
 

  • 穿梭组件
 {{ "func|0|全部节点,已赋予节点|name|id|220x350"|transfer("1=列表,5=添加,10=修改,15=删除,20=详情,25=状态,30=批量删除,35=添加子级,40=全部展开,45=全部折叠,50=导出数据,55=导入数据,60=分配权限,65=重置密码", funcList) }} 

模块展示

Goland激活2023.1.1(GoLand 2023.1 发布)

特别鸣谢

感谢Flask、Layui等优秀开源项目。

WGCLOUD 是一款集成度较高的分布式运维监控平台,具有集群监控,易部署、易上手使用、轻量、高效、自动化等特点,server 端基于 springboot 开发,agent 端使用 go 编写。核心模块包括:主机系统信息监控,CPU 监控,CPU 温度监控,内存监控,网络流量监控,磁盘 IO 监控,磁盘空间监测,系统负载监控,硬盘 smart 健康检测,应用进程监控,端口监控,docker 监控,日志文件监控,文件防篡改保护,数据可视化监控,自动生成拓扑图、大屏可视化,数通设备监测,服务接口监测,设备账号管理,web ssh ,指令下发,告警信息(邮件、钉钉、微信等)推送 

码云仓库:https://gitee.com/wanghouhou/wgcloud

GITHUB 仓库:https://github.com/tianshiyeben/wgcloud

WGCLOUD 唯一官网:http://www.wgstart.com

WGCLOUD 支持监测的操作系统平台

支持监测 Linux 系列:Debian、RedHat、CentOS、Ubuntu、Fedora、麒麟、统信 (UOS)、龙芯 (mips) 等
支持监测 Windows 系列:Windows Server 2008 R2,2012,2016,2019,2022,Windows 7,Windows 8,Windows 10,Windows 11
支持监测 Unix 系列:solaris,FreeBSD,OpenBSD
支持监测 MacOS 系列:macOS amd64,macOS arm64
其他支持:ARM,Android(安卓),riscv64,s390x,树莓派等

WGCLOUD-v3.4.6 更新说明  2023-04-12 发布

1. 新增,进程、端口、docker 的监控间隔时间,支持单独配置,修改 agent 配置文件配置项 

2. 新增,第三个大屏展板

3. 新增,监测主机用户的登录信息

4. 新增,进程监控,支持采集进程所有者

5. 新增,进程监控,支持自动恢复指令或者脚本,系统在检测到进程下线后触发,agent 会自动执行用户设置的恢复指令

6. 新增,数据源监测支持监控达梦数据库

7. 新增,对系统中涉及到的密码加密处理

8. 优化,磁盘、文件防篡改监控时间改为 15 分钟扫描一次,原来是 30 分钟

9. 优化,docker 容器监测

10. 优化,数通 SNMP 监测,可以不用填写进出口流量的 OID 了,系统将会自动获取设备的所有接口流量和速率

11. 新增,设备账号管理模块

12.bug 修复,端口监控,当 IP 和 Telnet IP 都在主机列表 IP 时,偶尔出现数据监控的问题

13. 一些已知的 bug 修复,优化 UI,代码结构优化

 

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

 

更新内容:

[新增] table 组件 sort-change 事件,在 column 排序时触发。
[新增] layer 组件 beforeClose 回调函数,他将在关闭前触发,你可以通过 return false 来阻止关闭。
[新增] icons 组件 type 属性 layui-icon-help-circle 值, HelpCircleIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-tips-fill 值, TipsFillIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-test 值, TestIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-clear 值, ClearIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-keyboard 值, KeyboardIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-backspace 值, BackspaceIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-show 值, ShowIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-hide 值, HideIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-error 值, ErrorIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-success 值, SuccessIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-question 值, QuestionIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-lock 值, LockIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-moon 值, MoonIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-github 值, GithubIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-disabled 值, DisabledIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-gitee 值, GiteeIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-eye-invisible 值, EyeInvisibleIcon 图标组件。
[新增] icons 组件 type 属性 layui-icon-eye 值, EyeIcon 图标组件。
[修复] layer 组件 maxmin 属性在首次拖拽前,无法正常最小化的问题。
[修复] config-provider 组件 themeVariable 属性在夜间模式下不生效的问题。
[修复] tab 组件 brief 风格中标题颜色由 primary-color 调整为 checked-color 变量。
[修复] page 组件 theme 属性缺省,主题色不跟随 config-provider 组件配置。
[修复] date-picker 组件主题色不跟随 config-provider 组件配置。
[修复] webpack 构建项目时,因为 tree-shaking 造成 index.css 丢失。
[修复] form 组件 model 属性中对象字段为 0 时,总是验证为空的问题。
[修复] form-item 组件 prop 属性无法深度取值的问题。
[优化] form-item 组件 prop 属性,区分深层与浅层取值的逻辑。
[升级] icons-vue 到 1.1.0 版本。
[升级] layer-vue 到 1.8.2 版本。

更多详情:http://www.layui-vue.com

前言

kkFileView 自 2017 年开源至今,已经支持 23 种文件类型,上百种文件后缀的文件在线预览。已在 Gitee 收获 17.2K 、Github 收获 8.2K star, 我们一直在精心打磨 kkFileView ,旨在打造开源里最好用最强大的文件在线预览项目。

时隔 4 个月,kkFileView 迎来了 2023 年第一个版本 v4.2.0 的发布,这是一个里程碑版本,新增了更多文件类型的预览支持,并且随着这个版本的迭代,我们确立了项目脱离原公司完全社区化运营迭代的节奏,也发布了我们新的官网,新的演示站点。

  • 官网站点:https://kkview.cn
  • 演示站点:https://file.kkview.cn

没有了公司背景,也意味着所有的服务器费用需要社区来支持,所以我们推出了付费的知识社区

  • kk 开源知识星球:https://sigusoft.com/09ZHSXbsQ

本星球用于发布最新的 kkFileView 发行包,以及解答使用 kkFIleView 遇到的任何问题,创建付费社区旨在推动以 kkFileView 为首的一系列 kk 开源项目的健康、可持续发展。欢迎加入我们的社区,支持我们开源

更新日志:

新增功能

  • 新增 SVG 格式文件预览支持
  • 新增加密的 Office 文件预览支持
  • 新增加密的 zip、rar 等压缩包文件预览支持
  • 新增 xmind 软件模型文件预览支持
  • 新增 bpmn 工作流模型文件预览支持
  • 新增 eml 邮件文件预览支持
  • 新增 epub 电子书文件预览支持
  • 新增 dotm,ett,xlt,xltm,wpt,dot,xlam,xla,dotx 等格式的办公文档预览支持
  • 新增 obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim 等 3D 模型文件预览支持
  • 新增可配置限制高风险文件上传的功能,比如 exe 文件
  • 新增可配置站点的备案信息
  • 新增演示站点删除文件需要密码的功能

优化

  • 文本文档预览加入缓存
  • 美化 404、500 报错页
  • 优化发票等 ofd 文件预览的印证渲染兼容性
  • 移除 office-plugin 模块, 使用新版 jodconverter组件
  • 优化 Excel 文件的预览效果
  • 优化 CAD 文件的预览效果
  • 更新 xstream 、junrar、pdfbox 等依赖的版本
  • 更新 TIF 文件转换 PDF 的插件,添加转换缓存
  • 优化演示页 UI 部署
  • 压缩包文件预览支持目录

修复

  • 修复部分接口 XSS 问题
  • 修复控制台打印的演示地址不跟着 content-path 配置走的问题
  • 修复 ofd 文件预览跨域问题
  • 修复内部自签证书 https 协议 url 文件无法下载的问题
  • 修复特殊符号的文件无法删除的问题
  • 修复 PDF 转图片,内存无法回收导致的 OOM
  • 修复 xlsx7.4 以上版本文件预览乱码的问题
  • 修复 TrustHostFilter 未拦截跨域接口的问题,这是一个安全问题,有使用到 TrustHost 功能的务必升级
  • 修复压缩包文件预览在 Linux 系统下文件名乱码的问题
  • 修复 ofd 文件预览页码只能显示 10 页的问题

kkFileView 支持的文件列表

  1. 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx,xlam, xla 等 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 等 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 等 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 等视频格式转码预览

Databricks 发布了 Dolly 2.0,这是该公司于两周前发布的一种训练成本不到 30 美,类似 ChatGPT 的大型语言模型 (LLM) Dolly 的改进版本。公告称,Dolly 2.0 是第一个开源的指令跟随型语言模型,它在人类生成的指令数据集上进行了微调,可用于研究和商业用途。

根据介绍,Dolly 1.0 使用了斯坦福大学 Alpaca 团队使用 OpenAI API 创建的数据集进行训练;该数据集包含 ChatGPT 的输出,而其服务条款试图阻止任何人创建与 OpenAI 竞争的模型。因此,Dolly 1.0 并不能用于商业用途。且据已知信息,目前所有现有的知名指令跟随模型 (Alpaca, Koala, GPT4All, Vicuna) 都受到此限制,禁止商业使用。为了解决这个难题,Databricks 于是决定创建一个没有商业用途限制的新数据集。

Goland激活2023.1.1(GoLand 2023.1 发布)

Dolly 2.0 是一个基于 EleutherAI pythia 模型系列的 12B 参数语言模型,并在透明且免费提供的数据集上进行了微调;该数据集称为 databricks-dolly-15k,也已开源发布。Databricks 表示,他们正在开源整个 Dolly 2.0,包括训练代码、数据集和模型权重,所有这些都适合商业使用。这意味着任何组织都可以创建、拥有和定制强大的 LLM,这些 LLM 可以与人们交谈,而无需支付 API 访问费用或与第三方共享数据。

databricks-dolly-15k 包含来自数千名 Databricks 员工的 15,000 个高质量的人工生成的提示/响应对,专为指令调优大型语言模型而设计。且 databricks-dolly-15k 根据(Creative Commons Attribution-ShareAlike 3.0 Unported License)的许可条款,任何人都可以出于任何目的使用、修改或扩展此数据集,包括商业应用程序。

Databricks 称这是“第一个开源的、人工生成的指令语料库,专门设计用于让大型语言能够展示 ChatGPT 的神奇交互性”。并补充到,虽然 databricks-dolly-15k 比训练 Dolly 1.0 的数据集 Alpaca 小得多,但基于 EleutherAI 的 pythia-12b 生成的 Dolly 2.0 模型表现出高质量的指令遵循行为。另一方面, databricks-dolly-15k 是由专业人士生成的、质量很高,并且包含对大多数任务的长篇答案。

Databricks 表示,他们并没有期望 Dolly 在有效性方面达到最先进水平。但确实希望 Dolly 和开源数据集将成为大量后续工作的种子,“这可能有助于引导出更强大的语言模型”。

“我们还认为,偏见、问责制和人工智能安全等重要问题应该由不同利益相关者组成的广泛社区来解决,而不仅仅是少数大公司。开源数据集和模型鼓励评论、研究和创新,这将有助于确保每个人都能从人工智能技术的进步中受益。”

要下载 Dolly 2.0 模型权重,只需访问 Databricks Hugging Face 页面,并访问  Dolly repo on databricks-labs,下载 databricks-dolly-15k 数据集。

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

为积极应对开源法律合规风险,助力国内开源生态高质量发展,openKylin社区联合红山开源社区4月12日成功举办了开源合规与技术风险研讨会

本次研讨会由红山开源平台工程师张启磊主持,openKylin社区Compliance SIG组Maintainer邢鹏、王悦良,上海探巡科技有限公司技术总监王宇,红山开源平台唐艺主任、活动负责人易比一技术负责人李光杰,红山开源平台工程师李维昊等专家参加。

Goland激活2023.1.1(GoLand 2023.1 发布)

会上,红山开源平台唐艺主任为本次会议发表了致辞,红山开源平台工程师李维昊分享了《红山开源发展理念与开源合规思考》主题报告;openKylin社区Compliance SIG Maintainer邢鹏为大家分享了《openchain开源合规治理国际标准简介》主题报告;openKylin社区Compliance SIG Maintainer王悦良以《操作系统开源合规治理思考》为题进行了主题报告;上海探巡科技有限公司技术总监王宇分享了《分级建立开源软件依赖关系图谱数据库,夯实开源软件供应链基础》主题报告。

Goland激活2023.1.1(GoLand 2023.1 发布)

随后,进入到本次会议研讨环节,各参会专家围绕开源合规和技术风险展开了交流研讨,并提出了诸多建设性意见。当前,开源已成为IT行业发展的核心原动力,渗透到各个产业领域,开源合规问题也受到各行业、各产业环节高度重视。

openKylin Compliance SIG作为openKylin社区这一重要关注方向的主体,负责openKylin社区开源合规与知识产权保护相关领域工作,为社区开源合规治理提供理论支撑,提升openKylin社区开源合规与知识产权保护质量,并积极对外开展开源合规与知识产权保护经验交流,为业界加强知识产权保护力度,普及与提升开源合规治理能力贡献力量,欢迎开源合规领域各位专家、公司法务、社区开发者、爱好者等任何对开源合规感兴趣的伙伴加入!

关于Compliance SIG

openKylin社区Compliance SIG以操作系统开源合规治理为抓手,积极对接“可信开源合规计划”,完善openKylin “可控开源”体系,积极探索知识产权保护与开源合规理论创新、推广普及和实践落地。

  • Compliance SIG 仓库地址:
  • https://gitee.com/openkylin/community/tree/master/sig/Compliance
  • Compliance SIG邮件列表:
  • compliance@lists.openkylin.top

openKylin(开放麒麟)社区旨在以“共创”为核心,在开源、自愿、平等、协作的基础上,通过开源、开放的方式与企业构建合作伙伴生态体系,共同打造桌面操作系统顶级社区,推动Linux开源技术及其软硬件生态繁荣发展。

社区首批理事成员单位包括麒麟软件、普华基础软件、中科方德、麒麟信安、凝思软件、一铭软件、中兴新支点、心科技、中国电科32所、技德系统、北京麟卓、先进操作系统创新中心等13家产业同仁和行业机构。

最近 ChatGPT 大火,它衍生出来的工具也如雨后春笋(受到的关注度也 ⬆️),Star History 三月的开源就来了解一下 ChatGPT 相关的好用工具 。

Auto-GPT

Goland激活2023.1.1(GoLand 2023.1 发布)

Auto-GPT 由 GPT-4 驱动,可以自主反思和改进行为。

比如你打算做个应用程序,只要用自然语言描述,Auto-GPT 可以自动生成并执行代码,然后还能自主 debug 并且修复 。

Goland激活2023.1.1(GoLand 2023.1 发布)

虽然 Auto-GPT 不是个成熟产品,只是个实验,但想象一下 AI 完全自主运行,完成开发 / 管理业务 / 设计市场营销计划已经指日可待了。

Awesome ChatGPT Prompts

Goland激活2023.1.1(GoLand 2023.1 发布)

每次都要拍脑袋写出有效的 prompt 还是很不容易的,有人收录了常用 prompt 的集锦,比如叫 ChatGPT 给你当社交媒体负责人,或者帮你把你写的人话翻译成表情。

Goland激活2023.1.1(GoLand 2023.1 发布)

ChatGPT Retrieval Plugin

Goland激活2023.1.1(GoLand 2023.1 发布)

这是个来自 OpenAI 官方的检索插件,通过将 ChatGPT 连接到向量数据库的实例,你可以使用自然语言查询对个人或组织文档进行语义搜索和检索,从而得到最相关的文档片段。

Goland激活2023.1.1(GoLand 2023.1 发布)

这个插件还可以将你和 ChatGPT 的对话中的片段保存到向量数据库中,ChatGPT 之后能记住并检索你们先前对话中的信息了。

Glarity

Goland激活2023.1.1(GoLand 2023.1 发布)

Glarity 是个给页面提供摘要的 Chrome 插件,比如在 Google 搜索结果 / YouTube 视频 / 新闻界面旁边看 ChatGPT 给你总结的摘要(再也不用翻阅页面 / 看长视频了)。

Goland激活2023.1.1(GoLand 2023.1 发布)

OpenAI Translator

Goland激活2023.1.1(GoLand 2023.1 发布)

OpenAI Translator 是个划词翻译浏览器插件 / 跨平台桌面端应用。除了基本的翻译功能,还可以美化,总结,分析内容(甚至解释代码),属于是最大化了 AI 在语言方面能做的贡献了。Google Translate 和 DeepL 你们在干嘛 。

Goland激活2023.1.1(GoLand 2023.1 发布)

OpenPrompt

Goland激活2023.1.1(GoLand 2023.1 发布)

OpenPrompt 其实可以想象成是个 ChatGPT 的 GitHub:你能创建,搜索,使用和分享 ChatGPT Prompts。

Goland激活2023.1.1(GoLand 2023.1 发布)

ShareGPT

Goland激活2023.1.1(GoLand 2023.1 发布)

ShareGPT 是个 Chrome 插件,能把你和 ChatGPT 聊天的页面生成一个永久链接,然后就可以把你和 ChatGPT 的对话分享与你的伙伴们分享了(而不用截十张图了)。比如可以了解一下人生的意义:sharegpt.com/c/oPt72P3

Goland激活2023.1.1(GoLand 2023.1 发布)

SQL Chat

Goland激活2023.1.1(GoLand 2023.1 发布)

 

SQL Chat = SQL + ChatGPT,一款基于 LLM 的对话式 SQL 客户端,开发者可以连上数据库,随后直接在对话框中用自然语言和你的数据库(目前支持 MySQL 和 PostgreSQL)打交道。今天新鲜支持了 Dark Mode ,点赞!

Goland激活2023.1.1(GoLand 2023.1 发布)

最后

有了 ChatGPT,好像这个也可以不用做,那个也可以不用做了,如果真的拿这些省下的时间来摸鱼,会不会很快被 AI 取代?我的想法是,最好的状态应该是 AI 帮助你提升效率,做出更棒的事儿(not to be mistaken with 卷),比如让 ChatGPT 帮你写 SQL 不代表你不用熟练掌握 SQL 和数据库知识,而是可以更快写出更优秀的 SQL 吧 ✌️。

RocketMQ消费者保障

img

  • 作者: 博学谷狂野架构师
  • GitHub:GitHub地址 (有我精心准备的130本电子书PDF)

只分享干货、不吹水,让我们一起加油!😄

消息确认机制

consumer的每个实例是靠队列分配来决定如何消费消息的。那么消费进度具体是如何管理的,又是如何保证消息成功消费的?(RocketMQ有保证消息肯定消费成功的特性,失败则重试)

什么是ACK

消息确认机制

在实际使用RocketMQ的时候我们并不能保证每次发送的消息都刚好能被消费者一次性正常消费成功,可能会存在需要多次消费才能成功或者一直消费失败的情况,那作为发送者该做如何处理呢?

为了保证数据不被丢失,RocketMQ支持消息确认机制,即ack。发送者为了保证消息肯定消费成功,只有使用方明确表示消费成功,RocketMQ才会认为消息消费成功。中途断电,抛出异常等都不会认为成功——即都会重新投递。

保证数据能被正确处理而不仅仅是被Consumer收到,我们就不能采用no-ack或者auto-ack,我们需要手动ack(manual-ack)。在数据处理完成后手动发送ack,这个时候Server才将Message删除。

RocketMQ ACK

由于以上工作所有的机制都实现在PushConsumer中,所以本文的原理均只适用于RocketMQ中的PushConsumer即Java客户端中的。 若使用了PullConsumer模式,类似的工作如何ack,如何保证消费等均需要使用方自己实现。

注:广播消费和集群消费的处理有部分区别,以下均特指集群消费(CLSUTER),广播(BROADCASTING)下部分可能不适用。

保证消费成功

PushConsumer为了保证消息肯定消费成功,只有使用方明确表示消费成功,RocketMQ才会认为消息消费成功。中途断电,抛出异常等都不会认为成功——即都会重新投递。

代码示例

消费的时候,我们需要注入一个消费回调,具体sample代码如下:


业务实现消费回调的时候,当且仅当此回调函数返回,RocketMQ才会认为这批消息(默认是1条)是消费完成的。

如果这时候消息消费失败,例如数据库异常,余额不足扣款失败等一切业务认为消息需要重试的场景,只要返回,RocketMQ就会认为这批消息消费失败了。

为了保证消息是肯定被至少消费成功一次,RocketMQ会把这批消息重发回Broker(topic不是原topic而是这个消费租的RETRY topic),在延迟的某个时间点(默认是10秒,业务可设置)后,再次投递到这个ConsumerGroup。而如果一直这样重复消费都持续失败到一定次数(默认16次),就会投递到DLQ死信队列。应用可以监控死信队列来做人工干预。

ACK进度保存

启动的时候从哪里消费

当新实例启动的时候,PushConsumer会拿到本消费组broker已经记录好的消费进度(consumer offset),按照这个进度发起自己的第一次Pull请求。

如果这个消费进度在Broker并没有存储起来,证明这个是一个全新的消费组,这时候客户端有几个策略可以选择:


所以,社区中经常有人问:“为什么我设了,历史的消息还是被消费了”? 原因就在于只有全新的消费组才会使用到这些策略,老的消费组都是按已经存储过的消费进度继续消费。

对于老消费组想跳过历史消息需要自身做过滤,或者使用先修改消费进度

消息ACK消费进度

RocketMQ是以consumer group+queue为单位是管理消费进度的,以一个consumer offset标记这个这个消费组在这条queue上的消费进度。

如果某已存在的消费组出现了新消费实例的时候,依靠这个组的消费进度,就可以判断第一次是从哪里开始拉取的,每次消息成功后,本地的消费进度会被更新,然后由定时器定时同步到broker,以此持久化消费进度。

但是每次记录消费进度的时候,只会把一批消息中最小的offset值为消费进度值,如下图:

message ack

这钟方式和传统的一条message单独ack的方式有本质的区别。性能上提升的同时,会带来一个潜在的重复问题——由于消费进度只是记录了一个下标,就可能出现拉取了100条消息如 2101-2200的消息,后面99条都消费结束了,只有2101消费一直没有结束的情况。

在这种情况下,RocketMQ为了保证消息肯定被消费成功,消费进度职能维持在2101,直到2101也消费结束了,本地的消费进度才能标记2200消费结束了(注:consumerOffset=2201)。

重复消费

在这种设计下,就有消费大量重复的风险。如2101在还没有消费完成的时候消费实例突然退出(机器断电,或者被kill)。这条queue的消费进度还是维持在2101,当queue重新分配给新的实例的时候,新的实例从broker上拿到的消费进度还是维持在2101,这时候就会又从2101开始消费,2102-2200这批消息实际上已经被消费过还是会投递一次。

对于这个场景,RocketMQ暂时无能为力,所以业务必须要保证消息消费的幂等性,这也是RocketMQ官方多次强调的态度。

实际上,从源码的角度上看,RocketMQ可能是考虑过这个问题的,截止到3.2.6的版本的源码中,可以看到为了缓解这个问题的影响面,中有个配置


这个值默认是2000,当RocketMQ发现本地缓存的消息的最大值-最小值差距大于这个值(2000)的时候,会触发流控——也就是说如果头尾都卡住了部分消息,达到了这个阈值就不再拉取消息。

但作用实际很有限,像刚刚这个例子,2101的消费是死循环,其他消费非常正常的话,是无能为力的。一旦退出,在不人工干预的情况下,2101后所有消息全部重复!

Ack卡进度解决方案

实际上对于卡住进度的场景,可以选择弃车保帅的方案:把消息卡住那些消息,先ack掉,让进度前移。但要保证这条消息不会因此丢失,ack之前要把消息sendBack回去,这样这条卡住的消息就会必然重复,但会解决潜在的大量重复的场景。 这也是我们公司自己定制的解决方案。

部分源码如下:


  1. 定义了一个装饰器,把原来的ConsumeRequest对象包了一层。

  2. 装饰器中,每条消息消费前都会调度一个调度器,定时触发,触发的时候如果发现消息还存在,就执行sendback并ack的操作。

    后来RocketMQ显然也发现了这个问题,RocketMQ在3.5.8之后也是采用这样的方案去解决这个问题。只是实现方式上有所不同(事实上我认为RocketMQ的方案还不够完善)

  3. 在pushConsumer中 有一个字段(默认15分钟),用于设置最大的消费超时时间。消费前会记录一个消费的开始时间,后面用于比对。

  4. 消费者启动的时候,会定期扫描所有消费的消息,达到这个timeout的那些消息,就会触发sendBack并ack的操作。这里扫描的间隔也是consumeTimeout(单位分钟)的间隔。

核心源码如下:


通过这个逻辑对比我定制的时间,可以看出有几个不太完善的问题:

  1. 消费timeout的时间非常不精确。由于扫描的间隔是15分钟,所以实际上触发的时候,消息是有可能卡住了接近30分钟(15*2)才被清理。
  2. 由于定时器一启动就开始调度了,中途这个consumeTimeout再更新也不会生效。

消息重试

顺序消息的重试

对于顺序消息,当消费者消费消息失败后,消息队列RocketMQ版会自动不断地进行消息重试(每次间隔时间为1秒),这时,应用会出现消息消费被阻塞的情况。因此,建议您使用顺序消息时,务必保证应用能够及时监控并处理消费失败的情况,避免阻塞现象的发生。

无序消息的重试

对于无序消息(普通、定时、延时、事务消息),当消费者消费消息失败时,您可以通过设置返回状态达到消息重试的结果。

无序消息的重试只针对集群消费方式生效;广播方式不提供失败重试特性,即消费失败后,失败消息不再重试,继续消费新的消息。

注意 以下内容都只针对无序消息生效。

重试次数

消息队列RocketMQ版默认允许每条消息最多重试16次,每次重试的间隔时间如下。

第几次重试 与上次重试的间隔时间 第几次重试 与上次重试的间隔时间 1 10秒 9 7分钟 2 30秒 10 8分钟 3 1分钟 11 9分钟 4 2分钟 12 10分钟 5 3分钟 13 20分钟 6 4分钟 14 30分钟 7 5分钟 15 1小时 8 6分钟 16 2小时

如果消息重试16次后仍然失败,消息将不再投递。如果严格按照上述重试时间间隔计算,某条消息在一直消费失败的前提下,将会在接下来的4小时46分钟之内进行16次重试,超过这个时间范围消息将不再重试投递。

注意 一条消息无论重试多少次,这些重试消息的Message ID不会改变。

和生产端重试区别

消费者和生产者的重试还是有区别的,主要有两点

  • 默认重试次数:Product默认是2次,而Consumer默认是16次
  • 重试时间间隔:Product是立刻重试,而Consumer是有一定时间间隔的。它照进行重试。
  • Product在异步情况重试失效,而对于Consumer在广播情况下重试失效。

配置方式

重试配置方式

消费失败后,重试配置方式,集群消费方式下,消息消费失败后期望消息重试,需要在消息监听器接口的实现中明确进行配置(三种方式任选一种):

  • 方式1:返回RECONSUME_LATER(推荐)
  • 方式2:返回Null
  • 方式3:抛出异常
示例代码

无需重试的配置方式

集群消费方式下,消息失败后期望消息不重试,需要捕获消费逻辑中可能抛出的异常,最终返回Action.CommitMessage,此后这条消息将不会再重试。

示例代码

获取消息重试次数

消费者收到消息后,可按照以下方式获取消息的重试次数:


效果演示

消费端只发送一条消息进行测试重试

消费端主动拒绝
演示代码

重试消息

消费端返回 ,消费端就会不断的重试。


异常重试
演示代码

这里的代码意思很明显: 主动抛出一个异常,然后如果超过3次,那么就不继续重试下去,而是将该条记录保存到数据库由人工来兜底。


重试消息

超时重试

这里的超时异常并非真正意义上的超时,它指的是指获取消息后,因为某种原因没有给RocketMQ返回消费的状态,即没有 或

那么 RocketMQ会认为该消息没有发送,会一直发送。因为它会认为该消息根本就没有发送给消费者,所以肯定没消费。

演示代码

重试消息

当获得 当前消费重试次数为 = 0 后 , 关掉该进程。再重新启动该进程,那么依然能够获取该条消息


重启消费者


重试消息的处理

一般情况下我们在实际生产中是不需要重试16次,这样既浪费时间又浪费性能,理论上当尝试重复次数达到我们想要的结果时如果还是消费失败,那么我们需要将对应的消息进行记录,并且结束重复尝试。


所以任何异常都要捕获返回ConsumeConcurrentlyStatus.RECONSUME_LATER,rocketmq会放到重试队列,这个重试TOPIC的名字是%RETRY%+consumergroup的名字,如下图:

注意点

  1. 如果业务的回调没有处理好而抛出异常,会认为是消费失败当ConsumeConcurrentlyStatus.RECONSUME_LATER处理。
  2. 当使用顺序消费的回调MessageListenerOrderly时,由于顺序消费是要前者消费成功才能继续消费,所以没有ConsumeConcurrentlyStatus.RECONSUME_LATER的这个状态,只有ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT来暂停队列的其余消费,直到原消息不断重试成功为止才能继续消费。

RocketMQ重试流程

重试队列与死信队列

在介绍RocketMQ的消费重试机制之前,需要先来说下“重试队列”和“死信队列”两个概念。

重试队列

如果Consumer端因为各种类型异常导致本次消费失败,为防止该消息丢失而需要将其重新回发给Broker端保存,保存这种因为异常无法正常消费而回发给MQ的消息队列称之为重试队列。RocketMQ会为每个消费组都设置一个Topic名称为“%RETRY%+consumerGroup”的重试队列(这里需要注意的是,这个Topic的重试队列是针对消费组,而不是针对每个Topic设置的),用于暂时保存因为各种异常而导致Consumer端无法消费的消息。考虑到异常恢复起来需要一些时间,会为重试队列设置多个重试级别,每个重试级别都有与之对应的重新投递延时,重试次数越多投递延时就越大。RocketMQ对于重试消息的处理是先保存至Topic名称为“SCHEDULE_TOPIC_XXXX”的延迟队列中,后台定时任务按照对应的时间进行Delay后重新保存至“%RETRY%+consumerGroup”的重试队列中。

死信队列

由于有些原因导致Consumer端长时间的无法正常消费从Broker端Pull过来的业务消息,为了确保消息不会被无故的丢弃,那么超过配置的“最大重试消费次数”后就会移入到这个死信队列中。在RocketMQ中,SubscriptionGroupConfig配置常量默认地设置了两个参数,一个是retryQueueNums为1(重试队列数量为1个),另外一个是retryMaxTimes为16(最大重试消费的次数为16次)。Broker端通过校验判断,如果超过了最大重试消费次数则会将消息移至这里所说的死信队列。这里,RocketMQ会为每个消费组都设置一个Topic命名为“%DLQ%+consumerGroup”的死信队列。一般在实际应用中,移入至死信队列的消息,需要人工干预处理;

Consumer端回发消息至Broker端

在业务工程中的Consumer端(Push消费模式下),如果消息能够正常消费需要在注册的消息监听回调方法中返回CONSUME_SUCCESS的消费状态,否则因为各类异常消费失败则返回RECONSUME_LATER的消费状态。消费状态的枚举类型如下所示:


如果业务工程对消息消费失败了,那么则会抛出异常并且返回这里的RECONSUME_LATER状态。这里,在消费消息的服务线程—consumeMessageService中,将封装好的消息消费任务ConsumeRequest提交至线程池—consumeExecutor异步执行。从消息消费任务ConsumeRequest的run()方法中会执行业务工程中注册的消息监听回调方法,并在processConsumeResult方法中根据业务工程返回的状态(CONSUME_SUCCESS或者RECONSUME_LATER)进行判断和做对应的处理。

CONSUME_SUCCESS

业务方正常消费

正常情况下,设置ackIndex的值为consumeRequest.getMsgs().size() – 1,因此后面的遍历consumeRequest.getMsgs()消息集合条件不成立,不会调用回发消费失败消息至Broker端的方法—sendMessageBack(msg, context)。最后,更新消费的偏移量;

RECONSUME_LATER

业务方消费失败

异常情况下,设置ackIndex的值为-1,这时就会进入到遍历consumeRequest.getMsgs()消息集合的for循环中,执行回发消息的方法—sendMessageBack(msg, context)。这里,首先会根据brokerName得到Broker端的地址信息,然后通过网络通信的Remoting模块发送RPC请求到指定的Broker上,如果上述过程失败,则创建一条新的消息重新发送给Broker,此时新消息的Topic为“%RETRY%+ConsumeGroupName”—重试队列的主题。其中,在MQClientAPIImpl实例的consumerSendMessageBack()方法中封装了ConsumerSendMsgBackRequestHeader的请求体,随后完成回发消费失败消息的RPC通信请求(业务请求码为:CONSUMER_SEND_MSG_BACK)。倘若上面的回发消息流程失败,则会延迟5S后重新在Consumer端进行重新消费。与正常消费的情况一样,在最后更新消费的偏移量;

Broker端对于回发消息处理的主要流程

Broker端收到这条Consumer端回发过来的消息后,通过业务请求码(CONSUMER_SEND_MSG_BACK)匹配业务处理器—SendMessageProcessor来处理。在完成一系列的前置校验(这里主要是“消费分组是否存在”、“检查Broker是否有写入权限”、“检查重试队列数是否大于0”等)后,尝试获取重试队列的TopicConfig对象(如果是第一次无法获取到,则调用createTopicInSendMessageBackMethod()方法进行创建)。根据回发过来的消息偏移量尝试从commitlog日志文件中查询消息内容,若不存在则返回异常错误。

然后,设置重试队列的Topic—“%RETRY%+consumerGroup”至MessageExt的扩展属性“RETRY_TOPIC”中,并对根据延迟级别delayLevel和最大重试消费次数maxReconsumeTimes进行判断,如果超过最大重试消费次数(默认16次),则会创建死信队列的TopicConfig对象(用于后面将回发过来的消息移入死信队列)。在构建完成需要落盘的MessageExtBrokerInner对象后,调用“commitLog.putMessage(msg)”方法做消息持久化。这里,需要注意的是,在putMessage(msg)的方法里会使用“SCHEDULE_TOPIC_XXXX”和对应的延迟级别队列Id分别替换MessageExtBrokerInner对象的Topic和QueueId属性值,并将原来设置的重试队列主题(“%RETRY%+consumerGroup”)的Topic和QueueId属性值做一个备份分别存入扩展属性properties的“REAL_TOPIC”和“REAL_QID”属性中。看到这里也就大致明白了,回发给Broker端的消费失败的消息并非直接保存至重试队列中,而是会先存至Topic为“SCHEDULE_TOPIC_XXXX”的定时延迟队列中。

疑问:上面说了RocketMQ的重试队列的Topic是“%RETRY%+consumerGroup”,为啥这里要保存至Topic是“SCHEDULE_TOPIC_XXXX”的这个延迟队列中呢?

在源码中搜索下关键字—“SCHEDULE_TOPIC_XXXX”,会发现Broker端还存在着一个后台服务线程—ScheduleMessageService(通过消息存储服务—DefaultMessageStore启动),通过查看源码可以知道其中有一个DeliverDelayedMessageTimerTask定时任务线程会根据Topic(“SCHEDULE_TOPIC_XXXX”)与QueueId,先查到逻辑消费队列ConsumeQueue,然后根据偏移量,找到ConsumeQueue中的内存映射对象,从commitlog日志中找到消息对象MessageExt,并做一个消息体的转换(messageTimeup()方法,由定时延迟队列消息转化为重试队列的消息),再次做持久化落盘,这时候才会真正的保存至重试队列中。看到这里就可以解释上面的疑问了,定时延迟队列只是为了用于暂存的,然后延迟一段时间再将消息移入至重试队列中。RocketMQ设定不同的延时级别delayLevel,并且与定时延迟队列相对应,具体源码如下:


Consumer端消费重试机制

每个Consumer实例在启动的时候就默认订阅了该消费组的重试队列主题,DefaultMQPushConsumerImpl的copySubscription()方法中的相关代码如下:


因此,这里也就清楚了,Consumer端会一直订阅该重试队列主题的消息,向Broker端发送如下的拉取消息的PullRequest请求,以尝试重新再次消费重试队列中积压的消息。


最后,给出一张RocketMQ消息重试机制的框图(ps:这里只是描述了消息消费失败后重试拉取的部分重要过程):

img

本文由教研团队发布。

如果本文对您有帮助,欢迎和;如果您有任何建议也可或,您的支持是我坚持创作的动力。

转载请注明出处!

摘要:多跳查询能力也是一个衡量产品性能非常重要的指标。

本文分享自华为云社区《聊聊超级快的图上多跳过滤查询》,作者:弓乙。

在图数据库/图计算领域,多跳查询是一个非常常用的查询,通常来说以下类型的查询都可以算作是多跳过滤查询:


如下图,可用3跳查询得到网讯公司A所有的对外投资机构。

Goland激活2023.1.1(GoLand 2023.1 发布)

与此同时,多跳查询能力也是一个衡量产品性能非常重要的指标,比如LDBC(Linked Data Benchmark Council)的交互式查询场景下就设计了多个考察图数据库系统多跳查询能力的测试用例,交互式查询Interactive的Complex Query中有多个用例均为多跳查询,如下图是一个查朋友最近发送的消息的IC2用例,是一个经典的图上2-hop查询。

Goland激活2023.1.1(GoLand 2023.1 发布)

在图计算的尺度里,多跳过滤某些情况下被称为k-hop算法,BFS,DFS算法,区别仅在于traversal的策略是深度优先还是广度优先。

而在图数据库中一般将多跳过滤看做是需要特殊优化的模式匹配查询(cypher)或可组合的复合查询(gremlin)。

以下展示常用的图查询语言gremlin/cypher的二跳查询的写法,结果均为返回李雷朋友的朋友:


 


这两个语句轻盈又直观,看起来一切都被解决地如此优雅。

但事实真的如此吗?

很遗憾,当我们兴致勃勃地构图,将数据导入图数据,再使用类似上述语句查询实际业务场景时,你也许会惊讶地发现,也许结果与我们所期待的并不一致。

接下来,我将展开说说为什么使用多跳过滤查询会比我们想象中的更复杂,了解了图上遍历的概念后,我们能把而基于多跳过滤这一特性,我们又能怎么做使得这个重要的查询又快又流程呢?

功能那些事儿

上面我们介绍了查询一个用户朋友的朋友的例子,这里我们假设业务场景是向李雷推荐好友,思路是:向他推荐其好友的好友,但是推荐的好友中不应包含李雷本身的好友,比如图中小明同时是李雷的一跳好友和二跳好友。这时我们不应向李雷推荐小明,因为她已经是李雷的好友了。

Goland激活2023.1.1(GoLand 2023.1 发布)

仅仅增加了一个返回的二跳邻居不包含一跳邻居这个条件,让我们来看下与上面单纯的2跳查询的gremlin和cypher变成什么样了?


 


不知道各位有什么感觉?如果是不熟悉图查询语言的朋友们看到这里一定两眼发黑了吧哈哈。

不用担心,如果我们灵活使用一些特性,也许事情会变得简单,比如这是一个GES原生API多跳过滤查询Path Query的json请求:


假如我们可以把它翻译为gremlin的写法的话,它大概是:


以上的写法除了strategy(‘ShortestPath’)其他本身就是gremlin已经支持的语法,意为-查询从李雷出发以ShortestPath为遍历策略的二跳邻居

遍历策略是什么?

理解遍历策略是了解多跳过滤的基石,我们这里从图论里几个定义展开:


以上应用wiki中对于图上不同的点集组成的边集说明,详情见Path (graph theory) – Wikipedia。

以下,我将几个相似又不同的概念用四个维度区分开。

Goland激活2023.1.1(GoLand 2023.1 发布)

以上5个概念均指代在G=(V,E,φ)中,由点V,边E组成的序列。

Goland激活2023.1.1(GoLand 2023.1 发布)

上图中,对于序列a->c->d->f,我们可以将它称为walk, trail, path,三者都可以。因为该序列的起点a与终点f不同,不属于对序列要求close状态circuit和cycle。

而序列a->c->a->c, 我们只能将其归为walk。因为其不闭合不属于circuit和cycle,且点有重复(a,c两个都有重复)不属于path,边集有重复(a->c的边有重复)不属于trail。

遍历策略对最终的结果和遍历效率都有决定性的影响。

Goland激活2023.1.1(GoLand 2023.1 发布)

这里简单说明下新增的shortestPath策略:

  • Walk:以图论中划定的walk进行图遍历:即在traversal的过程中允许经过重复的点和重复的边。
  • ShortestPath:以shortestPath的规则进行图遍历:即在BFS traversal的过程不会遍历在前面跳数出现过的点。在这种模式下的路径每个终点到起点都是最短路径。

BFS与DFS

影响遍历顺序的另一个角度一般我们分为:

  • BFS – Breadth-first search 广度优先搜索
  • DFS – Depth-first search 深度优先搜索

BFS在图遍历时会优先遍历一个点的所有邻居,再遍历其邻居的邻居,而DFS会优先遍历点的邻居的邻居,直到到达最深的节点。

我们可以设置一个batchSize,表示在进行BFS时不遍历全部的邻居,而是每层以batchSize的数量进行遍历,然后再以batchSize的个数遍历下一层邻居。

可以推断出,当batchSize=1时,该BFS约等于DFS的遍历策略。

性能那些事儿

多跳过滤的性能受很多因素影响。以下总结一些会影响到性能的因素以供参考:

Goland激活2023.1.1(GoLand 2023.1 发布)

而对于不同规模的图,多跳过滤查询的TPS大部分情况下并不取决于图的点边规模,而是与图的密度密切相关。

比如一个二跳查询,那么TPS就与该图的二跳邻居分布强相关。

Goland激活2023.1.1(GoLand 2023.1 发布)

简单来讲,多跳过滤最终的性能主要受遍历过程中触达节点的个数影响。同样规模的图,其多跳过滤tps可能相差很大。大部分情况下基准测试仅提供横向比较,考验的是图数据库/图引擎本身的性能指标,有一定参考价值,但仍以实际业务图表现为主。

经验上,稀疏的图性能表现大大好于稠密的图。

多跳查询的使用

为了简化多跳过滤查询的表达,我们用一些参数来表达查询过程。如前面章节介绍过的遍历策略,batchSize等。

本章我们将一一介绍以下特性参数:

Goland激活2023.1.1(GoLand 2023.1 发布)

接下来我们以GES的path query(filterquery version2版本)接口来举例介绍多跳过滤查询的使用。

该接口支持对多跳过滤查询循环执行遍历查询进行加速。可以看做是gremlin的repeat语句的扩充表达,例如以下gremlin语句:


以下为该接口的2跳/3跳查询在1亿规模图上的测试情况。

其中,

  • filterV2 – GES的多跳过程查询原生接口,该API性能最佳,TPS与延迟表现优异。
  • Cypher – GES的cypher查询(较老版本)。
  • Neo4j – Neo4j community 4.2.3版本cypher。
  • gremlin – GES的gremlin,未在图中体现,实际性能最差,故未做对比。
Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)

请求样例1


以上请求等价于gremlin语句:


特性参数简要说明

速查参数表

filterV2的参数过于复杂,需要花一定的时间去理解?请看下面总结出的速查表,帮助您快速使用repeat模式:

PS:strategy策略的说明查看下方

Goland激活2023.1.1(GoLand 2023.1 发布)
Goland激活2023.1.1(GoLand 2023.1 发布)

emit模式

emit是一个filtered query参数中对其他各个参数影响最大的参数。我们将其定义为,是否输出query过程中的点,其含义也与gremlin中的emit一致。

下面将介绍,在不同模式下emit的表现形式:

Goland激活2023.1.1(GoLand 2023.1 发布)

上图中,假定我们从点a出发,执行filtered khop query的查询。

strategy

图遍历过程中使用的策略,目前可选:ShortestPath和Walk。

  • Walk:以图论中划定的walk进行图遍历:即在traversal的过程中允许经过重复的点和重复的边。
  • ShortestPath:以shortestPath的规则进行图遍历:即在BFS traversal的过程不会遍历在前面跳数出现过的点。在这种模式下的路径每个终点到起点都是最短路径。
Goland激活2023.1.1(GoLand 2023.1 发布)

上图中,假定我们从点a出发,执行query的4跳查询。

Walk: a->c->a->b, a->c->a->c, a->c->d->f, a->c->d->c

ShortestPath: a->c->d->f

Goland激活2023.1.1(GoLand 2023.1 发布)

简单查询

1. 查询从a出发的第三跳邻居

使用gremlin查询:


以上两种写法是等效的,结果为点f。路径为a->c->d->f。

对应在API参数为:


2. 查询从a出发的三跳内邻居

使用gremlin查询:


结果为b,c,d,e,f。

对应在API参数为:


组合模式说明

Goland激活2023.1.1(GoLand 2023.1 发布)

emit+strategy

1. 查询第三跳邻居

在上面的图中,如果按照[简单查询1](#1. 查询从a出发的第三跳邻居), 将得到点f, c, b。

路径为a->c->a->b, a->c->d->f, a->c->d->c。

如果,我们只想得到f, 而不希望取到前两跳已经出现过的点c和b。则需要使用strategy模式中的ShortestPath。ShortestPath模式保证API在traversal的过程中起始点到各点是最短路径。该模式能够有效降低多跳查询中指数增长的查询量。

gremlin的写法为:


结果为仅为a->c->d->f。

对应在API参数为:


emit+until

Goland激活2023.1.1(GoLand 2023.1 发布)

1.提前终止traversal模式说明

我们以上面的图来说明该模式,当我们不清楚查询需要经过多少跳,但希望通过某些条件提前终止遍历,可以用到until。

如以下两个问题:


以上问题可以配合emit参数来解决,用gremlin可以写为:


与之对应的API为:


repeat模式说明

repeat+times

可通过参数repeat+times实现多种形式的多跳过滤repeat模式过滤

1.仅多跳过滤

Goland激活2023.1.1(GoLand 2023.1 发布)

gremlin的写法为:


对应在API参数为:


2.repeat mode

假如我们从点a出发,查询其带方向的四跳邻居。即:

Goland激活2023.1.1(GoLand 2023.1 发布)

gremlin的写法为:


对应在API参数为:


by模式说明

by模式当前支持两种形式:

  • select+by mode
  • by mode

by mode

该模式可针对输出的点进行输出格式上的过滤,返回的格式形如:


例如针对二跳邻居,我们可以通过参数by对id,label,property进行过滤:


转化为filtered query V2的形式为:


select + by mode

该模式可任意选择traverse路径上经过的N层。但每层只能在by中指定一个输出,返回的格式形如:


下面我们来介绍一下select+by模式。如下图,我们希望返回李雷的二跳邻居的路径情况。

Goland激活2023.1.1(GoLand 2023.1 发布)

 


在上面body体中,我们使用select自带的隐含层数别名v0, v1, v2。其分别表示用户输入的点集第0层-v0, K跳中的第1层-v1, K跳中的第2层-v2。

select中选中的别名与by中指定的格式一一对应。

以上案例输出格式形如:


当然,我们也可以有更多的更丰富的输出。比如我们希望将输入点李雷的id和label都展示在路径中,并且去掉了中间第一跳的好友小明和韩梅梅,直接显示李雷及其第二跳好友的关系:


最终展示结果是对路径自动去重的。比如在这个例子中,李雷小智有两条路径,中间分别经过好友小明和韩梅梅, 但最终仅显示了一条。

以上案例输出格式形如:


案例

案例一.好友推荐

Goland激活2023.1.1(GoLand 2023.1 发布)

我们向李雷推荐好友,思路是:向他推荐其好友的好友,但是推荐的好友中不应包含李雷本身的好友,比如图中韩梅梅同时是李雷的一跳好友和二跳好友。这时我们不应向李雷推荐韩梅梅,因为她已经是李雷的好友了。

下面将分别展示使用gremlin,cypher和下一代filter query查询,返回均为推荐路径:李雷->李雷好友->推荐好友。

gremlin


cypher


filtered query V2


案例二:自环写法案例

Goland激活2023.1.1(GoLand 2023.1 发布)

gremlin


cypher


reference

LDBC Social Network Benchmark (LDBC SNB)

从零开始学Graph Database(1)- 基础篇-云社区-华为云

Filtered-query V2(2.3.6)_图引擎服务 GES_API参考_业务面API_华为云

图引擎服务GES

 

 

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

导读: 随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时 OLAP 数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入 Apache Doris 作为最终的 OLAP 分析引擎,Doris 作为核心的 OLAP 引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。

作者叮咚买菜资深数据工程师 韩青

叮咚买菜创立于 2017 年 5 月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵化,不断为人们提供美好生活的解决方案,致力让更多人吃得新鲜、吃得省心、吃得丰富、吃得健康……以更美好的舌尖体验,为现代家庭创造美味与幸福感。

业务需求

随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,这些需求最终被数据看板、实时 Ad-Hoc、行为分析、B/C 端业务平台和标签平台等系统应用所承载,为实现这些系统应用,叮咚大数据希望引入一款实时 OLAP 数据库,旨在提供一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。基于上述诉求,我们希望所引入的数据库具备以下能力:

  • 可以实时高效地分析和使用数据;
  • 可以支持明细数据、汇总数据两种不同的数据查询方式;
  • 可以对入库后的数据即席选择维度和条件查询,实时/近实时返回结果

选型和对比

我们主要对比了 Apache Doris 和 ClickHouse 两款市面上最常见的开源 OLAP 引擎,在选型过程中我们主要考虑以下几个方面:

  1. 支持标准 SQL,无需投入额外的时间适应和学习新的 SQL 方言、直接用标准 SQL 即可直接查询,最大化降低使用门槛;
  2. 支持 Join 操作,方便事实表与维度表进行关联查询,在应对维度更新时具有更高的灵活性、无需对处理后的宽表进行重刷;
  3. 支持高并发查询,系统面临多条业务线的同时使用,因此需要有比较强的并行查询能力,以更好满足业务需求;
  4. 支持离线和实时导入,可与已有技术栈轻松对接,支持多个数据源或大数据组件的离线和实时导入,以更好适配不同使用场景;
  5. 支持大数据量的明细数据查询,以满足不同业务用户灵活多变的分析需求;

经过详尽的技术调研,Apache Doris 各项能力都比较优异,在我们的大多数业务场景中都需要明细数据级别的查询、高并发的点查和大数据量的 Join,而这几个方面 Apache Doris 相较于 ClickHouse 均更胜一筹,因此我们决定使用 Apache Doris 来搭建新的架构体系。

架构体系

在整体架构中,各个组件承载着特定的功能,Elasticsearch 主要负责存储标签系统的数据,HBase 是实时数仓的维表层,MySQL 用于存储业务系统的数据存储,Kafka 主要存储实时数据,Spark 主要提供 Ad-Hoc 查询的计算集群服务,而 Apache Doris 作为核心的 OLAP 引擎支持复杂地分析操作、提供多维的数据视图。

  • 离线部分: 数据从业务库通过 DataX 导入到数据仓库 ODS 层,经过层层处理输出到 Doris 中,上层 BI 系统链接到 Doris 进行报表展示。
  • 实时部分: 数据通过 Flink 消费 Kafka 中的数据,进行相应的逻辑处理后,输出到 Doris 或者 HDFS 中,供应用层使用。

Goland激活2023.1.1(GoLand 2023.1 发布)

在数据应用的 OLAP 层中,Doris 应用方案如下图所示:

Goland激活2023.1.1(GoLand 2023.1 发布)

  • 模型创建规范化: 采用流程审批的方式进行数据建模,根据具体的业务场景来搭建 Duplicate,Unique Key 和 Aggregate 模型,并按照用户提供的数据量设置合适的 Bucket 数目,做好模型归属关系。

  • 数据入口的统一: 数据的流入主要有实时和离线两种,实时数据用 Flink 任务从 Kafka 消费数据,逻辑处理流入 Doris ;离线数据通过 Broker Load 方式从 Hive 中将数据灌入 Doris 中。

  • 服务对外出口的统一: 对外服务主要通过两种方式暴露接口,一种是使用 JDBC 直连,上层系统配置 Doris 集群的 FE 的连接信息直连 Doris;另一种是业务通过内部的 One API 服务配置业务接口使用 Doris。

  • 业务 SQL 的优化治理:  通过采集 Doris FE 的审计日志,以此来对 SQL 的性能进行分析优化,以及对 Doris 服务进行治理。

应用实践

叮咚买菜目前已经将 OLAP 引擎统一为 Apache Doris 广泛应用于业务场景中,我们将 Doris 集群拆分成了四个集群,分别支持核心报表、行为分析与算法应用、B/C 端业务和实时数据,根据不同业务场景的业务量及数据规模,集群的资源配置也不尽相同。目前总的机器规模达数十台,以行为分析场景为例,单个集群近 20 个节点、 存储数据量超过百 TB,每日新增数据量达数十亿条

接下来分享 Apache Doris 在叮咚买菜常见业务场景中的应用实践及使用经验。

实时数据分析

从下方数仓模型图可知,数据通过 Flink 作业进行逻辑处理,在不同层级 Kafka 中进行流转加工,经过数据汇总层之后,应用层需要一个组件来存储结果数据,该组件一般是从 MySQL 数据库、KV 存储和 OLAP 引擎三者中选择其一。

Goland激活2023.1.1(GoLand 2023.1 发布)

考虑到我们的结果数据大多以计算指标数据居多,缺乏维度数据,因此应用层的组件需要具备高效、低延迟的数据 Join 能力。基于以上因素,我们最终选择 Apache Doris 作为实时数仓和实时业务的数据应用层,Doris 可以有效降低数据处理延时,提高查询效率

比如在销量计划项目中,该项目需要每日实时写入大量预测数据,并且这些数据需要较低时延提供给分析师进行及时对比分析、修改该预测值,并提供到供应链端。因修改预测值会影响到系统调拨,所以选用的存储必须是要具有高吞吐低延迟特性,Doris 完全符合该要求。从销量计划的整个数据生产及处理链路来看,使用 Doris 后,最慢 2 秒内可以看到最新的数据。

当前公司已经有数十个实时业务需求接入到 Doris 中,随着业务的不断发展,这个数字也在慢慢增加。

B 端业务查询取数

在实际的使用中,通常会有 B 端业务或系统需要从数据仓库中取数的需求,比如自研 Pylon 系统(主要用来基于用户偏好的数据查询)会根据 UID 查询用户画像信息。在这种场景下,通常需要进行复杂的模型关联,同时要求在秒级或者毫秒级返回查询结果。

  • 使用前:我们最初使用 Spark 的 JDBC 方式来直接查询数据仓库 Hive 表数据,由于存放用户标签数据的 Hive 表的数据量有几千万体量,通过 Spark JDBC 方式要耗费几分钟才能查出结果,同时还存在 Yarn 调度耗时较高的问题,有时会因为队列资源紧张产生延迟,导致一个普通的查询甚至需要十几分钟才能跑出结果,用户的体验度非常不好。
  • 使用后:经过我们对数据链路的改造,将 Hive 的用户标签数据离线灌入 Doris 中,再用同样的 SQL 查询,Doris 的性能在绝大多数场景下比 Spark 要好很多,可以在秒级别得到返回结果。

标签系统

最初我们的标签数据存放在 ES 中,但是随着业务的扩展、下游业务越来越多,标签数据规模急速膨胀,策略规则不断增加变化,标签系统遭遇严重的性能瓶颈。

  • 聚合和 Join 查询的性能低
  • 人群圈选花费时间近 20 分钟
  • ES 导入慢、查询性能低

为解决以上问题,我们目前正在尝试使用 Doris 来替换 ES,希望通过 Doris 解决上述问题,选择 Doris 主要考虑以下三点:

1、分布式 Join 大大提升查询效率

原有商品 ID 和仓库 ID 通过嵌套类型存储在 ES 中,替换为 Doris 存储之后,需要将复杂的嵌套类型拆解为两张表来做表级关联,同时可以试用 Doris 的多种分布式的 Join 提高查询得性能。Doris 的分布式 Join 主要有 Shuffle Join、Broadcast Join 和 Colocate Join。

其中 Colocate Join 查询性能是最好的,旨在为某些 Join 查询提供本地性优化,来减少数据在节点间的传输耗时、加速查询,另外我们在该场景下基本均为千万级的表。综合来看,Colocate Join 比较符合场景与需求,最终决定使用 Colocate Join方式提升 Join 性能。

如何使用: 标签数据的使用主要涉及到两张大表的 Join,建表时需要设置相同的 Distributed Key、相同的 Bucket数、相同的副本数,还要将两个表通过 属性划分到一个组 Colocation Group(CG)。


<!—->


比如我们有这样一条查询语句:


经过使用 Colocate Join 方式优化后,可以达到毫秒级的查询效果。接下来我们介绍一下 Colocate Join 的查询性能高的原因有哪些呢?

A. 数据导入时保证数据本地性

Doris 的分区方式如下所示,先根据分区字段 Range 分区,再根据指定的 Distributed Key Hash 分桶。

Goland激活2023.1.1(GoLand 2023.1 发布)

所以我们在数据导入时保证本地性的核心思想就是两次映射,对于 Colocate Tables,我们保证相同 Distributed Key 的数据映射到相同的 Bucket Seq,再保证相同 Bucket Seq 的 Buckets 映射到相同的 BE。可以同查看执行计划查看是否使用了Colocate Join:

Goland激活2023.1.1(GoLand 2023.1 发布)

对于 HashJoinFragment,由于 Join 的多张表有了数据本地性保证,所以可以去掉 Exchange Node,避免网络传输,将 ScanNode 直接设置为 Hash Join Node 的 Child。

B. 查询调度时保证数据本地性

  • 查询调度的目标: 一个 Colocate Join 中所有 ScanNode 中所有 Bucket Seq 相同的 Buckets 被调度到同一个 BE。

  • 查询调度的策略:第一个 ScanNode 的 Buckets 随机选择 BE,其余的 ScanNode 和第一个 ScanNode 保持一致。

C. 数据 Balance 后保证数据本地性

新增一个 Daemon 线程专门处理 Colocate Table 的 Balance,并让正常的 Balance 线程不处理 Colocate Table 的 Balance。正常 Balance 的粒度是 Bucket,但是对于 Colocate Table,必须保证同一个 Colocate Group 下所有 Bucket 的数据本地性,所以 Balance 的单位是 Colocate Group。

2、高效简易的函数

在做人群圈选时,有以下类似的 Json 结构,当配置,只要该 Value 里的 Json 项有一项满足全部条件就会被圈出来,我们可以借助 Doris 1.2 版本中的 数组函数处理,将 Json 转化为 Array 数组处理。

Goland激活2023.1.1(GoLand 2023.1 发布)

3、Broker Load 加速数据导入效率

Doris Broker Load 是一种高效、稳定的数据导入方式,它可以将数据分成多个分片,然后将每个分片分配给不同的 Broker 节点进行处理,我们使用 Broker Load 将标签数据从 Hive 导入 Doris 中,有效提高了数据导入的效率和稳定性。

BI 数据看板

我们商业智能分析使用的 BI 分析平台主要是帆软和自研的阿尔法 BI,底层使用 Doris 来存储数据,目前用来做报表的 Doris 表数量已达到了 3000 多张,四个 Doris 集群的日 UV 1000+PV 达到十几万,由于 Doris 可以达到毫秒级响应速度支持高并发查询,因此单集群的 QPS 可以达到达到 120次/秒,符合我们的要求。

OLAP 多维分析

随着业务的增长,我们在运营的过程中我们常常有一些疑问:最近三个月哪个品类的下单量最高?变化趋势如何?各个时段人均下单是多少?某个区域,发生购买行为的年龄段分布是怎样的?……而想要获得结果,必须根据用户行为日志进行事件分析。

目前我们的用户行为数据日均增量为 20亿+,高峰期 100亿+,为了更好的进行事件分析,我们需要保留半年的数据,也就是几千亿的数据量。 我们使用 Doris 来存储如此庞大的数据量,在应对复杂的分析场景时可以达到分钟级的响应。在多维分析的过程中, 往往也伴随着大数据量的复杂查询,接下来分享如何使用 Doris 应对:

1、 Bitmap 去重

业务使用过程中需要分析用户参与情况以及活跃程度,考查进行初始行为后的用户中,有多少人会进行后续行为,这时候一般都是使用留存分析模型实现此类需求。该模型使用中有去重操作,计算周期有某天/某周/某月/最近三个月等,由于每天的埋点数据量都能达到几十亿,高峰期 100 亿,在这个情况下,使用性能太差、甚至查询超时(或超过设置的时间),而如果使用 Bitmap 来可以成倍的缩短查询时间


使用 Bitmap 优化 SQL 后


使用中需要注意 Bitmap 函数在 Apache Doris 中仍然需要先把数据汇聚到一个 FE 节点才能执行计算,并不能充分发挥分布式计算的优势,在数据量大到一定的情况下, Bitmap 函数并不能获得比更好的性能,上述实例之所以能达到预期结果是由于做了分组计算。

如果处理大数据量的全量去重,在建表时将 Bitmap 列的值按照 Range 划分,不同 Range 的值存储在不同的分桶中,保证了不同分桶的 Bitmap 值是正交的。当查询时,先分别对不同分桶中的正交 Bitmap 进行聚合计算,然后顶层节点直接将聚合计算后的值合并汇总并输出,从而解决顶层单节点计算瓶颈问题。

2、前缀索引和 Bloom Filter 索引

Doris 主要支持两类索引:内建的智能索引(包括前缀索引)和创建的二级索引(包括 Bloom Filter 索引和 Bitmap 倒排索引)。实际使用时我们会用到前缀索引和 Bloom Filter 索引来提高查询效率。

前缀索引

Aggregate、Unique 和 Duplicate 三种数据模型中,底层的数据存储是按照各自建表语句中 AGGREGATE KEY、UNIQUE KEY 和 DUPLICATE KEY 指定的列进行排序存储的。前缀索引即在排序的基础上实现的一种根据给定前缀列、快速查询数据的索引方式,实现方式是将一行数据的前 36 个字节作为这行数据的前缀索引,当遇到 VARCHAR 类型时,前缀索引会直接截断。

比如我们要查询按照日期和 分组的去重人数,建表语句如下:


SQL 查询的 Where 条件一般遵循建表的 AGGREGATE 模型的 KEY 的顺序,这样可以命中 Doris 内置的前缀索引。


Bloom Filter 索引

针对大数据量的事件表进行查询时我们会设置,加快查询效率:


查询语句中 条件有以上设置的字段就会命中该索引。


3、物化视图

为了获得更粗粒度的聚合数据,Doris 允许在建表语句创建出来的 Base 表的基础上,创建若干 Rollup 表。

例如上表 ,我们可以对 ,, 建立 Rollup 物化视图,这样 Rollup 只包含三列: ,, 。

Goland激活2023.1.1(GoLand 2023.1 发布)

这时再进行上述查询就会命中这个 Rollup,从而只扫描极少的数据量就可以完成此次聚合查询。

优化经验

Broker Load 导数任务流程化

为了 Doris 使用更加便捷,我司在内部自研的叮咚大数据平台上对整个过程进行流程化;从建模到配置 Broker Load 导数任务再到导数任务调度均进行了调整,具体优化如下所述:

建模过程: 需要用户发起建模流程申请,填写需求内容、具体建模语句、预估数据量大小、数据保留时长、所需相关权限账号等信息,足够完整的信息可以在审批时获得建模过程中的数据信息以及选择更合适的数据模型。

Goland激活2023.1.1(GoLand 2023.1 发布)

Broker Load 导数任务配置: 为了提高用户使用效率、降低使用门槛,我们通过 Mapping 映射和自动化配置方式,自动生成导数任务。

Goland激活2023.1.1(GoLand 2023.1 发布)

导数任务调度: 配置完 Broker Load 导数任务,就可以由用户根据需求配置小时或者天级别的调度,这样整个 Doris 数据导入流程,就可以由用户配置自动完成。

Goland激活2023.1.1(GoLand 2023.1 发布)

总结与展望

Apache Doris 作为叮咚买菜整体架构体系中的核心 OLAP 分析引擎,不论是作为数仓数据看板类的应用层、还是作为实时数据汇总结果接入层、或是作为 B/C 端服务数据提供方,均能够很好的满足业务需求。除此之外,Doris 使得我们无需在存储选型上耗费过多时间,大大缩短了开发的周期;同时,Doris 支持 MySQL 协议和标准 SQL ,大大降低内部人员的使用成本和门槛。未来,我们希望使用 Doris 支撑内部更多的业务场景,更大范围了提升工作效率。我们也会紧跟社区步伐,积极使用推出的新版本特性,以更好解决场景需求,提升业务效果。

最后,非常感谢 SelectDB 团队对我们在 Doris 使用上的技术支持,祝愿 SelectDB 和 Apache Doris 发展越来越好!

Goland激活2023.1.1(GoLand 2023.1 发布)关注公众号

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

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

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

在利用 OpenAI 的 GPT-4 为 Bing Chat、 Bing Image Creator、Microsoft 365 Copilot、Azure OpenAI Service 和 GitHub Copilot X 引入了类似 ChatGPT 的功能后。微软现又宣布推出 DeepSpeed-Chat,一种用于 RLHF 训练的低成本开源解决方案,基于微软开源的深度学习优化库 DeepSpeed;声称即使是使用单个 GPU,任何人也都可以创建高质量的 ChatGPT 式模型。

该公司表示,尽管开源社区付出了巨大的努力,但目前仍缺乏一个支持端到端的基于人工反馈机制的强化学习(RLHF)的规模化系统,这使得训练强大的类ChatGPT 模型十分困难。ChatGPT 模型的训练是基于 InstructGPT 论文中的 RLHF 方式,与常见的大语言模型的预训练和微调截然不同,使得现有深度学习系统在训练类 ChatGPT 模型时存在种种局限。因此,为了让 ChatGPT 类型的模型更容易被普通数据科学家和研究者使用,并使 RLHF 训练真正普及到 AI 社区,他们发布了 DeepSpeed-Chat。

Goland激活2023.1.1(GoLand 2023.1 发布)

DeepSpeed-Chat 具有以下三大核心功能:

  • 简化 ChatGPT 类型模型的训练和强化推理体验:只需一个脚本即可实现多个训练步骤,包括使用 Huggingface 预训练的模型、使用 DeepSpeed-RLHF 系统运行 InstructGPT 训练的所有三个步骤、甚至生成你自己的类ChatGPT模型。此外,还提供了一个易于使用的推理 API,用于用户在模型训练后测试对话式交互。
  • DeepSpeed-RLHF 模块:DeepSpeed-RLHF 复刻了 InstructGPT 论文中的训练模式,并确保包括 a) 监督微调(SFT),b) 奖励模型微调和 c) 基于人类反馈的强化学习(RLHF)在内的三个步骤与其一一对应。此外,还提供了数据抽象和混合功能,以支持用户使用多个不同来源的数据源进行训练。
  • DeepSpeed-RLHF 系统:其将 DeepSpeed 的训练(training engine)和推理能力(inference engine) 整合到一个统一的混合引擎(DeepSpeed Hybrid Engine or DeepSpeed-HE)中用于 RLHF 训练。DeepSpeed-HE 能够在 RLHF 中无缝地在推理和训练模式之间切换,使其能够利用来自 DeepSpeed-Inference 的各种优化,如张量并行计算和高性能 CUDA 算子进行语言生成,同时对训练部分还能从 ZeRO- 和 LoRA-based 内存优化策略中受益。DeepSpeed-HE 还能够自动在 RLHF 的不同阶段进行智能的内存管理和数据缓存。

文档内容指出,DeepSpeed Chat 与其他先进方案相比的优势在于:效率和经济性方面比现有系统快 15 倍以上,在 Azure 云上只需 9 小时即可训练一个OPT-13B模型,只需 18 小时既可训练 OPT-30B 模型,分别花费不到 300 美和 600 美。

在速度和可扩展性方面,即使是 13B 的模型也可以在 1.25 小时内训练,庞大的 175B 模型可以在不到一天的时间内使用 64 个 GPU 集群进行训练。在 RLHF 的可访问性和普及化方面,则可以在单个 GPU 上训练超过 130 亿参数的模型。此外还支持在相同的硬件上分别运行 6.5B 和 50B 的模型,实现高达 7.5 倍的提升。

 

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

Goland激活2023.1.1(GoLand 2023.1 发布)

尽管近期关于对 ChatGPT 类大语言模型发展的反对和担忧之声不断,但微软似乎仍在全力推进其 AI 开发。对于微软的此次发布,前 Meta AI 专家 Elvis 也激动地表示,DeepSpeed Chat 提供了 Alpaca 和 Vicuna 等所缺少的、一个端到端的 RLHF 管道来训练类似 ChatGPT 的模型,解决的是成本和效率方面的挑战。这是“微软令人印象深刻的开源努力……是一件大事”。

更多详情可查看官方文档。

上月,Wireshark 社区正式成立了 Wireshark 基金会 (Wireshark Foundation),该基金会属于 501(c)(3) 非营利性组织,旨在帮助促进 Wireshark 的发展,并以其他方式支持社区。

Goland激活2023.1.1(GoLand 2023.1 发布)

Wireshark 首席开发者 Gerald Combs 表示,像 Wireshark 这样工具的重要性不可低估,现代社会运行在需要可靠、快速和安全的计算机网络上。Wireshark 本可以捐赠给现有的基金会,例如 Cloud Native Computing Foundation (CNCF),但它决定创建一个新的基金会,以确保 Wireshark 社区多年来建立的流程得以保留。

Goland激活2023.1.1(GoLand 2023.1 发布)

⭐ 新功能及优化

[新增] 代码生成器添加tag页配置方式及选项
[新增] 添加迁移回滚命令 mine:migrate-rollback –name=模块名
[新增] 新增数据源功能,可以在代码生成器载入远程数据库的表结构到本地库
[新增] 新增获取每日必应背景图
[优化] 优化excel导出支持超过26列
[优化] 抛出的异常全部允许跨域

🐞 BUG修复

修复Auth注解只获取method参数的,未获取class的bug

 

近日 Google 发布了 Android 14 的第一个 Beta 版(Android 14 Beta 1),该版本围绕隐私、安全、性能、开发者生产力和用户自定义等核心特性,同时持续改善平板电脑、可折叠设备等的大屏幕设备体验。

Goland激活2023.1.1(GoLand 2023.1 发布)

更智能的系统 UI

在 Android 操作系统中,功能是由两个独立但同样重要的软件包实现的:框架和系统 UI,前者提供服务,后者让用户控制这些服务。每个 Android 版本都会给系统用户界面带来新的改进,以下是你在 Beta1 中可能注意到的一些改进。

新的返回箭头

Goland激活2023.1.1(GoLand 2023.1 发布)

手势导航在你与应用程序交互时有一个更突出的后退箭头,以帮助提高后退手势的理解和实用性。后退箭头也与用户的壁纸或设备主题相衬。

系统共享菜单

Goland激活2023.1.1(GoLand 2023.1 发布)

在 Android 14 中,应用现在可以将自定义操作添加到它们调用的系统共享表中,并使用 ChooserAction.Builder 创建自定义的 ChooserAction。

此外,系统现在基于用户对一个应用的使用频率来确定直接共享目标的排名顺序。

更多的图形功能

路径现在是可查询和可插值的

Android 的 Path API 是一个强大而灵活的机制,可用于创建和渲染矢量图形。从 Android 14 开始,你可以查询路径,找出其中的内容。API 的更新包括在结构完全匹配的路径之间进行插值的功能,实现了变形效果,而 Android X 库则向后兼容到 API 21。

个性化

每个应用的语言偏好

Android 14 增强了每个应用的语言偏好设置,允许在 Android 设置中动态定制每个应用语言列表中显示的语言集,并给 IME 一种方法来了解当前应用的 UI 语言。从 Android Studio Giraffe Canary 7和 AGP 8.1.0-alpha07 开始,你可以配置你的应用,使其自动支持每个应用语言偏好。基于你的项目资源,Android Gradle 插件会生成 LocaleConfig 文件,并在生成的清单文件中添加对它的引用,因此当你的语言支持发生变化时,你不再需要手动创建或更新该文件。

隐私

无障碍服务

Android 14 引入了 accessibilityDataSensitive 属性,允许应用程序将指定视图的可见性限制在声称帮助残疾用户的无障碍服务上。Play Protect 确保从 Play Store 下载的应用程序对这些声明是真实的。TalkBack 和其他声称帮助残疾用户的服务将不会受到该属性的影响。

Goland激活2023.1.1

应用程序可以考虑使用 accessibilityDataSensitive 来:

  • 保护用户数据(如个人资料或明文密码)
  • 防止关键操作在无意中被执行(如在购物应用中转账或结账)

路线

Goland激活2023.1.1(GoLand 2023.1 发布)

Android 14 Beta 1 的发布也意味着 Android 14 如今已经脱离开发者预览阶段,希望尝鲜的普通用户也可以在兼容的设备上安装该版本(支持 Pixel 4a 5G 以及更新的 Pixel 设备)。按照 Google 的开发计划,Android 14 一共会有 4 个 Beta 版本,并将在今年 6 月,达到平台稳定阶段。

Goland激活2023.1.1

更多详情可查看:https://android-developers.googleblog.com/2023/04/android-14-beta-1.html

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/119057.html

(0)
上一篇 2024年 6月 22日 下午11:02
下一篇 2024年 6月 22日

相关推荐

关注微信