- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个向 Musicbrainz 网络服务发出请求的应用程序。我在 musicbrainz 手册中读到每秒不要向网络服务发出超过一个请求,否则客户端 IP 将被阻止。
为了使此限制对服务客户端透明,您建议采用什么架构。
谢谢!
最佳答案
由于调用之间需要延迟,我建议 java.util.Timer
或 java.util.concurrent.ScheduledThreadPoolExecutor
。 Timer
非常简单,并且完全适合这个用例。但如果稍后确定其他调度要求,则单个 Executor
可以处理所有这些。无论哪种情况,都使用固定延迟方法,而不是固定速率方法。
重复任务polls请求对象的并发队列。如果有待处理的请求,任务将执行该请求,并通过回调返回结果。对服务的查询和要调用的回调是请求对象的成员。
应用程序保留对共享队列的引用。要安排请求,只需将其添加到队列中即可。
<小时/>澄清一下,如果执行定时任务时队列为空,则不会发出请求。简单的方法就是结束任务,调度程序会在一秒后调用该任务再次检查。
但是,这意味着即使最近没有处理任何请求,启动任务也可能需要一秒钟的时间。如果这种不必要的延迟是无法忍受的,那么编写自己的线程可能比使用 Timer
更好。或ScheduledThreadPoolExecutor
。在您自己的计时循环中,如果您选择阻塞空队列直到有请求可用,您就可以更好地控制调度。内置计时器不保证在上一次执行完成后等待一整秒;他们通常根据任务的开始时间进行安排。
如果您想到的是第二种情况,您的run()
方法将包含一个循环。每次迭代均以 blocking 开始在队列中,直到收到请求,然后记录时间。处理完请求后,再次检查时间。如果时间差小于一秒,sleep其余的。此设置假设一个请求开始与下一个请求开始之间需要一秒的延迟。如果一个请求结束与下一个请求之间需要延迟,则不需要检查时间;睡一秒钟就可以了。
还需要注意的是,该服务可能能够在单个请求中接受多个查询,这将减少开销。如果是这样,请通过阻止take()
来利用这一点。对于第一个元素,然后使用 poll()
,可能需要很短的阻塞时间(5 毫秒左右),以查看应用程序是否发出更多请求。如果是这样,这些可以捆绑在对服务的单个请求中。如果queue
是 BlockingQueue<? extends Request>
,它可能看起来像这样:
Collection<Request> bundle = new ArrayList<Request>();
bundle.add(queue.take());
while (bundle.size() < BUNDLE_MAX) {
Request req = queue.poll(EXTRA, TimeUnit.MILLISECONDS);
if (req == null)
break;
bundle.add(req);
}
/* Now make one service request with contents of "bundle". */
关于java - 限时服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/784214/
假设我有一群 N 人要乘火车旅行。我需要以最小化总门票成本的方式组织他们到售票处。如果一家人买家庭票,去同一目的地的人买团体票,成本可以降到最低。 我不知道这些人中谁是家人,他们要去哪里旅行。 我能做
限时 QQ音乐幸运狂欢PARTY 最高可抽豪华绿钻24个月 手机打开链接 登录即可参与活动 每人登录就有两次机会 分享一下活动还有一次机会 必中项目 但是抽中什么就看自己的了 反正小编抽中的都是
我有一个 Python 脚本,其中我连接到 MQTT 服务器。我希望通过我订阅的主题收到消息,但如果我没有收到消息,我想完全终止脚本。 我正在使用的脚本如下所示: #!/usr/bin/python
我有一个客户想在线销售教程视频。我已经预览了他从 CF 流式传输的教程(这是公开的)。现在我想使用 c# sdk 生成私有(private)的、有时间限制的 URL,以允许购买教程的客户在有限的时间段
如何使用 AWS SDK 创建云端签名 URL ? 这看起来确实应该很容易做到,但我就是看不到。我大体上了解它是如何工作的,并且可能会拼凑简单的 Java 代码来自己完成。 AWS SDK 没有为此提
我是一名优秀的程序员,十分优秀!