【问题标题】:ElasticSearch query hangs in laravel job queueElasticSearch 查询挂在 laravel 作业队列中
【发布时间】:2015-06-30 23:13:56
【问题描述】:

我目前正在为我的 ES 查询使用laravel-elasticsearch 提供程序。我在我的 laravel 队列(使用 beanstalkd)处理的作业中使用它。我遇到的问题是,在长时间运行的作业中,最终我不再能够将数据插入到弹性搜索中。工作只是挂起(没有抛出异常)我已将其范围缩小到我正在进行 ES 调用的代码。我的连接是否有可能变得陈旧而不重新连接?我的另一个想法是它与使用 Facade 以及它是单例有关。

这就是我正在做的事情,这不是我的确切代码。但是当它不在长时间运行的作业中运行时,代码工作得很好。我只是想提供一些上下文。它插入得很好,代码运行没有问题,直到它在长时间运行过程之后运行。

更新:

我已将问题缩小到保持连接的 elasticsearch-php 库。我的 ES 位于负载均衡器后面,5 分钟后 TCP 连接超时。问题是 ES php 库中没有保持活动状态。 5 分钟后连接关闭,但它并没有关闭我的连接。有没有办法为elasticsearch-php设置保持活动状态?还是来电重置连接?

//run some functions....
$params = array();
$params['body']  = array('somefield' => 'some data');
$params['index'] = 'my_index';
$params['type']  = 'my_type';
$params['id']    = 'my_id';
$ret = Es::update($params);//this is working just fine

//long running function here
$newparams = array();
$newparams['body']  = array('somefield' => 'some data');
$newparams['index'] = 'my_index';
$newparams['type']  = 'my_type';
$newparams['id']    = 'my_id';
$return = Es::update($newparams);//this will just hang

【问题讨论】:

  • 看起来像是作业失败而不是 ES 的问题。你在处理失败的工作吗?
  • 我正在处理失败的作业,但该作业并没有失败,它只是挂起,好像它正在尝试连接到 ES 而没有超时

标签: php laravel laravel-4 elasticsearch


【解决方案1】:

我最终解决此问题的方法是在创建 ES 客户端时添加以下设置。

'guzzleOptions' => array(
              'curl.options' => [
                  CURLOPT_FORBID_REUSE => true
              ]
          ),

希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    大家齐聚一堂,让我们谈谈持久的队列过程。

    Laravel 队列与工人一起工作。那些无租的精灵从我们的队列服务中获取作业并及时处理它们。

    然而,经过长时间的无休止的工作,我们的精灵开始感到疲倦并随机制造错误。错误类型包括失败to send mail using SwiftMailer,处理数据库事务或connect to SSL ports

    我们的精灵需要的是一种能量饮料,形式为queue:restart,每 20 分钟一次。

    实施步骤:

    1) 如果您使用的是 linux,请输入控制台 sudo crontab -e

    2) 使用vim,输入以下行0,20,40 * * * * cd /path/to/my/laravel/installation && php artisan queue:restart --env=yourenvironment 1>> /dev/null 2>&1

    /path/to/my/laravel/installation 替换为你的 laravel 路径。

    yourenvironment 加上你的 laravel 环境名称。

    来源:我有一个正常运行时间为一个月的elasticsearch安装,并且laravel使用shift31的包实时轮询和更新数据。

    文档:http://laravel.com/docs/5.0/queues#daemon-queue-worker

    【讨论】:

    • 重启队列不会杀死当前正在处理的作业吗?
    • 我已经尝试重新启动队列,但没有运气。请看看我上面的更新。
    • 重新启动队列将等到当前处理的作业完成。因此不会丢失数据。
    • 如果您的负载均衡器每 5 分钟关闭一次连接(这非常低),我建议您将 cron 作业设置为每 2 分钟执行一次。请注意,这可能会使您的 VM 上的 CPU 使用率飙升。
    • 另外,您可以在请求后简单地关闭 Guzzle 在 Elasticsearch 中使用的连接。见vendor\elasticsearch\elasticsearch\src\elasticsearch\Connections\GuzzleConnection.php。第 165 行。地址:$request->setHeader('Connection', 'Close'); 来源:github.com/guzzle/guzzle/issues/113
    猜你喜欢
    • 1970-01-01
    • 2015-04-19
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多