同事突然问我:异步网络请求编码的方法
本文分享自华为云社区《异步网络请求编码》,作者:张俭 。
本文介绍常见的异步网络请求编码手法。尽管像golang这些的语言,支持协程,可以使得Programmer以同步的方式编写代码,大大降低编码者的心智负担。但网络编程中,批量又非常常见,这就导致即使在Golang中,也不得不进行协程的切换来满足批量的诉求,在Golang中往往对外以callback的方式暴露接口。
无论是callback、还是返回future、还是返回Mono/Flux,亦或是从channel中读取,这是不同的异步编程范式,编码的时候,可以从项目整体、团队编码风格、个人喜好来依次考虑。本文将以callback为主,但移植到其他异步编码范式,并不困难。
使用callback模式后,对外的方法签名类似:
go
func (c *Client) Get(ctx context.Context, req *Request, callback func(resp *Response, err error)) error
java
public interface Client { void get(Request req, Callback callback); }
网络编程中的批量
对于网络请求来说,批量可以提高性能。 批量处理是指将多个请求或任务组合在一起,作为单一的工作单元进行处理。批量尽量对用户透明,用户只需要简单地对批量进行配置,而不需要关心批量的实现细节。
常见的批量相关配置
- batch interval: 批量的时间间隔,比如每隔1s,批量一次
- batch size: 批量的最大大小,比如每次最多批量100个请求
批量可以通过定时任务实现,也可以做一些优化,比如队列中无请求时,暂停定时任务,有请求时,启动定时任务。
编码细节
整体流程大概如下图所示:
一定要先把请求放到队列/map中
避免网络请求响应过快,导致callback还没注册上,就已经收到响应了。
队列中的消息一定要有超时机制
避免由于丢包等原因,导致请求一直没有响应,而导致队列中的请求越来越多,最终内存溢出。
wait队列生命周期与底层网络client生命周期一致
wait队列中请求一定是依附于client的,一旦client重建,队列也需要重建,并触发callback、future的失败回调。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理
背景 在上一篇文章中,我们已经了解到华为即将发布的鸿蒙操作系统纯血版本——鸿蒙 Next,以及各个互联网厂商开展鸿蒙应用开发的消息。其中,Taro作为一个重要的前端开发框架,也积极适配鸿蒙的新一代语言框架 —— ArkTS。 本文将深入探讨 Taro 适配鸿蒙 ArkTS 框架的工作原理,接下来我们先一同看看适配的整体思路。 整体思路 在适配 ArkTS 的整体思路上面,和适配小程序类似的,我们优先采用了偏运行时的适配方案,在运行时将 Taro 虚拟 DOM 树映射到对应的 ArkTS UI 组件。 选择偏运行时方案的原因 1. 前端框架 React/Vue 的 DSL 范式和 ArkTS 的 UI 范式差异较大 以 React 为例,我们在 React 和 ArkTS 两边都简单渲染一个Button组件,并给这个组件赋予一些简单的样式属性: 可以看到单纯是一个简单的Button组件例子,两边的代码结构其实就已经有较大的差异,更不用说在实际的项目中,我们还需要考虑到各种各样的循环体和表达式,如果将这些代码放在编译时去进行解析和转换,难免会出现各种各样的错误和遗漏,并且也无法保证转换后代...
- 下一篇
AI Native工程化:百度App AI互动技术实践
作者 | GodStart 导读 随着AI浪潮的兴起,越来越多的应用都在利用大模型重构业务形态,在设计和优化Prompt的过程中,我们发现整个Prompt测评和优化周期非常长,因此,我们提出了一种Prompt生成、评估与迭代的一体化解决方案,以解决Prompt测评和优化过程中的挑战,加快业务和大模型结合的速度。 全文6796字,预计阅读时间17分钟。 01 背景 随着大模型技术在互动AI应用中的探索和实践,我们见证了其在用户体验和平台互动氛围方面的显著成效。这种技术不仅改善了用户互动率和参与时长,还为提供更丰富的互动体验开辟了新途径。基于这一认识,我们设定了三个关键的发展目标:首先,扩大大模型在不同互动场景中的应用范围,覆盖更多的内容和用户群体;其次,提高大模型在处理各种互动需求时的能力,以适应更广泛的垂直领域;最后,持续创新和完善基于大型模型的AI应用,不断优化和重构互动模式。这些目标的实现将极大地提升用户的参与度,同时使我们的平台互动体验方面保持领先。 在这些策略的实施过程中一系列关键的挑战和痛点逐渐显现。首先是数据分散的问题,多种类型的资源数据散布在不同的消息队列中,使得数据集成...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6