我正在设计一个系统来处理外部 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 种操作类型。某些操作类型会比其他操作类型有更多的请求。系统请求的数量可能会大于用户请求。
是否有处理此类问题的通用方法?模式还是技术?我是不是想多了(不幸的是,在它启动并运行之前我无法获得使用统计信息,我什至无法合理地猜测它们会是什么)?
我试图避免的主要事情是:
- 让系统请求处理用户请求(系统请求可能会等待数周,用户请求必须尽快处理)
- 在数据缓存在数据库中期间,没有两次发出相同的请求