文档章节

RabbitMQ(2)-消息通信篇

你我他有个梦
 你我他有个梦
发布于 2015/12/20 11:44
字数 1796
阅读 1829
收藏 41

关于rabbitmq的基本概念这里不再说明,百科讲的很详细,

http://baike.baidu.com/link?url=SNbsY_2cN1R7j2PpPmEef0ChQbUBQ2qG6JUT5fuk6KtbYUObIYQlJQR-colcXQ1yKu2GsxuSrQWTTYEvphdzAK

1.为什么使用信道(channel)而不使用TCP连接发送AMQP命令?

对操作系统来说频繁的建立和销毁TCP连接开销非常昂贵,而操作系统每秒建立的连接是有上限的,性能瓶颈不可避免,而只建立一条TCP连接无疑是一个很好的方案,在这条连接当中建立多条信道与RabbitMQ进行私密通信,相当于光纤电缆一样,一条电缆有多条光束,信道是没有限制的

2.队列

    1AMQP的命令basic.consumebasic.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

如果需要临时队列和结合exclusiveauto_deleteauto_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提供各种方式的插件扩展,我们可以实现自己的插件。

  使用任务队列一个优点是能够轻易地并行处理任务。当处理大量积压的任务,只要增加工作队列,通过这个方式,能够实现轻易的缩放。




© 著作权归作者所有

你我他有个梦

你我他有个梦

粉丝 96
博文 130
码字总数 109764
作品 0
通州
程序员
私信 提问
加载中

评论(1)

你我他有个梦
你我他有个梦 博主
理性评论,文明上网0
在Kubernetes上使用Sateful Set部署RabbitMQ集群

前面我们已经在Kubernetes上部署了Redis – 《在Kubernetes上使用Sateful Set部署Redis》。 本篇我们继续把RabbitMQ也跑在K8S上。 1.RabbitMQ的基础知识 在正式开始部署工作之前,我们先来复...

店家小二
2018/12/14
0
0
netty 和 rabbitmq 问题 (层次/关系/区别/结合)

小弟不才,最近在关于netty和rabbitmq之间才生一些问题,希望各位不吝赐教,十分感谢。 1、netty和rabbitmq层次的问题: 我知道netty是tcp通信框架,rabbitmq是基于tcp通信封装的一种消息队列...

65535
2015/04/22
2.8K
0
RabbitMQ详解(二)------消息通信的概念

  PS:近期在南宁出差,工作比较忙,所以更新会比较慢。   说到消息通信,可能我们首先会想到的是邮箱,QQ,微信,短信等等这些通信方式,这些通信方式都有发送者,接收者,还有一个中间...

ysocean
2018/07/09
0
0
消息中间件—RabbitMQ(集群原理与搭建篇)

摘要:实际生产应用中都会采用消息队列的集群方案,如果选择RabbitMQ那么有必要了解下它的集群方案原理 一般来说,如果只是为了学习RabbitMQ或者验证业务工程的正确性那么在本地环境或者测试...

癫狂侠
2018/05/25
0
0
配置RabbitMQ默认群集模式

RabbitMQ是什么? MQ(Msaaage Queue,消息队列)是一种应用程序对应用程序的通信方式。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无须专用链接来连接它们。消息传递指...

cchenyz
2018/07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

以GPS为例,深入浅出讲解射频接收路径的匹配调试流程

RF接收路径的匹配流程----以GPS为例 调Matching前,至少准备两块板子。 一块完整PCB,有上全部零件 : 一块裸版,完全都没上零件 : 匹配前注意事项—铜管 可能很多人忽略这点,但其实这才是...

demyar
32分钟前
11
0
TI AM570x浮点DSP C66x + ARM Cortex-A15开发板的LCD触摸屏接口、LED指示灯

TL570x-EVM是一款由创龙基于SOM-TL570x核心板设计的开发板,它为用户提供了SOM-TL570x核心板的测试平台,用于快速评估SOM-TL570x核心板的整体性能。 TL570x-EVM底板采用沉金无铅工艺的4层板设...

Tronlong创龙
32分钟前
8
0
docker部署springboot项目

前提条件: 1.可以运行jar包的环境 2.机器上已经安装了docker 3.准备部署的springboot的jar包 4.Dockerfile文件 首先在xshell中连接服务器,然后再创建docker_test,在docker_test下创建jar...

故久呵呵
37分钟前
6
0
MaxCompute问答整理之10月

本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文。希望对大家有所帮助。 问题一、DataStudio中是否可以通过shell节点调取MaxCompute sql语句? 不...

一肥仔
38分钟前
7
0
GMAT阅读高速解题6招秘籍分享

在做GMAT阅读题时,你是否曾因为文章内容无聊昏昏欲睡?是否看到第二段就神游不知所云?又是否看完问题选择觉得似乎每个都是正确答案?如果上面这些情况曾经发生在你身上,那么你的阅读方式和心...

bole6
39分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部