我有一个 Azure 辅助角色,可将一批记录插入到表中。昨天,插入记录最多需要 5 分钟,但今天已经花了几个小时。我怀疑该过程受到限制,但我没有得到任何例外。如果您受到限制,SQL Azure 是否总是返回错误,或者是否有另一种方法来检测您是否受到限制?
我正在使用瞬态故障处理应用程序块 (TFHAB) 来定义与 Azure 数据库交互时的重试策略。我想知道是否有一种方法可以调用限制响应来规划和处理可能的生产场景?
我可以将 SQL 命令放入循环中并运行它,直到调用响应为止,但是这可能不被认为是“最佳实践”?
谁能建议一些实用的方法来测试我的瞬态错误处理逻辑?
我发现的所有图都使用预定义的睡眠时间来限制工作。我需要节流阀等到一项工作完成后再开始一项新工作。一次只能运行 4 个作业。
因此,脚本将运行 4 个,当前暂停 10 秒,然后运行其余部分。我想要的是脚本一次只允许运行 4 个作业,并且当一项作业完成时,就会启动一个新作业。
作业是通过服务器名称列表初始化的。
这个可以存档吗?
$servers = Get-Content "C:\temp\flashfilestore\serverlist.txt"
$scriptBlock = { #DO STUFF }
$MaxThreads = 4
foreach($server in $servers) {
Start-Job -ScriptBlock $scriptBlock -argumentlist $server
While($(Get-Job -State 'Running').Count -ge $MaxThreads) {
sleep 10 #Need this to wait until a job is complete and kick off a new one.
}
}
Get-Job | Wait-Job | Receive-Job
Run Code Online (Sandbox Code Playgroud) 我们的系统存在 WCF 连接受限的问题,此答案已解决。我们将此设置添加到客户端的 web.config 中,并且两个并发连接的限制消失了:
除了明显的影响(例如服务器超载)之外,将此限制设置为比默认“2”高的数字(可能很多)是否有任何不利之处?任何关于默认值如此低的原因的来源?
对于小型应用程序来说,它们没有问题。
但对于有流量的应用程序,您很容易就会达到限制。
Http 协议是 req-res 驱动的。仅仅因为您的后端受到限制,您就迫不及待地发送响应,直到速率限制允许您恢复进行 api 调用。
你做什么工作?
我可以想到几种场景:
等待它:虽然它很糟糕,但有时很容易修复,因为您不需要做任何事情。
将其排队:与仅进行 api 调用相比,这需要大量工作。这要求首先将其存储在数据库中,然后让后台任务通过数据库并执行任务。用户还会被告知“正在处理”而不是“已完成”
使用大量 api:非常 hacky...并且管理起来很麻烦。假设您正在使用亚马逊,现在您必须创建、验证、确认 10 个帐户。甚至对于需要用域名进行验证的地方也是不可能的。因为亚马逊会知道帐户 abc 已经拥有它。
文档说该期间应该是以下之一:('s', 'sec', 'm', 'min', 'h', 'hour', 'd', 'day')。我很好奇我是否可以将期间设置为类似的1/10min?
我将通过提供一些关于我们正在做什么和我们面临的问题的背景来开始我的问题。
目前,我们没有限制或限制租户在给定时间段内可以发出的请求数量的策略。考虑到上面的最后两个考虑因素,很容易看出这是一个问题,因为租户提出的请求超出我们的处理能力几乎是微不足道的,从而导致服务质量下降(即使对于其他租户也是如此)共享资源方法)。
我们正在考虑限制/节流或一般准备系统以“隔离”租户的策略,因此一个租户不能通过发出超出我们处理能力的更多请求来降低其他租户的性能:
现在,我们倾向于采用选项 4。我们希望以这样一种方式实施请求限制(流量整形),即所有在先前与租户商定的速率(由合同强制执行)内提出的请求都将传递给服务毫不拖延。由于我们事先知道每个租户每分钟将发出多少请求(至少是估计的),因此我们可以相应地调整我们的基础设施(加上安全裕度)。
如果突发到达,多余的请求将被排队(达到限制),然后以固定速率释放(使用漏桶或类似算法)。这将确保租户不会影响其他租户的性能,因为请求将以预定义的速率命中服务。理想情况下,允许的请求率将是“动态的”,这样租户可以使用其他不使用它们的租户的“每分钟请求数”(在安全限制内)。我相信这被称为“动态速率泄漏桶”算法。目标是最大限度地利用资源。
我的问题是:
非常感谢你,米克尔。
我正在使用 ThrottleRequest 来限制登录尝试。在 Kendler.php 我有
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
Run Code Online (Sandbox Code Playgroud)
和我在 web.php 中的路线
Route::post('login', ['middleware' => 'throttle:3,1', 'uses' => 'Auth\LoginController@authenticate']);
Run Code Online (Sandbox Code Playgroud)
当我第四次登录时,它返回状态 429 并带有消息“TOO MANY REQUESTS”。(默认情况下,我猜)
但我只想返回错误消息,例如:
return redirect('/login')
->withErrors(['errors' => 'xxxxxxx']);
Run Code Online (Sandbox Code Playgroud)
谁来帮帮我!谢谢你!
在 laravel 6 中,密码代理现在有以下限制密码重置(https://github.com/laravel/framework/blob/6.x/src/Illuminate/Auth/Passwords/PasswordBroker.php#L58)
public function sendResetLink(array $credentials)
{
// First we will check to see if we found a user at the given credentials and
// if we did not we will redirect back to this current URI with a piece of
// "flash" data in the session to indicate to the developers the errors.
$user = $this->getUser($credentials);
if (is_null($user)) {
return static::INVALID_USER;
}
if (method_exists($this->tokens, 'recentlyCreatedToken') &&
$this->tokens->recentlyCreatedToken($user)) {
return static::RESET_THROTTLED;
}
// Once we have …Run Code Online (Sandbox Code Playgroud) 在 Laravel API 上,我使用默认的中间件进行节流设置了速率限制;
Route::group(['prefix' => 'products'], function() {
Route::get('/', ['as' => 'products.index', 'uses' => 'CustomerProductController@index'])->middleware('throttle:60,1');
Route::get('/{product}', ['as' => 'products.show', 'uses' => 'CustomerProductController@show'])->middleware('throttle:50,1');
});
Run Code Online (Sandbox Code Playgroud)
现在我需要制作自己的中间件以从限制中排除 1 个 IP 地址。但不知何故,我只能找到有关以其他方式做事的建议,例如。限制一组 IP 地址。
有人可以给我一个正确方向的推动吗?
throttling ×10
azure ×2
laravel ×2
api ×1
api-design ×1
architecture ×1
asp.net ×1
c# ×1
django ×1
http ×1
laravel-6.2 ×1
middleware ×1
node.js ×1
php ×1
powershell ×1
python ×1