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、抢单方法利用消息队列特性和高速内存数据库解决高并发下重复抢单问题、解决抢单队列消息重复时重复抢单问题、解决抢单异常问题。

具体实施方式

本发明旨在提出一种基于消息队列的高并发抢单功能实现方法,基于消息队列的特性,结合高速内存数据库实现高可靠、高并发、易维护、分布式的抢单功能。

在实现高并发抢单功能之前,需要进行以下工作:

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)解决抢单异常问题:抢单时可能出现不可控异常,造成队列读取成功但业务处理失败,从而引起数据一致性问题。本发明设计独立的抢单异常信息表,一旦发生抢单异常,则写入到此信息表中,定时程序重新执行处理程序,若仍无法正常处理,则人工通知干预。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode LCP 12. 小张刷题计划(二分查找)

1. 题目 为了提高自己的代码能力,小张制定了 LeetCode 刷题计划,他选中了 LeetCode 题库中的 n 道题,编号从 0 到 n-1,并计划在 m 天内按照题目编号顺序刷完所有的题目(注意,小张不能用多天完成同一题&…

java 监控 配置 文件怎么打开_java实现文件变化监控的方法(推荐)

一. spring配置文件:application.xmlxmlns:tx"http://www.springframework.org/schema/tx" xmlns:aop"http://www.springframework.org/schema/aop"xmlns:context"http://www.springframework.org/schema/context" xmlns:dwr"ht…

场景编辑器竣工!

今天接着做XML解析,对那个遍历的结构作了些修改,插入了几个函数。 终于,新的场景编辑器竣工了! 一个比较复杂的场景了,用3dsMax制作材质,安排物件位置和所用材质 导出到DirectX中,效果感觉比Max…

将MathType公式转换为Blog可用的LaTeX公式(MD编辑器)

会LaTex语法的同学敲起来还是会快一些的。 符号参考: LaTeX 各种命令,符号Latex所有常用数学符号整理 不会的同学,可以按照以下方式操作: 在MathType内先敲好公式 可以手敲,也可以手写(手写调用windows的…

java trim 不好使_Java String trim无效

7 个答案:答案 0 :(得分:49)该网站的源代码显示了特殊的html字符 。尝试在java字符串中搜索或替换以下内容:\u00A0。rank rank.replaceAll("\u00A0", "");应该有效。也许添加一个双\\而不是\。答案 1 :(得分:6)您应该将…

JQuery + Json 练习随笔

早就听说JQuery Ajax的方便快捷以及Json优秀的数据交换,今天有空尝试了一下,菜鸟了一番。对初步的使用也算是有个比较抽象的理解吧。记录之备忘! json简介: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人…

java jxl 写 excel文件_java采用jxl写入一个Excel文件

jxl写入一个excel文件。读取方面请看下面相关链接,上一遍是关于读取excel的。package com.javaer.file;import java.io.File;import java.io.IOException;import jxl.Workbook;import jxl.write.Label;import jxl.write.WritableCellFormat;import jxl.write.Writab…

LeetCode 313. 超级丑数(动态规划)

1. 题目 编写一段程序来查找第 n 个超级丑数。 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。 示例: 输入: n 12, primes [2,7,13,19] 输出: 32 解释: 给定长度为 4 的质数列表 primes [2,7,13,19], 前 12 个超级丑数序列为&#xf…

Visual Studio 2010 旗舰版免序列号安装体验

Visual Studio 2010 E文版已经发布多时,由于工作原因没有及早的下载体验,直到前几天园子里的朋友放出了下载简体中文的种子 ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4AE6228933DDE49D9BFA4C3467C831C2|/于是决定下来…

java 类的高级特性_java程序-类的高级特性

创建Employee类,在类中定义三个属性:编号,姓名,年龄,然后在构造方法里初始化这三个属性,最后在实现接口中的定义的CompareTo方法,将对象按编号升序排列。代码如下:(程序可能有些错误…

潜在狄利克雷分配(Latent Dirichlet Allocation,LDA)

文章目录1. 狄利克雷分布2. 潜在狄利克雷分配模型3. 学习推理4. sklearn.decomposition.LatentDirichletAllocation潜在狄利克雷分配(latent Dirichlet allocation,LDA),作为基于 贝叶斯学习的话题模型,是潜在语义分析…

JMF入门(Java Media Framework)

JMF是SUN推出的用来提供给Java开发者使用Java开发视频与音频播放程序的开发库,JMF的推出已经有几年的历史了,目前最新的版本为 2.1.1e,这里我们来讲述使用Java的AWT组件来开发一个视频播放器,采用JMF作为视频的播放库,…

LeetCode 983. 最低票价(动态规划)

1. 题目 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。 在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。 每一项是一个从 1 到 365 的整数。 火车票有三种不同的销售方式: 一张为期一天的通行证售价为 co…

final 数组 java_Java Final数组列表

您是正确的声明列表最终意味着您无法将列表变量重新分配给另一个对象.另一个问题(我想)是public class SomeClass {private static final ArrayList list new ArrayList();}VSpublic class SomeClass {ArrayList list new ArrayList();}我们轮流使用每个修饰符.private只有这…

生活点滴语录

1、gmail与chrome,高效实用,简单大方。生活中用到的两款google产品,确实喜欢。2、g.cn,值得信任。-------简洁明了,深入人心。3、深度,值得深入。-------精髓的解说。4、有人说态度决定一切,有人…

LeetCode 1306. 跳跃游戏 III(广度优先搜索BFS)

1. 题目 这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。 当你位于下标 i 处时,你可以跳到 i arr[i] 或者 i - arr[i]。 请你判断自己是否能够跳到对应元素值为 0 的 任意 下标处。 注意,不管是什么情况下&#xff…

mysql错误日志为aborting_MySQL 错误日志(Error Log)

同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件。通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等。这些日志能够帮助我们定位mysqld内部发生的事件&#xff0…

this和arguments

this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象。但是在javascript中,由于javascript的动态性(解释执行,当然也有简单的预编译过程),this的指向在运行…

LeetCode 529. 扫雷游戏(广度优先搜索BFS/深度优先搜索DFS)

文章目录1. 题目2. 解题2.1 BFS2.2 DFS1. 题目 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵。 ‘M’ 代表一个未挖出的地雷, ‘E’ 代表一个未挖出的空方块, ‘B’ 代表没有相邻(上,下,左…

java 使用jar_Java 使用JAR文件

JAR,Java Archive File,Java档案文件。JAR文件是一种压缩文件,与ZIP压缩文件兼容,通常称为JAR包。JAR文件中默认包含了一个名为META-INF/MANIFEST.MF的清单文件,是在生成JAR文件时由系统自动创建的。使用JAR文件与以下…