①. 消息队列概述
①. 消息中间(消息队列)是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和最终一致性[架构]使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ, Kafka,MetaMQ,RocketMQ
②. 消息中间件的本质及设计:接受数据、接受请求、存储数据、发送数据等功能的技术服务
③. AMQP:(全称:Advanced Message Queuing Protocol)是高级消息队列协议。由摩根大通集团联合其他公司共同设计。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现由RabbitMQ等
④. 为什么消息中间件不直接使用http协议?
因为http请求报文头和响应报文头是比较复杂的,包含了Cookie,数据的加密解密,窗台吗,响应码等附加的功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要性,MQ其实就是负责数据传递,存储,分发就行,一定要追求的是高性能。
尽量简洁,快速大部分情况下 http大部分都是短链接,在实际的交互过程中,一个请求到响应都很有可能会中断,中断以后就不会执行持久化,就会造成请求的丢失。这样就不利于消息中间件的业务场景,因为消息中间件可能是一个长期的获取信息的过程,出现问题和故障要对数据或消息执行持久化等,目的是为了保证消息和数据的高可靠和稳健的运行
②. 消息中间件的使用场景
①. 异步处理:
如果某系统直接发给另外一个系统,那叫同步(dubbo);同步就是一个系统调用另一个系统,另外一个系统必须在线,调用完后你就要接收返回结果,如果说并发量很大,这种方式有问题。如果你的逻辑代码很复杂,耗时长,我们就要考虑这种异步处理了
②. 应用解耦
dubbo之间通过一个接口工程来进行两个工程的调用,从某中意义上来说是耦合的,它共同使用了这个接口。如果你一个系统调用另一个系统,不想它耦合,可以使用消息中间件
③. 流量削锋
我们去调用发短信的功能是很耗时的,在高并发的情况下,容易造成高并发的问题。这个时候我们利用消息中间件,将信息发送消息中间件,然后拿另外一个线程去接收消息,然后发消息。就进行了流量的一个削锋
如订单系统,在下单的时候就会往数据库写数据。但是数据库只能支撑每秒1000左右的并发写入,并发量再高就容易宕机。低峰期的时候并发也就100多个,但是在高峰期时候,并发量会突然激增到5000以上,这个时候数据库肯定卡死了
消息被MQ保存起来了,然后系统就可以按照自己的消费能力来消费,比如每秒1000个数据,这样慢慢写入数据库,这样就不会卡死数据库了