MySQL WHERE IN还是范围查询

MySQL WHERE IN还是范围查询,第1张

线上出了一个bug:参与集福气活动的很多玩家奖励少发了。

要补发给玩家的奖励可以通过表A和奖励发放表计算得出(需要补发的奖励 = 表A - 实际奖励发放表)。

现在的做法是写个job把这份补发奖励的名单拉取来(没错不等关服维护了,直接在线跑job)。这里要强调一点:只有在“实际奖励发放表”存在的玩家才有可能需要补发奖励。

第三个方法是我用来凑数的,请各位千万不要这么做。除非实际奖励发放表中玩家人数只有个位数。那到底是用第一个还是第二个呢?这个问题主要看两点:

采用方法二:范围查询的方式把数据加到内存中然后再筛选

需要查询的MySQL数据很多(玩家名单list有几万个),使用范围查找能加快查询速度并且即使将表A的数据全部加载在内存中job服务器也是没有压力。

后台job顾名思义就是让后台自动定期或不定期地运行的作业,包括一些任务或批量处理的业务。主要用途:长时间运行(前台运行会有时间限制)、定时或按事件去触发运行等等,一般是按ABAP程序或事件形式进行调度运行。

Elastic-Job当当网基于quartz 二次开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分 布式协调,实现任务高可用以及分片。它由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成,使用Elastic-Job可以快速实现分布式任务调度。 

提供的功能:

分布式调度协调: 在分布式环境中,任务能够按指定的调度策略执行,并且能够避免同一任务多实例重复执行。 

丰富的调度策略: 基于成熟的定时任务作业框架Quartz cron表达式执行定时任务。 

弹性扩容缩容: 当集群中增加某一个实例,它应当也能够被选举并执行任务;当集群减少一个实例时,它所执行的任务能被转移到别的实例来执行。 

失效转移: 某实例在任务执行失败后,会被转移到其他实例执行。 

错过执行作业重触发 : 若因某种原因导致作业错过执行,自动记录错过执行的作业,并在上次作业完成后自动触发。 

支持并行调度 : 支持任务分片,任务分片是指将一个任务分为多个小任务项在多个实例同时执行。 

作业分片一致性 : 当任务被分片后,保证同一分片在分布式环境中仅一个执行实例。 

支持作业生命周期操作 : 可以动态对任务进行开启及停止操作。 

丰富的作业类型: 支持Simple、DataFlow、Script三种作业类型,后续会有详细介绍。 

Spring整合以及命名空间支持 : 对Spring支持良好的整合方式,支持spring自定义命名空间,支持占位符。 

运维平台 : 提供运维界面,可以管理作业和注册中心。 

分片概念 

作业分片是指任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的应用实例分别执行某 一个或几个分片项。 

例如:Elastic-Job快速入门中文件备份的例子,现有2台服务器,每台服务器分别跑一个应用实例。为了快速的执行作业,那么可以将作业分成4片,每个应用实例个执行2片。作业遍历数据的逻辑应为:实例1查找text和image 类型文件执行备份;实例2查找radio和video类型文件执行备份。 如果由于服务器扩容应用实例数量增加为4,则 作业遍历数据的逻辑应为:4个实例分别处理text、image、radio、video类型的文件。 

可以看到,通过对任务合理的分片化,从而达到任务并行处理的效果,最大限度的提高执行作业的吞吐量。 

分片项与业务处理解耦 

Elastic-Job并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器,开发者需要自行处 理分片项与真实数据的对应关系。 

最大限度利用资源

将分片项设置为大于服务器的数量,最好是大于服务器倍数的数量,作业将会合理的利用分布式资源,动态的分配分片项。 

例如:3台服务器,分成10片,则分片项分配结果为服务器A=0,1,2服务器B=3,4,5服务器C=6,7,8,9。 如果服务器C 崩溃,则分片项分配结果为服务器A=0,1,2,3,4服务器B=5,6,7,8,9。在不丢失分片项的情况下,最大限度的利用现有资源提高吞吐量。 

作业类型

elastic-job提供了三种类型的作业:Simple类型作业、Dataflow类型作业、Script类型作业。这里主要讲解前两者。Script类型作业意为脚本类型作业,支持shell,python,perl等所有类型脚本,使用不多,可以参见github文档。 

SimpleJob需要实现SimpleJob接口,意为简单实现,未经过任何封装,与quartz原生接口相似。

Dataflflow类型的定时任务需实现DataflflowJob接口,该接口提供2个方法可供覆盖,分别用于抓取(fetchData)和处理(processData)数据。Dataflflow类型用于处理数据流,它和SimpleJob不同,它以数据流的方式执行,调用fetchData抓取数据,直到抓取不到数据才停止作业。 

非流式处理数据则只会在每次作业执行过程中执行一次fetchData方法和processData方法,随即完成本次作业。  


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/117447.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-13
下一篇2023-03-13

发表评论

登录后才能评论

评论列表(0条)

    保存