【问题标题】:Multi level queue design多级队列设计
【发布时间】:2010-10-10 12:07:49
【问题描述】:

我正在设计一个系统来处理外部 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 种操作类型。某些操作类型会比其他操作类型有更多的请求。系统请求的数量可能会大于用户请求。

是否有处理此类问题的通用方法?模式还是技术?我是不是想多了(不幸的是,在它启动并运行之前我无法获得使用统计信息,我什至无法合理地猜测它们会是什么)?

我要避免的主要事情是:

  • 系统请求处理用户请求(系统请求可能会等待数周,用户请求必须尽快处理)
  • 在数据缓存到数据库期间没有两次发出相同的请求

【问题讨论】:

    标签: queue message-queue


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。 T 是请求之间的时间量(我可以说一个请求秒),这就是为什么我需要尽可能多地批量处理。 1 秒请求 10 秒或 10 秒请求 1 秒是一个巨大的差异。不确定它在设计中是否重要——只是动机。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多