草庐IT

php - ElasticSearch 查询卡在 laravel 作业队列中

coder 2024-04-05 原文

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

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

更新:

我已将问题缩小到 elasticsearch-php 库保持连接。我的 ES 位于负载均衡器后面,该负载均衡器在 5 分钟后使 TCP 连接超时。问题是 ES php 库中没有 keep alive。 5 分钟后连接关闭,但它不会关闭我这边的连接。有没有办法为 elasticsearch-php 设置一个 keep alive?或重置连接的调用?

//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

最佳答案

聚在一起,让我们来谈谈持久队列进程。

Laravel 队列与 worker 一起工作。那些不租用的 Sprite 从我们的队列服务中获取作业并及时处理它们。

然而,经过长时间不间断的工作,我们的小 Sprite 们开始感到疲倦并随机产生错误。错误类型包括失败to send mail using SwiftMailer , 处理数据库事务或 connect to SSL ports .

我们的 Sprite 需要的是能量饮料,以 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>>/开发/空 2>&1

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

yourenvironment 是你的 laravel 环境名称。

资料来源:我安装了一个运行时间为一个月的 elasticsearch,并使用 shift31 的包实时轮询和更新数据。

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

关于php - ElasticSearch 查询卡在 laravel 作业队列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812084/

有关php - ElasticSearch 查询卡在 laravel 作业队列中的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  4. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  5. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  6. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

  7. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  8. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params

  9. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

  10. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

随机推荐