消息中间件(1)—— 入门

消息中间件(消息队列)

一、概念

一般认为,消息中间件属于分布式系统中一个子系统,关注于数据的发送和接收,利用高效可靠的异步消息传递机制对分布式系统中的其余各个子系统进行集成。

高效:对于消息的处理处理速度快。

可靠:一般消息中间件都会有消息持久化机制和其他的机制确保消息不丢失。

异步:指发送完一个请求,不需要等待返回,随时可以再发送下一个请求,既不需要等待。

二、优点

低耦合,不管是程序还是模块之间,使用消息中间件进行间接通信。

异步通信能力,使得子系统之间得以充分执行自己的逻辑而无需等待。

缓冲能力,消息中间件像是一个巨大的蓄水池,将高峰期大量的请求存储下来慢慢交给后台进行处理,对于秒杀业务来说尤为重要。

伸缩性,是指通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。

扩展性,主要标准就是在网站增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或者很少改动既有业务功能就可以上线新产品。

三、使用场景

异步处理

应用解耦

流量削峰

日志处理

消息通讯

四、常见消息中间件对比

五、相关概念

5.1 AMQP协议

是应用层协议的一个开放标准,为面向消息的中间件设计。

基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

目标是实现一种在全行业广泛使用的标准消息中间件技术,以便降低企业和系统集成的开销,并且向大众提供工业级的集成服务。主要实现有RabbitMQ。

5.2 连接

作为客户端(无论是生产者还是消费者),如果要与 RabbitMQ 通讯的话,必须创建一条 TCP 连接.

同时建立连接后,客户端还必须发送一条指令,让彼此知道我们都是符合 AMQP协议的

通过认证之后,客户端和 RabbitMQ 之间就可以创建一条 AMQP的信道

5.3 信道

信道是生产者/消费者与RabbitMQ 通信的渠道

生产者/消费者与RabbitMQ 通信时,首先建立一条TCP,但是建立TCP是非常消耗性能

信道则是建立在 TCP 连接上的虚拟连接,就是说 rabbitmq 在一条 TCP连接上建立成百上千个信道来达到多个线程处理

这个TCP 被多个线程共享,每个线程对应一个信道,信道在 RabbitMQ 都有唯一的ID ,保证了信道私有性,对应上唯一的线程使用。

5.4 生产者、消费者

生产者是消息的创建者,发送到rabbitmq

消费者是连接到rabbitmq,订阅到队列上消费消息

5.5 消息

包含有效载荷和标签,有效载荷指要传输的数据,标签描述了有效载荷,并且 rabbitmq 用它来决定谁获得消息,消费者只能拿到有效载荷,并不知道生产者是谁。

5.6 交换器、队列、绑定、路由键

队列通过路由键(routing key)绑定到交换器,生产者将消息发布到交换器,交换器根据绑定的路由键将消息路由到特定队列, 然后由订阅这个队列的消费者进行接收。

路由键其实就是一个不超过255字节的字符串,随便定义,比如zczc,然后与队列进行绑定

交换器的类型共有四种 direct,fanout,topic,headers,其种 headers(几乎和 direct 一样)不实用,可以忽略。

交换器类型

描述

 

directheaders

路由键完全匹配,消息被投递到对应的队列, direct 交换器是默认交换器。声明一个队列时,会自动绑定到默认交换器,并且以队列名称作为路由 键

一对一,一个路由键对应一个队列

fanout

消息广播到绑定的队列,不管队列绑定了什么路由键,消息经过交换器,每个队列都有一份

一对多

topic

通过使用“*”和“#”通配符进行处理,使来自不同源头的消息到达同一个队列,”.”将路由键分为了几个标识符,“*”匹配 1 ,“#”匹配一个 或多

类似模糊匹配

Order.*

可以匹配 Order.book

不能匹配 Order.book.1

5.7 消息确认

消费者收到的每一条消息都必须进行确认(自动确认和手动确认)

消费者在声明队列时,可以指定 autoAck 参数

当 autoAck=false时,RabbitMQ 会等待消费者显式发回 ack 信号后才从内存(和磁盘,如果是持久化消息的话)中移去消息

否则,RabbitMQ 会在队列中消息被消费后立即删除它。

采用消息确认机制后,只要令autoAck=false,消费者就有足够的时间处理消息(任务),不用担心处理消息过程中消费者进程挂掉后消息丢失的问题, 因为 RabbitMQ 会一直持有消息直到消费者显式调用 basicAck为止。

 

当autoAck=false 时,对于RabbitMQ 服务器端而言,队列中的消息分成了两部分:

一部分是等待投递给消费者的消息;

一部分是已经投递给消费者, 但是还没有收到消费者ack 信号的消息。

如果服务器端一直没有收到消费者的ack信号,并且消费此消息的消费者已经断开连接,则服务器端会安排该消息重新进入队列,等待投递给下一个消费者(也可能还是原来的那个消费者)。RabbitMQ不会为未ack的消息设置超时时间,它判断此消息是否需要重新投递给消费者的唯一依据是消费该消息的消费者连接是否已经断开。这么设计的原因是RabbitMQ 允许消费者消费一条消息的时间可以很久很久。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值