我正在设计一个处理外部Web服务的系统。该服务限制了在一段时间(T)内可以进行的请求数量。系统允许批量处理一定数量的请求(R)。服务支持一定数量的操作(O)。
我的代码将处理来自用户的未知数量的请求(此时我真的不知道,可能每天只有一个请求,可能是每秒数千个,我需要在假设每秒数千的情况下构建它)。这些结果将缓存在数据库中一段时间。当数据库记录过期时,系统将需要再次从Web服务请求数据。
我只能通过一个帐户通过一个IP地址访问Web服务(没有作弊并且每个操作类型都有一个帐户,或者每个操作类型一个机器)。系统将(希望)全部在一台服务器上运行。
我想要做的事情(在没有任何我喜欢的结果的情况下连续几周思考它)会想出一个系统:
因此,例如,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种操作类型。某些操作类型的请求比其他操作类型多。系统请求的数量可能会大于用户请求。
有没有一种处理这类问题的常用方法?模式还是技术?我是否过度思考它(不幸的是,我无法获得使用情况统计数据,直到它启动并运行,我甚至无法合理地猜测它们将会是什么)?
我想避免的主要问题是:
答案 0 :(得分:1)
我通过拥有两个队列来解决这个问题:一个用于用户,一个用于系统请求。将每个队列设计为按字典顺序排列的集合,其中包含元组(操作类型,数据,到达时间);这假设您可以定义数据的排序。有序集允许通过部分密钥进行搜索,因此允许您检查两个队列中的重复请求,并允许将系统提升为用户请求。虽然,我不太了解T变量的作用。