libi / dcron

轻量分布式定时任务库 a lightweight distributed job scheduler library
MIT License
422 stars 73 forks source link

这叫分布式系统? #36

Closed chengyayu closed 1 year ago

chengyayu commented 1 year ago

目前每个服务节点是有状态的(job 存储),且状态不同步(每个节点内保存的 jobs 不同),并未实现分布式系统的高可用特性。与单机节点的风险无异。

libi commented 1 year ago

各个节点间状态不同步(每个节点内保存的 jobs 不同)这一点建议你仔细阅读源码, 你有动手能力的话,可以用docker起多个节点,随机关闭部分节点测试一下试试高可用性再来提问?

chengyayu commented 1 year ago

各个节点间状态不同步(每个节点内保存的 jobs 不同)这一点建议你仔细阅读源码, 你有动手能力的话,可以用docker起多个节点,随机关闭部分节点测试一下试试高可用性再来提问?

感谢你的回复。假设我部署了 a b c 三个服务节点,a 节点添加了一个 job1 。我确实没有看到哪部分源码负责把这个 job1 同步给 b 和 c 节点。请指教。

libi commented 1 year ago

你3个节点的代码都不一样,这就不是同一个服务,谈什么分布式呢,你看到哪个分布式系统(mysql,redis,etcd ...)各个节点代码是不同的呢,可以举个例子。 按照你的部署,你需要的不是分布式系统,你需要的中心化的任务调度系统,分别给不同的服务调度不同任务。 就算是中心化的调度系统,你的 b/c 节点都没有a节点上的执行代码,然后a节点挂了, 难道调度系统还能a节点的执行代码复制给 b/c 节点???

chengyayu commented 1 year ago

你3个节点的代码都不一样,这就不是同一个服务,谈什么分布式呢,你看到哪个分布式系统(mysql,redis,etcd ...)各个节点代码是不同的呢,可以举个例子。 按照你的部署,你需要的不是分布式系统,你需要的中心化的任务调度系统,分别给不同的服务调度不同任务。 就算是中心化的调度系统,你的 b/c 节点都没有a节点上的执行代码,然后a节点挂了, 难道调度系统还能a节点的执行代码复制给 b/c 节点???

我这里提到的 a b c 服务节点的代码都是一样的。换句话说,我要利用 dcron 库来实现一个高可用的分布式定时任务系统,请问如何部署?

libi commented 1 year ago

你只要保证同一份代码部署多个节点就行了,如果不确定,你可以使用docker启动多个节点去验证你的猜想。

我比较困惑的是 你说的 a/b/c 节点代码都是一样的, 咋还会问 “a节点挂了, 难道调度系统还能a节点的执行代码复制给 b/c 节点” ?

dxyinme commented 1 year ago

你3个节点的代码都不一样,这就不是同一个服务,谈什么分布式呢,你看到哪个分布式系统(mysql,redis,etcd ...)各个节点代码是不同的呢,可以举个例子。 按照你的部署,你需要的不是分布式系统,你需要的中心化的任务调度系统,分别给不同的服务调度不同任务。 就算是中心化的调度系统,你的 b/c 节点都没有a节点上的执行代码,然后a节点挂了, 难道调度系统还能a节点的执行代码复制给 b/c 节点???

我这里提到的 a b c 服务节点的代码都是一样的。换句话说,我要利用 dcron 库来实现一个高可用的分布式定时任务系统,请问如何部署?

如果你要动态提交任务,需要保证提交任务的时候给全部节点提交。

chengyayu commented 1 year ago

你3个节点的代码都不一样,这就不是同一个服务,谈什么分布式呢,你看到哪个分布式系统(mysql,redis,etcd ...)各个节点代码是不同的呢,可以举个例子。 按照你的部署,你需要的不是分布式系统,你需要的中心化的任务调度系统,分别给不同的服务调度不同任务。 就算是中心化的调度系统,你的 b/c 节点都没有a节点上的执行代码,然后a节点挂了, 难道调度系统还能a节点的执行代码复制给 b/c 节点???

我这里提到的 a b c 服务节点的代码都是一样的。换句话说,我要利用 dcron 库来实现一个高可用的分布式定时任务系统,请问如何部署?

如果你要动态提交任务,需要保证提交任务的时候给全部节点提交。

@libi 之前我们沟通了半天,你好像没有理解我表达的意思。你看看 @dxyinme 的回复,我觉得他理解我的问题,且给出了解决方案。

libi commented 1 year ago

在go项目里动态添加任务这一层我确实没理解,你可以详细解释下你在 go 项目里怎样动态添加任务。 通过反射调用 addJob 或者 是继续封装一层? 如果能提供一个具体的代码实现当然最好不过了。

heyouzhi commented 1 year ago

你3个节点的代码都不一样,这就不是同一个服务,谈什么分布式呢,你看到哪个分布式系统(mysql,redis,etcd ...)各个节点代码是不同的呢,可以举个例子。 按照你的部署,你需要的不是分布式系统,你需要的中心化的任务调度系统,分别给不同的服务调度不同任务。 就算是中心化的调度系统,你的 b/c 节点都没有a节点上的执行代码,然后a节点挂了, 难道调度系统还能a节点的执行代码复制给 b/c 节点???

我这里提到的 a b c 服务节点的代码都是一样的。换句话说,我要利用 dcron 库来实现一个高可用的分布式定时任务系统,请问如何部署?

如果你要动态提交任务,需要保证提交任务的时候给全部节点提交。

@libi 之前我们沟通了半天,你好像没有理解我表达的意思。你看看 @dxyinme 的回复,我觉得他理解我的问题,且给出了解决方案。

看现在的实现,确实在dcron.Start执行之后,在某个节点添加新的cron任务,其他节点感知不到,只有当前这个节点内存里面有这个任务。 现在的存储层面,只存了所有dcron节点的信息,用于算一致性哈希,判断cron能不能在当前节点执行。如果新加的cron没有在所有dcron节点都有的话,很可能导致某个节点新加了cron也不会执行

libi commented 1 year ago

目前的实现是需要同一个 service name 各个节点间代码完全一致(同一个service的多个副本),如果代码不一致的时候应该改用不同的service name。

如果需要在代码一致的情况下在服务运行期间动态添加任务,dcron 目前确实不适用这类情况。