2015-04-23 20 views
5

Tôi hiện đang sử dụng nhà cung cấp laravel-elasticsearch cho các truy vấn ES của tôi. Tôi đang sử dụng này từ bên trong một công việc được xử lý bởi hàng đợi laravel của tôi (sử dụng beanstalkd). Vấn đề tôi gặp phải là trong các công việc dài hạn, cuối cùng tôi không còn có thể chèn dữ liệu vào elasticsearch nữa. Công việc chỉ bị treo (không có ngoại lệ nào được ném ra) Tôi đã thu hẹp nó xuống mã mà tôi đang thực hiện cuộc gọi ES. Có thể kết nối của tôi có thể trở nên cũ và không kết nối lại được không? suy nghĩ khác của tôi là nó có liên quan đến việc sử dụng một mặt tiền và nó là một singleton.Truy vấn Tìm kiếm Đàn hồi bị treo trong hàng đợi công việc của laravel

đây là những gì tôi đang làm, đây không phải là mã chính xác của tôi. nhưng mã hoạt động tốt khi nó không chạy trong một công việc dài. Tôi chỉ muốn cung cấp một số context.it chèn tốt, không có vấn đề với mã hoạt động cho đến khi nó được chạy sau một quá trình chạy dài.

UPDATE:

tôi đã thu hẹp vấn đề xuống thư viện elasticsearch-php kiên trì một kết nối. Tôi có ES của tôi đằng sau một cân bằng tải mà lần ra các kết nối TCP sau 5 phút. vấn đề là không có gì còn sống trong thư viện ES php. sau 5 phút kết nối được đóng nhưng nó không đóng kết nối trên đầu của tôi. là có một cách để thiết lập một tiếp tục sống cho elasticsearch-php? hoặc cuộc gọi để đặt lại kết nối?

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

có vẻ như vấn đề với công việc thất bại hơn là với ES.bạn đang xử lý công việc thất bại? –

+0

Tôi đang xử lý các công việc thất bại, nhưng công việc không thất bại nó chỉ bị treo như thể đang cố gắng kết nối với ES mà không có thời gian chờ – arrowill12

Trả lời

0

gì tôi đã kết thúc làm gì để khắc phục vấn đề này là thêm các thiết lập sau khi tạo cho khách hàng ES.

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

hy vọng điều này sẽ giúp ai đó.

4

Thu thập xung quanh và nói về các quy trình xếp hàng lâu dài.

Hàng đợi hoạt động, với công nhân. Những người yêu tinh vô gia cư này tìm kiếm công việc từ dịch vụ xếp hàng của chúng tôi và xử lý chúng một cách kịp thời.

Tuy nhiên, sau một thời gian dài không ngừng làm việc, yêu tinh của chúng tôi bắt đầu cảm thấy mệt mỏi và tạo ra các lỗi ngẫu nhiên. Các loại lỗi bao gồm lỗi to send mail using SwiftMailer, để xử lý các giao dịch cơ sở dữ liệu hoặc connect to SSL ports.

Yêu tinh của chúng ta cần là thức uống năng lượng, dưới dạng queue:restart, cứ 20 phút một lần.

bước để thực hiện:

1) Nếu bạn đang trên Linux, gõ vào console sudo crontab -e

2) Sử dụng vim, nhập dòng sau 0,20,40 * * * * cd /path/to/my/laravel/installation && php artisan queue:restart --env=yourenvironment 1>> /dev/null 2>&1

Thay /path/to/my/laravel/installation với con đường của laravel của bạn .

yourenvironment với tên môi trường của laravel.

Nguồn: Tôi có cài đặt elasticsearch với thời gian hoạt động là một tháng và kiểm tra và cập nhật dữ liệu trong thời gian thực bằng gói shift31.

Tài liệu: http://laravel.com/docs/5.0/queues#daemon-queue-worker

+0

Sẽ không khởi động lại hàng đợi giết công việc hiện tại đang xử lý? – arrowill12

+0

Tôi đã thử khởi động lại hàng đợi, mặc dù không có may mắn. hãy xem bản cập nhật của tôi ở trên. – arrowill12

+0

Việc khởi động lại một hàng đợi sẽ đợi cho tới khi công việc xử lý hiện tại hoàn tất. Do đó không mất dữ liệu. – Mysteryos

Các vấn đề liên quan