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

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

本文介绍常见的异步网络请求编码手法。尽管像golang这些的语言,支持协程,可以使得Programmer以同步的方式编写代码,大大降低编码者的心智负担。但网络编程中,批量又非常常见,这就导致即使在Golang中,也不得不进行协程的切换来满足批量的诉求,在Golang中往往对外以callback的方式暴露接口。

无论是callback、还是返回future、还是返回Mono/Flux,亦或是从channel中读取,这是不同的异步编程范式,编码的时候,可以从项目整体、团队编码风格、个人喜好来依次考虑。本文将以callback为主,但移植到其他异步编码范式,并不困难。

使用callback模式后,对外的方法签名类似:

go

go 复制代码
func (c *Client) Get(ctx context.Context, req *Request, callback func(resp *Response, err error)) error

java

arduino 复制代码
public interface Client {
    void get(Request req, Callback callback);
}

网络编程中的批量

对于网络请求来说,批量可以提高性能。 批量处理是指将多个请求或任务组合在一起,作为单一的工作单元进行处理。批量尽量对用户透明,用户只需要简单地对批量进行配置,而不需要关心批量的实现细节。

常见的批量相关配置

  • batch interval: 批量的时间间隔,比如每隔1s,批量一次
  • batch size: 批量的最大大小,比如每次最多批量100个请求

批量可以通过定时任务实现,也可以做一些优化,比如队列中无请求时,暂停定时任务,有请求时,启动定时任务。

编码细节

整体流程大概如下图所示:

一定要先把请求放到队列/map中

避免网络请求响应过快,导致callback还没注册上,就已经收到响应了。

队列中的消息一定要有超时机制

避免由于丢包等原因,导致请求一直没有响应,而导致队列中的请求越来越多,最终内存溢出。

wait队列生命周期与底层网络client生命周期一致

wait队列中请求一定是依附于client的,一旦client重建,队列也需要重建,并触发callback、future的失败回调。

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

相关推荐
用户398346161202 小时前
Go-Spring 实战第 9 课 —— IoC 容器:复杂 Go 应用如何统一对象装配
spring·go
审判长烧鸡2 小时前
【Go Generics】泛型为何而生的
go·泛型·overload·重载·generics
用户398346161203 小时前
Go-Spring 实战第 8 课 —— 变量引用与动态刷新:配置值如何复用和更新
spring·go
小羊在睡觉1 天前
力扣239. 滑动窗口最大值
数据结构·后端·算法·leetcode·go
用户398346161201 天前
Go-Spring 实战第 7 课 —— Profile 多环境配置:基础配置与环境差异如何避免复制
spring·go
审判长烧鸡1 天前
【Go Context】终极指南
go
审判长烧鸡1 天前
【Go Test】单元测试保姆级完整指南
单元测试·go
审判长烧鸡2 天前
【Go工具】go-playground是什么组织?官方的?
开发语言·安全·go
别样的感动2 天前
我写了一个 Go 框架:用 DSL 替代 ORM,代码体积减半,开发效率翻倍
go
明月_清风2 天前
Go语言空接口与类型断言完全指南:从"万能容器"到"类型还原"
后端·go