嗯,如果你要去统计过去十分钟每个 api 的 一个访问次数,并且实时展示访问量最高的前十或者前一百个 api, 你 会怎么去设计呢?嗯, 可以用约的是记录每一次的请求,然后做定时统计。这个问题其实是在考察你的个技术广度,在高激发场景下,如何去实现实时的一个 api 统计。我们先理解下核心需求,第一,要统计过去十分钟每个 api 的 一个访问次数,并且数据是 只是更新的。第二, a p i 可能非常多,调用量很大,统计过程不能拖慢主系统。第三,要看版,展示访问量最高的前 n 个 a p i, 比如前十或者前一百。 如果只是低病发的一个场景,我们直接在拦截器里面用本地缓存技术其实就可以了。如果你担心简历上的东西讲不出来,我已经把面试经常问到的一些技术站场景题都 整理在两百万字的一个面试文档了,里面针对每个知识点都有很详细的一个解析思路,只要你是我的粉丝,留言六六六就可以打包带走。但高云发下这么做会有性能和 存储的一个问题,所以我们需要一套异步可扩展的一个架构。下面我来分享两种常见的方案。方案一,基于 flink 卡夫 卡 reddit 的 一个实时流处理。首先我们可以通过 aop 或者过滤器拦截 ip 的 一个消息队列里,这样做可以解偶,避免统计逻辑阻 测这个主业务的一个进程。接下来我们需要一个流程里的框架,比如 flink, 从卡芙卡消费日制数据, flink 可以 开启一个十分钟的一个滑动窗口,每隔一定时间统计一次窗口内的一个 api 的 一个访问 次数。窗口滑动的同时,计算结果会实时更新到 radis 中。因为我们要展示 top n radis 的 里面的一个 sort set 就 非常适合,可以把 a p i 的 一个路径作为成员,访问次数作为分数,每次直接更新用这个 z increase by 增加技术。最后,前端看板可以用 graph finder 连接 radis, 通过 radis 数据源直接查询 sort the set 的 前英文,并做成实时刷新的一个仪表盘替代呢,也可以,但 graph finder 呢,对 radis 的 一个支持是更好一些的。这套方案的一个优点是完全异步,不影响主 系统的性能。而且 flink 的 一个窗口计算保证了数据的一个实时性和准确性。 reddis 的 一个 sort 的 set, 它能够高效去获取 拓文。第二个方案,如果你的公司里面已经有这个 e o k 的 一个日制体系,那么就可以直接附用这套设施。 lockstand 负责采集 web 服务器的一个访问日制,解析出 api 路径和时间戳,然后写入 elastic search elasticsearch, 它按照时间缩影存储这些日期,并利用它的一个聚合功能,实时统计最近十分钟每个 a p i 的 一个访问次数。一般的呢,作为可视化工具,创建一个 dashboard, 添加一个 top a p i 的 一个聚合图标,设置时间过滤器为最近十分钟。聚合字段为 a p i 的 路径排序,取 前 n 个并开启自动刷新,就能实时展示 e l k 的 一个方案。优点是无需额外开发,开箱即用,还能长期存储日记,便于回溯。缺点是实时性略差,会有秒级到分钟级的个延迟,并且需要维护一套 e l k 的 集群资源,开销较大。两种方案都可以满足需求,选择哪个去 取决于公司现有的一个技术战和实施性的一个要求。如果追求极致的实施性和轻量,且愿意引入流处理的一个组建,那么方案一更合适。如果已经有成熟的 e o k 体系,直接用它就能快速实现,不需要去重复造轮子。
粉丝10.3万获赞51.8万

呃,如果要统计啊,过去十分钟里面每个 a p i 的 访问次数,而并且呢,我要根据访问量,对吧?然后去展示前面一十或者说一百个 a p i, 你 会怎么设计?嗯,可以用 us 记录每次的请求,然后定时统计。呃,这个问题啊,其实就是在考察你的技术广度, 在高病发场景下面,如何去实现 a b i 的 实时统计呢?我们先来理一下 a p i 的 一个核心需求,如果你担心简历上的东西讲不出来,我已经把面试经常问到的一些技术站场景题都整理在两百万字的面试文档了,里面针对每个知识点都有很详细的解析思路, 只要你是我的粉丝,留言六六六就可以打包带走。第一个,我们要统计过去十分钟每个 a p i 的 访问次数,并且呢数据要实时更新。而第二个呢, a p i 可能非常多,调研量非常大,那么统计的过程你不能拖慢主体的 信。而第三个,我需要看版展示出最高的前 n 个 api, 比如说前十或者说一百。如果只是低并发症的场景啊,我们直接去用拦截器,然后用本地缓存激素就可以了啊。但是呢,在高并发症下面可能会有性能问题和存储的问题,所以啊,我们需要一套异步的可扩展的架构。 下面呢,我来讲两套就比较常见的一个方案啊。那么第一个呢,就是基于 flink 卡不卡 reddit 加 graphing 啊。首先呢,我们可以通过 a o p 或者过滤器来拦截我们的 api 请求,但是啊,不要同步去处理, 而是要把请求的网址一步发送到卡不卡消息队列里面去,然后这样呢,可以做了一个解偶,避免统计的逻辑啊,阻碍我们的 主业务线程。接下来呢,我们需要一个流处理框架,比如说刚刚讲到的 flink 啊,从卡不卡消息网址里面,对吧,去拿到数据,然后 flink 呢,可以开启一个十分钟的滑动窗口,每隔一段时间,比如说五秒统计一个窗口的 api 访问次数,然后窗口滑动统计的同时啊,计算结果呢,就实时的更新到我们的 reddit 里面去, 因为我们要展示 top end, 那 么 reddit 里面我们就可以用数据库就是有序集合来去保存啊,可以把 api 路径作为一个 key, 对 吧?然后访问次数呢,作为我们的 score, 然后每次更新呢,直接用 the increase by 去增加次数就可以了啊。最后呢,前端看版,我们可以用 graph 呢连接到 reddit, 然后通过 reddit 的 数据源直接查询数据库里面前 end, 并且呢做实时的刷新仪表盘,当然 command 也可以,但是呢, graph 呢,对 reddit 的 知识呢更好一些。 这套方案的优点呢,就是完全一步不影响主系统的性能,而且 flink 的 窗口计算呢,保证了数据的实时性和准确性, release 的 source set 啊,能高效的获取 top m 啊。然后还有一套方案呢,就是我们公司已经有 e 二 k 体系的话呢,你就可以用 e 二 k 这样一套体系啊来去啊,作为统计 啊,弄个袋式来负责采集握本服务器的访问网址,比如说 nix 的 网址,然后解析出 api 的 路径和时间戳,然后,然后呢写入我们的 e s 里面,然后 e s 啊,按时间缩影存储这些日制,并且利用它的聚合功能,实时地统计最近十分钟里面每个 a p i 的 访问 次数。然后 command 就 可以作为可适化的工具,创建一个 dashboard, 添加一个 top a p i 的 一个聚合图标,设置时间过滤器为最近十分钟。然后聚合字段呢,为我们的 a p i 路径排序,前 n 的 呢,我 就可以拿出来,并且呢,开启自动刷新就能实时展示了。 e l k 的 方案的优点呢,就是你不需要额外的开发,开箱即用,还能长期存储日制,便于回溯。缺点呢,就是时效性啊,稍微差一点会有一个秒级别或者说分钟级别的延迟。呃,还需要维护套 e l k 集群资源开销比较大。 这两种方案呢,都可以满足需求啊。至于选择哪一种,取决于公司现有的技术栈和实施性的要求。如果追求极致的实施性和轻量级的,你就可以引入一些流处理的足迹啊。然后如果你已经有成熟的一二 k 体系了,那你就直接用它反而更快,你不需要重复的去倒笼子。

将我们的体系解放的豆包,让豆包给我们生成一个网页,我们点击它这个右上角的就可以展开,可以预览代码信了,免撤销,检查下它的功能的完整性,然后分享导出文件发送到微信好友, 这个文件我们用 qq 浏览器打开, 点击建立,可以看一下它是否已置这个 api。 k, 我 们就从 deepsafe 官网拿 我们输 deepsafe 来的它一个开放平台,然后点击左上角的这三根杆,点击与 p i k 一 起往后创建自己的 p i k, 输入名称,请我们随便输入,往后创建,记得复制这个 api, 然后返回我们的页面, 点击 e p i 设置,输入我们的 n p i, 然后获取模型,进而我们连获取到两个模型,有 fla 写的 pro 版本或属于我们的人设,保持那个人设就能开始我们的聊天了。

这一次咱们来聊一聊我们程序当中常见的 api request。 好, 那之前呢,我们的程序可以读取这些文件当中的内容,作为它操作的数据, 实际上呢,我们将要了解的这个 api, 它也是为我们的程序提供数据的。好,这是它的一个用处。呃,那这三个字母呢?实际上是 application, programming、 interface 这三个单词的缩写,那么前两个单词呢?就是应用程序,第三个单词 interface 是 接口的意思。 接口,那就肯定是说把两端连接一起,所以呢,实际上说我们使用数据是一个程序,那么提供数据的这个 api, 实际上它就是另外一个程序啊, 所以呢,在这啊,所谓 api 接口,它就是另外一个程序,这个是一个整体啊。好,那在这呢,我还要再介绍一个术语,那就是我们的程序向 api 接口,也就是向另外一个程序 去要数据,这个动作被称之为请求,然后 a p i 接口这另一个程序把数据返回给。呃,我们的这个程序这个动作叫做响应啊,两个单词分别是 request, response。 啊, 那到目前为止这些呢,都是知识点啊,那我们再继续。呃,那它什么样的一个形式呢?我们现在看到,那它就是一个网址的这样一个形式,那其中前边这部分我们把它称之为域名,实际上它代表着某一个网站的服务器, 你说我这个 api 接口向哪一个网站服务器去请求啊?哎,就是前边这段内容,那我们刚才还说另外一个程序,现在我怎么又跳到说网站服务器呢? 实际上我们所谓的另外一个程序是给其他程序,给其他浏览器提供数据的,所以呢,就是给其他程序 提供数据,这个就作为一个服务,所以我们把这个程序叫做服务器,而且通常情况下我们是以一个网站的形式,所以我们把这个所谓 api 接口啊,另外这一个程序称之为服务器,或者说网站服务器啊,好,可能会有一些细微的差别,暂时我们这样去理解没有问题。 那剩下的部分呢?这一部分看似呢,其实有规律,比如说问号,比如说这个按的符,但是呢,这一部分其实是完全由我们服务器端的这个程序,也就是 api 接口程序它去自定义的,那我们在这可能是 y y y, 那 比如说呢,我可能会写一个 user 哎,表示我 可以给你返回呃用户相关的数据,那比如说你可以是 course, 那 我给你返回课程相关的数据啊。问号后边呢?比如说我现在写的是 sex 等于一,然后 and age 等于十八,那可能是说我想查询,或者说我想获取性别是呃男的年龄是十八的这个信息。 但实际上呢,具体的这个接口肯定有具体的一个规范啊,他会有一个接口文档,我们使用接口的话,那肯定是要呃去阅读这个接口文档的啊,然后我们才能根据那个文档的要求去填写这些请求的参数啊。所以在这呢,我们就没有必要去纠结他 来过来,那为了去了解这个 a p i 接口儿,我们在这儿呢,不自己去写啊,我们以这个 github a p i 来去认识 api 接口儿啊。好,那在这儿呢,我们首先要说一下什么是 github? 呃,实际上我们在实际工作中有很多的代码开发者会将自己的这个代码以代码仓库的形式保存到 github 这个网站啊,也就是说它是一个网站,然后很多程序员把自己的代码存储到这个网站上边去存储的一个单位,比如说他写两个项目,那就是两个代码仓库, 那这个代码仓库呢?叫 repository 啊,这么一个单词啊。好,那最好也能够记住,记不住也没关系啊,来,那我们再继续。实际上那你比如说,呃,我们的代码放到这个 github 上边去啊?那为什么要放这个上边去啊?因为,呃,方便我们 这个部署啊,就是放到这个服务器上去运行,这个我不去细说。然后呢,实际上我们如果它这个代码仓库被设置为公有公开的,那就是别人可以看到, 那我们可以看到什么信息呢?比如说他这个代码仓库的名称,以及他这个代码仓库里边保存的这个项目代码主要是干什么的?哎,这个描述信息。然后呢?这个仓库是谁创建的?所有者是谁啊?这个这个代码是属于谁的?然后以及我们要想看这个代码仓库,我们得通过一个浏览器的地址,那这个地址 啊又是什么?以及说那他存储的这个代码是用 python 写的还是用 java 写的啊?或者用 go 写的啊?这个我们也可以看到他的这个编程语言, 以及说呢,当他公开他的代码的时候,因为,呃所有人都能看到,那如果说觉得他写的这个代码对我有用啊,对其他人有用,那我表示赞赏,所以我就可以给他一个小星星啊,我在这加了一个 s 啊,那如果说这个仓库 它具有很多 star, 那 就是说有很多人来对它表示支持啊,给它一朵小红花的那种感觉啊,只不过在这是给它一个小星星,那就代表这个代码仓库很优秀。 哈,是这么个意思啊,好,那回来我们简单说了一下这个 github, 那 么,呃,我们要以 github 它提供的这个 api 接口,我们来去做练习,那我们现在看到的这一长串的 u r l 或者说这个网址,这个就是 a p i 啊,好,那在这呢,呃,我不打算给大家去细解释这个东西啊,因为等我们以后自己去写的时候,呃,才更好地去理解它。就是在这,我们没有必要去呃,刻意的去记它。 好,过来,那刚才那个地址呢,我们可以把它复制一下,直接放到浏览器地址栏这一回车。哎,那我们就可以拿到啊,一些数据信息,那我们现在看到的大部分的这个 json 格式的这个信息就都是 github 这个 api 给我返回的数据啊,一大堆啊。好,那我们继续。刚才呢,我们只是手动地在浏览器地址那直接把这个 api 直接放在那,回车啊,我们就得到数据了。那实际上呢,我们大多数情况下是通过代码的形式使用这个 api 接口啊,或者说向 api 接口发出请求的啊。 好,那接下来呢,我们就演示这个代码的形式啊,要使用代码去请求,我们必须安装这个 requests 模块,注意是 request 后边再加一个 s 啊,这是我们这个 python 一个模块。好,那安装它的命令是 pip install requests, 这样呢就安装成了, 待安装成之后呢,呃,我们就可以接着来写我们的代码了啊,那在这呢,我们首先创建一个文件,它就叫 python 下划线 repost r e p u s 那 没有写全啊,就是刚才那个 repository, 呃,那么一个单词仓库的意思,好,文件名是它,然后呢,我们就直接导入这个 requests 模块儿啊,这个单词它本身就是请求的意思嘛,那我们要想获取数据,当然是要请求啦啊,那接着 我们在这呢写了一个 url 地址,其实就是 a p i 这个接口请求地址,因为它太长了啊,所以在这呢先写第一行,然后第二行呢用加,等于把两个长的字母串拼到一起了啊,是这个意思 啊,如果说你英文比较好的话,我们可以看一下,就是 h t t b s 然后 a p i 点 github 点 com, 然后呢,这部分是域名,后边 search 表示我要查询。然后呢,再后边单词 repository, 那就是仓库,还是一个复数形式啊,然后第二行的这个问号 q q, 一 般来说代表的是 query 啊,是查询的意思,然后等号 language 是 语言啊,再冒号 python, 那 就意思是说我要查询这个 github 上边的仓库,并且仓库里边的这个程序代码是由 python 语言编写的,这就是查询条件了。 加号 sort s o r t 是 排序的意思,冒号 stars, 那 就是按照这个星星数来排序啊,再写一个加号 stars, 冒号大于一万,那就是说这个仓库啊,我要找的是, 呃,首先是 python 语言的呃,代码仓库,并且呢按这个 star 数来排序啊,而且我要找所有 star 数 大于一万的啊,要不然的话,这这个代码仓库会特别多啊,可能会上百万个仓库,而呃,这个它的 star 数大于一万的,这个就少很多了啊,总之呢,这就是一个网址,我们这样去理解它啊。好, 那接下来,哎,我们要写这么一个信息,从数据类型上来说,它是一个字典啊,就是 dick 啊,或者呃 dictionary 啊, 呃,也就是说它是有键值座的,我特意指在这个冒号这个位置啊,那它的 key, 它的键是 accept, 不 管它什么意思啊,虽然它是什么接受的意思。后边呢,是说明啊,它要接收什么样类型的这个数据,我们也不管它啊,就 大致好像它意思是说啊,我要接收版本第三个版本的 jason 格式的这个数据啊,我们就这样去理解就行了啊,总之这是一个字典,实际上它是一个附加信息 headers 啊。好,那接下来这行代码比较关键,我们可以看到 request 点儿 get 啊,那么我们就通过这个 request 这个模块调用它的 get 方法。呃,为什么是 get 呢?其实 get 不 就是获取的意思吗?啊,所以在这是 get, 当然,呃,如果说随着我们深入学习, 也会有其他的这个动词啊,比如说 post, 比如说呃 put, 比如说 delete 啊, page 一 些啊,呃,当然我们在这儿呢,主要的呃,还是 get 和 post 的 比较多。在这儿我们就先认识这个点儿 get 这个方法啊,好,那就是说我用这个模块的 get 方法, 尝试去请求数据,获取数据,向哪儿去请求?把 url 地址作为第一个参数放在这儿了,那这个 url 参数呢?其实呢,说明了说我要向 github 那 个网站去请求数据,然后有一些请求的条件也在这个里边儿啊。这个, 呃,代码的语言是 python, 而且按照它的这个星星数去排序,要求星星数必须大于一万。哎,这个条件也有了啊,但是呢,后边第二个参数 hash 啊,叫请求的头部信息,其实呢就是一些附加的信息,那这个附加信息呢?就是跟这个,呃, api 接口,或者说这个服务器说,呃,我告诉你前面,我告诉你我要什么样的数据,然后呢?在这我还要补充说明,哎,你给我返回的这个数据啊,应该是 jason 格式啊,我才能够处理 好啊,那这个呢,就是一个完整的一个请求了,然后这这个 r 就是 请求之后返回的这个结果,它是响应对象, 首先它是一个对象啊,响应这个单词,那对应的是有请求才有响应嘛?请求 request, 响应 response, 这个是响应,就是我们拿到服务器给我们返回的这个信息了,这个数据了,它本身是一个对象啊。 好,那对象呢?它有一个属性,我们可以打印一下,叫状态码啊,我在这写的是 r 点 status 下划线 code, 这个叫响应状态码,通常情况下就是二百,二百就意味着我请求成功了。哎,我们就这样去理解它啊。 好,呃,那我们先不去看,然后接着往下走,我们说 r 是 一个对象,然后呢? r 啊,它有还有一个属性是 txt, 这个 txt 是 我们真正的想要查询的,想要获取的那个数据。哎,在这个里边,它是一个 jason 字母串,哎,它是 jason 格式,它是字母串,那么我们等号右边调用 r 点 jason, 这个方法是把这个 jason 字母串 转化成字典的形式啊,我们转化成字典的形式等号。左边 response 就是 响应的意思啊,下划线 ticked 啊,表明它是一个字典啊。 好,那我们再继续,我们把真正想要的那个信息拿到了,它是一个字典了啊,好,那在这儿呢。哎,我们先打印一下这个字典,那我们打印看它的结构上来说都有哪些 key。 哎,所以在这儿呢,呃,通过这个 response 下划线 ticked, 点 keys 啊,来获取它。这个键,我们打印一下。好,那在这呢,我们执行这个文件。前边呢,我们打印了一个响应状态码,我说了,一般情况下就是二百啊,二百就表示成功。那如果是四零四 啊,就说明你那个 url 地址写错了,就没找到啊。四零四是没找到的意思,多数情况下是因为你那个 a p i 地址写错了啊。好,那接着我们刚才打这个,说这个字典里边所有的 key, 第一层只有三个,第一个是 total count 啊, total 总数, count 的是计数。哎,总之呢,就是总数的意思啊。好,后边这个单词,呃,其实我们不知道也没有关系啊。这几个单词不知道没有关系,因为不同的接口肯定返回不同的数据啊,这个没必要去记死,只是说这个接口。哦,有这么一个 key, 那 当然,这个 key 呢?呃,前边 i n 是 取反的意思啊,就是反过来不怎么着,然后 complete 是 完成,那么 in complete 是 没有完成 啊,后边这个 results 是 结果的意思,那意思就是说我这个这次请求这个结果,呃,完没完是不是全部的这个结果啊?因为比如说你请求的多,他可能是分次给你的。 好,好,然后第三个 items。 好, 一般来说我们写接口的时候, item 就是 某一项啊,项目,那它加个 s 肯定就意思是说它里边还有一大坨数据,它本身还是一个列表啊,这个是我们真正要获取数据的,所有的核心的都在这个 items 在 这儿了。 啊,那这三项呢?哎,我们可以打印一下啊,比如说,那我再接着在这我直接打印了一个总的仓库数,那我用这个字典访问字典的那个 key 是 方括号里边,呃,用它这个字母串什么 total 下划线 count, 哎,我们就可以得到一个总的仓库数,然后呢,是否是全部啊?那 它如果是处的话,应该是不是全部啊?那不是全部在这呢?给它 not 一下,取个反啊,这个呢? 哎,怎,怎怎么解释呢?举个反就是意思。这个,呃,本来是,是不是不全呀?这么个意思,然后加个 not 呢?就是不是 全的呀?哈哈,有点绕啊,但是这个没关系,也不是太重要。好,总之呢,他反映一下,就说,那你这次查询结果是不是完整的,是不是全部的 这么这么一个真的不重要啊。好,然后再接下来。因为我刚才说了,呃,我们这个响应字典里边,它核心的数据在 items 这,如果我直接打印它的话,数据特别多,所以在这我们只是简单的看一下它到底有多少个,哎,所以呢,我用 l、 e、 n 这个函数把它包裹起来,就求一下它的长度啊。 好,那再继续我们看一下,那在这呢,我们打印出来,哎,根据这个字典的这个键,这个 key 我 们得到啊,总仓库数九百一十三个, 符合条件的啊,那这回是返回了全部的这个内容吗?啊?处啊,全部啊啊,但是呢我们 atms 这,呃有有多少个啊?实际上呢是这个三十个。好在这这个说实话我解释不好这个啊,按理说它处的话应该是九百一十三啊,它这个数据逻辑怎么去理解它? 呃,我没太搞懂,但是呢这个不重要,就是我们就主要知道说啊,接口是一个 url 地址,然后呢我们可以拿到它返回的这个数据啊,因为我写的接口怎么规定这个数据,别人写的接口怎么规定的数据?这个我们没有必要说每一个都去去 死到这个东西啊,我们知道感性上说接口是这么个意思,他给我返回数据,我通过这个 key 拿到相应的数据啊,就可以了。 好,然后呢我们再继续再继续呢,我们看看每一项啊,你刚才不是说有三十项吗?我把每一项拿出来看一下怎么去拿的。哎,你注意啊,我在这还是用这个响应字典 response 下划线摹制,然后呢返回号 items, 因为它有一个 key, 本身 items 就是 一个列表,它里边存了好多个仓库的信息,所以因为它是一个列表,那我在这加一个返回号零,就是拿第一个元素 啊,第一个仓库的信息,然后呢就给我们这个 response r e p u s 下回键 add 啊啊,一个简写形式,那我看一下每一个仓库它有有多少个 key 啊,有多少项啊,所以我在这呢, 呃,用 l e n 再看一下啊,那在这呢,我们可以看到哦,每个仓库有八十二个 key 啊,记记信息项啊信息项,那比如说这个仓库的名称,这个仓库的描述,仓库的所有者,创建时间,修改时间等等等等啊,有八十二个 key 啊,是,是这个样子啊,当然我们肯定,呃,不是说全要它,那我们对哪些感兴趣我们就要哪些呗。啊,那在这我们简单说一下,比如说它这个里边有仓库的名称,用的是啊 r e p u s 这个单个库的啊字典啊,然后方括号内幕,那就拿到了这个名称, 然后呢,我们还可以通过这个 owner, 那 这个 owner 呢?是所有者的意思,但是这个所有者肯定还是一个,呃,一个字典的一个姓氏啊,一个这个 owner, 比如说他的头像啊,他的登录名称啊,啊,他的邮箱啊等等等等,所以在这儿呢, owner 下边再加一个方括号, owner 本身就是一个字典,然后它的 log in 啊,这儿呢是它登录的那个账号名称哎,是是这么个意思啊,好,然后这个仓库有多少人给了小星星啊,是这个 key 啊,这个这个键, 这个呢,我是完全从书上摘抄下来的啊。呃,那这个这个单词我不会念,前面是 s t a r 星星的意思哈,后边 com 的是统计,但是加了一个 g a z e r s 我 就不知道了哈,总之它表示的是啊,这个仓库有多少人给了小星星, 然后接下来我要想看这个仓库,你得给我一个 url 地址啊,一个网址啊,好,那就在这个单个库字典里边啊,它那个 key 是 html 下划线 url 啊,这样呢,就拿到这个仓库的地址 啊,然后呢,这个仓库什么时候创建的,也是在这个字典里边啊?我们现在所有看到这都是一个单个库的信息,就是一个字典啊,好, 然后它这个字典里边的 key created, 下划线 at 啊,那就是创建时间啊,这个呢,其实我们看多了,这些单词应该是能够记记下来啊,然后这个呢? update 啊,下划线 at, 呃,这个是更新时间,你说我不知道啊,我没记下来,那是因为你才学多长时间啊, 对吧?你后边儿写项目的时候就这些单词就太常见了啊。呃,一些描述信息叫 description 啊, 好,也是这个字典里边了,那我们呢,可以打印看一下。哎,我们看啊,那从这到这啊,它的名称叫 public a b s 所有者啊,那它这个账号也叫 public a b s 啊,然后它的星星数, 呃,四十三万星星数,也就是说有四十三万,个人觉得它这个项目不错哈,给他点了星星啊,相当于给他点了赞,然后仓库地址,你看仓库地址就是一个。 呃,网址嘛,对吧?好,然后创建时间,更新时间,描述信息,哎,这一堆内容啊,好,那回来,实际上呢?呃,这是一个库的信息,那么如果说我们想把这个接口的数据,刚才不是查看它有三十个库呢吗?符合条件呢?哎,那我们可以 foring 去便利一下啊, 那 foring 的 时候我们是用这个 response 下回键 tick, 这是响应的信息字典,然后所有的信息在 items 里边儿啊,那每一个 就是一个这个单个?这个库代码库的字典叫 r e p u s 啊,简写啊,实际就是 repository 啊, 下划线 dick 啊,就是这个,然后下边我再逐个的去打印这个库的信息就可以了。好的,这个打印的结果我就没有给大家去准备啊,这个和无非是把刚才那第一个仓库的信息,然后其他的信息,这不就是一个模板的形式吗?就都显示一下,所以这个就没有必要去看了。 来,这个是我们通过 github api 接口,然后看了一下它返回的数据是什么样子的啊,可以拿到这些信息, 然后我们来第二个文件,我们第二个文件,呃,就是在原文呃,复制一下,然后呢改一下名字,后边加了一个 with you v i s u a l 啊,这这么一个文件啊,这个文件里边我们要拿到数据再给它画个图来,那前边呢?这两行首先导入 requests 模块,然后我们还导入了 plu 点儿 express 这么一个子模块儿啊,把它重命名为起个别名儿 p x, 我 们准备要画画儿哈。好,那接下来还是刚才那个 a b i 地址, a b i 请求地址啊,啊, 然后呢?这个还是一样的附加信息,头部信息啊, headers 啊,头部信息,然后呢,我们一样的是 requests 点 get, 我 要去获取数据哦,然后传的参数 url, 我 向哪儿去请求数据以及查询条件是什么,然后 headers 里边儿是一些附加信息, 在这儿我们只是有了这个附加信息,只是说要求你给我返回什么格式的,实际上,呃,还有一些时候,我们这个 header 里边会加一个叫做呃 令牌的东西啊,就是你有这个令牌你才能够请求数据,我才给你数据,你没有令牌,对不起,我不给你数据啊,还会,那也是常常见的信息啊。好,那紧接着呢,我们得到了这个 r r 响应对象,响应对象,把响应对象调用一下 json, 把真正的数据转化为我们 python 当中的字典形式 啊,然后再继续,这个时候呢,我们拿到了整体的数据,我们应该整理数据才画画啊,所以整理数据我们在这准备了啊,三个空格列表,第一个啊, r e p u s, 也就是 代码仓库的,这后边写的是 links 啊,实际是要保存这个仓库的名称,只不过我希望这个名称呢,能够一点击这个名称进行一个跳转,所以同时它又是一个超链接的形式啊,所以我们在这是给它起的名字叫 links 啊,这是第一个啊,主,其实里边保存的主要保存的是仓库的名称。 然后第二个,我们要收集的信息是这个仓库的星星数啊,都有多少人点赞了?第三个,呃,我们要收集一个信息,就是当我们画这个图,鼠标移上去的时候,一些提示信息,哎,我们就要这三类信息啊,所以是三个列表,然后我们就逐个地去便利响应字典里边的这个 items 啊。然后呢,那就是在这儿 e p o s 下行键,这个是每个仓库啊, 然后我们每个仓库是一个字典,把每个仓库里边的 name 拿出来,把每个仓库里边的呃 url 地址、网址拿出来。好,这两个拿出来干嘛?第三行代码用上边这两个数据啊, 你看在这啊,我用了它的名称,用了它的 url 地址,把它拼接成了一个特殊的这么一个字母串,以 小于号 a 开始啊,后边以 a 大 于号结束。这个实际上叫 html 代码啊,就是网页代码呃,它在网页上显示出来就是一个超链接形式,我们看到的那个名字是 r 下划线 name, 当我们点击这个名字的时候,会跳转到 r 下划线 u r l 这个地址去啊,这是它大体的意思啊。当然,这样拼接成一个字母串之后,我们由 r 下划线 link 来保存啊,就保存了这么一个特殊的字母串啊,然后接下来把这个仓库当中的星星数啊拿到, 再接下来把仓库当中的这个所有者的名称拿到,接下来这两个信息,我也给它拼接成一个特殊的字母串, 一个字母串 r 下划线 o owner 就是 这个仓库的所有者。然后后边这个监控号 b r 斜线大于号,这个实际上是网页里边的回车换行啊,出现这个标记啊,那它前后的内容会出现在两行,所以前边 owner 是 在一行, 然后后边那个 r e s r 下划线呃, description d e s c 在 列第二行啊,是这么个意思啊啊,总之呢,它呢就是拼接成这 r 下划线 harv 啊, 实际上上边儿这七行代码儿,我们主要的是要这三行啊,其他那两行是为了拼接成它的啊,更准确地说,我们就要拼接出这三个变量来,第一个是 link, r 下角线 link 里边儿包含着它的名称以及它的地址。第二个它的 stars, 它的星星数。第三个 r 下角线 hover, 那 就是鼠标放到这个图形上边的时候,它显示了这个信息,然后我们把这三个变量保存到或者说 append 追加到这三个列表里边去,那我们其实后边我们画图肯定是也以这三个列表为基础啊。好, 那画图呢?我们在这呢,首先,哎,先,呃,想这么一个标题啊, github 上边 star 数最多的 python 项目啊,因为我们查询条件里边 api 那 个地址里边有查询条件,我查的就是, 呃, python 项目,而且让它按这个 star 数排序了啊。接下来那横坐标,纵坐标 x 轴,外轴那个标签显示的文字分别是什么啊? x 轴是 repository, 那 就是准备显示一个一个的仓库名称 y 轴 stars, 那 就是说每一个仓库到底有多少个 star 啊? 那在这呢,我们用的是 p x 点 bar, 它的意思是说,呃,画那个条形图啊,或者说叫柱状图, 然后 x 轴 x 轴,我们在这儿给的是啊, r e p u s repose, 下回见 links, 我 说了 links, 本身它是一个超链接,它里边主要显示的内容是仓库的名称,也就是说在 x 轴会显示仓库的名称,但是呢,这个名称我可以用鼠标点击啊, 然后外轴,那它就是这个仓库的这个 star 数啊,到底有多少人点了赞啊,那这个外轴如果其实呢,就是它这个条形图的那个高度啊,你的这个点赞数高,你这条形条形图,这个条就高,是这么个意思。接下来是标题标签,然后这个 啊, hover 下角键 name 啊,等于 hover 下角键 text, 那 就是,呃,每一个条形我鼠标移上去的时候相应的提示信息,这个这个比较简单啊,好,再往下,再往下呢,这个我们整体来说一下啊,呃,这个呢,你知道能设置就可以了,也不需要记住, 我们现在很多代码不需要记住啊,你只需要知道有它,你想起来啊,这可以设置这个,可以设置那个,然后具体怎么代码问 ai 就 可以了啊,在这呢,那就是设置标题的字号, 设置 x 轴那个标签, y 轴那个标签的字号啊,这个代码就这个啊,然后下边呢,这个是设置,我们这个不是条形图吗?啊?或者说要柱状图,这个柱它的颜色是什么啊?第一个参数设设置颜色,第二个是设置这个柱的,呃,透明度 啊,我们之前可以用阿尔法,实际上它在这还有一个单词叫 o b a c i t y 啊,也是表示这个透明度的意思啊,零点六, 也就是说它也有点半透明的意思。最后一行那就是显示出来就可以了啊,那在这呢,我们执行一下,执行一下呢,就会打开浏览器看到这样的这个图了啊,我们可以看到 x 轴是每一个仓库的名称,然后呢,每一个仓库的星星数多,这个条就多啊, 以及我把树标放上去的时候会有相应的这个提示信息啊,那主要是这个作,呃,作者,然后这个描述信息,仓库数以及 star 数啊这些信息啊。好, 那接下来我们就小结一下,小结一下呢,那这节视频呢,我主要是说,首先明确 api 的 用处是什么?用处就是让我们的程序可以获取数据,处理数据。那紧接着呢,我们在这又说了术语两个,一个是请求,一个是响应,以及它们相应的这个单词 request report 啊, 然后再接着那这个 api 它的形式其实呢,就是一个网址的形式啊,我没有具体地去说,因为具体这个 api 的 形式,呃,我们后边有可能会去 学习框架什么的,自己去写这个 api 接口程序,那个时候再说啊。好,然后呢,紧接着我们又手动地去尝试一下,把这个 api 地址复制下来,扔到浏览器地址当中去,然后呢,浏览器也给我们显示出来它响应的这个数据。 不是所有的接口都可以啊,呃,因为,呃,有的接口是允许你 get, 有 的接口是允许你 post 的, 这个不一样,只能是说 get 的 时候可以。 然后,呃,我们又写了两个代码文件,第一个代码文件叫 python, 下行线 repost, 点 p y 在 这个文件当中,呃,我们是获取数据,然后打印了一下,看看这个数据里边到底有什么信息,主要就是了解这个它的接口返回数据的这个结构啊,它是这样一个嵌套结构啊, 当然我们核心的代码肯定是用 requests 这个模块点儿 get 啊,去请求得到的啊。然后呢,我们第二个代码文件叫 python request, 嗯,下划线 with you, 点儿 p y 这个文件里边儿呢,我们是获取数据,也是通过 requests 点儿 get 去获取的,然后整理出来我们想要的数据,把它画了一个图儿啊,这是我们干的事儿啊。好,除了以上的内容,然后在这儿呢,我还有一个补充啊。第七 就是我们的接口还存在一个请求权限和请求频率的问题啊,当然我们这个 github api 接口啊,我们这个练习没有,但大多数实际工作场景的 api 接口都存在这两个内容啊,请求权限和请求频率。 那请求权限,通常情况下是我们首先先登录啊,不管你以什么方式登录啊,你登录之后呢,会得到一个令牌,然后当你得到这个令牌之后,你需要向这个服务器的 api 接口请求的时候,你要带着这个令牌 啊,那服务器那个 api 接口一看,哎,你有这个令牌,令牌也是真的。好,那就把数据给你,是这么个意思啊,好,而且呢,呃,在这这个令牌通常也是 token 啊,这么一个单词,它和我们大模型里边说稍 token 那 个单词是一模一样的,就可以理解为这个 token 是 一个单词,两个意思啊。好,这个是请求权限上边,而我们实际会牵扯到一个令牌的问题啊,然后请求频率,那请求频率呢?通常情况下是说,嗯, 你不能说在一秒之内你,你请求了很多次,这样的服务器也忙,忙不过来啊,所以可能会要求你每个小时或每天最多请求多少次。会有这样的一个限制。你比如说我们现在呃,一些,呃, ai 大 模型的这个请求,尤其是免费的这 请求,他那也叫 api key 吗?那可能就会对你限制一下,比如说一个小时只能请求六十次啊,一天只能请求多少多少次啊, 当然还会有其他的这个限制啊。好,那主要来说请求的频率,请求的权限。好,以上就是我这节视频所分享的全部内容,因为透彻,所以简单,我是讲师井水。呃,这节视频完了呢,我们就已经把这本书的三百三十七页已经完成了。 如果说这个视频你有什么疑问啊,欢迎在评论区给我留言啊,当然我其中有一些表达,如果不准确,你也欢迎啊,可以在评论区留言,咱们讨论啊。那让我们下个视频再见。

嗯,如果你要去统计过去十分钟每个 a p i 的 一个访问次数,并且实时展示访问量最高的前十或者前一百个 a p i, 你 会怎么去设计呢?这个问题其实是在考察你的个技术广度,在高音发场景下,如何去实现实时的一个 a p i 统 计。我们先理解下核心需求,第一,要统计过去十分钟每个 a p i 的 一个访问次数,并且数据是实时更新的。第二, a p i 可能非常多,调用量很大,统计过程不能拖慢主系统。第三,要看版展, 是访问量最高的前 n 个 a p i, 比如前十或者前一百。如果只是低病发的一个场景,我们直接在拦截器里面用本地缓存技术其实就可以了。如果你担心简历上的东西讲不出来,我已经把面试经常问到的一些技术站场景题都整理在两百万字的一个面试文档了, 里面针对每个知识点都有很详细的一个解析思路,只要你是我的粉丝,留言六六六就可以打包带走。但高运发下这么做会有性能和 存储的一个问题,所以我们需要一套异步可扩展的一个架构。下面我来分享两种常见的方案。方案一,基于 flink 卡芙卡 reddis grafana 的 一个实时流处理。首先我们可以通过 a o p 或者过滤器拦截 ip 的 一个请求,但不要同步处理,而是把请求日制异步发送到卡芙卡的一个消息队列里。这样做可以解偶,避免统计逻辑堵塞这个主业务的一个进程。接下来我们需要一个流处理的框架,比如 flink, 从卡芙卡消费日制数据 link 可以 开启一个十分钟的一个滑动窗口,每隔一定时间统计一次窗口内的一个 a p i 的 一个访问次数。窗口滑动的同时,计算结果会实时更新到 read 中,因为我们要展示通 n reddit 的 里面的一个 sort set 就 非常适合,可以把 a p i 的 一个路径作为成员,访问次数作为分数,每次直接更新,用这个 z increase by 增加技术。最后,前端看板可以用 graph finder 连接 reddit, 通过 reddit 数据源直接查询 sort set 的 前英文名,并做成实时刷新的一个仪表盘。其他呢,也可 可以,但 java 呢,对 react 的 一个知识是更好一些的。这套方案的一个优点是完全异步,不影响主系统的性能。而且 flink 的 一个窗口计算保证了数据的一个实时性和准确性。 react 的 一个 sort 的 set, 它能够高效去获取托 盘。第二个方案,如果你的公司里面已经有这个 e o k 的 一个日制体系,那么就可以直接附用这套设施。 block stench, 负责采集 web 服务器的一个访问日制,解析出 api 路径和时间戳,然后写入 elastic search elasticsearch, 它按照时间缩影存储这些日期,并利用它的一个聚合功能,实时统计最近十分钟每个 a p i 的 一个访问次数。一般的呢,作为可视化工具,创建一个 dashboard, 添加一个 top a p i 的 一个聚合图标,设置时间过滤器为最近十分钟。聚合字段为 a p i 的 路径排序,取前 n 个并开启自动刷新,就 实时展示 e o k 的 一个方案,优点是无需额外开发,开箱即用,还能长期存储日制,便于回溯。缺点是实时性略差,会有秒级到分钟级的个延迟,并且需要维护一套 e o k 的 集群资源,开销较大。两种方案都可以满足需求。选择哪个 取决于公司现有的一个技术占和实时性的一个要求。如果追求极致的实时性和清量,且愿意引入流处理的个组建,那么方案一更合适。如果已经有成熟的 e o k 体系,直接用它就能快速实现,不需要去重复造轮子。

面试官问,如果统计过去十分钟每个 api 的 访问次数,还要实时的展示 top 十或 top 一 百,你会怎么设计? 很多人啊,上来就说用拦截器加本地 map 技术,说完就直接卡壳了。兄弟们,这到二零二六年了,高病发场景下这么搞,不仅啊,数据会不准,还会把主县城去拖垮。面试官一听啊,就觉得你啊缺乏架构思维,这题基本就凉透了。 其实啊,面试官考察的根本不是你如何去写代码,而是你懂不懂动作与状态的一个结奥,懂不懂在海量数据下如何保证高性能和高扩展性? 今天呢,就用大白话讲透两套实战方案,面试直接照着说,瞬间可以拉开差距,要是你还不知道如何提升,建议参考我这份大厂批六到批七的学习路线图,还有扎瓦高频面试题, 喊盖了市面上八成项目场景跟八股文,短时间内快速提升技术能力,有需要的可以拿走,希望给大伙带来帮助。首先啊,要明确三个核心难点,数据要实时更新,不能拖慢主业务,还要能高效的算出排名前。低病发下本地缓存确实够用, 但高病发下必须要上异步架构。第一套方案,卡夫卡加 radis, 这是追求极致性能的首选 核心思路啊,就四个字,一步解偶。第一步啊,通过 aop 或过滤器拦截请求,但千万别同步处理,直接把请求日期扔到卡福卡的消息队列里。这一步啊,把统计逻辑和主业务彻底的分开,哪怕统计挂了 接口啊,照样可以响应用户,高可用性直接拉满。第二步,搞个消费服务,从卡不卡拉数据,利用啊滑动窗口算法,比如每五秒计算一次过去十分钟的访问量。 第三步,计算结果实时写 readys, 这里啊,有一个技巧,用 readys 的 zset, p 呢是 api 的 路径, score 是 访问的次数,每次更新啊,直接用 zkrb 的 命令,既原子又高效。最后啊,前灯焊板连 readys 直接 zrange 去前一版,配合 graph 呢,做实时刷新。这套方案优减很明显,完全一步不堵塞主流场。 滑动窗口呢,可以保证实时准确。 radis 呢,搞定排名简直啊,就是一个降维打击二号发。 如果呀,公司有 e l k 体系,可以直接服用,万不要再到轮子了,很多大厂啊都有成熟的 e l k 战, 这个时候引入卡不卡,反而啊,会增加维护的成本。直接让 logstouch 采集 n g 或应用程序也吸出啊 api 和时间扔进 es, 利用 es 强大的聚合查询,设置时间过滤器为最近的十分钟,按 api 路径分组技术 再排个序, top n 啊,就瞬间出来了。企巴纳呀,配个 dashbox, 设个自动刷新,看版也就有了。这套方案 主打一个开箱即用,还能长期存日制,方便回收查询。缺点嘛,实时性啊,比卡福卡方案稍差一些,可能啊,有秒级的延迟, 且集训资源消耗开销有点大。总结一下面士官想听的是你的选型思路,如果追求极致的实时和清量,选择卡福卡加 rad, 整体亦步皆有,性能是无敌的。如果啊,已经有成熟的基建, 选 e l k 降本增效,快速落地。关于选哪一个核心呢,都是异步处理加分层胶,这才是架构师该有的思维。

面试官问如何统计过去十分钟每个 api 的 访问次数,还要实时的展示 tab 十或 tab 一 百,你会怎么设计?很多人上来就说用拦截器加本地 map 技术,说完就直接卡壳了。兄弟们,这都二零二六年了,高病发场景下这么搞, 不仅数据会不准,还会把主县城去拖垮。面试官一听就觉得你缺乏架构思维,这题基本就凉透了,其实面试官考察的根本不是你缺乏架构思维,这题基本就凉透了。其实面试官考察的根本不是高性能和高扩展性。 今天呢,就用大白话讲透两套实战方案,面试直接照着说,瞬间可以拉开差距。如果你担心简历上的东西讲不出来,我已经把面试经常问到的技术站场景题都整理好了,只要你是我的粉丝,留言六六六打包带走。首先要明确三个核心难点,数据要实时更,更新不能放慢主业务, 还要能高效地算出排行前 n。 低病发下本地缓存确实够用,但高病发下必须要上异步解偶。第一套方案, kofja 加 radis, 这是追求极致性能的首选,核心思路就四个字,异步解偶。第一步,通过 a、 o p 或过滤器拦截请求,但千万别同步处理,直接把请求日记扔到 kofja 的 消息队列里。这一步,把统计逻辑和主业务彻底的分开, 哪怕统计挂了接口,照样可以响应用户,高可用性直接拉满。第二步,搞个消费服务,从 kasper 拉数据,利用滑动窗口算法,比如每五秒计算一次过去十分钟的访问量。第三步,计算结果实时写入 rads。 这里有一个技巧,用 rads 的 sort set 有 序集合, key 是 api 的 路径,过是访问的次数,每次更新直接用 zinkaby 命令及原子和高效。最后前端看版联 rads, 直接让 zrand 举前一百名,配合 grafana 做实时刷新。 这套方案优点很明显,完全一步不堵塞主线程,滑动窗口可以保证实时准确锐 d s 搞定排名,简直就是一个降维打击。第二套方案,如果公司有 e l k 体系,可以直接附用,千万不要再造轮子,很多大厂都有成熟的 e l k 站,这个时候引入 kof k 反而会增加维护的成本。直接让 logstash 采集 index 或应用日制 解析出 a p i 和时间争进 es, 利用 es 强大的聚合查询,设置时间过滤器为最近的十分钟,按 a p i 路径分组技术,再拍个序, top n 就 瞬间出来了。 kevin 配个 dashboard 设置自动刷新看板也就有了。 这套方案主打一个开箱即用,还能长期存日记,方便回复查询。缺点吗?实时性比 kufka 方案稍差一些,可能有秒级的延迟,且集群资源消耗开销有点大。 总结一下面士官想听的是你的选型思路。如果追求极致的实时和清量,选择 kfk 加 radis, 整体异步解偶性能是无敌的。如果已经有成熟的基建,选 e l k 降本增效,快速落地。关于选哪一个核心呢?都是异步处理加分层解偶,这才是架构师该有的思维。

上期视频我们分析了一个 how low 请求的全部细节,结果发现将近消耗了三万个 token。 很多朋友留言问,那如果连续聊十条,那是不是三十万 token 了? 不会的,所以这期我们就详细讲解一下 clock code 里面 prompt cash 提示词缓存是如何工作的。上期介绍的 clock trace 是 在代码里打补丁,有很多粉丝反馈了最新的二点一点一一九版本已经不能用了。确实是有这个问题的,因为我自己是用 n p m 安装的二点一点一一二版本, 现在官方已经不支持 npm 安装了。所以为了解决这个问题,我发现了一个新工具叫 cloud tab, 它的工作方式是在本地起一个代理服务器, 你启动它以后,它自动启动 call code 的 所有的 api 流量,经过代理转发退出后生成 html 文件,打开浏览器就能看,生成的 html 是 这样的,左边是导航栏,列出了每一次 api 的 请求,然后右边最底下就是原始的请求的 json 数据, 这个和之前的 cloud trace 生成的网页是一样的。但是 cloud tab 做得最好的地方就是把这个 tools, 然后 messages, system 这些重要的数据子段抽离出来,然后变成独立的模块显示在这里。比如这里对应的是工具, 然后系统提示词,然后还有消息你看,打开以后,他还做了每一块的分行的渲染,原始请求里面不是有很多一堆这个分行符对吧?看着都头疼,现在排的整整齐齐的,一眼就能读的懂。他还有一个杀手功能叫对比,上次 他可以把相邻两次请求放在一起对比新增的内容高亮,然后没有变的就灰色, 比如系统提示词,工具,这里都没变化,今天我们就用这个功能来看看请求是怎么变化的。 ok, 然后用法很简单,我们只要用 cloud tab, 然后杠杠 tab live, 收集所有请求,启动 cloud, 然后我们回去, 然后我们发三条消息, hello, 然后第二条 fine, 然后最后一条 thank you, 然后做完以后我们退出来,然后就能看到收集的提示词了,然后我们用这个来做分析。在看数据之前,我先讲一下 prompt cache 的 核心概念,它的正式名称叫前缀缓存 prefix caching, 什么意思呢?就是你每次发消息, cloud code 要把整个完整的请求都发给 api, 那 么请求里有什么呢?工具的定义,系统的提示词,还有用户输入的上下文,还有对话的历史, 服务器就按这个固定顺序排列它们,它们一起组成了缓存的查询键。那么前缀缓存的逻辑也很简单,两次请求,只要它们的前缀是一样的,那么第二次就不用重新推理了,就重新推理, 那么什么叫一样的呢?福气会对这个前缀做哈希,一个字母不差,就算命中了,差一个字母,那么哈希就变整个缓存就全部失效了。 打开抓取的 html, 结果里面第一个请求,我们按照前缀的顺序来看看里面有什么。最前面的是工具,里面有三十一个工具的定义, 然后中间的是工具的身份,然后他怎么做事,还有各种的行为准则, 然后最后的是消息,你的消息被包成了五个 block, 前四个是 cloud code 注入的后台配置, m c p 的 指南, skills 列表,还有比如说什么 cloud, md, 最后的最后才是你写的 hello, 这些上期都讲过,没记住的朋友记住,好好去复习一下上次的视频。今天你只要记住一件事,就是你的输入永远在最末尾,前面所有的内容,你的输入永远在最末尾,前面所有的结果了。 现在看重头戏。打开第一个请求的返回值,我们找到 usage, 一个字段,三个关键字, input tokens 等于六, cash creation input tokens 四万八, cash read input tokens 零,对不对?记住它们, 这里 input tokens 是 六,对应的是 hello 的 本身,然后 cash creation 是 四万八,将近五万个 token。 那 么前面所有的内容,工具的定义,系统提示词,用户输入上下文,全部首次写入缓存, 然后 cash read 是 零,那么第一条消息没有缓存可以读,这就是冷启动。我们继续看第二个请求,我们先用这个对比,看看请求变了什么。 你看消息从一条变成了三条,新增了 assistant 的 回复, hi, what would you like to work on, 然后还有 user 的 消息 fine, 然后系统提示词没有变,然后工具的定义也没有变,变得只有用户的消息。 然后我们再看 usage, 记住音符的 tokens 是 六, cash creation 二十四, cash read 四万八, 这里 cash 的 read 四万八是不是和上一轮 cash 的 creation 四万八完全一样,证明缓存完全命中了? 然后这里的 cash create 和二十四就对应了新增的 assistant 的 回复,还有用户的新的消息 fine, 所以 只有新增的两条消息需要加入缓存,我们继续看第三个请求,然后对比上次, 然后选对比最后一次,我们看到还是多了两条消息,对不对? assistant 回复 got it let me know, 然后用户回了一句 thank you, 其他的依然没有变,然后我们继续看 usage, 我 们只要记住这一个 cash read 是 四万八千六百七十八, 我们看看这个四万八千六百七十八哪来的呢?那就是上一次的开始 read 的 这个四万八千六百五十四,加上这个二十四,是不是就是四万六千 六百七十八了,对不对?所以也是上一次所有写入的缓存全部命中了, 然后这次写入的二十九个 token 也是新增的这个回复,对吧?然后再加上最后的 thank you, 把三轮数据放在一起看过滤就很清楚了,每一轮的 cash read 等于上一轮的 cash read, 加上上一轮的 cash creation, 所以 缓存就像滚雪球一样,越滚越大,但是每轮新增的只有几十个,总的上下文三轮了 只多了五十三个,然后信息从一涨到了五条,但是新增的计算量几乎可以忽略不计。 这些工具的定义,然后系统提示词,然后用户的注上下文,每次每轮都要带上,但是只有第一次才做了真正的推理,后面全部走了缓存,光看 token 数还不够直观,我们看一下比例关系, 缓存有三种计费方式,普通的输入就是正常价,然后 cash 的 写入比正常价贵一点点,五分钟缓存写入是一点二五倍,然后一小时缓存是两倍,但是缓存的读取只有正常价的十分之一, 所以第一轮冷启动将近五万个 token, 只能按照两倍的写入,看起来比较亏,对吧?但从第二轮开始,这五万个 token 几乎全部是走的 cash 读取,所以只有正常价的十分之一。第三轮、第十轮、第五十轮都是一样的, cash read 越来越大,但是每个 token 只花十分之一,所以对话越长,缓存的优势就越明显。 ok, 那 我们总结一下, prompt cash 就是 前缀的复用 工具的定义,然后系统提示词,对话的历史只有在第一轮,在计算后面的每轮新增的就只有几十个 token 了,对话越长, cash 省的越多。然后我觉得大家留言提的问题都非常好,给了我很多的启发,希望这期大家看完以后有什么问题可以多多提问,我每条都会看。

今天聊一个听起来很硬核,但其实你天天都在用的东西, api。 api 的 全名叫应用程序编辑接口,听着很唬人,对吧?拆开来看,它其实就是 app 之间的街头暗号。 想象一下,你去一家很火的餐厅吃饭,你是来吃饭的,后厨呢,是负责做菜的,里面很乱,不能随便进。那么那个帮你下单的服务员就是 api, 你不需要跑到后厨去抢大厨的炒勺,你只需要对着服务员喊,帮我来份宫爆鸡丁,服务员告诉后厨,后厨做完了,服务员再把菜端给你。 所以, api 就是 那个服务员,它的作用就是让你不用知道后厨有多乱,代码多复杂,只要吼一嗓子,你就能拿到你想要的东西。 听完比喻,你可能觉得 api 就是 个工具人,但我想说的是啊,他才是这个时代真正的底层大佬。为什么你能用微信登录小红书呢?当你在小红书点微信登录的时候啊,小红书没有偷看你的微信密码,而是对着微信喊了一嗓子,帮我看看这个人是谁。 微信通过 api 给小红书回了一句,哦,这个是张三,昵称是爱撸猫的程序员,头像呢,是个猫,全程啊,只传递了结果,没有泄露隐私。 api 就是 软件世界的快递员和保安队长,他负责把东西送到位,同时还能确保不该碰的东西绝对不碰。我觉得 api 是 这个时代最性感的发明,它就是数字世界的乐高积木。以前啊,造一个软件得从挖地基开始, 现在呢,有了 api, 你 直接拼积木就行了。以前造个天气 app 可能要写三个月,现在呢,花五分钟找到一个天气 api 调用一下,数据就会整整齐齐的过来。你说这三个月和五分钟的区别是什么? 就是 api, api 是 信任的边界。在 ai 时代,数据安全是大家最焦虑的。 我觉得 api 最优雅的地方就在于它建立了一种我能为你服务,但我进不了你家门的关系。就像我前面说的微信登录, api 的 底层逻辑是权限控制,它告诉所有程序你可以要结果,但你不能碰数据库。 这种各司其职、各取所需的克制,其实是整个互联网能运转起来的底层信任机制。未来啊, api 级产品。我观察到现在的 ai 公司,比如欧本 ai, 虽然它们有 chad、 gpt 这个界面,但它们真正值钱的东西其实是背后的 api。 你 看自动售货机,真正赚钱的不是那个玻璃门和按钮,而是里面每一罐可乐被拿走的那一下。 你投币,他出货一次一块钱。 api 就是 那个出货口,别人调用一次,你收一次钱。你不用管对方是用手机 app 调用的,还是用网页调用的,甚至可能是用智能冰箱调用的,你只管按次收费。 我们在刷手机的时候啊,总觉得是 app 在 服务我们,但其实是背后无数个 api 在 协同工作。 api 的 本质其实是孤独的代码之间寻找写作的一种本能。


之前我发了那个 coco 的 教程,很多人在收藏,很多人超爱赚钱。其实就是 coco 直接连到 deepsea 或者其他模型的时候,它会变得很慢或者很贵。 因为在二点一点三六版本之后,它就会在你的提示里面加入一些随机的资源, 导致你的 cash 没有办法使用,所以每一次他就又重新把你的上下五计算一次,就变得很慢很贵。那解决方法就很简单,把它新的所有配置都关掉就可以了,就把那个教程再发一次出来。

深夜紧急提醒二师兄,请所有使用 openclaw 即成飞书的用户注意,现在立刻马上去更改小龙虾原码的这个配置项,改完再回来感谢我 小龙虾突然不回复你!除了常见的网络连接问题或者 a p i 额度耗尽等原因,还很有可能是因为飞书机器人的调用次数达到了上限。 目前基础免费版的飞书企业自建应用 api 调用总量的上限为每月一万次,但是小龙虾默认每一分钟就会向飞书发送一次 api 心跳请求,目的是验证机器人是否存活,也就意味着即使你不使用小龙虾,不到七天,飞书机器人将不再响应你的任何指令。 那么解决办法分两步,第一步,修改心跳间隔,远程登录服务器,找到如下文件,将参数的值修改为八千六百四十万,即二十四小时。第二步,复制这段指令, 直接让小龙虾执行,完成后检查此处,验证配置项是否生效。这里是二师兄 ai 分享 ai 实操干货,欢迎关注!

同一个 ai 模型,为什么有人只会用它闲聊,而有人却能用它蒸汽?每天处理几万次请求的系统?今天我们来聊一下什么是 api 调用。 api 调用就是餐厅的传菜窗口,你不用做下聊,直接让程序对着后厨喊一嗓子,来一百份数据,后厨做完递出来程序接口直接用它只干一件事,集成,把 ai 塞进任何软件,让脚本骑乘二十四小时自动跑,批量生产价值,这才是算力变现的正路。 跟普通聊天比, a p i。 调用有三个区别。第一,记忆聊天能接上下文,但是 a p i 调用直接失忆,每次都得把全部历史重发一遍, talking 哗哗响。第二,并发聊天,你一次只能问一个 a p i 调用同一秒能够扔几百个问题, 夫妻能够强权并行处理。第三,计费聊天是体验订阅 a p i 按 talking 精确计费是给程序吃的,生产资料要算 r o i。 说白了,普通聊天是你自己用 ai, 而 ai 调用则是你的软件,你的生意用 ai。

你的 a p i 中转费到底花在哪了?八步,技术练路,乘以三个利润变量,同样叫 a p i 中转价格能差十倍,体验也能差十倍,为什么?从你发消息到 ai 回复,实际上经历了八个步骤,一、入口接收请求。 二、健全检查权限。三、限流控制速度。四、排队等待处理。五、调度核心环节。六、协议转换格式翻译。七、上游调用真正请求。 八、回包正事容错处理。第一到两步,门卫检查入口,你的请求到达中转站健全检查。你的会员卡 api 有 效吗?余额够吗?能用什么模型? 第三步,为什么要卡你?你一秒发十条消息,中转站只放三条,不是故意卡,你是保护账号不被封,触发风控的。四个信号请求频率异常高,多 ip 同时请求凌晨持续满负荷,格式高度统一。 第四步,你在等位,通过限流的请求进入队列,你前面有多少人不知道,有时快有时慢,大部分卡在这一步,不是 ai 在 思考,是你在排队。 第五步,核心中的核心中转站手里有几百个账号,你的请求发给哪个?这个决定直接影响你的体验和中转站的成本。四个维度的智能调度,地区调度,选颜值最低的线路额度调度,选余额充裕的账号, 健康度分流,避开快被分的账号模型调度。 opus 走 opus 通道, samsung 走 samsung 线路。中转站不生产智能,它做的是流量调度, 就像快递公司或是同一个货,拼的是调度效率、线路质量损耗控制。同样一百个账号,能服务五百人还是两千人,这就是技术的价值。 第六步,格式翻译。你的工具用 open ai 格式, cloud 用 andrapec 格式中转站做翻译, open ai 转 andrapec 再转回来。这就是为什么同一个 key 能调多个模型。 第七步,泡娃还是直连?你以为是你到中转站到 cloud 的 时机?可能是你到中转站 a 到中转站 b 到中转站 c 到 cloud 的 美国一层加延迟加出错概率,加利润抽成。第八步,融错机制,请求失败了怎么办?自动重试,换账号重发, 你感觉稍微慢了一点,连续失败,触发熔断,暂时摘掉问题账号,你感觉稍微慢了一个,账号崩,导致前往瘫痪。中转商怎么赚钱? 三个利润变量,第一,账号成本,批量采购对比零售价。第二,调度效率,同样资源服务更多人。第三,分销层级直连对比套娃三层价格差十倍的秘密就在这三个变量里, 现在你知道了你的钱花在哪?为什么价格差这么大?为什么体验差这么大?选中转站要看调度算法,账号质量是否套娃垄断机制, 技术决定体验,体验决定价值。关注我,了解更多下期预告,如何识别套娃中转商?点赞、收藏、关注,让更多人看到这个真相!