RabbitMQ学习笔记1

博主从事网络编程3年了,但是说来惭愧的是,工作中没有使用过消息队列。所以呢,打算从今天开始系统学习一些消息队列相关的知识,博客也就作为笔记了。记录一下自己的一些理解过程,有不对之处希望各位指出。

生产者、消费者与消息队列

首先呢,消息队列不生产数据,他只是一个信息的搬运工具。数据由生产者提供,经过消息队列的传递,最终消费者接受到了数据。就好比厨师,餐车,顾客的关系:厨师做饭(生产者),餐车把饭菜由后厨送到顾客的餐桌(消息队列),顾客吃到饭菜(消费者)。以上内容可以由下图进行表示:

消息通信

应用程序和Rabbit代理服务器中间创建一条TCP连接。一旦TCP连接打开,那么应用程序就可以在TCP的内部建立一条虚拟连接的信道,每一条消息都是根据虚拟连接的先到发送的。

为什么要建立信道,而不是直接通过TCP连接进行通讯的呢?因为对于操作系统拉说,建立和销毁TCP会话是非常高昂的开销。

简单看一下,一个TCP连接需要什么样的资源:

内核内存(包括各种数据结构及分配的缓冲区)、文件描述符、端口、地址(源IP 源端口 目标IP 目标端口,这四元组构成了一个唯一的tcp连接)、系统总的打开文件数。

1)端口,可以在1024-65535之间任选一个,

2)文件描述符fd,每个tcp连接占用一个,那么一个文件描述符下的文件大约占1K字节,而内核对这块也有说明,文件描述符建议最多占用10%的内存。

3)内存,tcp连接需要双方接收和发送数据,那么就需要一个读缓冲区和写缓冲区。

每次建立TCP连接时,创建需要三次握手,销毁需要四次分手。如果不使用信道,那么引用程序就会使用TCP的方式连接到rabbitmq,高峰时每秒成千上万条连接会造成资源的巨大浪费(一条tcp消耗资源,成千上万的tcp会非常消耗资源),而且操作系统每秒处理TCP连接数量也是有限的,必定会造成性能瓶颈。

交换器,队列和绑定

生产者将消息发布到交换器上;最终到达队列,被消费者接收;绑定决定了消息如何从路由器到特定的队列。

交换器的类型

AMQP协议中定义了四种类型的交换器,分别是direct,fanout,topic,headers。

1)direct:

比较简单,如果路由匹配,那么消息被投递到响应队列。

比兔上图,黄瓜被投入Q1,香蕉被投入Q2,蓝莓被投入Q3;

2)fanout:

当把一条消息发送到fanout交换器时,他会把消息投递给所有附加在此交换器的队列上,允许对单条消息进行不同的反应。

没一条信道上都收到了香蕉,黄瓜和蓝莓的信息。

3)topic:

topic交换器允许来自不同源头的消息达到统一队列。

这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值