2016-03-17 14 views
7

Tôi tiếp tục gặp phải các vấn đề về mysql trong khi công nhân thực hiện các tác vụ ngay sau khi tạo.Tạo kết nối cơ sở dữ liệu riêng biệt cho mọi công nhân cần tây

Chúng tôi sử dụng django 1.3, cần tây 3.1.17, djorm-ext bơi 0,5

Chúng tôi bắt đầu quá trình cần tây với đồng thời 3. obeservation tôi cho đến nay là, khi bắt đầu quá trình công nhân, tất cả họ đều nhận được cùng một mysql connecition. Chúng tôi đăng nhập id kết nối db như dưới đây.

from django.db import connection 
connection.cursor() 
logger.info("Task %s processing with db connection %s", str(task_id), str(connection.connection.thread_id())) 

Khi tất cả công nhân nhận nhiệm vụ, người đầu tiên thực hiện thành công nhưng hai người kia lại gặp lỗi Mysql lạ. Nó hoặc là lỗi với "Mysql server biến mất", hoặc với một điều kiện mà Django ném "DoesNotExist" lỗi. rõ ràng các đối tượng mà Django đang truy vấn tồn tại.

Sau lỗi này, mỗi nhân viên bắt đầu nhận được kết nối cơ sở dữ liệu riêng của mình sau đó chúng tôi không tìm thấy bất kỳ vấn đề nào.

Hành vi mặc định của cần tây là gì? Nó được thiết kế để chia sẻ cùng một kết nối cơ sở dữ liệu. Nếu như thế nào là giao tiếp giữa các quá trình xử lý? Tôi lý tưởng sẽ thích kết nối cơ sở dữ liệu khác nhau cho mỗi công nhân.

Tôi đã thử mã được đề cập trong liên kết bên dưới không hoạt động. Celery Worker Database Connection Pooling

Chúng tôi cũng đã sửa mã cần tây được đề xuất bên dưới. https://github.com/celery/celery/issues/2453

Đối với những người downvote câu hỏi, vui lòng cho tôi biết lý do giảm giá.

+0

Bạn có đang sử dụng bất kỳ phần mềm trung gian kết nối Django nào không? Ngoài ra, 'CONN_MAX_AGE' của bạn trong cấu hình django là gì? Tôi nghĩ rằng điều này ảnh hưởng đến hành vi kết nối liên tục trong django. Điều này có thể liên quan đến hành vi mà bạn đang thấy, không phải điều gì đó với chính Celery. –

+0

Bạn có thể chạy đồng thời = 1 và bắt đầu nhiều công nhân không? –

+0

@AlexLuisArias Điều đó sẽ chỉ chạy một quy trình công nhân và không phải là trường hợp cho vấn đề trên. –

Trả lời

2

Cần tây được bắt đầu với lệnh dưới đây

celery -A myproject worker --loglevel=debug --concurrency=3 -Q testqueue 

myproject.py như là một phần của quá trình tổng thể đã làm một số truy vấn đến cơ sở dữ liệu mysql trước khi forking các quá trình lao động.

Là một phần của luồng truy vấn trong quá trình chính, django ORM tạo một hồ bơi kết nối sqlalchemy nếu nó chưa tồn tại. Quá trình công nhân sau đó được tạo ra.

Cần tây là một phần của sửa chữa django đóng các kết nối hiện có.

def close_database(self, **kwargs): 
    if self._close_old_connections: 
     return self._close_old_connections() # Django 1.6 
    if not self.db_reuse_max: 
     return self._close_database() 
    if self._db_recycles >= self.db_reuse_max * 2: 
     self._db_recycles = 0 
     self._close_database() 
    self._db_recycles += 1 

Thực tế điều gì có thể xảy ra là đối tượng pool sqlalchemy với một kết nối db không được sử dụng sẽ được sao chép vào quy trình 3 nhân viên khi chia hai. Vì vậy, 3 hồ bơi khác nhau có 3 đối tượng kết nối trỏ đến cùng một bộ mô tả tệp kết nối.

Công nhân trong khi thực hiện các tác vụ khi được yêu cầu kết nối db, tất cả các công nhân có cùng kết nối không được sử dụng từ nhóm sqlalchemy vì hiện tại chưa được sử dụng. Thực tế là tất cả các kết nối trỏ đến cùng một bộ mô tả tập tin đã gây ra kết nối MySQL biến mất.

Kết nối mới được tạo ở đó sau khi tất cả đều mới và không trỏ đến cùng một bộ mô tả tệp socket.

Giải pháp:

Trong quá trình chính thêm

from django.db import connection 
connection.cursor() 

trước khi bất kỳ nhập khẩu được thực hiện. tức là trước khi mô-đun djorm-ext-pool được thêm vào.

Bằng cách đó, tất cả các truy vấn db sẽ sử dụng kết nối được tạo bởi django bên ngoài hồ bơi. Khi sửa chữa cần sa kết thúc kết nối, kết nối thực sự bị đóng như trái ngược với việc quay trở lại hồ giả kim thuật rời khỏi hồ giả kim mà không có kết nối trong đó tại thời điểm đối phó với tất cả các công nhân khi chia đôi. Có sau khi nhân viên yêu cầu kết nối db, sqlalchemy trả về một trong các kết nối mới được tạo ra.

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