Files
Notes/notes-service/vendor/tokio-cron-scheduler/design.adoc
T
2026-08-01 16:11:49 +03:00

257 lines
5.9 KiB
Plaintext

= Design
== Job activity
[plantuml, job_activity_puml, svg]
....
title __Job activity__
control Timer as timer
actor Scheduler as scheduler
database MetadataStorage as storage
boundary JobActivationQueue as jobQueue
boundary NotifyQueue as notify
actor Runner as runner
entity JobCode as jobStorage
actor NotifyRunner as notifyRunner
database NotifyStorage as notifyStorage
entity NotifyCode as notifyCode
note over scheduler
Schedules tasks
end note
/ note over storage
Stores job metadata
end note
/ note over jobQueue
A queue that receives the job GUID
for jobs that needs to be run
end note
/ note over notify
A queue that receives the job GUID
and the job state it needs to be
notified of
end note
/ note over runner
Runs the job code
end note
/ note over jobStorage
Converts a job GUID to
runnable code
end note
/ note over notifyRunner
Runs notification code
end note
/ note over notifyStorage
Stores notification metadata
end note
/ note over notifyCode
Converts a notification GUID
to runnable code
end note
== Scheduling ==
timer -> scheduler : Every 1 sec
activate scheduler
scheduler -> storage : Get job guid list
storage -> scheduler
scheduler -> storage : For each guid get metadata
storage -> scheduler
scheduler -> scheduler : Filter next tick
scheduler -> storage : Next tick, last tick\nfor scheduled guids
scheduler -> jobQueue : GUIDs of next job
scheduler -> notify : GUID + SCHEDULED
deactivate scheduler
== Run the job ==
jobQueue -> runner : GUID of scheduled GUID
activate runner
runner -> jobStorage : Get runnable code\nvs GUID
jobStorage -> runner
runner -> notify : GUID + STARTED
runner -> runner : Run job
runner -> notify : GUID + DONE
deactivate runner
== Notification ==
notify -> notifyRunner : GUID + <JOB STATE>
activate notifyRunner
notifyRunner -> notifyStorage : Get notify GUIDs for\njob GUID + job state
notifyStorage -> notifyRunner
notifyRunner -> notifyCode : Get notify code to run\nusing Notify GUID
notifyCode -> notifyRunner
notifyRunner -> notifyRunner : Run notification code
deactivate notifyRunner
....
== Create job
[plantuml, job_creation_puml, svg]
....
title __Create job__
actor CreateJob as createJob
boundary JobCreateQueue as notify
boundary JobCreatedQueue as done
actor JobCreator as jobCreator
database MetadataStorage as storage
entity JobCode as runStorage
note over createJob
Starts the create job
process
end note
/ note over notify
Queue that produces
job metadata
end note
/ note over jobCreator
Handles the creation
message from the queue
end note
/ note over storage
Stores job metadata
end note
/ note over runStorage
Converts a job GUID
to runnable code
end note
/ note over done
Queue that produces
job metadata when a job
is done being made
end note
createJob -> notify : New Job
activate createJob
notify -> runStorage
notify -> jobCreator
activate jobCreator
jobCreator -> jobCreator : Generate next tick
jobCreator -> storage : Save metadata
jobCreator -> storage : Get list of GUIDs
storage -> jobCreator
jobCreator -> storage : Update list of GUIDs
jobCreator -> done : Job GUID
deactivate jobCreator
done -> createJob
deactivate createJob
....
== Create notification
[plantuml, create_notification_puml, svg]
....
title __Create notification__
actor CreateNotification as create
boundary NotifyCreateQueue as notify
boundary NotifyCreatedQueue as notified
actor NotificationCreator as creator
database NotifyStorage as notifyStorage
entity NotifyCode as notifyCode
create -> notify : Job GUID +\nNotify GUID +\nJob State
activate create
notify -> notifyCode
notify -> creator
activate creator
creator -> notifyStorage : Get notification data
notifyStorage -> creator
creator -> creator : Update job metadata\nwith new data
creator -> notifyStorage : Save
creator -> notified : Notify GUID + Job State
deactivate creator
notified -> create
deactivate create
....
== Delete notification
[plantuml, delete_notification_puml, svg]
....
title __Delete notification__
actor DeleteNotification as deleter
boundary NotifyDeleteQueue as notify
boundary NotifyDeletedQueue as notified
actor NotificationDeleter as delete
database NotifyStorage as storage
entity NotifyCode as notifyCode
deleter -> notify : Notify GUID + Job State
notify -> delete
activate delete
delete -> storage : Get notification\nmetadata
delete -> delete : Update metadata\nwith new data
delete -> storage : Save metadata
delete -> notified : Notify GUID + Job State
notified -> notifyCode
notified -> deleter
deactivate delete
....
== Delete job
[plantuml, job_deletion_puml, svg]
....
title __Delete job__
actor DeleteJob as deleter
boundary DeleteJobQueue as deleteQueue
boundary DeletedJobQueue as deletedQueue
actor Deleter as delete
database MetadataStorage as storage
entity JobCode as jobStorage
actor NotifyDeleter as notifyDelete
database NotifyStorage as notifyStorage
boundary NotifyDeletedQueue as notifyDeleted
entity NotifyCode as notifyCode
deleter -> deleteQueue : Job GUID
activate deleteQueue
deleteQueue -> delete
activate delete
group Delete Job
delete -> storage : Delete metadata
storage -> delete
delete -> deletedQueue : GUID
deletedQueue -> jobStorage
deactivate delete
deletedQueue -> deleter
end
deleteQueue -> notifyDelete
deactivate deleteQueue
group Delete notifications
activate notifyDelete
notifyDelete -> notifyStorage : Get notifications for Job ID
notifyStorage -> notifyDelete
notifyDelete -> notifyStorage : For each,\ndelete notification
notifyDelete -> notifyDeleted : For each\ndeleted notification,\nNotification GUID +\nJob GUID + State
notifyDeleted -> notifyCode
deactivate notifyDelete
end
....