|
@@ -27,3 +27,72 @@ celeryd is not doing anything, just hanging
|
|
|
|
|
|
**Answer:** See `MySQL is throwing deadlock errors, what can I do?`_.
|
|
|
|
|
|
+
|
|
|
+Can I send some tasks to only some servers?
|
|
|
+--------------------------------------------
|
|
|
+
|
|
|
+As of now there is only one use-case that works like this, and that is
|
|
|
+tasks of type ``A`` can be sent to servers ``x`` and ``y``, while tasks
|
|
|
+of type ``B`` can be sent to server ``z``. One server can't handle more than
|
|
|
+one routing_key, but this is coming in a later release.
|
|
|
+
|
|
|
+Say you have two servers, ``x``, and ``y`` that handles regular tasks,
|
|
|
+and one server ``z``, that only handles feed related tasks, you can use this
|
|
|
+configuration:
|
|
|
+
|
|
|
+ * Servers ``x`` and ``y``: settings.py:
|
|
|
+
|
|
|
+ .. code-block:: python
|
|
|
+
|
|
|
+ AMQP_SERVER = "rabbit"
|
|
|
+ AMQP_PORT = 5678
|
|
|
+ AMQP_USER = "myapp"
|
|
|
+ AMQP_PASSWORD = "secret"
|
|
|
+ AMQP_VHOST = "myapp"
|
|
|
+
|
|
|
+ CELERY_AMQP_CONSUMER_QUEUE = "regular_tasks"
|
|
|
+ CELERY_AMQP_EXCHANGE = "tasks"
|
|
|
+ CELERY_AMQP_PUBLISHER_ROUTING_KEY = "task.regular"
|
|
|
+ CELERY_AMQP_CONSUMER_ROUTING_KEY = "task.#"
|
|
|
+ CELERY_AMQP_EXCHANGE_TYPE = "topic"
|
|
|
+
|
|
|
+ * Server ``z``: settings.py:
|
|
|
+
|
|
|
+ .. code-block:: python
|
|
|
+
|
|
|
+ AMQP_SERVER = "rabbit"
|
|
|
+ AMQP_PORT = 5678
|
|
|
+ AMQP_USER = "myapp"
|
|
|
+ AMQP_PASSWORD = "secret"
|
|
|
+ AMQP_VHOST = "myapp"
|
|
|
+
|
|
|
+ CELERY_AMQP_CONSUMER_QUEUE = "feed_tasks"
|
|
|
+ CELERY_AMQP_EXCHANGE = "tasks"
|
|
|
+ CELERY_AMQP_PUBLISHER_ROUTING_KEY = "task.regular"
|
|
|
+ CELERY_AMQP_CONSUMER_ROUTING_KEY = "task.feed.#"
|
|
|
+ CELERY_AMQP_EXCHANGE_TYPE = "topic"
|
|
|
+
|
|
|
+Now to make a Task run on the ``z`` server you need to set its
|
|
|
+``routing_key`` attribute so it starts with the words ``"task.feed."``:
|
|
|
+
|
|
|
+.. code-block:: python
|
|
|
+
|
|
|
+ from feedaggregator.models import Feed
|
|
|
+ from celery.task import Task
|
|
|
+
|
|
|
+ class FeedImportTask(Task):
|
|
|
+ name = "import_feed"
|
|
|
+ routing_key = "task.feed.importer"
|
|
|
+
|
|
|
+ def run(self, feed_url):
|
|
|
+ # something importing the feed
|
|
|
+ Feed.objects.import_feed(feed_url)
|
|
|
+
|
|
|
+
|
|
|
+You can also override this using the ``routing_key`` argument to
|
|
|
+:func:`celery.task.apply_async`:
|
|
|
+
|
|
|
+ >>> from celery.task import apply_async
|
|
|
+ >>> from myapp.tasks import RefreshFeedTask
|
|
|
+ >>> apply_async(RefreshFeedTask, args=["http://cnn.com/rss"],
|
|
|
+ ... routing_key="task.feed.importer")
|