拉卡拉电签版
您当前的位置:主页 > 行业资讯 >

支付系统架构中的消息总线技术

2020-01-13 来源:安全付 作者:Memory

  本文为第三方支付技术与监督,其中一章节,如需查看全文,请点击:《第三方支付技术与监督》全文

  1.消息总线

  近年来,我国第三方网上支付发展迅速,对社会经济和金融发展的影响已不容忽视,由于其业务的不断发展,支付系统用户数不断增加,子系统也越来越多,对支付系统的主要需求体现在以下两个方面。

  (1)系统可用性高,能够支持大并发量的用户交易

  对于传统的采用同步接口的系统来说,一个交易事务的开始必须依赖于前一交易事务的结束,无法支持大并发量的交易,用户很容易感觉到不流畅,特别是在商户的促销高峰,推出一些特价、团购、秒杀等促销活动时,用户经常掉线或打不开网站,用户体验非常不好,导致了用户的流失。

  (2)能够共享异构系统的数据,易于系统维护

  随着业务的演进,应用系统必然产生持续改进的维护性需求。如果各个应用系统之间相互独立,没有根据完整的业务流程有机串接起来,则在增加或改进业务功能时,可能需要对关联的多个应用系统都做出调整。例如,在用户支付过程中,成功支付后,系统发送给用户一条支付成功的短信,并且通知账务系统进行记账处理。在参与协作的各个应用系统的开发商不同、技术路线不统一的情况下,业务改进困难重重。同时,相互协作的应用系统之间还存在兼容性问题。某个应用系统的调用接口调整后,可能导致与其他应用系统之间的交互产生问题,这些问题往往在部署运行后才被发现,对业务流程可能产生严重影响,甚至导致业务中断。

  消息中间件可以有效地解决上述两个问题。基于消息中间件的异步消息传递的主要优势有:通过增加系统吞吐量和减少系统响应时间,解决系统瓶颈,通过解耦提高系统的可伸缩性,采用发送后无须等待回应的方式,使业务人员立即开始后续工作,从而提高其生产率。在异构的平台之间实现通信和集成,总之,作为企业级应用架构,基于消息中间件的异步消息传递技术具有体系结构上的灵活性和敏捷性。

  目前,基于消息总线实现主要分为两种:一种是自主研发类,另一种是采用消息中间件类。自主研发类可控性强,但开发周期较长。消息中间件有商用和开源两大类。随着Java的发展,JMS已经成为实际上的消息中间件标准,基于JMS的消息中间件更具备广泛的适用性。目前,比较流行和成熟的商业消息中间件有IBM的MQSeries, BEA的Weblogic JMS Service 、Progress的SonicMQ及微软的MSMQ。开源中间件中基于JMS的有ActiveMQ和OpenJMSjBossMQ等,开源中间件相对于商用的更加可控,并且成本更低。

  2.ActiveMQ消息中间件

  ActiveMQ由Apache组织开发的开源的企业级消息中间件(MOM),完整实现了JMS服务,同时具备了高性能、高可用和高扩展的企业特性,是当前最流行的企业级消息中间件。下面主要介绍消息中间件(MOM) JMS规范及ActiveMQ消息模式。

  (1)消息中间件(MOM)

  消息中间件(MOM)是一种中间件软件,它具备高效可靠的消息传递机制。它不仅能够通过异步传递消息机制,大大增加系统吞吐量和减少系统响应时间,减轻系统瓶颈,而且还可以有效屏蔽异构系统的细节,组成松耦合的系统,提高可维护性,为异构系统基本消息的交互提供有效的手段。

  MOM在企业中的应用已经十分广泛,各家厂商都推出自己的MOM产品。但是每家都使用自己的规范,在后期使用时,反而给系统带来很大的困难,不仅延长系统的部署时间,同时还增加了系统部署的复杂性。2003 年JCP(Java标准组织)发布的Java领域的MOM规范,也就是JMS(Java Message Service,Java消息服务),解决了这一问题。随着Java的发展,JMS已经成为实际上的MOM标准。

  (2) JMS规范

  JMS使用集中式体系结构。一般而言,每个客户端只会收到消息服务器给自己发送的消息,不能看到消息服务器给其他客户端发送的消息。消息传递系统依赖于一台消息服务器,客户端之间传递的消息都是由消息服务器进行处理。这样任意添加或者删除某. 一个客户端不影响整个消息传递系统。集中式体系结构使用星形拓扑结构,一台集中式消息服务器连接着所有的客户端。

  (3) ActiveMQ 的消息模式

  ActiveMQ在此过程中的角色是消息代理,发送消息给消息代理的一方称为消息生产者,从消息代理接收消息的一方就称为消息消费者,消息消费者收到消息代理的消息后,如果确定接收,就给消息代理返回确认接收消息。

  消息模式分为点对点和发布订阅两种模式:

  ●点对点的消息模式

  点对点的消息模式是消息生产者把消息放人ActiveMQ消息代理创建的队列实现的,队列中的消息只能有一个消息接收者。虽然消息有优先级,但也仅仅限于消息从生产者到达消息代理的时候能够保证优先级别高的先进人消息队列,而进人消息队列后,则是严格按照先进先出的原则把消息发送给消费者。

  ●发布订阅模式

  发布订阅模式类似于电视广播,是一对多的关系,适用的场景多是生产者少于消费者的情况。当消息生产者把消息送到某一个主题对象中的时候,ActiveMQ消息代理会以广播的形式发送给所有关注此主题的消费者,如果有新的消费者订阅了此主题,它还可以把以前的消息再次发送给尚未接收过消息的消费者。

  3. ActiveMQ特性

  ActiveMQ的企业级特性包括跨平台、异步、集群、持久化、消息监控等企业特性。

  (1)跨平台:ActiveMQ支持跨平台特征。由于ActiveMQ是由Java语言编写的,继承了Java的跨平台性,可以在Linux、Windows.UNIX等操作系统中运行。

  (2)异步消息:ActiveMQ提供发送异步消息的功能。通过使用异步功能,可以明显提高系统的性能,加快系统的响应速度。ActiveMQ在不同的层面提供异步消息的功能,比如消费者层面等。一般而言,针对处理消息时间比较长的消费者使用异步消息,相反,对于消息消费比较快的消费者,一般使用同步消息。

  (3)集群:ActiveMQ集群主要有两种方式,即均衡模式和主备模式。均衡模式的集群能够实现均衡负载,但是存在单点故障,在某个节点出故障时,可能导致数据丢失;主从模式集群能够解决数据不丢失的问题,如果主机宕机,则备机自动升级成主机继续工作,如果及时重新启动主机,则原来升级而来的主机就恢复成备机运行,但是这种集群模式在访问量很大的情况下不能进行负载均衡,效率较低。

  (4)消息持久性:ActiveMQ提供消息的持久化的能力,保证数据不丢失。当消息的接收者不在活动状态,或者是网络原因,或者是系统在处理完一部分消息之后,系统宕机了,最常见的是对消息接收者进行日常维护升级,需要重启服务,这时候ActiveMQ持久化的特性就显得尤为重要了,在消息接收者重新注册后,积压在队列中的消息就发送到消息接收者那里了。消息持久化还有一个好处,就是在ActiveMQ服务器因某种原因宕机,新的消息不能到达消息中心是不可避免的问题,但是已经在消息中心的消息则不会因为ActiveMQ的宕机而丢失,当ActiveMQ重新启动后,持久化的消息会被重新读取到队列中,继续原有的流程,这一点很重要。ActiveMQ 的持久化采用的方式是消息保存到本地文件或者数据库中,本地文件持久化是其默认的持久化方式,包括本地文件和本地文件数据库两种形式,单机使用时效率较高。当使用集群的时候,本地文件就需要共享,以达到消息共享的目的,这个时候使用通用数据库的持久化方式就灵活很多了,而且可以通过数据库的集群达到更加安全的效果。

  (5)SSL的完美支持:系统要处理敏感的用户数据,数据通信的安全性就显得尤为必要。数据加密在所难免,这无形中增加了开发的工作量,而ActiveMQ提供了基于证书的SSL数据通信,使得使用证书更加方便。

  (6)消息的优先级:在消息发送时,可按消息的优先级发送。一共分为0~9个级别,0~4级为普通消息,5~9级为加急消息。系统确保加急的消息先于普通的消息到达,但是一旦进人队列的消息,则严格按照先进先出顺序执行分发。

  (7)可以方便地监控和管理ActiveMQ的运行:对ActiveMQ的监控能够让我们清楚地知道代理、队列、主题、消费者和生产者等组件的运行状态,并可以对它们进行操作。

  能够根据其对组件的统计,分析系统的性能,找到ActiveMQ在应用中的瓶颈,对其进行优化。通常有JMX API的监控方式和JMX监控工具两种监控与管理ActiveMQ 的方式。

  4.基于MDP的消息传递

  Spring是针对JavaEE框架较为臃肿、低效等现实问题,而提出的简化企业级应用的轻量级开源框架,Spring框架有两个显著的特点:第一个是控制反转(InversionofCon-trol,IoC),在IoC中程序代码不负责对象的调用权和操控,而是通过容器来实现对象组件的组装和管理。第二个是面向切面的编程(Aspect Oriented Programming, AOP),在AOP中把这些重复性的功能模块,比如日志,提取出来做成一个切面(Aspect),这样就使业务逻辑的处理更纯粹干净。

  在Spring框架中有两种JMS消息传递方式:JMStemplate和messagelistenercon-tainer,前者用于产生消息和同步消息接收,后者用于异步收发消息。

  ●基于同步消息的接收

  JmSTemplate可以同步发送接收消息,但是这样需要在接收消息的模块进行控制消息的处理流程,不能使开发人员将精力投入到业务处理。

  ●基于MDP异步消息的接收

  ActiveMQ通过与Spring的整合可以实现基于消息驱动Bean(MDP)的轻量级的消息传递。使消息传递系统更加高内聚、低耦合。一般由消息监听容器的一个子类从JMS消息队列接收消息并被注人MDP。消息监听容器负责消息接收的多线程处理并将消息分发到各MDP中。消息监听容器是MDP和消息提供者之间的媒介,用来处理消息事务管理、资源获取和释放,以及异常转换等。这使得应用开发人员可以专注于消息业务逻辑,把和JMS基础框架有关的重复性的工作交由Spring框架处理。

  5.基于消息总线的支付系统架构

  采用基于消息总线的架构技术建立支付系统,提供系统服务最大的灵活性,解决异构系统的数据共享的问题。同时,通过强大的SSL安全通道确保数据的安全性。为了保证系统能够承载大量业务,架设ActiveMQ集群,通过其负载均衡、协同处理和互为备份的能力,来提升系统的高并行高可靠及安全的处理能力,提高系统资源利用率和系统可靠性。

  支付系统的各个子系统,如电子钱包子系统、支付网关子系统、短信系统、账户系统等的集成是关键,该架构充分体现了ActiveMQ跨平台、跨语言及异构环境下的优势,系统之间的交互采用消息驱动的形式,在采用消息总线架构的同时,还采用J2EE轻量级架构的分层设计和实现方式,在技术结构上分为业务接人层、业务表示层和业务处理层及数据库层,使系统的功能扩展性得到保障。

  业务表示层包括普通用户的访问界面、业务人员的管理界面、系统配置界面、交易监控界面、差错处理界面等,使用JSP + Struts Form Bean+标签库的技术方案;对交互性要求高的,如账户查询、交易监控,页面整合AJAX技术,提供浏览器与服务器端的快速交互,业务处理层基于Spring提供应用服务逻辑处理。

  业务接入层可以使用HTTP协议与网上交易系统、支付接人系统通信,使用TCP/IP协议与银行/银联相关系统通信,还包括使用WebService与其他商业系统的通信,同时,根据不同的交易类别分发到不同业务处理层处理。交易类别是指事先约定的,如账户注册、注销等,不同交易类别的消息分发到消息服务器的不同队列中,再分发到不同的业务接人层,例如,用户注册交易分发到账户注册服务上,而用户销户的交易分发到账户销户服务上。

  在消息总线层,使用了ActiveMQ消息中间件,提供高可用高性能.高扩展的服务能力。消息服务器采用集群部署,提高并发能力及消息持久化的保障,客户端证书认证提高了消息的安全性。消息总线客户端采用了ActiveMQ 与Spring 相结合的方式,利用Spring内置的JmsTemplate方法,及基于MDP的消息处理方式,将开发人员精力集中在业务处理上,减少了底层JMS的处理。消息端点的主要任务是在业务接入之后将数据转换成消息的格式,以便将消息送到对应的消息监听系统。

  服务层是针对系统的各种业务进行的,使用SpringService和POJO进行各项业务功能的封装,用Spring的配置文件进行各个业务功能流转的配置,提供服务,如账户开户、账户消费、账户支付等。

  数据库服务提供逻辑数据库概念,提供逻辑数据库划分,达到数据分类分库的效果,提升数据库整体运行性能。将数据库划分为核心交易数据库、历史交易数据库、账务及清/结算数据库、业务管理配置数据库、查询统计数据库等。后期可以根据具体业务数据量进行水平切库划分,把数据库访问量分散到不同的数据库.上,提高反应速度。同时采用数据库集群部署,保障数据库的数据完整和安全。