用三个应用场景说明,解耦、异步、削峰
传统模式中,系统A的代码直接调用系统BCD的代码,系统间耦合性太强,如果此时有一个系统E需要接入系统A,还需要进行代码修改。
中间件模式中,系统A的消息写入消息队列,系统BCD按需从消息中间件中订阅,系统A不需要任何代码修改。
传统模式同步方式运行系统逻辑,比较耗时,如上图用时150ms。
中间件模式将消息写入消息队列,没有必要及时响应的业务逻辑可以异步运行,缩短耗时。
传统模式下,非常多的用户请求同时到达系统A,相当于用户请求的高峰,写入到数据库的时候就可能出现连接异常。
中间件模式下,有了消息中间件作为过渡,系统A可以根据数据库的承载能力慢慢拉取请求消息,增强系统的稳定性。
消息服务器,以服务的形式运行在server端,给各个业务系统提供核心消息数据的中转服务(消息中间件的一个实例)
消息生产者,业务的发起方,负责生产消息传输给broker
消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由broker分发到不同的订阅者,实现消息的广播
队列,PTP(点对点)模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
可以将消息放在queue中,根据需求再去处理。
对项目各系统进行解耦,降低工程系统间的强依赖程度。当应用发生变化时,可以独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束,降低了修改的工作量。
消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。
数据持久化一般都是将消息存储到本地磁盘中,也有少数消息中间件支持将数据持久化到数据库中,这都会对消息系统的性能造成一定的影响。
采用消息队列解耦处理过程后,增大消息入队和处理的频率只需要另外增加处理过程即可,便于分布式扩容。
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量无法提取预知;若为了能处理这类瞬间峰值访问,从而投入资源非常浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序(queue队列先进先出)的,并且能保证数据会按照特定的顺序来处理。
在任何重要的系统中,都会有需要不同的处理时间的元素。消息队列通过一个缓冲层来帮助任务最高效率的执行,该缓冲有助于控制和优化数据流经过系统的速度,以调节系统响应时间。
分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等,针对这些数据流进行实时或批量采集汇总,然后进行大数据分析是当前互联网的必备技术,通过消息队列可以很好地完成此类数据收集的任务。