十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
早期需要延迟处理的业务场景,更多的是通过定时任务扫表,然后执行满足条件的记录,具有频率高、命中低、资源消耗大的缺点。随着消息中间件的普及,延迟消息可以很好的处理这种场景,本文主要介绍延迟消息的使用场景以及基于常见的消息中间件如何实现延迟队列,最后给出了一个在网易公开课使用延迟队列的实践。
创新互联专注于企业营销型网站、网站重做改版、托里网站定制设计、自适应品牌网站建设、成都h5网站建设、商城网站建设、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为托里等各大城市提供网站开发制作服务。
1、有效期:限时活动、拼团。。。
2、超时处理:取消超时未支付订单、超时自动确认收货。。。
4、重试:网络异常重试、打车派单、依赖条件未满足重试。。。
5、定时任务:智能设备定时启动。。。
1、RabbitMQ
1)简介:基于AMQP协议,使用Erlang编写,实现了一个Broker框架
a、Broker:接收和分发消息的代理服务器
b、Virtual Host:虚拟主机之间相互隔离,可理解为一个虚拟主机对应一个消息服务
c、Exchange:交换机,消息发送到指定虚拟机的交换机上
d、Binding:交换机与队列绑定,并通过路由策略和routingKey将消息投递到一个或多个队列中
e、Queue:存放消息的队列,FIFO,可持久化
f、Channel:信道,消费者通过信道消费消息,一个TCP连接上可同时创建成百上千个信道,作为消息隔离
2)延迟队列实现:RabbitMQ的延迟队列基于消息的存活时间TTL(Time To Live)和死信交换机DLE(Dead Letter Exchanges)实现
a、TTL:RabbitMQ支持对队列和消息各自设置存活时间,取二者中较小的值,即队列无消费者连接或消息在队列中一直未被消费的过期时间
b、DLE:过期的消息通过绑定的死信交换机,路由到指定的死信队列,消费者实际上消费的是死信队列上的消息
3)缺点:
a、配置麻烦,额外增加一个死信交换机和一个死信队列的配置
b、脆弱性,配置错误或者生产者消费者连接的队列错误都有可能造成延迟失效
2、RocketMQ
1)简介:来源于阿里,目前为Apache顶级开源项目,使用Java编写,基于长轮询的拉取方式,支持事务消息,并解决了顺序消息和海量堆积的问题
a、Broker:存放Topic并根据读取Producer的提交日志,将逻辑上的一个Topic分多个Queue存储,每个Queue上存储消息在提交日志上的位置
b、Name Server:无状态的节点,维护Topic与Broker的对应关系以及Broker的主从关系
2)延迟队列实现:RocketMQ发送延时消息时先把消息按照延迟时间段发送到指定的队列中(rocketmq把每种延迟时间段的消息都存放到同一个队列中),然后通过一个定时器进行轮训这些队列,查看消息是否到期,如果到期就把这个消息发送到指定topic的队列中
3)缺点:延迟时间粒度受限制(1s/5s/10s/30s/1m/2m/3m/4m/5m/6m/7m/8m/9m/10m/20m/30m/1h/2h)
3、Kafka
1)简介:来源于Linkedin,目前为Apache顶级开源项目,使用Scala和Java编写,基于zookeeper协调的分布式、流处理的日志系统,升级版为Jafka
2)延迟队列实现:Kafka支持延时生产、延时拉取、延时删除等,其基于时间轮和JDK的DelayQueue实现
a、时间轮(TimingWheel):是一个存储定时任务的环形队列,底层采用数组实现,数组中的每个元素可以存放一个定时任务列表
b、定时任务列表(TimerTaskList):是一个环形的双向链表,链表中的每一项表示的都是定时任务项
c、定时任务项(TimerTaskEntry):封装了真正的定时任务TimerTask
d、层级时间轮:当任务的到期时间超过了当前时间轮所表示的时间范围时,就会尝试添加到上层时间轮中,类似于钟表就是一个三级时间轮
e、JDK DelayQueue:存储TimerTaskList,并根据其expiration来推进时间轮的时间,每推进一次除执行相应任务列表外,层级时间轮也会进行相应调整
3)缺点:
a、延迟精度取决于时间格设置
b、延迟任务除由超时触发还可能被外部事件触发而执行
4、ActiveMQ
1)简介:基于JMS协议,Java编写的Apache顶级开源项目,支持点对点和发布订阅两种模式。
a、点对点(point-to-point):消息发送到指定的队列,每条消息只有一个消费者能够消费,基于拉模型
b、发布订阅(publish/subscribe):消息发送到主题Topic上,每条消息会被订阅该Topic的所有消费者各自消费,基于推模型
2)延迟队列实现:需要延迟的消息会先存储在JobStore中,通过异步线程任务JobScheduler将到达投递时间的消息投递到相应队列上
a、Broker Filter:Broker中定义了一系列BrokerFilter的子类构成拦截器链,按顺序对消息进行相应处理
b、ScheduleBroker:当消息中指定了延迟相关属性,并且jobId为空时,会生成调度任务存储到JobStore中,此时消息不会进入到队列
c、JobStore:基于BTree存储,key为任务执行的时间戳,value为该时间戳下需要执行的任务列表
d、JobScheduler:取JobStore中最小的key执行(调度时间最早的),执行时间=当前时间,将该任务列表依次投递到所属的队列,对于需要重复投递和投递失败的会再次存入JobStore中。
注: 此处JobScheduler的执行时间间隔可动态变化,默认0.5s,有新任务时会立即执行(Object-notifyAll())并设置时间间隔为0.1s,没有新任务后,下次执行时间为最近任务的调度执行时间。
3)缺点:投递到队列失败,将消息重新存入JobStore,消息调度执行时间=系统当前时间+延迟时间,会导致消息被真实投递的时间可能为设置的延迟时间的整数倍
5、Redis
1)简介:基于Key-Value的NoSQL数据库,由于其极高的性能常被当作缓存来使用,其数据结构支持:字符串、哈希、列表、集合、有序集合
2)延迟队列实现:Redis的延迟队列基于有序集合,score为执行时间戳,value为任务实体或任务实体引用
3)缺点:
a、实现复杂,本身不支持
b、完全基于内存,延迟时间长浪费内存资源
6、消息队列对比
1、公开课延迟队列技术选型
1)业务场景:关闭超时未支付订单、限时优惠活动、拼团
2)性能要求:订单、活动、拼团 数据量可控,上述MQ均能满足要求
3)可靠性:使用ActiveMQ、RabbitMQ、RocketMQ作为延迟队列更普遍
4)可用性:ActiveMQ、RocketMQ自身支持延迟队列功能,且目前公开课业务中使用的中间件为ActiveMQ和Kafka
5)延迟时间灵活:活动的开始和结束时间比较灵活,而RocketMQ时间粒度较粗,Kafka会依赖时间格有精度缺失
结论: 最终选择ActiveMQ来作为延迟队列
2、业务场景:关闭未支付订单
1)关闭微信未支付订单
2)关闭IOS未支付订单
3、ActiveMQ使用方式
1)activemq.xml中支持调度任务
2)发送消息时,设置message的延迟属性
其中:
a、延迟处理
AMQ_SCHEDULED_DELAY:设置多长时间后,投递给消费者(毫秒)
b、重复投递
AMQ_SCHEDULED_PERIOD:重复投递时间间隔(毫秒)
AMQ_SCHEDULED_REPEAT:重复投递次数
c、指定调度计划
AMQ_SCHEDULED_CRON:corn正则表达式
4、公开课使用中进行的优化
1)可靠性:针对实际投递时间可能翻倍的问题,结合ActiveMQ的重复投递,在消费者逻辑中做幂等处理来保证延迟时间的准确性
2)可追溯性:延迟消息及消费情况做数据库冗余存储
3)易用性:业务上定义好延迟枚举类型,直接使用JmsDelayTemplate发送,无需关心数据备份和参数等细节
1、无论是基于死信队列还是基于数据先存储后投递,本质上都是将延迟待发送的消息数据与正常订阅的队列分开存储,从而降低耦合度
2、无论是检查队头消息TTL还是调度存储的延迟数据,本质上都是通过定时任务来完成的,但是定时任务的触发策略以及延迟数据的存储方式决定了不同中间件之间的性能优劣
张浩,2018年加入网易传媒,高级Java开发工程师,目前在网易公开课主要做支付财务体系、版本迭代相关的工作。
为了大家更容易理解我举出的SQL语句,本文假定已经建立了一个学生成绩管理数据库,全文均以学生成绩的管理为例来描述。
1.在查询结果中显示列名:
a.用as关键字:select name as '姓名' from students order by age
b.直接表示:select name '姓名' from students order by age
2.精确查找:
a.用in限定范围:select * from students where native in ('湖南', '四川')
b.betweenand:select * from students where age between 20 and 30
c.“=”:select * from students where name = '李山'
d.like:select * from students where name like '李%' (注意查询条件中有“%”,则说明是部分匹配,而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:'%李%';若是第二个字为李,则应为'_李%'或'_李'或'_李_'。)
e.[]匹配检查符:select * from courses where cno like '[AC]%' (表示或的关系,与"in()"类似,而且"[]"可以表示范围,如:select * from courses where cno like '[A-C]%')
3.对于时间类型变量的处理
a.smalldatetime:直接按照字符串处理的方式进行处理,例如:
select * from students where birth = '1980-1-1' and birth = '1980-12-31'
4.集函数
a.count()求和,如:select count(*) from students (求学生总人数)
b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’
c.max(列)和min(列),求最大与最小
5.分组group
常用于统计时,如分组查总数:
select gender,count(sno)
from students
group by gender
查看男女学生各有多少)
注意:从哪种角度分组就从哪列"group by"
对于多重分组,只需将分组规则罗列。比如查询各届各专业的男女同学人数,那么分组规则有:届别(grade)、专业(mno)和性别(gender),所以有"group by grade, mno, gender"select grade, mno, gender, count(*)
from students
group by grade, mno, gender
通常group还和having联用,比如查询1门课以上不及格的学生,则按学号(sno)分类有:
select sno,count(*) from grades
where mark60
group by sno
having count(*)1
6.UNION联合
并查询结果,如:
SELECT * FROM students
WHERE name like ‘张%’
UNION [ALL]
SELECT * FROM students
WHERE name like ‘李%’
7.多表查询
a.内连接
select g.sno,s.name,c.coursename
from grades g JOIN students s ON g.sno=s.sno
JOIN courses c ON g.cno=c.cno
(注意可以引用别名)
b.外连接
b1.左连接
select courses.cno,max(coursename),count(sno)
from courses LEFT JOIN grades ON courses.cno=grades.cno
group by courses.cno
左连接特点:显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。
左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。
b2.右连接
与左连接类似
b3.全连接
select sno,name,major
from students FULL JOIN majors ON students.mno=majors.mno
两边表中的内容全部显示
c.自身连接
select c1.cno,c1.coursename,c1.pno,c2.coursename
from courses c1,courses c2 where c1.pno=c2.cno
采用别名解决问题。
d.交叉连接
select lastname+firstname from lastname CROSS JOIN firstanme
相当于做笛卡儿积
8.嵌套查询
a.用关键字IN,如查询李山的同乡:
select * from students
where native in (select native from students where name=’ 李山’)
b.使用关键字EXIST,比如,下面两句是等价的:
select * from students
where sno in (select sno from grades where cno=’B2’)
select * from students where exists
(select * from grades where
grades.sno=students.sno AND cno=’B2’)
9.关于排序order
a.对于排序order,有两种方法:asc升序和desc降序
b.对于排序order,可以按照查询条件中的某项排列,而且这项可用数字表示,如:
select sno,count(*) ,avg(mark) from grades
group by sno
having avg(mark)85
order by 3
10.其他
a.对于有空格的识别名称,应该用"[]"括住。
b.对于某列中没有数据的特定查询可以用null判断,如select sno,courseno from grades where mark IS NULL
c.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑运算“||”而all则相当于逻辑运算“”
d.注意在做否定意义的查询是小心进入陷阱:
如,没有选修‘B2’课程的学生 :
select students.*
from students, grades
where students.sno=grades.sno
AND grades.cno ’B2’
上面的查询方式是错误的,正确方式见下方:
select * from students
where not exists (select * from grades
where grades.sno=students.sno AND cno='B2')
11.关于有难度多重嵌套查询的解决思想:
如,选修了全部课程的学生:
select *
from students
where not exists ( select *
from courses
where NOT EXISTS
(select *
from grades
where sno=students.sno
AND cno=courses.cno))
最外一重:从学生表中选,排除那些有课没选的。用not exist。由于讨论对象是课程,所以第二重查询从course表中找,排除那些选了课的即可。
要求学生学习并掌握现代计算机信息系统所必备的基础理论、专业知识、主要的实现手段。具有比较熟练的数据库应用,信息系统管理技能,并能进行基本的信息系统工程中的需求研究、开发与维护。 二. 专业方向 1.微软SQL SERVER方向/ORACLE方向 2.信息管理方向 3.财务信息管理方向 三. 具体介绍 (一)微软SQL SERVER方向 这个方向是和微软ATA联合办学,参加微软考证,课程考试合格,可以获取微软的MCDBA认证证书。 1. 知识能力结构 (1) 具有熟练应用和操作计算机的能力。 (2) 具有较好的英语听、阅读能力及简单的写作能力。 (3) 熟悉.NET框架平台,熟练基于.NET框架的程序开发。 (4) 熟练掌握SQL Server数据库,能够对数据库进行各种操作。 (5) 掌握计算机网络基本概念,掌握局域网的组建与管理技术,熟练掌握网络操作系统的使用。 2. 就业方向: (1) 各企业事业单位劳动、人事、档案、财务管理、电子商务及办公自动化。 (2) 企业ERP系统的开发、实施与维护。 (3)网络组建运行维护、信息管理及数据库建设。 (4)企业电子商务的实施与系统维护 3. 主要课程介绍 (1)SQL Server 2000 设计与应用 主要讲授数据库技术的基本概念,数据模型和关系数据库模型,关系数据库设计理论,SQLserver数据库设计,数据查询,高级SQL语言查询,存储过程,应用数据库设计。 (2) ADO.NET 程序设计 操纵数据库是编写应用程序的重要环节,单独开设一门课程讲解如何编写高效、安全、稳定的面向数据的应用程序。 (3)基于.NET 的Web 应用程序设计 介绍设计基于.NET 的Web 应用程序的基本概念,方法和相关配置,是本专业重要的课程。 4. 实践训练课程 SQL SERVER程序设计实训、ASP.NET课程实训、毕业综合实训。 (二)ORACLE方向 这个方向是和ORACLE联合办学,参加ORACLE考证,课程考试合格,可以获取ORACLE的数据库工程师证书。 1.知识能力结构 (1) 具有熟练应用和操作计算机的能力。 (2) 具有较好的英语听、阅读能力及简单的写作能力。 (3) 熟悉ORACLE框架平台,熟练基于ORACLE框架的程序开发。 (4) 熟练掌握SQL Server数据库,能够对数据库进行各种操作。 (5) 掌握计算机网络基本概念,掌握局域网的组建与管理技术,熟练掌握网络操作系统的使用。 2.就业方向: (1) 各企业事业单位劳动、人事、档案、财务管理、电子商务及办公自动化。 (2) 软件程序的设计、开发、调试与维护。 (3) 金融证券行情接收、分析、交易,人口、工业、农业等普查。 (4) 工业生产过程自动化控制、农业大棚管理、环境监测、天文计算等。 (5) 网络组建运行维护、信息管理及数据库建设。 3.主要课程介绍 (1)ORACLE 数据库及应用 本课程主要介绍ORACLE数据的使用,其中包括SQL语言的基础基本数据定义、数据操作语句。
金融领域七大数据科学应用实践案例
近年来,数据科学和机器学习应对一系列主要金融任务的能力已成为一个特别重要的问题。 公司希望知道更多技术带来的改进以及他们如何重塑业务战略。
为了帮助您回答这些问题,我们准备了一份对金融行业影响最大的数据科学应用清单。 它们涵盖了从数据管理到交易策略的各种业务方面,但它们的共同点是增强金融解决方案的巨大前景。
自动化风险管理
风险管理是金融机构极其重要的领域, 负责公司的安全性,可信度和战略决策 。 过去几年来,处理风险管理的方法发生了重大变化,改变了金融部门的性质。 从未像现在这样,今天的机器学习模型定义了业务发展的载体。
风险可以来自很多来源,例如竞争对手,投资者,监管机构或公司的客户。 此外,风险的重要性和潜在损失可能不同。 因此,**主要步骤是识别,优先考虑和监控风险,这是机器学习的完美任务。 **通过对大量客户数据,金融借贷和保险结果的训练,算法不仅可以增强风险评分模型,还可以提高成本效率和可持续性。
数据科学和人工智能(AI)在风险管理中最重要的应用是识别潜在客户的信誉。 为了为特定客户建立适当的信用额度,公司使用机器学习算法来分析过去的支出行为和模式。 这种方法在与新客户或具有简短信用记录的客户合作时也很有用。
虽然金融风险管理流程的数字化和自动化处于早期阶段,但潜力巨大。 金融机构仍需要为变革做好准备,这种变革通过实现核心财务流程的自动化,提高财务团队的分析能力以及进行战略性技术投资。 但只要公司开始向这个方向发展,利润就不会让自己等待。
管理客户数据
对于金融公司来说,数据是最重要的资源。因此,高效的数据管理是企业成功的关键。今天,在结构和数量上存在大量的金融数据:从社交媒体活动和移动互动到市场数据和交易细节。金融专家经常需要处理半结构化或非结构化数据,手动处理这些数据是一个巨大的挑战。
然而,对于大多数公司来说,将机器学习技术与管理过程集成仅仅是从数据中提取真实知识的必要条件。**人工智能工具,特别是自然语言处理,数据挖掘和文本分析有助于将数据转化为智能数据治理和更好的业务解决方案,从而提高盈利能力。**例如,机器学习算法可以通过向客户学习财务历史数据来分析某些特定财务趋势和市场发展的影响。最后,这些技术可用于生成自动报告。
预测分析
分析现在是金融服务的核心。 值得特别关注的是预测分析,它揭示了预测未来事件的数据模式,可以立即采取行动。 通过了解社交媒体,新闻趋势和其他数据源,这些复杂的分析方法已经实现了预测价格和客户终生价值,未来生活事件,预期流失率和股市走势等主要应用。 最重要的是,这种技术可以帮助回答复杂的问题 - 如何最好地介入。
实时分析
实时分析通过分析来自不同来源的大量数据从根本上改变财务流程,并快速识别任何变化并找到对其的最佳反应。财务实时分析应用有三个主要方向:
欺诈识别
**金融公司有义务保证其用户的最高安全级别。**公司面临的主要挑战是找到一个很好的欺诈检测系统,罪犯总是会采用新的方法并设置新的陷阱。**只有称职的数据科学家才能创建完美的算法来检测和预防用户行为异常或正在进行的各种欺诈工作流程。**例如,针对特定用户的不寻常金融购买警报或大量现金提款将导致阻止这些操作,直到客户确认为止。在股票市场中,机器学习工具可以识别交易数据中的模式,这可能会指示操纵并提醒员工进行调查。然而,这种算法最大的优势在于自我教学的能力,随着时间的推移变得越来越有效和智能化。
消费者分析
实时分析还有助于更好地了解客户和有效的个性化。先进的机器学习算法和客户情绪分析技术可以从客户行为,社交媒体互动,他们的反馈和意见中获得见解,并改善个性化并提高利润。由于数据量巨大,只有经验丰富的数据科学家才能精确分解。
算法交易
这个领域可能受实时分析的影响最大,因为每秒都会受到影响。根据分析传统和非传统数据的最新信息,金融机构可以做出实时有利的决策。而且由于这些数据通常只在短时间内才有价值,因此在这个领域具有竞争力意味着使用最快的方法分析数据。
在此领域结合实时和预测分析时,另一个预期会开启。过去,金融公司不得不聘用能够开发统计模型并使用历史数据来创建预测市场机会的交易算法的数学家。然而,今天人工智能提供了使这一过程更快的技术,而且特别重要的是 - 不断改进。
因此, 数据科学和人工智能在交易领域进行了革命,启动了算法交易策略。 世界上大多数交易所都使用计算机,根据算法和正确策略制定决策,并考虑到新数据。 人工智能无限处理大量信息,包括推文,财务指标,新闻和书籍数据,甚至电视节目。 因此,它理解当今的全球趋势并不断提高对金融市场的预测。
总而言之,实时和预测分析显着改变了不同金融领域的状况。 通过hadoop,NoSQL和Storm等技术,传统和非传统数据集以及最精确的算法,数据工程师正在改变财务用于工作的方式。
深度个性化和定制
企业认识到,在当今市场竞争的关键步骤之一是通过与客户建立高质量的个性化关系来提高参与度。 这个想法是分析数字客户体验,并根据客户的兴趣和偏好对其进行修改。 人工智能在理解人类语言和情感方面取得重大进展,从而将客户个性化提升到一个全新的水平。 数据工程师还可以建立模型,研究消费者的行为并发现客户需要财务建议的情况。 预测分析工具和高级数字交付选项的结合可以帮助完成这项复杂的任务,在最恰当的时机指导客户获得最佳财务解决方案,并根据消费习惯,社交人口趋势,位置和其他偏好建议个性化服务。
结论
对于金融机构来说,数据科学技术的使用提供了一个从竞争中脱颖而出并重塑其业务的巨大机会。大量不断变化的财务数据造成了将机器学习和AI工具引入业务不同方面的必要性。
我们认为,我们主要关注金融领域的7大数据科学用例,但还有很多其他值得一提的。 如果您有任何进一步的想法,请在评论部分分享您的想法。