2016-03-21 20 views
7

Tôi đang sử dụng nhà sản xuất RabbitMQ để gửi các tác vụ chạy dài (30 phút +) cho người tiêu dùng. Vấn đề là người tiêu dùng vẫn đang làm việc trên một nhiệm vụ khi kết nối đến máy chủ bị đóng và nhiệm vụ chưa được trả lời được yêu cầu.RabbitMQ đóng kết nối khi xử lý các tác vụ chạy dài và cài đặt thời gian chờ tạo ra lỗi

Từ nghiên cứu, tôi hiểu rằng có thể sử dụng heartbeat hoặc increased connection timeout để giải quyết vấn đề này. Cả hai giải pháp này đều gây ra lỗi khi thử chúng. Khi đọc câu trả lời cho các bài viết tương tự, tôi cũng đã học được nhiều thay đổi đã được triển khai cho RabbitMQ kể từ khi câu trả lời được đăng (ví dụ: thời gian chờ nhịp tim mặc định đã thay đổi thành 60 từ 580 trước khi có RabbitMQ 3.5.5).

Khi xác định một nhịp tim và ngăn chặn kết nối thời gian chờ:

credentials = pika.PlainCredentials('user', 'password') 
parameters = pika.ConnectionParameters('XXX.XXX.XXX.XXX', port, '/', credentials, blocked_connection_timeout=2000) 
connection = pika.BlockingConnection(parameters) 

channel = connection.channel() 

Các lỗi sau đây được hiển thị:

TypeError: __init__() got an unexpected keyword argument 'blocked_connection_timeout' 

Khi xác định heartbeat_interval=1000 trong kết nối thông số một lỗi tương tự được hiển thị: TypeError: __init__() got an unexpected keyword argument 'heartbeat_interval'

Và tương tự cho socket_timeout = 1000 lỗi sau được hiển thị: TypeError: __init__() got an unexpected keyword argument 'socket_timeout'

Tôi đang chạy RabbitMQ 3.6.1, pika 0.10.0 và python 2.7 trên Ubuntu 14.04.

  1. Tại sao các phương pháp trên tạo ra lỗi?
  2. Phương pháp tiếp cận nhịp tim có thể được sử dụng khi có nhiệm vụ liên tục chạy liên tục không? Ví dụ như nhịp tim có thể được sử dụng khi thực hiện các phép nối cơ sở dữ liệu lớn, mất 30 phút? Tôi ủng hộ cách tiếp cận nhịp tim nhiều lần rất khó để đánh giá một nhiệm vụ như tham gia cơ sở dữ liệu sẽ mất bao lâu.

Tôi đã đọc qua câu trả lời cho câu hỏi tương tự

Cập nhật: chạy code from the pika documentation tạo ra lỗi tương tự.

+0

Có bất kỳ loại cân bằng tải nào đang ngồi trước máy chủ mq thỏ không? Môi trường của bạn trông như thế nào có thể liên quan đến việc trả lời câu hỏi này. – mschuett

+0

Máy sản xuất và máy tiêu dùng đều nằm trên cùng một mạng riêng. – Greg

+1

Vấn đề là bạn cần xử lý dữ liệu trong khi chờ đợi, ngay cả khi bạn không tiêu thụ tin nhắn; connection.process_data_events(). Nếu không, pika sẽ không phản ứng với nhịp tim. – eandersson

Trả lời

5

Tôi đã gặp sự cố tương tự với hệ thống của tôi, mà bạn đang thấy, với kết nối bị ngắt trong các tác vụ rất dài.

Có thể nhịp tim có thể giúp giữ cho kết nối của bạn luôn hoạt động, nếu thiết lập mạng của bạn sao cho các kết nối TCP/IP nhàn rỗi bị giảm mạnh. Nếu đó không phải là trường hợp, mặc dù, thay đổi nhịp tim sẽ không giúp đỡ.

Thay đổi thời gian chờ kết nối sẽ không giúp ích chút nào. Cài đặt này chỉ được sử dụng khi tạo kết nối ban đầu.

Tôi đang sử dụng nhà sản xuất RabbitMQ để gửi các tác vụ chạy dài (30 phút +) cho người tiêu dùng. Vấn đề là người tiêu dùng vẫn đang làm việc trên một nhiệm vụ khi kết nối đến máy chủ bị đóng và nhiệm vụ chưa được trả lời được yêu cầu.

có hai lý do cho điều này, cả hai mà bạn đã chạy vào đã:

  1. Connections thả ngẫu nhiên, ngay cả dưới các hoàn cảnh tốt nhất
  2. lại bắt đầu một quá trình vì một tái thông báo được đề xuất có thể gây ra sự cố

Có mã RabbitMQ được triển khai với các tác vụ trong khoảng từ một giây đến vài giờ, tôi thấy rằng việc nhận thông báo ngay lập tức và cập nhật ating hệ thống với các thông báo trạng thái hoạt động tốt nhất cho các tác vụ rất dài, như thế này.

Bạn sẽ cần có một hệ thống bản ghi (có thể với cơ sở dữ liệu) để theo dõi trạng thái của một công việc nhất định.

Khi người tiêu dùng chọn một tin nhắn và bắt đầu quá trình, nó sẽ nhận được tin nhắn ngay lập tức và gửi thông điệp trạng thái "bắt đầu" đến hệ thống bản ghi.

Khi quá trình hoàn tất, hãy gửi một thông báo khác để thông báo hoàn thành.

Điều này sẽ không giải quyết được sự cố kết nối đã bị loại bỏ, nhưng không có gì sẽ giải quyết 100% dù sao. Thay vào đó, nó sẽ ngăn chặn thông báo xếp hàng lại vấn đề xảy ra khi kết nối bị ngắt.

Giải pháp này giới thiệu một vấn đề khác, mặc dù: khi quá trình chạy kéo dài bị treo, bạn làm cách nào để tiếp tục công việc?

Câu trả lời cơ bản là sử dụng hệ thống hồ sơ (cơ sở dữ liệu của bạn) trạng thái cho công việc để cho bạn biết rằng bạn cần phải chọn lại công việc đó. Khi ứng dụng bắt đầu, hãy kiểm tra cơ sở dữ liệu để xem có công việc chưa hoàn thành hay không. Nếu có, hãy tiếp tục hoặc khởi động lại tác phẩm đó theo bất kỳ cách nào là thích hợp.

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