设为首页 收藏本站
查看: 943|回复: 0

[经验分享] 5、RabbitMQ

[复制链接]

尚未签到

发表于 2017-7-1 21:16:11 | 显示全部楼层 |阅读模式
pytho系列之 RabbitMQ - Exchange几种模式

  

  RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储

  RabbitMQ提供了四种Exchange:fanout, direct, topic, header
header模式在实际使用中较少,本文只对前三种模式进行比较。
性能排序:fanout
> direct >> topic

  。比例大约为11:10:6



六、关键字发送
  exchange type = direct
  之前事例,发送消息时明确指定某个队列并向其中发送消息,RabbitMQ还支持根据关键字发送,即:队列绑定关键字,发送者将数据根据关键字发送到消息exchange,exchange根据 关键字 判定应该将数据发送至指定队列。
  1.生产者:

import pika
import sys

connection
= pika.BlockingConnection(pika.ConnectionParameters(
        
host='localhost'))
channel
= connection.channel()

channel.exchange_declare(
exchange='direct_logs',
                        
type='direct')

result
= channel.queue_declare(exclusive=True)
queue_name
= result.method.queue

severities
= sys.argv[1:]
if not severities:
    sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
    sys.exit(
1)

for severity in severities:
    channel.queue_bind(exchange='direct_logs',
                       
queue=queue_name,
                       
routing_key=severity)

print('
  • Waiting for logs. To exit press CTRL+C')

    def callback(ch, method, properties, body):
        print(" [x] %r:%r" % (method.routing_key, body))

    channel.basic_consume(callback,
                         
    queue=queue_name,
                         
    no_ack=True)

    channel.start_consuming()



    2、消费者

    import pika
    import sys

    connection
    = pika.BlockingConnection(pika.ConnectionParameters(
            
    host='localhost'))
    channel
    = connection.channel()

    channel.exchange_declare(
    exchange='direct_logs',
                            
    type='direct')

    severity
    = sys.argv[1] if len(sys.argv) > 1 else 'info'
    message = ' '.join(sys.argv[2:]) or 'Hello World!'
    channel.basic_publish(exchange='direct_logs',
                         
    routing_key=severity,
                         
    body=message)
    print(" [x] Sent %r:%r" % (severity, message))
    connection.close()




    一、Direct Exchange
    DSC0000.png

      任何发送到Direct
    Exchange的消息都会被转发到RouteKey中指定的Queue。


    1.一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下文称其为default
    Exchange)。
    2.这种模式下不需要将Exchange进行任何绑定(binding)操作
    3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
    4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。

      

    二、Fanout Exchange
                                      DSC0001.png
      

      任何发送到Fanout
    Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。


    1.可以理解为路由表的模式
    2.这种模式不需要RouteKey
    3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。
    4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。

      

    三、Topic Exchange
    DSC0002.png

      

      任何发送到Topic
    Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上


    1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列。
    2.这种模式需要RouteKey,也许要提前绑定Exchange与Queue。
    3.在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
    4.“#”表示0个或若干个关键字,“*”表示一个关键字。如“log.*”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
    5.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息

      

      

      

      



    来自为知笔记(Wiz)

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390222-1-1.html 上篇帖子: windows server 2008 R2 SP1 安装exchange 2010 下篇帖子: Install Exchange Server 2013 on Windows Server 2012
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表