接口高可用设计 - 排队
系列 - 接口高可用设计系列
目录
警告
本文最后更新于 2023-07-11,文中内容可能已过时。
排队的概念
排队是高可用系统中一种常见的策略,用于处理大量并发请求的情况。当系统在短时间内收到大量请求时,如果直接对所有请求进行处理,可能会导致系统过载并最终崩溃。为了避免这种情况,系统可以选择将请求放入队列,然后以其处理能力所能承受的速度逐个处理这些请求。
- 基本原理:
- 收到请求后并不立即进行同步处理,而是将请求加入队列。
- 系统根据处理能力进行异步处理请求。
- 请求端进行轮询以获取处理结果。
- 优点:
- 可以有效地处理大量请求,缓解系统压力。
- 由于请求是在队列中等待,可以按照系统的处理能力进行调整,避免了过载的风险。
- 缺点:
- 对于长时间等待的请求,可能会造成用户体验下降。
- 需要请求端进行轮询以获取处理结果,可能增加了一些复杂性。
- 应用场景:
- 处理大量并发请求的场景,如秒杀、抢购等。
- 当系统处理能力有限,需要将请求暂存起来异步处理的场景。
设计关键点
对于排队的设计关键主要包括以下两个方面:
- 如何设计异步处理流程:这需要考虑如何将请求有效地加入队列,如何根据系统的处理能力进行调度,以及如何对已处理的请求进行有效的管理。这通常需要设计一套完整的流程,包括请求的接收、处理和响应等环节,并考虑如何对各种异常情况进行处理。
- 如何保证用户体验:因为队列策略涉及到请求的异步处理,可能会导致用户需要等待一段时间才能获得处理结果。因此,需要考虑如何设计前端和客户端的交互流程,使用户能够清楚地知道请求的处理状态,并在必要时提供适当的反馈。此外,还需要考虑如何避免用户在等待过程中的不适感,例如通过提供等待时间的估计,或者提供一些其他的用户体验优化措施。
示例
排队的具体实施流程可以在多个步骤中进行展示,这里使用Kafka作为排队服务器,业务服务器使用Redis来存储请求处理结果:
- 用户发起请求:
- 排队服务器收到请求并放入Kafka队列
- 排队服务端返回用户一个排队号,用户可以用这个号码来查询请求处理的进度
- 业务服务器从Kafka队列中取出一个请求进行处理:
- 处理完的请求结果(比如一个token)会被写入Redis,键为对应的排队号
- 用户使用排队号进行轮询查询处理结果:
- 用户向排队服务端提交排队号
- 排队服务端查询Redis,使用排队号作为键
- 如果查询到了对应的token,返回给用户
- 用户使用token访问实际的业务接口:
- 业务服务端通过Redis验证token的有效性
- 如果token有效,则继续处理业务请求
- 业务服务器返回业务处理结果给用户
以上就是使用排队进行请求处理的一种具体实现方式,涉及到了请求的接收、处理、查询和响应等多个环节。其中Kafka和Redis是常见的分布式系统组件,被广泛应用在实际的系统设计中。
[!question] 为什么要用 token,直接用排队号不就可以了么?
- 安全性:排队号通常是按照一定的规则顺序生成的,如果直接使用排队号,攻击者可能能够预测到未来的排队号,然后提前进行一些操作,这可能会导致安全问题。而token通常是随机生成的,不容易被预测,从而提高了系统的安全性。
- 隐私性:如果处理结果中包含了用户的敏感信息,比如用户的个人信息,那么直接使用排队号可能会导致这些信息被其他人通过排队号查询到。而使用token,只有知道具体的token的人才能查询到处理结果,这可以保护用户的隐私。
https://www.infoq.cn/article/yhd-11-11-queuing-system-design