我正在尝试实现https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/03/14/how-to-configure-network-for-azure-sql-managed-instance/,以供队列作业达到速率受限的外部API时使用。
这是我的工作:
public function handle() {
echo 'about to check throttling'.PHP_EOL;
Redis::throttle('throttle-test')->allow(10)->every(5)->then(function () {
// this is never executed
echo 'doing work'.PHP_EOL;
}, function () {
// also never executed
echo 'released back onto queue'.PHP_EOL;
return $this->release(10);
});
}
除了“ ...应用程序可以与Redis服务器交互”之外,没有提到需要在文档中使用Redis进行队列,缓存或任何类似性质的操作。无论哪种方式,这都是我的环境变量:
DB_CONNECTION=mysql
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=redis
我已经确认RedisServiceProvider
收到了预期的正确配置:
array:3 [
"client" => "predis"
"default" => array:4 [
"host" => "redis"
"password" => null
"port" => "6379"
"database" => 0
]
"horizon" => array:5 [
"host" => "redis"
"password" => null
"port" => "6379"
"database" => 0
"options" => array:1 [
"prefix" => "horizon:"
]
]
]
我正在努力理解为什么没有运行时错误,只是什么都没有执行。如果我把节流阀的东西注释掉,则工作运行正常,并且可以完成预期的工作。 我对使用此限制的要求缺少什么?
答案 0 :(得分:7)
在这种情况下,Laravel的文档具有很大的误导性。虽然这意味着您仅需要连接到#include <locale.h>
#include <stdio.h>
#include <wchar.h>
#include <wctype.h>
int main(void) {
setlocale(LC_ALL, "");
wchar_t sentence[30];
wprintf(L"Gimme a sentence:\n");
wscanf(L"%l29[^\n]", sentence); //Reading the line
wprintf(L"Your sentence: %ls\n", sentence); //Printing the whole line
wprintf(L"Detecting non-alphabetic wide characters"); //Detecting non-alphabetic characters
for (int i = 0; sentence[i]; i++) {
if (iswalpha(sentence[i]) == 0) {
wprintf(L"\n\"%lc\" %i\n", sentence[i], i);
wprintf(L"An illegal character has been detected here");
return 1;
}
}
return 0;
}
,但实际上您必须为队列使用Redis
。
答案 1 :(得分:0)
不幸的是,如果不使用Redis
队列驱动程序,就没有“正式”的方法来限制队列的速率。
我写了一个自定义队列工作器mxl/laravel-queue-rate-limit,它使用Illuminate\Cache\RateLimiter
来对作业的执行进行速率限制(与Laravel在rate limit HTTP requests内部使用的相同)。
在GitHub page或this SO answer上详细了解其用法。