งานการกำหนดเส้นทางคื่นฉ่ายไปยังเซิร์ฟเวอร์ของผู้ปฏิบัติงานที่ไม่ถูกต้อง

ดังนั้นฉันจึงมีเซิร์ฟเวอร์ผู้ปฏิบัติงานสองตัว (คื่นฉ่าย) ที่ใช้โฮสต์เสมือนสองโฮสต์ในเซิร์ฟเวอร์ rabbitmq เดียวกัน ฉันส่งตัวแปรไปยังไฟล์ messagecenter.py ของฉันเพื่อระบุว่าควรใช้ URL ของโบรกเกอร์ใดในการเผยแพร่งาน หลังจากการดีบั๊กมาระยะหนึ่ง ฉันพบว่าเมื่อคื่นฉ่ายสร้างการเชื่อมต่อกับ URL ของโบรกเกอร์ - มันจะไม่ตัดการเชื่อมต่อจาก vhost ก่อนหน้าและเชื่อมต่อกับอันใหม่ ฉันไม่แน่ใจว่าการแลกเปลี่ยนและการผูกทำงานอย่างไรในขึ้นฉ่าย ดังนั้นความช่วยเหลือใด ๆ จึงได้รับการชื่นชมอย่างมาก

messagecenter.py/

from celery import Celery

MESSAGE_SETTINGS = {
    "WORKER1": "amqp://user1:pass1@server-name:5672/vhost1",
    "WORKER2": "amqp://user2:pass2@server-name:5672/vhost2"
}

class MessageCenter(object):
    def __init__(self, config):
        self._config = config
        self._celery = Celery()

    def produce_task(self, name, uuid, params):
        self._celery.conf.update(
            BROKER_URL = self._config[name])
        self._celery.send_task(uuid, params) 

และฉันส่งผ่าน 'WORKER1' หรือ 'WORKER2' พร้อมกับพารามิเตอร์ที่จำเป็นเพื่อเผยแพร่งาน เช่น send_task ฉันหวังว่าจะมีวิธีที่ฉันสามารถกำหนดเส้นทางงานของฉันไปยังเซิร์ฟเวอร์ต่างๆ ได้อย่างถูกต้อง ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก


person user2216194    schedule 16.12.2013    source แหล่งที่มา


คำตอบ (1)


พบวิธีแก้ปัญหาที่นี่

ดังนั้นฉันจึงเปลี่ยน celeryconfig บนเซิร์ฟเวอร์ของผู้ปฏิบัติงานเพื่อรวมการแลกเปลี่ยนสองครั้ง (แต่ละอันมีชุดการผูกและ routing_keys ของตัวเอง) จากนั้นฉันก็ส่งต่อสิ่งเหล่านั้นเป็นพารามิเตอร์จากผู้ผลิตของฉัน (เช่น send_task('task_name', [params], Que = 'myQueue', routing_key = 'myRoutingKey'))

เพื่อการอ้างอิง นี่คือลักษณะการตั้งค่าคื่นฉ่ายของฉันบนเซิร์ฟเวอร์ตัวใดตัวหนึ่ง:

BROKER_URL = "amqp://server_URL/cel_host"

CELERY_APP = 'proj.tasks'

CELERY_IMPORTS = ('proj.tasks', )

CELERY_ROUTES = {
        'proj.tasks.send_email': {
            'queue': 'email_tasks',
            'routing_key': 'email.import',
        },
}
person user2216194    schedule 17.12.2013