java抢单功能_基于消息队列的⾼并发抢单功能实现⽅法与流
程
本发明涉及嵌⼊式软件中间件,具体涉及⼀种基于消息队列的⾼并发抢单功能实现⽅法。
背景技术:
中间件是⼀种独⽴的系统软件或服务程序,分布式应⽤系统借助这种软件在不同的技术之间共享资源,管理计算资源和⽹络通讯。它在计算机系统中是⼀个关键软件,它能实现应⽤的互连和互操作性,能保证系统的安全、可靠、⾼效的运⾏。中间件位于⽤户应⽤和操作系统及⽹络软件之间,它为应⽤提供了公⽤的通信⼿段,并且独⽴于⽹络和操作系统。中间件为开发者提供了公⽤于所有环境的应⽤程序接⼝,当应⽤程序中嵌⼊其函数调⽤,它便可利⽤其运⾏的特定操作系统和⽹络环境的功能,为应⽤执⾏通信功能。
RocketMQ是⼀款分布式、队列模型的消息中间件,具有以下特点:
(1)能够保证严格的消息顺序;
(2)提供丰富的消息拉取模式;
(3)⾼效的订阅者⽔平扩展能⼒;
(4)实时的消息订阅机制;
(5)亿级消息堆积能⼒;
MongoDB是⼀个基于分布式⽂件存储的数据库,由C++语⾔编写,旨在为WEB应⽤提供可扩展的⾼性能数据存储解决⽅案。具备⾼性能、易部署、易使⽤等特点。
主要功能特性有:
(1)⾯向集合存储,易存储对象类型的数据;
(2)模式⾃由;
(3)⽀持动态查询;
(4)⽀持完全索引,包含内部对象;
(5)⽀持查询;
(6)⽀持复制和故障恢复;
(7)使⽤⾼效的⼆进制数据存储,包括⼤型对象(如视频等);
(8)⾃动处理碎⽚,以⽀持云计算层次的扩展性;
(9)⽀持RUBY,PYTHON,JAVA,C++,PHP等多种语⾔;
(10)⽂件存储格式为BSON(⼀种JSON的扩展);
(11)可通过⽹络访问;
如何有机结合消息队列中间件及⾼速内存数据库实现⾼并发抢单功能是嵌⼊式软件领域当前⼀项研究热点问题。
技术实现要素:
本发明所要解决的技术问题是:提出⼀种基于消息队列的⾼并发抢单功能实现⽅法,基于消息队列的特性,结合⾼速内存数据库实现⾼可靠、⾼并发、易维护、分布式的抢单功能。
本发明解决其技术问题所采⽤的技术⽅案是:
作为⼀种实施例,本发明的基于消息队列的⾼并发抢单功能的实现⽅法,包括加⼊抢单⽅法,所述加
⼊抢单⽅法包括:
为需要参加抢单的业务划分不同的类型,并设置对应的不同的优先级抢单队列;
作为进⼀步优化,所述抢单队列采⽤先进先出机制。
作为进⼀步优化,通过设置多个Topic来设置不同的优先级抢单队列。
作为进⼀步优化,所述抢单业务的类型包括:预处理抢单、要素纠偏抢单、全图纠偏抢单、规则检查抢单、模拟记账抢单、复核抢单。
作为进⼀步优化,所述保存⼊列记录的⽅式为:采⽤异步刷盘⽅式结合内存数据库,记录已加⼊队列的抢单业务,若发⽣程序中断、服务器宕机事件,在重启应⽤后⾃动从内存数据库中读取未消费的信息,⾃动加⼊队列。
作为进⼀步优化,通过⼊列失败信息表来记录抢单业务加⼊失败信息,对于第⼀次写⼊失败信息表的抢单业务,通过定时程序在定时时间到来时,再次将该抢单业务加⼊到队列中,若仍然加⼊失败,则通知⼈⼯⼲预。
作为另⼀种实施例,本发明的基于消息队列的⾼并发抢单功能的实现⽅法,包括撤销抢单⽅法,所述撤销抢单⽅法包括:
通过创建撤销记录表来记录需要撤销的业务单,在进⾏抢单处理时,从抢单队列中取出业务单,若该取出的业务单在撤销记录表中,则直接丢弃该业务单,从⽽达到撤销该业务单的⽬的,若撤销业务单失败,则记录撤销业务单失败信息,并保存到数据库。
作为进⼀步优化,对于第⼀次保存的撤销业务单失败信息,通过定时程序在定时时间到来时,再次对业务单进⾏撤销,若仍然撤销业务单失败,则通知⼈⼯⼲预。
作为第三种实施例,本发明的基于消息队列的⾼并发抢单功能的实现⽅法,包括抢单⽅法,所述抢单⽅法包括:
采⽤多消费端的并发抢单⽅式,从抢单列表中取出业务单后,及时更新消费进度,然后查询该业务单是否存在于撤销记录表中,若存在,则直接丢弃该业务单,然后从抢单列表中取出下⼀个业务单;若不存在于撤销记录表中,则继续查询该业务单对应的消费记录,若已存在对应的消费记录,则丢弃该业务单,若不存在对应的消费记录,则在对业务单进⾏处理后在消费记录表中保存对应的消费记录。
作为进⼀步优化,该⽅法还包括:在对业务单进⾏处理时,若出现抢单异常状况,则通过抢单异常信息表记录这⼀状况,通过定时程序在定时时间到来时,再次对该业务单进⾏处理,若仍然异常,则通知⼈⼯⼲预。
本发明的有益效果是:
基于消息队列(Rocketmq)的特性,结合⾼速内存数据库(Mongodb)实现⾼可靠、⾼并发、易维护、分布式的抢单功能:
1、加⼊抢单⽅法利⽤消息队列特性和⾼速内存数据库解决⽆序问题、解决优先级问题、解决多类型问题、解决可靠性问题以及解决加⼊失败问题;
2、撤销抢单⽅法利⽤内存数据库实现消息队列删除功能;
3、抢单⽅法利⽤消息队列特性和⾼速内存数据库解决⾼并发下重复抢单问题、解决抢单队列消息重复时重复抢单问题、解决抢单异常问题。
java调用python模型具体实施⽅式
本发明旨在提出⼀种基于消息队列的⾼并发抢单功能实现⽅法,基于消息队列的特性,结合⾼速内存数据库实现⾼可靠、⾼并发、易维护、分布式的抢单功能。
在实现⾼并发抢单功能之前,需要进⾏以下⼯作:
1、安装消息队列(Rocketmq)服务,包括nameserver服务和mqbroker服务,安装完成后修改相关配置,调整端⼝等信息;安装内存数据库(Mongodb)并修改相关参数,创建库名为cscbase的数据库。
2、创建⼊列失败信息表(queue_fail_info)、⼊列记录表(queue_snatch_info)、消费记录表(queue_spending_info)、撤销记录表(queue_cancel_info)和抢单异常信息表(csc_message_info);
3、搭建java环境,分别开发加⼊抢单⽅法流程、撤销抢单⽅法流程、抢单⽅法流程的功能代码。
下⾯具体阐释本发明中的基于消息队列的⾼并发抢单功能实现:
⼀、加⼊抢单⽅法,即将需要参与抢单的业务加⼊到抢单队列的实现⽅法,其包括:
为需要参加抢单的业务划分不同的类型,并设置对应的不同的优先级抢单队列;
通过本⽅法可以解决如下⼏个问题:
(1)解决⽆序问题:消息队列(Rocketmq)为采⽤先进先出(FIFO)机制可以严格的保证消息有序。应⽤中调⽤加⼊抢单⽅法时有序,则可确保抢单时有序。
(2)解决优先级问题:抢单存在优先级问题,如优先级⾼的业务先处理。Topic是消息中间件⾥⼀个重要的概念,每⼀个Topic代表了⼀类消息,有了多个Topic,就可以对消息进⾏归类与隔离。因此利⽤Topic的这⼀特性,将不同优先级的业务抢单放⼊不同的Topic中,完美的解决了优先级问题。
(3)解决多类型问题:为减少程序复杂度及开发⼯作量,我们将多类型抢单业务(如预处理抢单、要素纠偏抢单、全图纠偏抢单、规则检查抢单、模拟记账抢单、复核抢单等)共⽤抢单程序,利⽤消息队列Topic和Tag进⾏归类和隔离。
(4)解决可靠性问题:程序中断,服务器宕机等突发状况经常使已加⼊抢单池数据丢失,造成不可逆的灾难。消息队列(Rocketmq)所有发往broker的消息,有同步刷盘和异步刷盘机制。同步刷盘时,消息写⼊物理⽂件才会返回成功,因此⾮常可靠,但因为要写⼊物理⽂件,效率稍受影响;异步刷盘时,消息写⼊内存即返回成功,内存数据定时异步写⼊物理⽂件,此⽅式效率⾼,但存在服务器宕机后数据丢失风险。本发明采⽤异步刷盘⽅式,并结合内存数据库(Mongodb)技术,记录所有已加⼊队列的抢单业务。程序中断,服务器宕机后,重启应⽤⾃动从内存数据库(Mongodb)中读取未消费的消息⾃动重新加⼊队列。
(5)解决加⼊失败问题:加⼊抢单队列时可能出现不可控异常,造成加⼊抢单队列失败,从⽽引起抢单丢失问题。本发明设计独⽴的⼊列失败信息表,⼀旦发⽣加⼊抢单异常,则写⼊到此信息表中,定时程序重复执⾏指定次数后仍⽆法加⼊,则通知⼈⼯⼲预。
⼆、撤销抢单⽅法,即对于已经加⼊抢单队列的业务由于业务需要⼜从抢单队列中删除的⽅法,其包括:通过创建撤销记录表来记录需要撤销的业务单,在进⾏抢单处理时,从抢单队列中取出业务单,
若该取出的业务单在撤销记录表中,则直接丢弃该业务单,从⽽达到撤销该业务单的⽬的,若撤销业务单失败,则记录撤销业务单失败信息,并保存到数据库。
由于消息队列(Rocketmq)不能指定删除队列中的消息,因此本⽅法另辟蹊径,利⽤内存数据库(Mongodb)保存撤销记录,抢单时从队列中取出抢单消息,若在撤销记录中,则不处理直接丢弃,从⽽达到删除的⽬的,若撤销业务单失败,则记录撤销业务单失败信息,并保存到数据库,对于第⼀次保存的撤销业务单失败信息,通过定时程序在定时时间到来时,再次对业务单进⾏撤销,若仍然撤销业务单失败,则通知⼈⼯⼲预。
三、抢单⽅法,即抢单时从抢单池中⾼效、稳定、准确取出业务信息的⽅法,其包括:采⽤多消费端的并发抢单⽅式,从抢单列表中取出业务单后,及时更新消费进度,然后查询该业务单是否存在于撤销记录表中,若存在,则直接丢弃该业务单,然后从抢单列表中取出下⼀个业务单;若不存在于撤销记录表中,则继续查询该业务单对应的消费记录,若已存在对应的消费记录,则丢弃该业务单,若不存在对应的消费记录,则在对业务单进⾏处理后在消费记录表中保存对应的消费记录。
通过本⽅法可以解决如下⼏个问题:
(1)解决⾼并发下重复抢单问题:⾼并发抢单时,同⼀条业务信息会因为并发操作造成来不及修改抢单标志,从⽽被重复抢单。本⽅法通过及时更新消费进度并结合Java线程安全很好的解决了这⼀难题;
为避免影响性能,本⽅法采⽤多消费端的⽅式进⾏抢单,⼤⼤提⾼抢单并发性。
(2)解决抢单队列消息重复时重复抢单问题:由于业务或者程序原因,会导致部分业务信息重复加⼊到抢单队列,如果不处理则会出现被抢多次的情况。本⽅法通过内存数据库保存消费记录完美解决这⼀问题。同时,内存数据库⾼性能和分布式也为抢单⽅法的⾼性能奠定坚实基础。
(3)解决抢单异常问题:抢单时可能出现不可控异常,造成队列读取成功但业务处理失败,从⽽引起数据⼀致性问题。本发明设计独⽴的抢单异常信息表,⼀旦发⽣抢单异常,则写⼊到此信息表中,定时程序重新执⾏处理程序,若仍⽆法正常处理,则⼈⼯通知⼲预。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论