金融信息交换FIX协议的业务实现方法、装置及系统
技术领域
本发明涉及互联网技术领域,尤其涉及一种FIX协议的业务实现方法、装置及系统。
背景技术
金融信息交换(Financial Information eXchange,简称FIX)协议是一种不受单一实体控制的开放消息标准,能够被调整组建适应任何一个企业的商务需求,用于促进与安全交易相关的信息交换。FIX协议最早用于支持美国国内的委托人间基于直接信息流转的证券交易,随着时代的发展,FIX协议还进一步增加了衍生工具及其它产品的业务领域,包括集成投资、金融衍生产品及外汇交易等。
基于FIX协议标准,交易双方可以直接进行交易,也可以通过第三方搭建的金融业务平台(后续简称为业务平台)进行交易。随着金融市场的不断开放,大量的小微机构不断涌现,基于业务平台的交易方式越来越受到这些机构的关注和青睐。
对于基于业务平台的交易方式,机构方与业务平台应当使用相同版本的FIX协议。目前,FIX协议版本已经从FIX 1.0发展到FIX 5.0,其中,FIX 5.0版本协议又将早先版本中的会话层协议从应用层协议中分离出来,进一步产生了FIXT X.Y及FIX X.Y两个协议版本。现有技术中,业务平台无法要求或限制机构方使用的协议版本,为保证FIX协议的版本兼容,业务平台就需要搭建所有协议版本的业务环境,并针对不同的协议版本单独开发交易的业务逻辑。随着FIX协议版本的不断升级以及业务种类的持续增长,业务平台侧的环境部署成本将会越来越高。
发明内容
本发明提供了一种FIX协议的业务实现方法、装置及系统,能够解决业务平台侧部署FIX业务环境成本过高的问题。
为解决上述问题,第一方面,本发明提供了一种FIX协议的业务实现方法,该方法包括:
业务平台接收发送端发送的FIX消息,FIX消息由不同类型的业务数据组成,业务数据为字符串形式;
根据业务数据中的业务类型信息在脚本列表中查找与FIX消息对应的业务脚本,脚本列表中保存有对应不同FIX协议版本的业务脚本,业务脚本包含业务逻辑;
执行业务脚本,按照业务逻辑对业务数据进行处理。
第二方面,本发明还提供了一种FIX协议的业务实现方法,该方法包括:
发送端将FIX报文封装为FIX消息,FIX消息由不同类型的业务数据组成,不包含对应具体FIX协议版本的业务逻辑,业务数据为字符串形式;
将封装后的FIX消息发送给业务平台,以使得业务平台根据包含业务逻辑的业务脚本对业务数据进行处理。
第三方面,本发明还提供了一种FIX协议的业务实现装置,该装置包括:
接收单元,用于接收发送端发送的FIX消息,FIX消息由不同类型的业务数据组成,业务数据为字符串形式;
查找单元,用于根据业务数据中的业务类型信息在脚本列表中查找与FIX消息对应的业务脚本,脚本列表中保存有对应不同FIX协议版本的业务脚本,业务脚本包含业务逻辑;
执行单元,用于执行业务脚本,按照业务逻辑对业务数据进行处理。
第四方面,本发明还提供了一种FIX协议的业务实现装置,该装置包括:
处理单元,用于将FIX报文封装为FIX消息,FIX消息由不同类型的业务数据组成,不包含对应具体FIX协议版本的业务逻辑,业务数据为字符串形式;
发送单元,用于将封装后的FIX消息发送给业务平台,以使得业务平台根据包含业务逻辑的业务脚本对业务数据进行处理。
第五方面,本发明还提供了一种FIX协议的业务实现系统,该系统包括业务平台及发送端;
业务平台包括上述第三方面的装置;
发送端包括上述第四方面的装置。
借由上述方案,本发明提供的FIX协议的业务实现方法、装置及系统,能够对FIX报文进行上层抽象封装,获得仅保留业务数据但不包含具体业务逻辑的通用类FIX消息。通过从FIX报文中“剔除”具体业务逻辑的方式,弱化了FIX报文中业务的强类型特点,使得FIX消息能够通用于任何一种版本的FIX协议。而对于业务逻辑而言,则采用业务脚本的形式独立于FIX协议代码进行配置,针对不同的FIX协议版本开发不同的业务脚本,利用脚本语言“动态配置”、“动态加载”的特点对FIX交易业务予以实现。与现有技术相比,本发明实现了业务逻辑与FIX协议代码之间的彻底解耦,使得业务逻辑的实现不再依赖于协议代码本身,因此业务平台仅部署一种版本的FIX协议就可以实现所有FIX协议版本的交易业务,能够大大降低FIX业务环境的部署成本。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例提供的第一种FIX协议的业务实现方法的流程图;
图2示出了本发明实施例提供的第二种FIX协议的业务实现方法的流程图;
图3示出了本发明实施例提供的第三种FIX协议的业务实现方法的流程图;
图4示出了本发明实施例提供的对非标准FIX协议进行解析的方法流程图;
图5示出了本发明实施例提供的第一种处理FIX消息的交互图;
图6示出了本发明实施例提供的第二种处理FIX消息的交互图;
图7示出了本发明实施例提供的第一种FIX协议的业务实现装置的组成框图;
图8示出了本发明实施例提供的第二种FIX协议的业务实现装置的组成框图;
图9示出了本发明实施例提供的第三种FIX协议的业务实现装置的组成框图;
图10示出了本发明实施例提供的FIX协议的业务实现系统的示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
本发明实施例公开了一种FIX协议的业务实现方法,如图1所示,该方法包括:
101、业务平台接收发送端发送的FIX消息。
发送端一般为机构方,例如证券交易所、期货交易所的客户端等,发送端向业务平台发送封装好的FIX消息,该FIX消息的内容为字符串形式,涉及不同类型的业务数据,例如交易金额、交易时间、买卖双方ID、业务类型、消息长度等。实际应用中,现有FIX协议中的所有数据域(或称为字段)均可作为本实施例中的业务数据使用,并且,在现有FIX协议允许的范围内,交易双方自定义的数据域也可以作为所述业务数据使用,本实施例不对业务数据的种类和数量进行限制。
本步骤中接收的FIX消息是经过发送端进行上层抽象封装后的消息,与现有实现方式不同的是,现有FIX报文中除了携带有各种数据域之外,还会携带有针对具体交易业务的业务逻辑,这些业务逻辑本质上是对各种数据域的约束控制信息。例如对于业务“买进股票”而言,其具体的约束控制信息至少包括:确定买入对象(哪只股票)、判断股票价格是否达到预设价位、买入几手股票、如何发起买进操作等。由于FIX报文中的业务逻辑涵盖了实现交易业务的具体约束控制条件,因此现有技术中的FIX报文被称为是一种强类型的报文。与此同时,正是由于FIX报文中存在具体的业务逻辑,而受FIX协议版本差异影响,即使是同一个交易业务,不同FIX协议版本对应的业务逻辑也会有所不同,因此现有技术需要针对不同FIX协议版本单独开发业务逻辑。而在本实施例中,业务逻辑被从FIX报文中解耦出去,以脚本语言的形式单独配置在业务平台侧。对于FIX报文而言,发送端将其中的数据域(业务数据)抽象成一个通用的类,获得字符串形式的业务数据。这种通用类型的业务数据可以适用于任何FIX协议版本。
102、业务平台根据业务数据中的业务类型信息在脚本列表中查找与FIX消息对应的业务脚本。
每一个业务脚本都记录有一个对应具体FIX版本的具体业务逻辑,脚本列表是一种用于查找业务脚本的索引性文件,其中记录有业务类型与业务脚本之间的映射关系。当接收到FIX消息后,业务平台根据其中的业务类型信息在脚本列表中查找对应的业务脚本,以实现相应的业务逻辑。
进一步的,考虑到同一个业务逻辑会存在对应不同FIX协议版本的业务脚本,为进行精确查找,业务平台还可以从业务数据中提取协议版本信息,将协议版本信息与业务类型信息相结合查找业务脚本。与此对应的,脚本列表中应当增加一个维度信息,即协议版本信息,从而记录业务类型、协议版本以及业务脚本三者之间的映射关系。
本实施例中,需要开发人员预先编写各种业务脚本,业务平台可以允许开发人员针对某个版本的FIX协议开发对应各种业务逻辑的不同业务脚本,也可以允许开发人员针对某个具体的业务逻辑开发对应各个FIX协议版本的不同业务脚本。实际应用中,为实现业务逻辑的按需定制,业务平台还可以向机构方开放用于开发业务脚本的应用程序接口(ApplicationProgramming Interface,简称API),以接收机构方开发的业务脚本。
需要说明的是,脚本语言是一种轻量化的动态语言,开发脚本语言所消耗的时间成本及计算机资源远远小于在FIX协议代码中开发业务逻辑的消耗。因此相对现有技术而言,本实施例除了可以减少部署协议版本数量以外,还能够通过配置脚本语言的方式进一步降低FIX协议的部署成本。
103、业务平台执行业务脚本,按照业务逻辑对业务数据进行处理。
通常情况下,业务脚本可以保存在数据库服务器中,当在数据库中查找到需要的业务脚本后,业务平台将其放入到缓存中,通过刷新缓存的方式对业务脚本进行动态加载。
通常,业务逻辑的实现会使用到不同的业务数据,例如在商品交易过程中,至少需要买卖方ID、商品ID、商品价格等业务数据。选择何种业务数据做何种方式的处理,这是由业务脚本中的业务逻辑决定,或者说是由业务逻辑中的约束控制信息决定,本实施例不对执行业务脚本使用的业务数据的种类和数量进行限制。
实际应用中,某些交易业务是在业务平台侧完成的,而有些交易业务则需要通过业务平台传递给作为接收端的机构方进行实现(例如议价)。对于后者情况,业务平台在执行完步骤103之后还需要将处理后的FIX消息发送给接收端。
进一步的,本发明实施例还公开了一种FIX协议的业务实现方法,如图2所示,该方法包括:
201、发送端将FIX报文封装为FIX消息。
图2所示方法主要应用于发送端一侧,将传统的FIX报文进行上层抽象封装,获得一个通用类的FIX消息。由于FIX消息中只包含字符串形式的业务数据,而不包含对应具体FIX协议版本的业务逻辑,因此该FIX消息可以通用于任何版本的FIX协议。
同时,业务逻辑被写入到提前开发的业务脚本中,并配置到业务平台侧,以使得业务平台根据包含业务逻辑的业务脚本对业务数据进行处理。
202、发送端将封装后的FIX消息发送给业务平台。
本发明实施例提供的方法,能够将FIX报文中的业务逻辑解耦到业务平台侧的业务脚本中实现。由于业务逻辑中的约束控制信息在形式和内容上,因FIX协议版本的不同而有所差异,因此当FIX消息中剩余有通用类型的业务数据而不再包含具体的业务逻辑时,FIX消息就不会再受FIX协议版本的限制,可以适用于任何版本的FIX协议中。相对现有技术而言,本实施例能够提高FIX协议版本的兼容性减少部署的FIX协议版本数量,并由此降低FIX业务环境的部署成本。
进一步的,作为对上述图1和图2所示方法的细化,本发明实施例还提供了一种FIX协议的业务实现方法,如图3所示,该方法包括:
301、发送端将FIX报文封装为FIX消息。
发送端将FIX报文封装成通用类的FIX消息。具体的,发送端从FIX报文的报文头及报文体中提取字符串,组装成通用类的FIX消息。发送端根据预设的报文头长度截取报文头,然后根据报文头内容解析出报文体长度,并根据报文体长度截取报文体的字符串,最后将截取的字符串组装成FIX消息。
实际应用中,发送端可以但不限于将FIX报文封装为Message类FIX消息。
302、发送端将封装后的FIX消息发送给业务平台。
根据现有的FIX协议规定,FIX报文的收发双方应当在一个会话(Session)中进行通信。在建立好会话后,发送端调用已有的发送方法将FIX消息发送给业务平台,例如使用静态方法sendToTarget进行发送。
303、业务平台根据业务数据中的业务类型信息在脚本列表中查找与FIX消息对应的业务脚本。
如前所述,消息收发双方需要基于同一个会话进行通信。发送端在发送FIX消息的同时还会将本次会话的会话ID一同进行发送,由业务平台根据该会话ID在会话列表中找出对应的会话,然后在该会话中进行后续流程。
现有技术中FIX报文中的业务数据是以数据域的形式存在的,即以键值对的形式存在。本实施例中的业务数据同样是以键值对的形式存在,下表示出了FIX协议规定的部分键值对(Tag-Value):
发送端在对FIX消息进行解析后,获得其携带的业务数据。其中,一个键值对对应一个类型的业务数据。
在解析出键值对后,业务平台查找业务类型的键值对,从中获取交易业务的业务类型信息,然后根据该业务类型信息在脚本列表中查找与FIX消息对应的业务脚本。
进一步的,由于业务平台涉及交易业务众多,为避免重复或混淆,业务平台还可以结合发送者ID、消息类型(应用层消息或会话层消息)甚至会话ID一同查找业务脚本。
304、业务平台执行业务脚本,按照业务逻辑对业务数据进行处理。
业务平台将查找到的业务脚本放入缓存,通过刷新缓存的方式加载业务脚本,实现相应的业务逻辑。
实际应用中,FIX协议涉及的业务逻辑可以分为两大类:一类是针对具体交易对象/具体交易场景的特定业务逻辑,这类业务逻辑在不同交易对象或不同交易场景中的通用性较差,需要针对具体情况单独开发,包括但不限于是报文内容解析(涉及不同的解析规则)、报文字段校验(是否非空、金额格式、金额大小等)、报文字段转换(日期格式转换、金额格式转换、币种标识转换等)、签名验签、返回码转换、幂等控制、流量控制等。
另一类是所有机构方均可以使用的业务逻辑,这一类业务逻辑主要用于建立、保障、注销通信双方之间的底层通信过程,当然也包括较为通用的交易业务的业务逻辑,其适用于任何业务类型的业务逻辑。较为典型的业务逻辑包括会话层的心跳管理、网路测试、消息重传、消息驳回、序号复位、注销、登录验证等,以及应用层的撤单请求、驳回撤单、执行报告、状态请求、状态检查、下新单等。
对于特定的业务逻辑,将其以业务脚本的形式配置到业务平台,通过执行步骤304予以实现。而对于通用的业务逻辑而言,则无需针对不同的机构方重复配置业务脚本,在开发FIX业务环境时,直接将通用业务逻辑写入业务平台侧的协议代码中。通过后续步骤305至步骤307进行实现。由于通用业务逻辑适用于所有的业务类型,使用过程中无需修改,因此不会增加FIX业务环境的维护成本。
305、业务平台根据业务数据中的消息类型信息判断FIX消息的消息类型。
业务平台根据Key为“MsgType”的键值对获得FIX消息的消息类型,该消息类型包括“应用层消息”及“会话层消息”两种。针对不同的消息类型,业务平台选择执行后续步骤306或步骤307。
306、若消息类型为应用层消息,则业务平台调用应用层方法执行应用层的通用业务逻辑。
业务平台调用Application类中的toApp方法或fromApp方法执行应用层的通用业务逻辑。toApp方法或fromApp方法的区别在于,如果是对待发送给接收端的FIX消息进行处理,则调用toApp方法,如果是对接收到的FIX消息进行处理,则调用fromApp方法。
307、若消息类型为会话层消息,则业务平台调用会话层方法执行会话层的通用业务逻辑。
业务平台调用Application类中的toAdmin方法或fromAdmin方法执行应用层的通用业务逻辑。toAdmin方法或fromAdmin方法的区别在于,如果是对待发送给接收端的FIX消息进行处理,则调用toAdmin方法,如果是对接收到的FIX消息进行处理,则调用fromAdmin方法。
实际应用中,发送和接收FIX消息的会话序号是各自分别维护的,管理待发送和已接收消息的消息队列也是相互独立的,因此业务平台可以根据FIX消息的会话序号选择调用toApp/toAdmin还是fromApp/fromAdmin。
本实施例将步骤305至步骤307置于步骤304之后仅为便于表述,实际应用中业务平台在接收到FIX消息后,也可以首先执行步骤305至步骤307然后再执行步骤303至步骤304,或者,同时执行步骤305至步骤307以及步骤303至步骤304。
在本实施例的一种实现方式中,可以将字段校验、基于会话序号的漏传校验等通用的校验业务写入到FIX协议代码中,通过会话层方法的调用予以实现。
进一步的,业务平台还可以将下述几种新的通用业务逻辑写入到FIX协议代码中,通过会话层方法执行:
1、重置序号逻辑
现有FIX协议标准中存在序号保护机制,消息发送方会在发送的消息中添加一个会话序号,对于消息接收方而言,如果当前接收消息的序号与前一个接收消息的序号不连续,则说明两消息之间存在漏传的消息,需要触发消息重传机制。而如果序号连续,则发送方再次发送消息时会将上一个消息的序号加1,作为下一个消息的会话序号使用。
由此可见,随着通信过程的不断深入,通信双方使用的会话序号将不断递增,当会话序号的数值超过系统或数据库支持的最大上限时,系统因无法识别该会话序号而容易出现错误重传等问题。为防止会话序号超过系统上限,本实施例给出了一种重置序号的通用业务逻辑并通过会话层方法予以实现。具体的,业务平台根据系统支持的最大上限值设定一个预设的序号最大值,通常该序号最大值小于系统的最大上限值,实际应用中可以将序号最大值设定为系统最大上限值的70%到95%。例如当系统最大上限值为99万时,可以将序号最大值设置为90万。
在执行重置序号逻辑时,业务平台判断当前消息的会话序号是否到达预设的序号最大值。如果到达序号最大值则会话序号重置为0,以使得后续从0开始继续累加;如果未到达序号最大值则不作任何处理。
本实施例中,通过会话层的重置序号逻辑可以防止消息的会话序号超出系统或数据库支持的最大上限,能够有效避免因会话序号溢出导致的系统异常。
2、拒绝交易逻辑
当对会话序号进行重置时,可能因为机构方不受理,或者系统自身的异常原因导致重置失败,此时为避免会话序号超出系统或数据库支持的最大上限值,业务平台可以通过会话层方法实现拒绝交易逻辑,拒绝对当前的FIX消息进行处理,由此消除会话序号进一步累加的可能性。
3、清除队列逻辑
在现有FIX协议的重传机制中,如果会话序号不连续,则会将当前消息放在一个消息队列中进行缓存,并通知发送端重新发送漏传序号对应的消息。此时发送端后续发送的当前消息之后的所有消息都需要缓存在消息队列中,因此消息队列存在内存溢出风险。本实施例中,业务平台可以通过清除队列逻辑对消息队列的大小进行监控,若消息队列占用的缓存超过预设的缓存阈值,则清除消息队列中缓存的FIX消息,以保证系统的稳定高可用。实际应用中,缓存阈值可以根据系统的内存大小按照比例设置,本实施例对其具体数值不作限制。
进一步的,在本实施例中,当机构方新增FIX业务时,业务平台还可以获取包含新增FIX业务逻辑的业务脚本,并将获取的业务脚本添加到脚本列表中,由此完成新增业务逻辑的添加。本实施例将业务逻辑以脚本语言的形式配置在业务平台侧,当需要新增业务逻辑时,只需要将新开发的业务脚本配置在业务平台侧即可,无需对FIX协议代码进行修改。与现有技术相比,大大提高了增加业务逻辑的灵活性和便捷性,更加便于机构方自定义个性化的交易业务。
与此类似的,当需要从业务平台中删除某些业务逻辑时,只需要更加业务类型查找到对应的业务脚本,然后将该业务脚本从脚本列表中删除即可,同样无需改动FIX协议代码,使用起来方便灵活。
进一步的,考虑到实际应用中,部分机构方因不愿频繁重置会话序号等原因并未使用标准的FIX协议报文进行通信。对于使用非标准FIX协议报文的机构方,为保证其交易业务的实现,本实施例中业务平台还可以针对不同非FIX协议报文的封装规则预先开发不同的报文解析器,当接收到非FIX协议报文时,业务平台根据其封装规则选择对应的报文解析器,并通过报文解析器对非FIX协议报文的数据流进行解析,获得业务数据。
实际应用中,证券公司的资产查询交易就是使用非标准FIX协议报文实现的,采用非标准FIX协议主要是考虑到降低序号的增长速度,因为用户查询资产的频率会明显高于交易的频率,因此资产查询必然会导致会话序号的快速增长,从而导致频繁重置的情况发生。对于非标准FIX协议报文,由于其封装规则与通用类FIX消息的封装规则不同,因此使用通用的解析手段并不能将底层的二进制数据流解析正确解析为字符串形式的数据。本实施例中,通过定制开发的报文解析器可以实现非标准FIX协议报文的正确解析,从而保证业务逻辑的实现。具体的,通过报文解析器解析非标准FIX协议报文的流程如图4所示:
401、按照约定好的报文头长度截取报文头。
业务平台按照封装规则中规定的报文头长度,从非标准FIX协议报文的数据流中截取报文头。该报文头长度可以由业务平台预先与机构方(发送端)约定获得。
402、根据报文头获得报文类型以及报文体长度信息。
获得报文头后,就可以从中获得报文类型、报文体长度等字段信息。业务平台根据报文体长度信息执行步骤403,截取报文体。
403、根据报文体长度截取报文体。
在截取报文体的过程中,业务平台需要多次判断截取的报文体是否足够长,即截取的报文体是否达到报文体长度。如果达到该长度则停止截取,否则继续读取数据流直至达到报文体长度或数据流读取完毕。
404、组装报文头及报文体,以字符串形式返回给上层。
在对对应报文头、报文体的数据流进行截取后,将数据流组装成字符串形式的数据,并返回给上层。由上层将字符串拆分成一个个键值对,在进行字段校验后完成业务数据的提取。
进一步的,在本实施例的另一种实现方式中,业务平台在对接收的FIX消息进行处理后,还可以将处理后的FIX消息发送给接收端。通常,除了能够在业务平台侧实现的交易业务外,还有一部分交易业务需要基于机构双方共同完成,例如价格询盘/还盘等。这种情况下,业务平台需要将一方机构(发送端)发送的FIX消息进行处理后,发送给另一方机构(接收端)。本发明实施例后续将分别针对平台接收消息及发送消息两个过程,对FIX业务的实现过程进行介绍。
进一步的,在本实施例的最后一种实现方式中,业务平台还可以采用分布式网络架构,通过多个计算节点对接收的FIX消息进行分布式处理,其中,每个计算节点处理至少一个会话的FIX消息。在会话初始阶段,可以以会话ID为依据,通过哈希算法对会话进行负载均衡,以使得每个计算节点负责数量相同或近似相同的会话。当新增会话时,可以选择会话数量最少的计算节点进行分配,也可以在会话数量相同的情况下,为最近进行过会话注销的计算节点分配新增会话,本实施例不对分布式结构中的计算节点数量、会话分配方式以及节点上负载的会话数量进行具体限制。
在上述实现方式中,采用分布式网络结构除了可以提高计算效率、减轻单台计算节点负荷之外,还可以使每个计算节点独立管理各自的会话序号,从而支持会话序号的横向扩展,由此解决序号顺序发送带来的性能瓶颈。
下面给出本发明实施例的两种应用场景:
第一,业务平台向外部发送FIX消息
本场景中,业务平台接收发送端发送的FIX消息,对FIX消息进行处理后发送给接收端。具体的,如图5所示,该场景流程包括:
1、发送端封装FIX消息,并调用静态方法SendToTarget将FIX消息发送给业务平台。
2、业务平台根据消息中携带的会话ID查找对应的会话。
3、业务平台根据消息中携带的业务类型信息查找并执行对应的groovy脚本。
通过groovy脚本对FIX消息进行处理,实现脚本中的业务逻辑。
4、业务平台根据消息中携带的消息类型信息判断FIX消息的类型。
若为会话层消息,则调用会话层的toAdmin方法对FIX协议进行处理,实现会话层的通用业务逻辑;
若为应用层消息,则调用应用层的toApp方法对FIX协议进行处理,实现应用层的通用业务逻辑。
5、业务平台调用对象IoSessionResponder将处理后的FIX消息发送给接收端。
对象IoSessionResponder对象是由InitiatorIOHandler初始化得到的。
6、业务平台与发送端将自身保存的会话序号加1。
第二,业务平台接收外部发送的FIX消息
本场景中,业务平台接收发送端发送的FIX消息,并对FIX消息进行处理。具体的,如图6所示,该场景流程包括:
1、业务平台通过对象InitiatorIoHandler对发送端的socket套接字进行异步非阻塞式监听。
2、当接收到发送端发送的FIX消息时,业务平台调用类EventHandlingStrategy将消息加入到消息队列blockingQueue中。
3、业务平台调用类EventHandlingStrategy重复性的从blockingQueue中读取FIX消息。
4、业务平台根据消息中携带的会话ID查找对应的会话。
5、业务平台检查会话序号是否连续。
如果会话序号连续则执行后续步骤,否则要求发送端重新发送正常序号范围内的FIX消息。
6、业务平台根据消息中携带的业务类型信息查找并执行对应的groovy脚本。
通过groovy脚本对FIX消息进行处理,实现脚本中的业务逻辑。
7、业务平台根据消息中携带的消息类型信息判断FIX消息的类型。
若为会话层消息,则调用会话层的fromAdmin方法对FIX协议进行处理,实现会话层的通用业务逻辑;
若为应用层消息,则调用应用层的fromApp方法对FIX协议进行处理,实现应用层的通用业务逻辑。
8、业务平台与发送端将自身保存的会话序号加1。
在上述场景中,业务脚本采用groovy语言开发。groovy是一种基于Java虚拟机的敏捷动态语言,可以无缝集成所有已经存在的Java对象和类库,采用groovy语言结合java环境进行开发更为方便。实际应用中,业务脚本还可以但不限于使用JPython、JRuby等同样基于Java虚拟机的语言进行实现,本实施例对此不作限制。
进一步的,作为对上述图1及图3所示方法的实现,本发明实施例还提供了一种FIX协议的业务实现装置。该装置主要位于业务平台侧,如图7所示,该装置包括:接收单元71、查找单元72以及执行单元73;其中,
接收单元71,用于接收发送端发送的FIX消息,FIX消息由不同类型的业务数据组成,业务数据为字符串形式;
查找单元72,用于根据业务数据中的业务类型信息在脚本列表中查找与FIX消息对应的业务脚本,脚本列表中保存有对应不同FIX协议版本的业务脚本,业务脚本包含业务逻辑;
执行单元73,用于执行业务脚本,按照业务逻辑对业务数据进行处理。
进一步的,接收单元71接收的FIX消息为封装成通用类的FIX消息。
进一步的,如图8所示,该装置还包括:
写入单元74,用于将通用业务逻辑写入业务平台侧的协议代码中,通用业务逻辑为适用于任何业务类型的业务逻辑。
进一步的,如图8所示,该装置还包括判断单元75,用于在接收发送端发送的FIX消息之后,根据业务数据中的消息类型信息判断FIX消息的消息类型;
执行单元73,用于当消息类型为应用层消息时,调用应用层方法执行应用层的通用业务逻辑;
执行单元73还用于当消息类型为会话层消息时,调用会话层方法执行会话层的通用业务逻辑。
进一步的,执行单元73用于:
当通用业务逻辑为会话层的重置序号逻辑时,若会话序号到达预设的序号最大值,则将会话序号重置为0;
当通用业务逻辑为会话层的拒绝交易逻辑时,若会话序号重置失败,则拒绝处理FIX消息;
当通用业务逻辑为会话层的清除队列逻辑时,若消息队列占用的缓存超过预设的缓存阈值,则清除消息队列中缓存的FIX消息。
进一步的,如图8所示,该装置还包括:
获取单元76,用于当新增FIX业务时,获取包含新增FIX业务逻辑的业务脚本;
添加单元77,用于将获取的业务脚本添加到脚本列表中。
进一步的,如图8所示,该装置还包括:
选择单元78,用于当接收到非FIX协议报文时,根据非FIX协议报文的封装规则选择报文解析器;
解析单元79,用于通过报文解析器对非FIX协议报文的数据流进行解析,获得业务数据。
进一步的,如图8所示,该装置还包括:
发送单元710,用于将处理后的FIX消息发送给接收端。
进一步的,该装置用于通过多个计算节点对接收的FIX消息进行分布式处理,其中,每个计算节点处理至少一个会话的FIX消息。
进一步的,作为对上述图2及图3所示方法的实现,本发明实施例还提供了一种FIX协议的业务实现装置。该装置主要位于发送端侧,如图9所示,该装置包括:处理单元91及发送单元92;其中,
处理单元91,用于将FIX报文封装为FIX消息,FIX消息由不同类型的业务数据组成,不包含对应具体FIX协议版本的业务逻辑,业务数据为字符串形式;
发送单元92,用于将封装后的FIX消息发送给业务平台,以使得业务平台根据包含业务逻辑的业务脚本对业务数据进行处理。
进一步的,处理单元91用于将FIX报文封装成通用类的FIX消息。
进一步的,处理单元91用于从FIX报文的报文头及报文体中提取字符串,组装成通用类的FIX消息。
进一步的,作为对上述图3所示方法的实现,本发明实施例还提供了一种FIX协议的业务实现系统。如图10所示,该系统包括业务平台101及发送端102,其中:
业务平台101包括如图7或图8所示的装置;
发送端102包括如图9所示的装置。
本发明实施例提供的FIX协议的业务实现装置及系统,能够对FIX报文进行上层抽象封装,获得仅保留业务数据但不包含具体业务逻辑的通用类FIX消息。通过从FIX报文中“剔除”具体业务逻辑的方式,弱化了FIX报文中业务的强类型特点,使得FIX消息能够通用于任何一种版本的FIX协议。而对于业务逻辑而言,则采用业务脚本的形式独立于FIX协议代码进行配置,针对不同的FIX协议版本开发不同的业务脚本,利用脚本语言“动态配置”、“动态加载”的特点对FIX交易业务予以实现。与现有技术相比,本发明实施例实现了业务逻辑与FIX协议代码之间的彻底解耦,使得业务逻辑的实现不再依赖于协议代码本身,因此业务平台仅部署一种版本的FIX协议就可以实现所有FIX协议版本的交易业务,能够大大降低FIX业务环境的部署成本。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
可以理解的是,上述方法及装置中的相关特征可以相互参考。另外,上述实施例中的“第一”、“第二”等是用于区分各实施例,而并不代表各实施例的优劣。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的发明名称(如确定网站内链接等级的装置)中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。