# RabbitMQ

RabbitMQ 即一个消息队列,主要来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用

# 传统模式

这个流程,全部在主线程完成,注册 -》入库 -》发送邮件 -》发送短信,由于都在主线程,所以要等待每一步完成才能继续执行。由于每一步的操作时间响应时间不固定,所以主线程的请求耗时可能会非常长,如果请求过多,会导致 IIS 站点巨慢,排队请求,甚至宕机,严重影响用户体验。

# 常用方式

这个流程是主线程只做耗时非常短的入库操作,发送邮件和发送短信,会开启 2 个异步线程,扔进去并行执行,主线程不管,继续执行后续的操作,这种处理方式要远远好过第一种处理方式,极大的增强了请求响应速度,用户体验良好。缺点是,由于异步线程里的操作都是很耗时间的操作,一个请求要开启 2 个线程,而一台标准配置的 ECS 服务器支撑的并发线程数大概在 800 左右,假设一个线程在 10 秒做完,这个单个服务器最多能支持 400 个请求的并发,后面的就要排队。出现这种情况,就要考虑增加服务器做负载,尴尬的增加成本。

# RabbitMQ

这个流程是,主线程依旧处理耗时低的入库操作,然后把需要处理的消息写进消息队列中,这个写入耗时可以忽略不计,非常快,然后,独立的发邮件子系统,和独立的发短信子系统,同时订阅消息队列,进行单独处理。处理好之后,向队列发送 ACK 确认,消息队列整条数据删除。这个流程也是现在各大公司都在用的方式,以 SOA 服务化各个系统,把耗时操作,单独交给独立的业务系统,通过消息队列作为中间件,达到应用解耦的目的,并且消耗的资源很低,单台服务器能承受更大的的并发请求

# 消息队列

对于消息队列:我们一般知道有三个概念:发消息者、队列、收消息者,RabbitMQ 在这个基本概念之上,多做了一层抽象,在发消息这和队列之间,加入了交换器这样发消息者和队列就没有直接联系,转而变成发消息者吧消息给交换器,交换器根据调度策略再把消息传给队列

# 交换机

交换机的功能主要是接收消息并且转发到绑定的队列

交换机类型 Direct 类型、Topoc 类型、Headers 类型、和 Fanout 类型
Direct 是 RabbitMQ 默认的交换机模式,也是最简单的模式。即创建消息队列的时候,指定一个 BindingKey. 当发送者发送消息的时候,指定对应的 Key. 当 Key 和消息队列的 BindingKey 一致的时候,消息将会被发送到该消息队列中。

Topic 转发信息主要是依据通配符,队列和交换机的绑定主要是依据一种模式 (通配符 + 字符串), 而当发送消息的时候,只有指定的 Key 和该模式相匹配的时候,消息才会被发送到该消息队列中。

Headers 是根据一个规则进行匹配,在消息队列和交换机绑定的时候会指定一组键值对规则,而发送消息的时候也会指定一组键值对规则,当两组键值对规则相匹配的时候,消息会被发送到匹配的消息队列中。

Fanout 是路由广播的形式,将会把消息发给绑定它的全部队列,即便设置了 key, 也会被忽略。

阅读次数

请我喝[咖啡]~( ̄▽ ̄)~*

Zhouy 支付宝

支付宝

Zhouy 宝贝不是paypal

宝贝不是paypal

Zhouy 微信支付

微信支付