分布式任务elasticjob框架原理了解及使用

分布式任务elasticjob框架原理了解及使用,第1张

一、为什么要使用elasticjob

1 可动态修改任务执行时间, 解决quartz 修改配置需重启系统问题 可运维

2: 可通过调整分片的方式, 动态调整任务执行线程的数量 动态改变任务吞吐量

3: Lite-Job 一台机器能起一个实例, 多台机器分别起实例同时执行, 解决quartz 单机执行问题, 可扩展

二、elasticjob原理

底层执行仍然采用quartz,执行过程中会对数据进行取膜。取膜结果与当前服务器拥有的分片做比较,相等则执行,否则不予执行。

单机多分片情形:job触发时会new多个线程执行(每个线程的分片数不同)

多机多分片情形:job触发时会先去zookeeper节点下的leader节点检测看是否有sharding目录下的necssary节点,有则会重新执行分片。分片策略参考如下。

三、分片策略

1AverageAllocationJobShardingStrategy

基于平均分配算法的分片策略,也是默认的分片策略。

如果分片不能整除,则不能整除的多余分片将依次追加到序号小的服务器。如:

如果有3台服务器,分成9片,则每台服务器分到的分片是:1=[0,1,2], 2=[3,4,5], 3=[6,7,8]

如果有3台服务器,分成8片,则每台服务器分到的分片是:1=[0,1,6], 2=[2,3,7], 3=[4,5]

如果有3台服务器,分成10片,则每台服务器分到的分片是:1=[0,1,2,9], 2=[3,4,5], 3=[6,7,8]

2OdevitySortByNameJobShardingStrategy

根据作业名的哈希值奇偶数决定IP升降序算法的分片策略。

作业名的哈希值为奇数则IP升序,作业名的哈希值为偶数则IP降序。

用于不同的作业平均分配负载至不同的服务器。

AverageAllocationJobShardingStrategy的缺点是,一旦分片数小于作业服务器数,作业将永远分配至IP地址靠前的服务器,导致IP地址靠后的服务器空闲。而OdevitySortByNameJobShardingStrategy则可以根据作业名称重新分配服务器负载。如:

如果有3台服务器,分成2片,作业名称的哈希值为奇数,则每台服务器分到的分片是:1=[0], 2=[1], 3=[]

如果有3台服务器,分成2片,作业名称的哈希值为偶数,则每台服务器分到的分片是:3=[0], 2=[1], 1=[]

3RotateServerByNameJobShardingStrategy

根据作业名的哈希值对服务器列表进行轮转的分片策略。

四、处理方式

1、SimpleJob类型处理方式

意为简单实现,未经任何封装的类型。需实现SimpleJob接口。该接口仅提供单一方法用于覆盖,此方法将定时执行。与Quartz原生接口相似,但提供了d性扩缩容和分片等功能。

2、DataflowJob类型作业

流式处理类型作业

即使实现了DataflowJob接口 默认也是不开启流式作业。

何为流式?  就是fetchData后List,调用processData时候,传整个list。执行后再去fetch,如果还有符合条件的继续processData。

非流式只有时间片到了才触发执行。

此外,还有一点, fetch的List, 会遍历list,每条记录作为task扔到线程中,processData(List),每次处理的都是一条数据。

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

MD5信息摘要算法 (英语:MD5 Message-Digest Algorithm),一种被广泛使用的 密码散列函数 ,可以产生出一个128位(16 字节 )的散列值(hash value),用于确保信息传输完整一致。2004年,证实MD5算法无法防止碰撞(collision)(如网站: CMD5 ),因此不适用于安全性认证,如 SSL 公开密钥认证或是 数字签名 等用途。

MD5 是哈希算法的一种。

密码加密常见的有以下几种方式:

HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,并在 IPSec 和其他网络协议(如 SSL )中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。

如上图中,共有两个流程:

授权设备登录流程:
1、输入账号过后,就把账号作为参数向服务器发送请求
2、服务器根据账号生成对应的key,并传递给客户端
3、客户端拿到key,进行HMAC运算,并将运算结果的哈希值传给服务器

其他设备登录流程:
1、输入账号过后,在本地缓存中找服务器传过来的key,有就登录,没有就把账号作为参数向服务器发送请求
2、服务器要先看这个账号是否开启了设备锁,没有开启就不允许登录,开启了,就向授权设备发送请求,是否授权,如果授权,就将这个账号的key传给其他客户端
3、客户端拿到key,进行HMAC运算,并将运算结果的哈希值传给服务器

但是在这之中有一个潜在的安全隐患问题: 当别人拿到账号和传递的哈希值过后,也就能拿到登录权限,从而不安全。

为了防止上面的问题,注册流程不变,服务器还是保存的有加了key的HMAC哈希值。
1、只是登录的时候,客户端将哈希值与时间戳拼接过后,进行MD5加密,再传给服务器。
2、服务器将注册保存的账号对应的HMAC哈希值,分别与当前时间,和前一分钟拼接再MD5加密,再和客户端传过来的进行匹配,匹配成功则登录成功,否则不成功。
3、注意这里的时间戳是服务器给的时间戳。

常见的加密算法:

应用模式:

AES加密解密都是用到的CCCrypt函数,并且需要导入 CommonCrypto 框架。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10890179.html

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

发表评论

登录后才能评论

评论列表(0条)

保存