ListWatch-从-到-WatchList (list网站)

教程大全 2025-07-14 17:51:37 浏览

分析

可以先设想一下如果自己去实现的话,该如何设计。Client 和 Server 端都要去适配这是必然的,因为 Informer 现在是 ListWatch 机制,服务端并不支持流式 List。因此可以有个初步的方向:

客户端的适配相对简单,重点还是放在 Server 端如何实现。先回顾下之前 List 的逻辑,在前一篇Stale Read里面已经介绍过了。

到

新版中已经修复了 List Stale Read 的问题,对于前两种情况,其会先从 kube-apiserver 获取 Etcd 最新的 RV,等待 WatchCache Store 内容追平 RV 后再一次性的返回。

也就是说服务端是可以知道自己是否已经包含最新全量数据的,在这个基础上再以流式方式返回即可。当前已有的流式 API 就是 Watch,所以可以在此基础上支持 List 的效果。为什么不直接在 List 请求基础上改呢,因为改 List 的话,会涉及到太多的客户端侧的适配,List 会经常单独使用,而 Watch 基本是在 Informer 里面使用。

所以最终的工作就会变成如何使用 Watch API 实现 List 的效果,但数据仍然以流式返回给客户端,同时 Informer 修改 ListWatch 方式为只使用 Watch API 实现之前的效果。下文以详细介绍服务端实现为主,客户端适配的部分会比较简单的介绍下。

原理

通过为 Watch API 添加一个SendInitialEvents=true参数来支持 List 的效果。Server 端接收到 Watch 请求后判断哪些数据是应该作为 InitEvents 发送给客户端,同时在发送完这些数据之后发送一个特定的 BOOKMARK Event(带特定 Annotation 的 BOOKMARK,其 RV 对应下文的 bookmarkAfterRV)给客户端作为服务端通知客户端 InitEvents 发送完毕的标志,客户端在接收到指定 BOOKMARK Event 后,将之前接收到的所有 InitEvent 作为 List 的结果处理。

时序图

下面是基于 v1.29 代码的分析,此时 v1.29 还在 alpha 状态,提到的旧版代表 1.27 之前的版本,新版代表 v1.29。如果你看到的代码和下面描述的不一致,有可能是代码版本导致的。

从 WatchCache 开始右面四个蓝色的是在 kube-apiserver 启动的时候开始执行的,G1 G2 代表两个 goroutine,分别用来从 Etcd 获取数据,以及发送数据给客户端 CacheWatcher 的 input chan

上述过程描述了服务端启动时的数据处理流程,接下来看有客户端请求时的处理流程

2a 开始从 WatchCache Store 中获取需要返回的数据,此时的处理逻辑旧版本相同,返回 Store 中的全部数据,并记录 Store 数据的最大 RV 供下一步使用;

2b 消费 input chan 中的事件,对比其 RV 是否比 2a 传入的 RV 大,或者如果是 BOOKMARK 类型并且 RV 等与 2a 传入的 RV,且尚未发送 bookmarkAfterRV 的事件,则此 BOOKMARK 事件就会被当做 List 结束的标志,为其设置 Annotation: k8s.io/initial-events-end,最后发送给客户端;

至此,服务端的主要流程已经介绍完,客户端 Informer 也做了对应的适配,如果开启 WathList 功能的话,会发送 Watch 请求来获取一遍全量数据,等到接收到携带 Annotation: k8s.io/initial-events-end 的 BOOKMARK 事件后,记录其 RV,将在此期间接受并处理后的对象作为 List 的结果。最后再次以上述 RV 作为参数调用 Watch 请求,从这一步开始就是 Informer 传统意义上的 Watch 逻辑了。

数据流

图片来自 KEP 3157 watch-list,其实里面也包含时序图,不过里面的书序图画的有一些问题,和代码不一致,所以这里并没有直接使用他的时序图,而是重新画了。

可以结合上面两个图理解整个过程,上图中的 a 对应时序图中的 2a,b 对应时序图中的 2b,c 对应时序图中的 G2.1。最下面白色部分对应时序图中 G1 的逻辑,即从 Etcd 获取数据,客户端请求的处理是自上到下的,而数据返回是自下而上的。

注意

上述处理逻辑中存在很多的细节,需要额外注意下

总结

本篇主要分析了 WatchList 的实现原理和逻辑,其中不乏一些细节处理,后续也会和社区就有关细节进一步讨论。在此 KEP 中同时还介绍了另外两个用来降低 kube-apiserver 内存压力的修改,篇幅有限,将会在下一篇中进行介绍,同时也会给出所有优化工作做完前后的效果对比。敬请期待~


我下了个Turbo Pascal 7.0英文版,请问怎么用啊?

第四章 使用TURBO-PASCAL7.0系统 一、进入TURBO-PASCAL7.0系统 双击桌面PASCAL系统的快捷方式(如TPX等),或从其它方式进入(如从“我的电脑”里找出相应程序所在的位置然后进入)。 例4_1 在Turbo Pascal编辑系统下输入下面的程序(9-9乘法表): program example4_1; var i,j:integer; beginfor i:=1 to 9 dobegin for j:=1 to i do write(i*j:4);writeln;end; readln end. 输入正确后保存,文件名为eg4_,保存时扩展名可以不加,系统会自动添加pas扩展名,不正确进行相应编辑直到正确。 基本的编辑键介绍: 上下左右箭头:移动光标 Home 光标移到行头 End 光标移到行尾 PageUp 上一页 PageDown 下一页 Insert 插入/改写状态切换 Delete 删除当前字符Backspace 删除前一字符 Ctrl + PageUp 移到文件头 Ctrl + PageDown 移到文件尾 Ctrl + Y 删除当前行 要求熟悉菜单:File,Edit,Run等项目。 选取菜单可以用鼠标直接点也可以按F10键,再用上下左右键移动到相关项目。 运行程序(run)——点击菜单项目或Ctrl+F9。 编译程序(compile)——点击菜单项目或Alt+F9。 一般的TP系统可以设置成运行程序的同时先编译成可执行文件。 退出系统后运行刚才编译好的程序,注意刚才保存的位置,到相应文件夹里找文件,这个文件可以直接执行。 二、系统简介 目前使用得比较多的PASCAL系统主要有三种:Turbo Pascal、Borland Pascal、Free Pascal,前两种基本上没有大的差别,这里主要是介绍前两种的使用,有关安装程序可以从网上下载,然后进行安装。 安装完后,相应目录里(如\TP\BIN)里会有两个执行主文件、tpx ,其中后者只能在windows下执行,但是两者的编辑界面、菜单等几乎是相同的。 一般进入系统后,屏幕上方是菜单栏,中间的编辑栏(用户的程序在此显示、编辑),最下面是常用的功能快捷键提示: F1:help F2:Save F3:open Alt + F9:compile F9:make Alt+F10:local menu 相关功能都可以在菜单里找到,菜单分为这样几类:File Edit Search Run Compile Debug Tools Options Window Help,下面分别介绍几个常用的菜单项目。 1.File 文件操作类 New :新建,在新的编辑窗口中新建一个文件 Open F3:打开,查找并找开一个文件 Save: 存盘,保存当前活动编辑窗口的文件 Save as: 另存为,将当前文件换名或换路径保存 Save all:保存所有,保存所有修改过的文件 Change dir…:改变默认目录 Dos shell:暂时退回到DOS命令状态,键入exit再返回 Exit Alt + X: 退出系统 2.Edit 编辑类 Undo Alt+ Backspace :撤销,撤销最近的编辑操作 Redo :恢复,恢复刚撤销的操作 Cut Shift + Del:剪切 Copy Ctrl + Ins:复制 Paste Shift +Ins:粘贴 Clear Ctrl + Del:清除 Show clipboard :显示剪贴板内容 3.Search 查找类 Find… 查找 Replace… 替换 Search again 再次查找(替换) 4.Run 运行类 Run Ctrl + F9 :运行,执行当前编辑的文件 Step over F8 :不跟踪过程的单步调试 Trace into F7 :跟踪,单步调试(一行一行地执行) Goto cursor F4 :执行调试到光标处 Program reset Ctrl + F2 :取消当前调试并初始化调试器 5.Compile 编译类 compile Alt + F9:编译,将pas源程序编译成可执行文件exe Make F9:只编译更新的源文件 Build:全部编译主文件及调用的所有单元 6.Debug 调试类Watch 打开“观察”窗口,常用来观察相关变量或表达式运行状态下的值Output 打开“输出”窗口,与编辑窗口在同一屏幕下看输出情况User screen Alt + F5 切换到用户运行全屏幕状态,按任意键返回Add watch… Ctrl + F7 增加“观察”表达式 7.Tools 工具类Go to next Alt + F8 到下一个位置Go to previous Alt + F7 到前一个位置 8.Options 选项类 这一类菜单是让用户进行相关设置,包括:Compiler… 、 Memory sizes….、 Directories…、 Browser… 、 Environment等 9.Windows 窗口类 Close all 关闭所有窗口 Size/Move Ctrl + F5 调整窗口尺寸/移动窗口 Zoom F5 放大(最大化)或还原当前活动窗口 Next F6 到下一窗口 Previous Shift + F6 到前一窗口 Close Alt + F3 关闭当前窗口 List… Alt + O 窗口列表 10. Help 帮助类 Index Shift + F1 索引 Topic search Ctrl + F1 主题查找 Prevopis topic Alt + F1 到上一次帮助主题窗口 三.PASCAL程序介绍 例4-1要求输入的程序就是一个完整的PASCAL程序,它是由程序头、说明部分和程序体三部分组成。 程序头:program部分,表明程序的名字(跟文件名不是一回事),没有太大的实际意义,往往只是表明程序的主要作用,一般跟注释部分结合使用,说明此程序做什么的,用了什么主要算法等,一个程序可以没有程序头。 说明部分:说明程序中用到的常量、变量、过程或函数等。 在pascal程序中用的量必须先说明后使用,如常量的说明通过const,变量的说明通过var,常见的变量类型有integer(整数),real(实数),char(字符、1个字符),string(字符串,一般要指明长度),boolean(布尔型,值为真ture或假false)等。 标准PASCAL程序说明部分可以有标号说明、常量说明、自定义类型说明(包括枚举、子界等)、变量说明、过程或函数说明,说明符分别是:Lable、const、type、var、procedure或function,如果程序中有多种说明,要注意说明的顺序,一般是labelconsttypevarprocedure或function。 这个顺序有它的原因的,在以后的使用中会体会到的。 程序体:begin和end. 部分的内容,程序中每一个语句与语句之间通过分号来间隔。 一个最简单的程序必须由begin 开始、end . 结束,中间可以什么都没有,也能执行,只不过没有什么结果,因为其中没有什么要计算机做的语句。

选择20题

1.C;2B;3B;4D;5C;6A;7C;8A;9B;10A;11B;12C;13B;14D;15B;16D;17C;18C;19B;20B;

思青英文翻译!!

思青 是名字吧。 建议用 读音相似的英文名吧女性的话1.、Sarah希伯来语中的公主。 她给人的感觉是保守、甜美、身材不高、待人随和,但没有什么大志。 女性(印度) 女性 (印度)男性 水之天使 猎鹰

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐