概要
对消息中间件原理和架构进行简单介绍。了解其使用场景,并对特殊情况可能产生的问题进行分析。
一、什么是消息中间件
消息中间件MQ(message queue)是一种软件系统,基于队列和消息传递技术,用于在网络环境中提供同步或异步、可靠的消息传输。
消息中间件支持在不同平台、协议、编程语言、应用程序、硬件和软件平台之间的通信。其核心机制包括消息传递和消息排队,允许应用程序组件之间进行松耦合的通信和协作。消息中间件的主要功能是在应用程序之间提供异步、可靠的消息传送,确保消息即使在接收者不可用时也能可靠传递。此外,消息中间件还提供了一组通用的API和消息传递语义,如确保消息一定会被传递且仅传递一次。
以收发短信的短信银行为例,如图所示:
如果由短信银行直接对用户进行短信分发,对应用来说负载过大,比如一次群发就要占用大量的线程,没有分法任务时又处于长时间空闲状态。用户上行短信也是如此,大量的短信对短信银行数据库和应用都带来了巨大的压力。
如果在中间加个消息中心组件,让相应的短信排队等待处理,虽然对用户来说不一定能同时收到短信,但相差时间不大,且宝贵的服务器资源也能得到充分均衡调用。
二、消息中心在实际商业场景的应用
- 如图所示,此服务目录采用双活部署模式,主中心4台,辅中心3台。服务目录是直接与用户交互的应用,他们构成zookeeper并实现同步,用于对消息中心6个分组接口的注册和调用。
- 消息中心为双中心六分组,每中心有三分组,每组主备模式部署。消息生产者随机将消息发布到消息中心的集群中;消息消费者遍历所有消息中心集群,获取消息。
可见这样的微服务部署结构属于生产者、消费者、服务注册中心的SOA架构,服务目录相当于soa架构中的服务注册中心,消息中心对上面注册的服务的调取和使用起到派发的功能,并帮助消息生产者找到对应的消息消费者。
三、消息中间件的好处
-
流量削峰
假如用户不过消息中心,可能在峰值的时候同事有上万条消息或请求发给服务器,这时候如果只考虑即使处理的话,服务器会有大量现场,很容易造成宕机。
这时候引入消息中间件,就能用较长的时间慢慢分法下去,让服务器峰值降低,减少服务器硬件资源使用量。
-
系统解耦
假设你有一个系统A,这个系统会产出一个数据,现在下游有系统B和系统C需要这个数据。这时仅需把接口暴露给B、C系统即可。
但在开发过程中,可能有多了n个系统需要使用这个数据,这样对系统A来说,它的下游系统有n个,如果要更新数据结构就要通知n个系统,十分繁琐。有消息中心就能专事转办,交给mq去处理就好了。 -
实现分布式系统架构
理论上支持消息无限堆积;可以对系统进行扩展。
四、常见的消息中间件
- RabbitMQ
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
参考百度百科 - Kafka
Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,它是完全的分布式系统:Broker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现负载均衡;Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
“Producer” 负责发布消息到Kafka broker
“Consumer” 消息消费者,向Kafka broker读取消息的客户端。
“Consumer Group” 每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。
小结
本文结合mq在实际使用场景中的应用,对mq消息中间件的功能和使用进行了介绍,对mq的意义和作用进行相应的解析。