高校智慧校园建设旨在改变师生与学校资源、环境的交互方式,开展以人为本的个性化服务,进而建立智能开放的教育环境和便利舒适的生活环境。消息中心服务可以将各类业务过程中产生的消息进行集中管理与收发,师生用户可以方便、及时、准确的获知个人所关注的各类业务状态,实现了学校消息的一站式与个性化推送。因此,消息中心成为高校智慧校园建设的一项重要内容。

  消息中心的实现依赖于高效可靠的消息队列中间件(简称消息中间件),它可以通过消息传递和消息排队模型,在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等功能。目前,应用比较广泛的消息中间件包括:RabbitMQ、ActiveMQ、Kafka、RocketMQ,其中RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议实现,该协议面向消息、队列和路由(包括点对点和发布/订阅),强调可靠性与安全性,主要应用于对数据一致性、稳定性和可靠性要求很高的场景,此外RabbitMQ还有高可用性、高易用性等优点。结合高校的统一消息服务特点(对数据一致性、稳定性和可靠性要求很高,并发量、吞吐量要求一般),考虑采用RabbitMQ来构建高校智慧校园消息中心。本文主要对基于RabbitMQ构建的智慧校园消息中心的设计方案与实现进行阐述。

RabbitMQ原理

  RabbitMQ起源于金融系统,用于在分布式系统中存储转发消息,具有易用性、扩展性、高可用性等优势,其内部结构如图1所示。

上海财经大学:消息中心点亮智慧校园

图1 RabbitMQ 内部结构

  1.Message:消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。

  2.Publisher:消息的生产者,也是一个向交换器发布消息的客户端应用程序。

  3.Exchange:交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。

  4.Binding:绑定,是消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。

  5.Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列,消息一直在队列里面,等待消费者连接到这个队列将其取走。

  6.Connection:网络连接,比如一个TCP连接。

  7.Channel:信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。

  8.Consumer:消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。

  9.Virtual Host:虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的 RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP 概念的基础,必须在连接时指定,RabbitMQ默认的vhost是“/”。

  10.Broker:表示消息队列服务器实体。

系统架构

  基于RabbitMQ的智慧校园消息中心包括:“消息汇聚层”和“消息下发层”,消息汇聚层完成业务消息的统一汇集与存储,消息下发层则以方便、有效的途径(服务门户、短信消息、微信消息等)将消息下发给师生用户。具体架构如图2所示。

上海财经大学:消息中心点亮智慧校园

图2 基于 RabbitMQ 的智慧校园消息中心架构

  1.消息汇聚层

  在消息汇聚层,对于RabbitMQ而言,生产者是消息接口API,业务系统通过调用消息接口API将消息数据放入消息队列;消费者的职责则由后台轮询程序完成。在该架构下,完整的消息集成流程如下:

  (1)业务系统调用消息接口API;

  (2)消息接口API被调用后,首先将消息数据落地到数据库表,消息记录的初始推送状态设置为“pushstatus=0”,然后以Confirm方式将消息发送给RabbitMQ;

  (3)消息接口API在接收到RabbitMQ返回的Confirm消息确认成功后,更新消息记录的推送状态“pushstatus=1”。

  (4)轮询程序从RabbitMQ队列读取消息,调用消息汇聚中心接口将消息写入消息汇聚中心数据库表。