一、系统间通信技术介绍
如果是一个业务被拆分成多个子业务部署在不同的服务器上,那就是分布式应用;如果是同一个业务部署在多台服务器上,那就是集群。分布式应用的子系统之间并不是完全独立的,它们需要互相通信来完成某个功能,这就涉及系统间通信了。
业界通常有两种方式来实现系统间通信,其中一种是基于远程过程调用的方式;另一种是基于消息队列的方式。前一种就是常说的RPC调用,客户端不需要知道调用的具体实现细节,只需直接调用实际存在于远程计算机上的某个对象即可,但调用方式看起来和调用本地应用程序中的对象一样。
RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
- 它是协议,说明是一种规范,就需要遵循这套规范的实现。典型的RPC实现包括Dubbo、Thrift、GRPC等。
- 网络通信的实现是透明的,调用方不需要关心网络之间的通信协议、网络I/O模型、通信的信息格式等。
- 跨语言,调用方实际上并不清楚对端服务器使用的是什么程序语言。
而基于消息队列的方式是指由应用中的某个系统负责发送信息,由关心这条消息的相应系统负责接收消息,并在收到消息后进行各子系统内的业务处理。
消息在被发送后可以立即返回,由消息队列来负责消息的传递,消息发布者只管将消息发布到消息队列而不用管谁来取,消息使用者只管从消息队列中取消息而不管是谁发布的,这样发布者和使用者都不用知道对方的存在。
二、消息队列的典型场景
1.解耦
对于紧耦合问题可以在模块之间调用时增加一个中间层来实现解耦,方便了以后的扩展。所谓解耦,就是一个模块只关心自己的核心流程,而依赖该模块执行结果的其他模块如果做的不是很重要的事情,有通知即可,无须等待结果。基于消息队列的模型,关心的是通知,而非处理。
2.流量削峰
在分布式系统中,经常会出现某个基础服务不可用造成整个系统不可用的情况,这种现象被称为**“服务雪崩效应”**,从而发生整个系统不可用的严重生产事故。
使用消息队列,先将短时间高并发的请求持久化,然后逐步处理,从而削平高峰期的并发流量,改善系统的性能。
3.日志收集
利用消息队列产品在接受和持久化消息方面的高性能,引入消息队列快速接受日志消息,避免因为写入日志时的某些故障导致业务系统访问阻塞、请求延迟等。
4.事务最终一致性
处理分布式事务的规范——XA。XA主要定义了全局事务管理器和局部资源管理器之间的接口。XA接口是双向的系统接口,在事务管理器及一个或多个资源管理器之间形成通信桥梁。XA引入的事务管理器充当全局事务中的协调者的角色。事务管理器控制着全局事务,管理事务生命周期,并协调资源。资源管理器负责控制和管理实际资源(如数据库或JMS队列)。目前各主流数据库都提供了对XA规范的支持。
这种方案的每一个事务操作都涉及系统间的多次通信、协调,所以它的最大缺陷是性能很差,因此并不适合在生产环境下有高并发和高性能要求的场景。
三、消息队列的功能特点
消息是指在应用间传送的数据,消息的表现形式是多样的,可以简单到只包含文本字符串,也可以复杂到有一个结构化的对象定义格式。对于队列,从抽象意义上来理解,就是指消息的进和出。一个典型意义上的消息队列,至少需要包含消息的发送、接受和暂存功能。
- Broker:消息处理中心,负责消息的接受、存储、转发等。
- Producer:消息生产者,负责产生和发送消息到消息处理中心。
- Consumer:消息消费者,负责从消息处理中心获取消息,并进行相应的处理。
在不同的业务场景中,需要消息队列产品能解决诸如消息堆积、消息持久化、可靠投递、消息重复、严格有序、集群等各种问题。
1.消息堆积
一旦在某个时间段消费者处理消息的速度没有跟上生产者发送消息的速度,必将导致消息在处理中心逐渐积压而得不到释放。比如给消息队列设置一个阈值,将超过阈值的消息不再放入处理中心,以防止系统资源被耗尽,导致机器挂掉甚至整个消息队列不可用。
2.消息持久化
常规的做法是先将消息暂存下来,然后选择合适的时机将消息投递给消费者。消息暂存可以选择将消息放在内存中,也可以选择放到文件、数据库等地方。持久化方案有很多种,比如将消息存到本地文件、分布式文件系统、数据库系统中等。
3.可靠投递
可靠投递是不允许在消息丢失的情况的。从消息的整个生命周期来分析,消息丢失的情况一般发生在如下过程中:
- 从生产者到消息处理中心
- 从消息处理中心到消息消费者
- 消息处理中心持久化消息
4.消息重复
有些消息队列为了支持消息可靠投递,会选择在接收到消息后先持久化到本地,然后发送给消费者。当消息发送失败或者不知道是否发送成功时(比如超时),消息的状态是待发送,定时任务不停地轮询所有的待发送消息,最终保证消息不会丢失,这就带来了消息可能会重复的问题。
5.严格有序
经常会碰到需要按生产消息时的顺序来消费的情形。每个环节都可能产生消息,但会要求严格按照顺序消费消息,否则在业务处理上就是不正确的。这就需要消息队列你能够提供有序消息的保证。
6.集群
集群不仅可以让消费者和生产者在某个节点崩溃的情况下继续运行,集群之间的多个节点还能够共享负载,当某台机器或网络出现故障时能自动进行负载均衡,而且可以通过增加更多的节点来提高消息通信的吞吐量。
7.消息中间件
消息中间件关注于数据的发送和接受,利用高效、可靠的异步消息传递机制集成分布式系统。中间件是一种独立的系统软件或服务程序,分布式应用系统借助这种软件在不同的技术之间共享资源,管理计算资源和网络通信。中间件在计算机系统中是一个关键软件,它能实现应用的互联和互操作,能保证系统安全、可靠、高效运行。中间件位于用户应用和操作系统及网络软件之间,它为应用提供了公用的通信手段,并且独立于网络和操作系统。中间件为开发者提供了公用与所有环境的应用程序接口,当在应用程序中嵌入其函数调用时,它便可利用其运行的特定操作系统和网络环境的功能,为应用执行通信功能。
消息传输中间件(MOM)简化了应用之间数据的传输,屏蔽了底层的异构操作系统和网络平台,提供了一致的通信和应用开发标准,确保在分布式计算网络环境下可靠、跨平台的信息传小数和数据交换。它基于消息队列的存储-转发机制,并提供了特有的异步传输机制,能够基于消息传输和异步事务处理实现应用整合与数据交换。