最近遇到一个业务上的问题在网上看到一个对应场景下的解决方案我感觉这个场景还挺有通用性的分享一下。以后遇到类似问题或者当它以面试场景题出现的时候你可以拿去就用。事情是这样的。程序里面有一条“线路”这个“线路”是购买的外部服务使用起来是要收费的。为了更好的理解这个“收费的线路”你可以假设为这是一个付费的 AI 接口。然后你可以把“线路”简单的理解为一个 FIFO 的公共队列对应着多个生产者。也就是同时有很多人即消费者在使用这个“AI 接口”提问。画个示意图是这样的理想情况下我们期望大家和和气气轮流用你一个我一个节奏均匀得像心跳。但是实际使用过程中可能会出现一个卷王 A 生产者突然快速的生产了大批量的数据导致 B、C 生产者产生的少量的数据排在队列的最后面等到天荒地老整个队列呈现出的短时间内只为 A 生产者服务的效果。即 A 生产者“长时间霸占”了整个队列。很明显这样对其他生产者不友好。我在网上查询了一下这个现象还有一个专门的名词叫做吵闹邻居问题Noisy Neighbor Problem。主要是指在多租户环境中单个用户过度占用资源导致其他用户服务质量下降的现象。常见的方案针对这个问题常见的方案一般有两个。第一个是把队列即“线路”分来就像这样各玩儿各的互不干扰。没有邻居也就不存在“吵闹邻居”的问题。这样可以解决问题但是会带来一个新的问题。前面说了这个“线路”是有购买成本的。如果为每一个消费者都提供一个单独的队列即上面说的“线路”那成本就太高了。那你可能会反驳一句不需要为每个人提供单独的队列只为高频使用的人员提供就行了嘛。是的这样也没有毛病。但是实际情况是高频使用的人 也只是在某个小段时间内高频使用随后就是长期的闲置浪费购买成本。而且在实际情况中还会出现一个情况是某个低频使用的用户突然在某一段时间出现业务高峰。那这种情况为了不影响其他用户还得紧急给业务高峰的用户搞个专门的队列。运营成本太高。所以这个方案适用于长期稳定都是高频用户的情况。第二个方案是限制生产者的生产速度。这个方案在解决问题的同时也带来了新问题。第一个问题是我需要实现一个限流功能提升了基础组件的复杂度。第二个问题是由于下游有限流机制那上游必然就要有重试机制增加了整体系统的复杂度。这两个常见的方案一个烧钱一个烧脑。我了解了之后发现和我的场景都不太匹配不能直接使用。Amazon SQS在我向大模型求助的时候它给了我这样一个关键词智能调度算法正如Amazon SQS所使用的公平队列Fair Queueing 机制在软件层面确保资源被公平地分配给所有用户防止任何一个用户垄断资源。于是我在网上找到了 Amazon 官方网站中这个文章https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-fair-queues.html从文章中的描述看它有一个识别谁是“吵闹邻居”的机制当识别到 A 是一个“吵闹邻居”之后Amazon SQS 会把其他租户B、C 和 D的消息放在最前面。这里的“租户”你可以认为就是我们前面提到的生产者。这种优先级有助于保持安静租户 B、C 和 D 的低停留时间而租户 A 的消息停留时间会延长直到队列积压被消耗而不会影响其他租户看起来确实能解决我的问题。于是追问了一下大模型关于它的问题想要进一步了解一下底层原理从大模型的回答来看它核心逻辑是有一个“动态权重调整机制”。“动态权重调整机制”的目的我个人理解是为了给每个生产者一个合适的权重从而决定这次生产的任务是应该放在队列的前面还是后面。大概是这个意思
无意中在应用层瞥见了一个微内核的操作系统调度器
最近遇到一个业务上的问题在网上看到一个对应场景下的解决方案我感觉这个场景还挺有通用性的分享一下。以后遇到类似问题或者当它以面试场景题出现的时候你可以拿去就用。事情是这样的。程序里面有一条“线路”这个“线路”是购买的外部服务使用起来是要收费的。为了更好的理解这个“收费的线路”你可以假设为这是一个付费的 AI 接口。然后你可以把“线路”简单的理解为一个 FIFO 的公共队列对应着多个生产者。也就是同时有很多人即消费者在使用这个“AI 接口”提问。画个示意图是这样的理想情况下我们期望大家和和气气轮流用你一个我一个节奏均匀得像心跳。但是实际使用过程中可能会出现一个卷王 A 生产者突然快速的生产了大批量的数据导致 B、C 生产者产生的少量的数据排在队列的最后面等到天荒地老整个队列呈现出的短时间内只为 A 生产者服务的效果。即 A 生产者“长时间霸占”了整个队列。很明显这样对其他生产者不友好。我在网上查询了一下这个现象还有一个专门的名词叫做吵闹邻居问题Noisy Neighbor Problem。主要是指在多租户环境中单个用户过度占用资源导致其他用户服务质量下降的现象。常见的方案针对这个问题常见的方案一般有两个。第一个是把队列即“线路”分来就像这样各玩儿各的互不干扰。没有邻居也就不存在“吵闹邻居”的问题。这样可以解决问题但是会带来一个新的问题。前面说了这个“线路”是有购买成本的。如果为每一个消费者都提供一个单独的队列即上面说的“线路”那成本就太高了。那你可能会反驳一句不需要为每个人提供单独的队列只为高频使用的人员提供就行了嘛。是的这样也没有毛病。但是实际情况是高频使用的人 也只是在某个小段时间内高频使用随后就是长期的闲置浪费购买成本。而且在实际情况中还会出现一个情况是某个低频使用的用户突然在某一段时间出现业务高峰。那这种情况为了不影响其他用户还得紧急给业务高峰的用户搞个专门的队列。运营成本太高。所以这个方案适用于长期稳定都是高频用户的情况。第二个方案是限制生产者的生产速度。这个方案在解决问题的同时也带来了新问题。第一个问题是我需要实现一个限流功能提升了基础组件的复杂度。第二个问题是由于下游有限流机制那上游必然就要有重试机制增加了整体系统的复杂度。这两个常见的方案一个烧钱一个烧脑。我了解了之后发现和我的场景都不太匹配不能直接使用。Amazon SQS在我向大模型求助的时候它给了我这样一个关键词智能调度算法正如Amazon SQS所使用的公平队列Fair Queueing 机制在软件层面确保资源被公平地分配给所有用户防止任何一个用户垄断资源。于是我在网上找到了 Amazon 官方网站中这个文章https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-fair-queues.html从文章中的描述看它有一个识别谁是“吵闹邻居”的机制当识别到 A 是一个“吵闹邻居”之后Amazon SQS 会把其他租户B、C 和 D的消息放在最前面。这里的“租户”你可以认为就是我们前面提到的生产者。这种优先级有助于保持安静租户 B、C 和 D 的低停留时间而租户 A 的消息停留时间会延长直到队列积压被消耗而不会影响其他租户看起来确实能解决我的问题。于是追问了一下大模型关于它的问题想要进一步了解一下底层原理从大模型的回答来看它核心逻辑是有一个“动态权重调整机制”。“动态权重调整机制”的目的我个人理解是为了给每个生产者一个合适的权重从而决定这次生产的任务是应该放在队列的前面还是后面。大概是这个意思