- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
RabbitMQ的基本概念和模型
RabbitMQ是一种消息队列,用于程序间的通信。形象地说,MQ就像一个邮局,发送者将消息写入MQ,MQ负责把消息发送给接收者。RabbitMQ可支持Java, PHP, Python, Go, JavaScript, Ruby等多种语言。几个基本概念图1 rabbit_modelRabbitMQ的基本模型如图1所示。先介绍一些术语。生产者(producer)在图中为P,表示消息的发送者。交换机(exchanges)在图中为X, 生产者发过来的消息需要经过交换机,交换机将决定将消息放到哪些队列当中。队列(queue)队列在图1中由红色矩形阵列表示,负责保存消息和发放消息。消费者(consumer)在图中为C,代表等待接收消息的程序。信息流消息是怎么从生产者传递到消费者的呢?首先,生产者发送消息到交换机,同时发送一个key,通过这个key,交换机就知道该把消息发到哪个队列。随后交换机把消息发送到相应的队列中。由队列将消息发送给消费者。消费者监听某些队列,当有消息过来时,就立即处理消息。那么,接下来就有两个问题:交换机是如何根据key来分配消息到队列?队列怎样将消息发送给消费者?交换机类型这个部分将回答第一个问题。交换机如何根据key来分配消息到队列?RabbitMQ的交换机有四种类型:direct, topic, headers, fanoutfanoutfanout交换机就跟广播一样,对消息不作选择地发给所有绑定的队列。以图1为例,两个队列都将收到消息。direct图2 direct在direct模式里,交换机和队列之间绑定了一个key,只有消息的key与绑定了的key相同时,交换机才会把消息发给该队列。如图2所示,消息的key为orange时,消息将进入队列Q1;key为black或者green时,消息将进入队列Q2。若消息的key是其他字符串,被交换机直接遗弃。图3 多重绑定同时,交换机支持多重绑定,多个队列可以以相同的key与交换机绑定。如图3所示,当消息的key为black时,消息将进入Q1和Q2.topictopic模式可以理解为主题模式,当key包涵某个主题时,即可进入该主题的队列。topic模式的key必须具有固定的格式:以”.”作为间隔的一串单词;比如:“quick.orange.rabbit”,key最多不能超过255byte。交换机和队列的key可以以类似正则表达式的方式存在,有两种语法:“*”可以替代一个单词“#”可以替代0个或多个单词图4 topic图中,Q1与交换机绑定的kye为:“*.orange.*”,故当消息的key为三个单词,且中间的单词为orange时,消息将进入Q1。Q2与exchange绑定的key为”rabbit.#”,当消息的key以rabbit开头时,消息将进入Q2。其实,图中的key描述的是动物的属性,第一个单词表示反应速度,第二个单词表示颜色,第三个单词表示名称。绑定的key定义了它们的筛选规则,所有橘色的动物都将进入Q1,所有懒洋洋的动物都将进入Q2,老鼠也将进入Q2下面给出更具体的例子帮助理解:key – 进入的队列lazy.orange.elephant – Q1和Q2quick.orange.fox – Q1quick.orange.fox – Q2quick.brown.fox – 被直接无视headers官网没介绍这个模式。队列分发消息的方式这一部分将回答第二个问题。队列怎样将消息发送给消费者?图5 Round-robin dispatching循环发放(Round-robin dispatching)队列分发消息给消费者的方式采用循环发放。举例来说,若队列里有四个消息w,x,y,z,则C1将得到消息z和x,C2将得到消息y和w。即每个消费者按顺序每人发一个消息。注意,在这种分配方式下,消息其实在刚进入队列的时候就已经内定好将要被分发的消费者。即z,x一定是给C1,y,w一定是给C2。这种方式存在一些隐患,如果z和x都是耗时的命令、y,z都是简单的命令,C1将不停地工作,而C2就比较空闲,造成资源浪费。公平发放解决了上述问题。公平发放(fair dispatching)这种方式下,队列只会把消息给空闲的消费者。如果它看到某个消费者正忙,就查找下一个空闲消费者。java中,公平发放的实现:使用basicQos()方法将 prefetchCount 设为1。intprefetchCount = 1;channel.basicQos(prefetchCount);消息的确认(Message acknowledgment)若没有特别设定,消息一旦被队列分发给消费者,就被rabbitmq从内存中删除。在这种情况下,如果将一个正在处理消息的消费者强行关闭,那么,消息将未被完全处
文档评论(0)