{"id":10008057,"date":"2023-07-07T17:59:11","date_gmt":"2023-07-07T09:59:11","guid":{"rendered":"https:\/\/ityet.com\/?p=10008057"},"modified":"2023-07-07T17:59:11","modified_gmt":"2023-07-07T09:59:11","slug":"%e3%80%90%e6%ba%90%e7%a0%81%e6%8e%a2%e7%b4%a2%e3%80%91nameko-%e6%98%af%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e5%8d%8f%e7%a8%8b%e5%b9%b6%e5%8f%91%e6%b6%88%e8%b4%b9%e7%9a%84%ef%bc%9f","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10008057","title":{"rendered":"\u3010\u6e90\u7801\u63a2\u7d22\u3011nameko \u662f\u5982\u4f55\u5b9e\u73b0\u534f\u7a0b\u5e76\u53d1\u6d88\u8d39\u7684\uff1f"},"content":{"rendered":"<p>\u4f7f\u7528 nameko \u7684\u65f6\u5019\uff0c\u8bbe\u7f6e max_workers \u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u5e76\u53d1\u7684\u6d88\u8d39<\/p>\n<p>\u6211\u81ea\u5df1\u7528 eventlet+kombu \u5199\u4e86\u4e00\u4e2a\u6d88\u8d39\u8005\uff0c\u5374\u4e0d\u80fd\u5b9e\u73b0\u5e76\u53d1\u6d88\u8d39\uff0c\u53ea\u80fd\u4e00\u4e2a\u4e00\u4e2a\u6392\u961f\u6d88\u8d39<\/p>\n<p>\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"python\">import random\nimport eventlet\neventlet.monkey_patch()  # noqa (code before rest of imports)\nfrom kombu.mixins import ConsumerMixin\nfrom kombu.messaging import Consumer\nfrom kombu import Connection, Exchange, Queue\nfrom loguru import logger\nimport time\n\n\nclass MyConsumer(ConsumerMixin):\n    def __init__(self, connection):\n        self.connection = connection\n\n    def get_consumers(self, Consumer, channel):\n        print('\u521b\u5efa\u6d88\u8d39\u8005 start')\n        queue_name = 'evt-ye.events-take--dna_create_service.auth'\n        exchange_name = 'ye.events'\n        routing_key = 'take'\n\n        exchange = Exchange(exchange_name, type='topic')\n        queue = Queue(\n            queue_name, exchange=exchange,\n            routing_key=routing_key,\n            queue_arguments={'x-max-priority': 10}\n        )\n\n        # \u521b\u5efa\u4e00\u4e2a\u6d88\u8d39\u8005\uff0c\u5e76\u8bbe\u7f6e\u9884\u53d6\u6d88\u606f\u6570\u91cf\u4e3a10\n        consumer = Consumer(\n            queues=[queue], callbacks=[self.on_message],\n            prefetch_count=10\n        )\n        print('\u521b\u5efa\u6d88\u8d39\u8005 down')\n        return [consumer]\n\n    def on_message(self, body, message):\n        logger.debug(f&quot;Received message: {body}&quot;)\n        logger.debug(f'\u5f00\u59cb\u6d88\u8d39')\n        time.sleep(3)\n        logger.debug(f'\u7ed3\u675f\u6d88\u8d39')\n        message.ack()  # \u53d1\u9001ACK\u786e\u8ba4\u6d88\u606f\u63a5\u6536\n\n\nwith Connection('amqp:\/\/pon:pon@192.168.38.191:5672\/\/') as conn:\n    consumer = MyConsumer(conn)\n    consumer.run()\n\n<\/code><\/pre>\n<p>\u5c31\u5f88\u70e6\uff0c\u600e\u4e48\u529e\uff0c\u6211\u5c31\u53bb\u7ffb\u4e86\u534a\u5929 nameko \u7684\u6e90\u7801\u4ee3\u7801\uff0c\u53d1\u73b0\u95ee\u9898\u5728\u8fd9\u91cc\uff1a<\/p>\n<p><code>site-packages\/nameko\/messaging.py<\/code> \u6ce8\u518c\u56de\u8c03\u51fd\u6570<\/p>\n<pre><code class=\"python\">def handle_message(self, provider, body, message):\n    ident = u&quot;{}.handle_message[{}]&quot;.format(\n        type(provider).__name__, message.delivery_info['routing_key']\n    )\n    self.container.spawn_managed_thread(\n        partial(provider.handle_message, body, message), identifier=ident\n    )\n\ndef get_consumers(self, consumer_cls, channel):\n    &quot;&quot;&quot; Kombu callback to set up consumers.\n\n    Called after any (re)connection to the broker.\n    &quot;&quot;&quot;\n    _log.debug('setting up consumers %s', self)\n\n    for provider in self._providers:\n        callbacks = [partial(self.handle_message, provider)]\n\n        consumer = consumer_cls(\n            queues=[provider.queue],\n            callbacks=callbacks,\n            accept=self.accept\n        )\n        consumer.qos(prefetch_count=self.prefetch_count)\n\n        self._consumers[provider] = consumer\n\n    return self._consumers.values()<\/code><\/pre>\n<p>\u7136\u540e kombu \u5728\u6536\u5230\u6d88\u606f\u4e4b\u540e\uff0c\u4f1a\u8c03\u7528\u4e4b\u524d\u6ce8\u518c\u7684\u56de\u8c03\u51fd\u6570<br \/><code>site-packages\/kombu\/messaging.py<\/code><\/p>\n<pre><code class=\"python\">def receive(self, body, message):\n    &quot;&quot;&quot;Method called when a message is received.\n\n    This dispatches to the registered :attr:`callbacks`.\n\n    Arguments:\n        body (Any): The decoded message body.\n        message (~kombu.Message): The message instance.\n\n    Raises:\n        NotImplementedError: If no consumer callbacks have been\n            registered.\n    &quot;&quot;&quot;\n    callbacks = self.callbacks\n    if not callbacks:\n        raise NotImplementedError('Consumer does not have any callbacks')\n    \n    [callback(body, message) for callback in callbacks]<\/code><\/pre>\n<p>\u6240\u4ee5\uff0c\u9053\u7406\u5f88\u7b80\u5355\uff0c\u6211\u6309\u7167 nameko \u7684\u601d\u8def\uff0c\u6539\u9020\u4e86\u4e00\u4e0b\u6211\u7684\u4ee3\u7801<\/p>\n<p>\u6700\u540e\u5b8c\u6574\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"python\">import random\nimport eventlet\neventlet.monkey_patch()  # noqa (code before rest of imports)\nfrom kombu.mixins import ConsumerMixin\nfrom kombu.messaging import Consumer\nfrom kombu import Connection, Exchange, Queue\nfrom loguru import logger\nimport time\n\n\nclass MyConsumer(ConsumerMixin):\n    def __init__(self, connection):\n        self.connection = connection\n\n    def get_consumers(self, Consumer, channel):\n        print('\u521b\u5efa\u6d88\u8d39\u8005 start')\n        queue_name = 'evt-ye.events-take--dna_create_service.auth'\n        exchange_name = 'ye.events'\n        routing_key = 'take'\n\n        exchange = Exchange(exchange_name, type='topic')\n        queue = Queue(\n            queue_name, exchange=exchange,\n            routing_key=routing_key,\n            queue_arguments={'x-max-priority': 10}\n        )\n\n        # \u521b\u5efa\u4e00\u4e2a\u6d88\u8d39\u8005\uff0c\u5e76\u8bbe\u7f6e\u9884\u53d6\u6d88\u606f\u6570\u91cf\u4e3a10\n        consumer = Consumer(\n            queues=[queue], callbacks=[self.on_message],\n            prefetch_count=10\n        )\n        print('\u521b\u5efa\u6d88\u8d39\u8005 down')\n        return [consumer]\n\n    def on_message(self, body, message):\n        eventlet.spawn(self._on_message, body, message)\n\n    def _on_message(self, body, message):\n        logger.debug(f&quot;Received message: {body}&quot;)\n        logger.debug(f'\u5f00\u59cb\u6d88\u8d39')\n        time.sleep(3)\n        logger.debug(f'\u7ed3\u675f\u6d88\u8d39')\n        message.ack()  # \u53d1\u9001ACK\u786e\u8ba4\u6d88\u606f\u63a5\u6536\n\n\nwith Connection('amqp:\/\/pon:pon@192.168.38.191:5672\/\/') as conn:\n    consumer = MyConsumer(conn)\n    consumer.run()\n<\/code><\/pre>\n<p>\u4fee\u6539\u5176\u5b9e\u5f88\u7b80\u5355\uff0c\u628a\u56de\u8c03\u51fd\u6570\u6539\u9020\u4e00\u4e0b\uff0c\u6536\u5230\u6536\u5230\u6d88\u606f\u4e4b\u540e\uff0c\u7acb\u523b\u8d77\u4e00\u4e2a\u534f\u7a0b\u5904\u7406\uff0c\u8ba9\u534f\u7a0b\u5230\u540e\u53f0\u6162\u6162\u5904\u7406\uff0c\u4fdd\u6301\u56de\u8c03\u51fd\u6570\u6c38\u8fdc\u4e0d\u963b\u585e\u5c31\u597d\u4e86<\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000043983238\">https:\/\/segmentfault.com\/a\/1190000043983238<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4f7f\u7528 nameko \u7684\u65f6\u5019\uff0c\u8bbe\u7f6e max_workers \u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u5e76\u53d1\u7684\u6d88\u8d39 \u6211\u81ea\u5df1\u7528 eventlet+ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-10008057","post","type-post","status-publish","format-standard","hentry","category-share"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10008057","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10008057"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10008057\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10008057"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10008057"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10008057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}