-1

我们正在尝试重新设计基于微服务架构的应用程序以支持多个租户。我们有一个简单的队列服务,其他服务将使用它来对任何异步作业进行排队。另一方面,单个微服务将轮询队列服务以获取/选择它们可以频繁处理的任何异步作业(出队)。

为了确保出队期间的公平性,我们使用了一个简单的循环算法,该算法使用 Redis 中的循环列表 ( https://redis.io/commands/lmove#pattern-circular-list ) 实现。我们将服务名称维护为键/列表名称,并将所有租户标识符维护为值。这使我们可以在每次从特定服务发出获取请求时在每个服务的基础上进行循环。我们使用了 Redisson 的 Deque 数据结构(存储所有租户)以循环方式遍历所有租户。

这种方法有一个缺点。即使是没有工作的租户(在我们的例子中更高),当获取请求到达时也会被考虑,这会导致有工作的租户出现一些延迟。

我们可以只添加具有作业的租户,而不是将所有租户标识符添加到列表中,因为我们可以在排队操作发生时识别租户。我们可以在出队期间从列表中删除租户。但是由于我们的应用程序是多线程的,我们不太确定如何处理 Redis 中的并发部分,即我们可能会在租户获得新工作时从列表中删除他。

例如,当一个作业排队时,tenant1 被添加到列表中,而在出列期间,正如我们向 Redis 发出命令以从列表中删除tenant1 一样,tenant1 的另一个新作业已登陆。现在,在新作业的新排队操作中,我们将尝试将tenant1 添加回列表中。由于网络延迟或应用程序的多线程性质,如果添加租户操作在删除命令之前执行,然后删除命令将从列表中删除租户标识符。这将导致租户 1 在列表中不可用,即使他在队列中有工作。

我们如何解决这个问题,或者我们可以考虑其他方法吗?

4

0 回答 0