目录
什么是消息中间件?
消息中间件基于队列模型实现异步/同步传送数据。只关注数据的发送与接收。
简单点的说:就是一个转发器:生成-队列存储-消费。
传统的http请求存在哪些缺点?
- http请求基于请求与响应模型,在高并发的情况下,客户端发送大量的请求到达服务器端可能会导致我们服务器端处理请求堆积。
- tomcat服务器处理每个请求都有独立的线程,如果超过最大线程数会将该请求缓存到队列中,如果请求堆积过多的情况下,可能会导致tomcat服务器崩溃的问题。
- http请求在处理业务逻辑比较耗时的情况下,容易造成客户端一直等待,阻塞等待过程中会导致客户端超时,发生重试策略,有可能引发幂等问题。
注意事项:接口在http协议的情况下,最好不要处理比较耗时的业务逻辑,耗时的业务逻辑应该交给多线程或者是mq进行处理。
Mq应用场景
- 异步发送短信
- 异步发送邮件
- 处理一些比较耗时的操作
应用场景:最终都是因为处理一些比较耗时的操作。
MQ使用的原因?
可以解决上述问题。实现支撑高并发、异步解耦、流量削峰等。
常用的消息中间件都有什么,优缺点是什么?
多线程与mq的区别:
- 持久化:使用多线程如果该机器宕机,则创建的线程全部消失,会导致子线程任务丢失,MQ有持久化操作,将队列中的信息保存在了硬盘上。
- 流量削峰:挡大量数据发送请求时,MQ可以将消息存储到消息容器中。使用多线程,会创建大量的线程。Tomcat默认只有200个线程,如果使用线程池,大量线程进来,会直接将线程灌满。再创建线程会触发淘汰策略,直接拒绝。
- 资源消耗:多线程会耗费CPU资源,但MQ不会,可以配置一个再拿下一个,始终保持内存最佳状态。
- 服务器集群:MQ可以更均衡的分配到每个服务器。多个服务器会同时向MQ拿取消息。多线程在哪台服务器上开启就会在哪台机器上执行,会导致任务倾斜,使某个服务器开启了大量的线程,其他服务器却很空闲(nginx可以根据负载均衡解决服务器分配问题)
RabbitMQ架构图
MQ消息中间件名词:
- Producer:生产者:投递消息到 Broker 中
- connection:连接。与Broker中建立的连接(与jdbc连接数据库一样)。
- channel:信道。jdbc连接数据库的时候,开关连接耗费大量资源。从而使用数据库连接池。此时信道目的一样。
- Broker:简单的说,就是一个消息队列服务器实体。即安装的整个RabbitMQ。
- Virtual Host:虚拟主机。感觉就跟redis中的16个data一样,只是用来做一下区分。以便开发人员使用。
- Exchange:消息交换机。指定消息路由到队列的规则。类似于nginx中的代理指向。
- Queue:消息队列载体,每个消息将被发送到一个或者多个队列中。
- Consumer:消费者。接收消息的程序。