多级队列设计

时间:2009-02-28 06:51:12

标签: queue message-queue

我正在设计一个处理外部Web服务的系统。该服务限制了在一段时间(T)内可以进行的请求数量。系统允许批量处理一定数量的请求(R)。服务支持一定数量的操作(O)。

我的代码将处理来自用户的未知数量的请求(此时我真的不知道,可能每天只有一个请求,可能是每秒数千个,我需要在假设每秒数千的情况下构建它)。这些结果将缓存在数据库中一段时间​​。当数据库记录过期时,系统将需要再次从Web服务请求数据。

我只能通过一个帐户通过一个IP地址访问Web服务(没有作弊并且每个操作类型都有一个帐户,或者每个操作类型一个机器)。系统将(希望)全部在一台服务器上运行。

我想要做的事情(在没有任何我喜欢的结果的情况下连续几周思考它)会想出一个系统:

  • 重复请求被合并(重复意味着它们具有相同的请求数据)
  • 用户请求优先于系统请求
  • 系统请求可以更改为用户请求(数据库更新在队列中,用户请求相同的数据)
  • 如果没有R用户请求特定操作,则剩余部分取自系统请求
  • 用户请求的处理顺序与它们进入的顺序相同(除了处理用户请求后,处理相同类型的R请求)。

因此,例如,T为1秒,R为3,O为2.以下请求进入系统:

Request 1,  user,   operation A, data 1
Request 2,  user,   operation A, data 2
Request 3,  user,   operation A, data 1 <- duplicate of request 1
Request 4,  system, operation B, data 3
Request 5,  system, operation A, data 1 <- duplicate of request 3
Request 6,  user,   operation B, data 3 <- duplicate of Request 4
Request 7,  system, operation A, data 4
Request 8,  user,   operation A, data 5
Request 9,  user,   operation A, data 6
Request 10, user,   operation A, data 7
Request 11, user,   operation B, data 8

一旦你处理了重复项,你就会得到这个:

Request 1,  user,   operation A, data 1 
Request 2,  user,   operation A, data 2 
Request 4,  user,   operation B, data 3 <- promoted to user from system (msg 6)    
Request 7,  system, operation A, data 4 
Request 8,  user,   operation A, data 5 
Request 9,  user,   operation A, data 6 
Request 10, user,   operation A, data 7 
Request 11, user,   operation B, data 8

请求应按以下顺序处理:

T1 Request 1, Request 2, Request 8
T2 Request 4, Request 11
T3 Request 9, Request 10, Request 7

我认为可能会有3-7种操作类型。某些操作类型的请求比其他操作类型多。系统请求的数量可能会大于用户请求。

有没有一种处理这类问题的常用方法?模式还是技术?我是否过度思考它(不幸的是,我无法获得使用情况统计数据,直到它启动并运行,我甚至无法合理地猜测它们将会是什么)?

我想避免的主要问题是:

  • 通过用户请求处理系统请求(系统请求可以等待数周,用户请求必须尽快处理)
  • 在数据库缓存数据的时间段内没有两次发出相同的请求

1 个答案:

答案 0 :(得分:1)

我通过拥有两个队列来解决这个问题:一个用于用户,一个用于系统请求。将每个队列设计为按字典顺序排列的集合,其中包含元组(操作类型,数据,到达时间);这假设您可以定义数据的排序。有序集允许通过部分密钥进行搜索,因此允许您检查两个队列中的重复请求,并允许将系统提升为用户请求。虽然,我不太了解T变量的作用。