一.项目总览、
1.这个项目干了什么
2.我在项目总充当了什么角色?
3.项目得整体架构是什么样的?
- worker--执行官:所有的任务都由执行官调度和处理
- flowsvr--代理人:表现为一种web服务,当worker想要和数据库交互时, 由flowsvr提供接口从中调度并返回到worker执行,当然也可以向用户提供接口,当用户想创建任务时,也由其提供webserver接口。
- DB--Mysql:注意其中有什么表,有什么字段
- Cache--Redis:缓存,分布式锁
4.细节问题
- 对于worker来说:用户如何接入,对于用户来说需要做什么,我们框架设计者已经做了什么?
- 对于flowsvr来说,提供了哪些接口?
- 对于DB来说,有哪些表?字段加了哪些索引?拉取字段的优先级如何设计?
- 分布式锁的实现过程,如何实现?
- 他们之间的关联(如下图)注:Redis解决的问题是当同任务类型的多个worker同时向flowsvr发送请求时,flowsvr向数据库发送请求,而此时数据库并没有更新任务状态,可能会将同一个任务分发给不同的worker,造成资源的浪费。
- 分表操作的意义:当数据达到几百万上千万的量级时,所有的操作会变得非常缓慢,需要在flowsvr接口中增加一个接口操作,即服务治理,服务治理中实现最重要的功能就是分表。
- 分表操作的过程:flowsvr针对同一任务类型设置一个查询机制,检查某一张表是否超过阈值(如500w),若大于该阈值,即进行分表操作,即新建一张新表,此时原始表为0号表,新建表为1号表, 在数据库设计中,任务信息表中有两个字段,begin和end,实际作用像两个指针,在开始时指向了0号表,(简单解释一下,当worker向flowsvr拉取任务时,从哪张表拉取,看的就是begin,而用户发起创建任务的请求,flowsvr实际会向end指向的表里创建数据,在创建新表时,end进行++操作,只有当表0中的所有任务全部失败或成功时,begin+1)
- 数据库的操作不单单是任务,还有某项任务是否完成等等,因此在Worker完成任务后,也会返回到数据库中消息表示当前任务已完成。
写在最后:希望更加真实,后续有一些优化点,并且会更加迭代。主要想一个较好的业务场景。
- THE END -
最后修改:2024年3月8日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://ohhbene.com/project-intro.html