2015-04-23 72 views
5

我目前使用laravel-elasticsearch供應商進行我的ES查詢。我在我的laravel隊列(使用beanstalkd)處理的作業中使用了這個。我遇到的問題是,在長時間運行的作業中,最終我不能再將數據插入到elasticsearch中。這項工作只是掛起了(沒有例外),我將它縮小到我正在進行ES調用的代碼。有可能我的連接可能會變得過時而無法重新連接?我的另一個想法是,它與使用Facade和它是一個單身人士有關。ElasticSearch查詢在laravel作業隊列中掛起

這是我在做什麼,這不是我確切的代碼。但是當代碼在長時間運行的作業中運行時,代碼工作得很好。我只是想提供一些context.it插入很好,直到它在長時間運行的進程之後運行才能正常運行。

UPDATE:

我已經縮小問題下到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 
+0

看起來像失業的問題,而不是ES。你是否在處理失敗的工作? –

+0

我正在處理失敗的作業,但作業沒有失敗,它只是掛起,就好像它試圖連接到ES而沒有超時 – arrowill12

回答

0

我最終什麼事做來解決這個問題是創建ES客戶端時添加以下設置。

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

希望這可以幫助別人。

4

收集各地,讓我們討論持久的隊列過程。

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

與laravel的路徑替換/path/to/my/laravel/installation

yourenvironment與您的laravel的環境名稱。

來源:我有一個月的正常運行時間的elasticsearch安裝,laravel輪詢和使用shift31的包實時更新數據。

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

+0

不會重新啓動隊列會終止當前正在處理的作業嗎? – arrowill12

+0

我已經嘗試重新啓動隊列,但沒有運氣。請看看我上面的更新。 – arrowill12

+0

重新啓動隊列將等待當前正在處理的作業完成。因此沒有數據丟失。 – Mysteryos