rabbitmq消息队列集群集群,怎么实现消费者只从一个队列收到一份消息

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&当前访客身份:游客 [
这个人很懒,啥也没写
:理性评论,文明上网
今日访问:0
昨日访问:4
本周访问:62
本月访问:15
所有访问:2131
RabbitMQ(2)-消息通信篇
发表于3个月前( 11:44)&&
阅读(880)&|&评论()
0人收藏此文章,
关于rabbitmq的基本概念这里不再说明,百科讲的很详细,
?1.为什么使用信道(channel)而不使用TCP连接发送AMQP命令??
对操作系统来说频繁的建立和销毁TCP连接开销非常昂贵,而操作系统每秒建立的连接是有上限的,性能瓶颈不可避免,而只建立一条TCP连接无疑是一个很好的方案,在这条连接当中建立多条信道与RabbitMQ进行私密通信,相当于光纤电缆一样,一条电缆有多条光束,信道是没有限制的
&&&&1)AMQP的命令basic.consume与basic.get
如果需要消息一到达队列就自动接收的话,应该使用basic.consume
basic.get会订阅消息,获得单条消息,然后取消订阅,值得注意的是不应该循环basic.get来替代basic.consume,应该理性使用basic.consume实现高吞吐量
消息如果到达无人订阅的队列,消息会在队列中等待,知道有消费者订阅到该队列
&&&&2)接收消息
消费者确认消息告诉RabbitMQ已正确接收RabbitMQ会安全的把消息从队列上删除,
如果消费者收到一条消息,确认之前RabbitMQ断开了连接(或者从队列上取消订阅),RabbitMQ会认为这条消息没有被分发,然后分发给下一个订阅者。如果应用程序处理消息耗时,则可以延迟确认消息,防止源源不断的消息涌入
&&&&3)拒绝接收
消息未确认之前
a.消费者从RabbitMQ服务器断开连接,它会将消息入队并发送给下一个消费者,但是这种连接/断开方式会增加服务器负担
b.可以使用basic.reject命令拒绝接收消息,参数为true,会发送给下一个消费者,false时,会把消息从队列中移除不会分发给下一个消费者
&&&&4)队列设置
如果想拥有私人队列只为一个消费者服务,可以设置exclusive参数为true
如果需要临时队列和结合exclusive和auto_delete,auto_delete在消费者取消订阅时,会自动删除,都设置为true
3.三种基本交换类型
direct交换器非常简单:如果路由键匹配的话,消息就会被投递到相应的队列当中;
fanout交换器会将收到的消息广播到绑定的队列上;
topic交换器使得来自不同源头的消息能够到达同一个队列。
4.虚拟主机(vhost)的作用
a.逻辑分离允许为不同应用程序安全保密的运行数据,将rabbit的众多客户区分开来,避免队列和交换器的命名冲突;
b.权限控制以vhost为单位;
c.vhost之间是绝对隔离的,无法将vhost1上的交换器绑定到vhost2中的队列去;
d.可以安全的迁移到新的RabbitMQ服务器上处理新的负载,不会有任何命名冲突
e.vhost不仅消除了在基础架构中为每一层都运行一个RabbitMQ服务器,也避免了为每一层创建不同集群
5.持久化的策略
durable属性决定了RabbitMQ是否需要在崩溃或者重启之后重新创建队列(或者交换器)
持久化消息三个要点:
把他的投递模式(delivery mode)选项设置为2(持久);
发送到持久化的交换器上;
到达持久化的队列。
持久性消息从服务器重启中恢复的方式是写入磁盘的持久化日志文件,当发布一条持久性消息到持久化的交换器上时,消息提交到日志文件后才会响应;
持久性消息如果路由到了非持久化的队列当中,会自动从持久性日志中移除,无法从服务器重启中恢复;
一旦被正确消费(经过确认后),RabbitMQ会在持久化日志中将这条消息标记为等待垃圾收集。在消费之前,如果重启,服务器会重建交换器和队列以及绑定,重播持久性日志文件中的消息到合适的队列或者交换器上,这取决与宕机时消息处在哪个环节上
6.解决事务的方案:发送方确认模式?
由于AMQP内部事务对性能有很大瓶颈,现采取发送方确认模式保证事务,将信道设置为confirm模式,所有在此信道上发布的消息都会有一个唯一的ID号,当被投递到匹配的队列时,信道就会发送一个发送方确认模式给生产者应用程序,这个模式是异步的,应用程序可以等待确认的同时继续发送下一条,但如果是持久化的消息,会在写入磁盘之后消息发出。
如果发送内部错误而导致消息丢失,RabbitMQ会发送一条nack(not acknowledged,未确认)消息,这种模式下每分钟可追踪数以百万计的消息投递
?7.& 性能特点?
&&&&7.1&&&&可靠性(Reliability)?
&&&&&&&&RabbitMQ提供很多特性供我们可以在性能和可靠性作出折中的选择,包括持久化、发送确认、发布者确认和高可用性等。
&&&&7.2&&&&弹性选路(Flexible Routing)
&&&&&&&&消息在到达队列前通过交换(exchanges)来被选路。RabbitMQ为典型的选路逻辑设计了几个内置的交换类型。对于更加复杂的选路,我们可以将exchanges绑定在一起或者写属于自己的exchange类型插件。
&&&&7.3&&&&集群化(Clustering)
&&在一个局域网内的几个RabbitMQ服务器可以集群起来,组成一个逻辑的代理人。
&&&&7.4&&&&联盟(Federation)
&&&&&&&&对于那些需要比集群更加松散和非可靠连接的服务器来说,RabbitMQ提供一个联盟模型(Federation Model)
&&&&7.5&&&&高可用队列(High Available Queue)
&&&&&&&&可以在一个集群里的几个机器里对队列做镜像,确保即时发生了硬件失效,你的消息也是安全的。
&&&&7.6&&&&多种协议(Multi-protocol)
&&&&&&&&RabbitMQ支持消息在多种协议中传输。
&&&&7.7&&&&多客户端(Many Clients)
&&&&&&&&RabbitMQ客户端有你几乎能想象到的任何语言。
&&&&7.8&&&&管理界面(Management UI)
&&&&&&&&RabbitMQ附带一个容易使用的管理界面,允许您监控和控制你的消息broker服务器的方方面面。
&&&&7.9 & &跟踪(Tracing)
&&&&&&&&如果你的消息系统行为异常,RabbitMQ提供跟踪支持来找出错误的根源。
&&&&7.10 & &插件系统(Plugin System)
&&&&&&&&RabbitMQ提供各种方式的插件扩展,我们可以实现自己的插件。
  使用任务队列一个优点是能够轻易地并行处理任务。当处理大量积压的任务,只要增加工作队列,通过这个方式,能够实现轻易的缩放。
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读RabbitMQ(python实现)学习之二:Producer发送消息至多个消息队列queue(广播消息)
分类:程序语言|标签:Python|日期:
1.1本部分内容简介
这部分我们将要发送一个消息到多个Consumer,这部分称之为“publish/subscribe”
我们实现的方式就是发送端,发送一个消息,与此同时,多个接收端将同时接收到消息并打印在屏幕上面。
1.2exchange简介
在前面的博文中,我们的讲解是:发送端发送消息至消息队列,接收端从消息队列获取消息。现在我们来介绍一下rabbitmq的完整消息传送模型。
&Producer:用来发送消息的应用程序
&queue:用来存储消息的缓存
&Consumer:用来接收消息的应用程序
消息传送模型的核心是,Producer从不会直接将消息传送给queue,而是,将消息传送给exchange,exchange是个很简单的东西,在一侧,他接收来自Producer的消息,另一侧将消息传送给queue。exchange将消息传送给你个queue,还是传送给多个queue,这主要是由exchange的type决定。模型图如下:
        
exchange有很多type可用,如下:direct、topic、headers、fanout。本博客针对fanout讲解,后续博文对其他类型有所讲解,让我们创建一个exchange,type为fanout,名字为logs,代码如下:
channel.exchange(exchange='logs',type='fanout')
对于type为fanout的exchange,理解起来非常简单,它将接收到的消息,广播给他所知道的所有的queue,即所有和他建立连接的queue。前面的博文降到了命令行查看list_exchanges的命令如下:
$ :sudo rabbitmqctl list_exchanges
Listing exchanges ...
amq.direct
amq.fanout
amq.headers
对于上图中,你会看到很多amq.*的exchange,这些是系统默认建立的,在你不建立exchange时,系统默认建立上面几个。
对于消息的发布函数basic_publish()也随之变为:
channel.basic_publish(exchange='logs',routing_key='',body=message)
1.3临时queue
&正如你前面学到的,对于一个queue,会有自己的名字(hello什么的),
result = channel.queue_declare()
然后通过result.method.queue,系统会随机给queue命名。
如果我们想Producer与Consumer断开连接时,队列queue删除,那么需要改成下面的代码:
result = channel.queue_declare(exclusive=True)
1.4Bingings(将queue与exchange绑定)
模型图如下:
        
我们已经创建了一个type为fanout的exchange,现在,我们要告诉exchange,将消息发送给我们自己定义的queue,在exchange与queue之间建立连接的是binding,代码如下:
channel.queue_bind(exchange='logs',queue=result.method.queue)
在命令行查看binding的列表,命令如下:
$: sudo rabbitmqctl list_bindings
&1.5最终代码
最终的模型如下:
        & &
send.py代码如下:
import pika
import sys
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='logs',
type='fanout')
message = ' '.join(sys.argv[1:]) or &info: Hello World!&
#如果键盘有输入,message为键盘输入,如果键盘没有输入,消息message=&info: Hello World!&;
channel.basic_publish(exchange='logs', routing_key='', body=message) print & [x] Sent %r& % (message,) connection.close()
receive.py代码
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='logs',
type='fanout')
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
channel.queue_bind(exchange='logs',
queue=queue_name)
print ' [*] Waiting for logs. To exit press CTRL+C'
def callback(ch, method, properties, body):
print & [x] %r& % (body,)
channel.basic_consume(callback,
queue=queue_name,
no_ack=True)
channel.start_consuming()
1.6代码测试
开启一个命令行窗口,运行send.py:
$: python send.py
#(此时你传送的内容为info: Hello World!)或者
$: python send.py message #message为你想发送的内容
开启两个命令行窗口,分别运行receive.py,两个窗口你会看到有相同的消息输出:
$: python receive.py
文章署名:
文章地址:
优质IT资料分享网,由广大资源爱好者通过共享互助而共享各种学习资料,但本站无法保证所共享,资料的完整性和合理性
如果有资料对您的合法权益造成侵害,请立即联系我们处理}

我要回帖

更多关于 rabbitmq查看消息队列 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信