写点什么

同事突然问我:异步网络请求编码的方法

  • 2023-12-21
    广东
  • 本文字数:808 字

    阅读完需:约 3 分钟

同事突然问我:异步网络请求编码的方法

本文分享自华为云社区《异步网络请求编码》,作者:张俭 。


本文介绍常见的异步网络请求编码手法。尽管像 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 的失败回调。


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

发布于: 刚刚阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
同事突然问我:异步网络请求编码的方法_开发_华为云开发者联盟_InfoQ写作社区