异步思想:解决长耗时的问题

异步思想:解决长耗时问题

异步思想是一种解决长耗时问题的方法,它通过将耗时的操作放在后台进行,不阻塞主线程或其他任务的执行,从而提高系统的响应性能和并发处理能力。

业务场景:

在处理一些复杂的业务场景时,对于部分操作考虑使用异步,可以大幅降低接口耗时。

比如,在做服务性能优化时,可以将如数据上报、流水日志等做异步处理,以降低接口时延。用户上传图片后的审核,音视频的合成等等。

案例 1:

文本配音(TTS)为例,【合成音频】和【添加音效】这两个子过程耗耗时比较长:

我们可以把耗时长的部分封装到一个异步任务中,并生成一个任务 ID,后续可以查询处理进度和结果。音频生成部分改为异步任务是因为该子过程是文本配音的关键路径(主流程、耗时长),对非关键路径如【数据埋点】直接改为协程处理即可:

案例 2:

异步处理在数据库中同样应用广泛,例如 Redis 的 bgsave,bgrewriteof 就是分别用来异步保存 RDB 跟 AOF 文件的命令,bgsave 执行后会立刻返回成功,主线程 fork 出一个线程用来将内存中数据生成快照保存到磁盘,而主线程继续执行客户端命令;Redis 删除 key 的方式有 del 跟 unlink 两种,对于 del 命令是同步删除,直接释放内存,当遇到大 key 时,删除操作会让 Redis 出现卡顿的问题,而 unlink 是异步删除的方式,执行后对于 key 只做不可达的标识,对于内存的回收由异步线程回收,不阻塞主线程。

MySQL 的主从同步支持异步复制、同步复制跟半同步复制。异步复制是指主库执行完提交的事务后立刻将结果返回给客户端,并不关心从库是否已经同步了数据;同步复制是指主库执行完提交的事务,所有的从库都执行了该事务才将结果返回给客户端;半同步复制指主库执行完后,至少一个从库接收并执行了事务才返回给客户端。有多种主要是因为异步复制客户端写入性能高,但是存在丢数据的风险,在数据一致性要求不高的场景下可以采用,同步方式写入性能差,适合在数据一致性要求高的场景使用。

此外,对 Kafka 的生产者跟消费者都可以采用异步的方式进行发送跟消费消息,但是采用异步的方式有可能会导致出现丢消息的问题。对于异步发送消息可以采用带有回调函数的方式,当发送失败后通过回调函数进行感知,后续进行消息补偿。

一些常见的异步编程方式有:

需要注意的是,异步并没有缩短整体的响应时间,反而可能有所增加。异步编程有优点也有缺点,可根据自身业务选型:

优点:

  1. 提高系统的响应性能:异步编程可以避免长耗时操作阻塞主线程或其他任务的执行,从而提高系统的响应速度和用户体验。通过将耗时操作放在后台进行,主线程可以继续执行其他任务,不必等待操作的完成。
  2. 提高并发处理能力:异步编程可以与其他任务并发执行,充分利用系统资源,提高系统的并发处理能力。通过将多个任务同时进行,可以减少总体的处理时间,提高系统的吞吐量。
  3. 节省资源消耗:异步编程可以减少不必要的资源消耗。通过将耗时操作放在后台进行,可以避免占用过多的 CPU 时间和内存资源,提高系统的资源利用率。
  4. 提高代码的可读性和维护性:异步编程可以使代码更加简洁和易于理解。通过使用异步/等待或 Promise 等编程模式,可以以同步的方式编写异步代码,提高代码的可读性和维护性。
  5. 支持并行计算和分布式处理:异步编程可以支持并行计算和分布式处理。通过将任务分解为多个子任务,并使用多线程、分布式计算或 GPU 并行计算等技术,可以实现高效的并行计算和数据处理。
  6. 提高系统的可扩展性:异步编程可以提高系统的可扩展性。通过将任务分发给多个处理单元或节点进行并行处理,可以实现分布式的并发处理和负载均衡,提高系统的可扩展性和性能。

缺点:

  1. 复杂性增加:异步编程涉及到回调函数、Promise、异步/等待等概念和技术,对于初学者来说可能会增加学习和理解的难度。
  2. 错误处理复杂:异步编程中的错误处理可能会更加复杂,需要处理回调函数中的错误、Promise链中的异常等情况,增加了代码的复杂性。
  3. 可能引发竞态条件:在并发环境下,异步编程可能会引发竞态条件(Race Condition)和数据一致性的问题,需要额外的并发控制和数据同步机制来解决。
  4. 调试困难:由于异步编程中任务的执行顺序和时间不确定,调试异步代码可能会更加困难,需要使用适当的调试工具和技术。
  5. 可能导致回调地狱:在复杂的异步操作中,使用回调函数可能会导致回调地狱(Callback Hell),使代码难以理解和维护。这可以通过使用Promise、异步/等待等技术来缓解。

综上所述,异步编程具有许多优点,可以提高系统的性能和响应能力。然而,它也存在一些缺点,需要在设计和实现中注意解决相关的问题。合理地应用异步编程,可以最大程度地发挥其优点,减少其缺点的影响。

0%