Project

General

Profile

Logged in as mguschin

Task #80238

open

Task #79968: [&] (Tech Story) CourseKey Integration: Requests Based on Queue

[&] CourseKey Integration: Requests Based on Queue: Очередь отправки

Added by Mikhail Guschin 11 days ago. Updated about 19 hours ago.

Status:
In Progress
Priority:
Normal
Assignee:
Target version:
Start date:
Due date:
Estimated time:
3.00 h (Total: 40.75 h)
Spent time:
(Total: 25.25 h)
Release Notes:
Tech Support:
No

Description

Доработать очередь отправки (таблица coursekey_requests.sql):
  1. Добавить поле bool для хранения факта отправки. Добавить Индекс.
  2. Добавить поле для хранения datetime отправки.
  3. Добавить поля для поддержки цепочек (chain): номер цепочки, порядковый номер запроса в цепочке.
  4. Поменять типы json полей на json (например RequestParams).

Добавить класс GEGI\CourseKey\Requests\Request для работы с coursekey_requests.sql.
  1. Наследовать его от CollectionItem, т.к. коллекция нужна будет нам чтобы массово сохранять ответы в БД.
  2. Свойства из БД.

Добавить фоновый скрипт send-coursekey-requests.php:
  1. Запускается раз в N минут по настройке Period of Synchronization, Minutes.
    Работает только если включена Enable CourseKey Synchronization.
  2. Выбирает все не отправленные записи coursekey_requests.sql в коллекцию:
  3. сортирует их по номеру цепочки и по порядковому номеру запроса в цепочке.
  4. ограничивает количество не большими порциями (важно выбирать полные цепочки), т.к. отправка частая.
  5. Отправляет их один за другим и фиксирует ответы в объектах. Затем массово сохраняет их в БД.
  6. Если запрос в цепочке выполнился с ошибкой:
    1. Фиксирует ошибку.
    2. Решает остановить ли цепочку. Нужен гибкий способ настраивать такие решения (будет отдельный класс ChainSendPolicy). Если остановить, то останавливает и переходит к следующей цепочке. Если можно продолжать, то продолжает.
  7. Для каждого запроса добавляет фоновую задачу (dispatcher task) пост-обработки. Так делаем, потому что бывают "тяжелые" алгоритмы (например пересчет SAP).
    1. Фиксирует в отдельном поле Id такой задачи и статус. Таск пост-обработчик после выполнения меняет этот статус.

Добавить класс GEGI\CourseKey\Requests\Chain для работы с цепочками:
  1. Содержит массив запросов GEGI\CourseKey\Requests\Request с порядковыми номерами (можно использовать индексы массива пронумерованные от 1).
  2. Содержит объект GEGI\CourseKey\Requests\ChainSendPolicy которая объясняет сценарий действий если при отправке в цепочке есть ошибка.

Добавить класс GEGI\CourseKey\Requests\ChainSendPolicy для описания политик обработки ошибок:
  1. Содержит имя.
  2. Содержит метод, который на переданный код ответа ({200, ОК}, {400, User Exists} и др.) возвращает сигнал, что делать: продолжить запросы в цепочке, остановить, повторить, отменить сделанные запросы и др.

Results

Разработка ведётся в ветке: feature/79114-coursekey-integration-requests-based-on-queue.
  1. Доработал очередь отправки. Добавлены новые колонки.
  2. Добавил коллекции для работы с таблицей.
  3. Добавил фоновый скрипт.
  4. Добавил класс Chain - который работает с цепочкой.
  5. Добавил прототип класса ChainSendPolicy.

Files

clipboard-202402231857-4s31f.png (268 KB) clipboard-202402231857-4s31f.png Классы Maksim Fomin, 02/23/2024 17:57 Delete
clipboard-202402261726-up7rv.png (327 KB) clipboard-202402261726-up7rv.png 2 версия класов Maksim Fomin, 02/26/2024 16:26 Delete

Add

Subtasks 5 (5 open0 closed)

Task #80245: CourseKey Integration: Requests Based on Queue: Очередь отправки: Доработать очередь отправкиTestingMikhail GuschinDelete link to subtaskActions
Task #80246: CourseKey Integration: Requests Based on Queue: Очередь отправки: Добавить коллекцию RequestTestingMikhail GuschinDelete link to subtaskActions
Task #80247: CourseKey Integration: Requests Based on Queue: Очередь отправки: Добавить фоновый скрипт send-coursekey-requestsIn ProgressMaksim FominDelete link to subtaskActions
Task #80248: CourseKey Integration: Requests Based on Queue: Очередь отправки: Добавить класс ChainTestingMikhail GuschinDelete link to subtaskActions
Task #80249: CourseKey Integration: Requests Based on Queue: Очередь отправки: Добавить класс ChainSendPolicyIn ProgressMaksim FominDelete link to subtaskActions

Add

Related issues

Actions #1

Updated by Mikhail Guschin 11 days ago

  • Assignee set to Mikhail Guschin
Actions #2

Updated by Mikhail Guschin 11 days ago

  • Description updated (diff)
  • Assignee deleted (Mikhail Guschin)

Updated by Maksim Fomin 11 days ago · Edited

важно выбирать полные цепочки - мы можем использовать метку времени для таких цепочек. Например колонку group: а туда вставлять timestump.

Actions #4

Updated by Mikhail Guschin 11 days ago

  • Subject changed from CourseKey Integration: Requests Based on Queue: Очередь отправки to [&] CourseKey Integration: Requests Based on Queue: Очередь отправки

Updated by Maksim Fomin 11 days ago · Edited

Maksim Fomin wrote in #note-3:

важно выбирать полные цепочки - мы можем использовать метку времени для таких цепочек. Например колонку group: а туда вставлять timestump.

Договорились, что можно использовать Uuid для группировки цепочек. Если его нет в проекте, то подключу библиотеку uuid

Actions #6

Updated by Maksim Fomin 11 days ago

  • Subtask #80245 added
Actions #7

Updated by Maksim Fomin 11 days ago

  • Subtask #80246 added
Actions #8

Updated by Maksim Fomin 11 days ago

  • Subtask #80247 added
Actions #9

Updated by Maksim Fomin 11 days ago

  • Subtask #80248 added
Actions #10

Updated by Maksim Fomin 11 days ago

  • Subtask #80249 added
Actions #11

Updated by Maksim Fomin 6 days ago

  • Description updated (diff)
Actions #12

Updated by Mikhail Guschin 5 days ago

  • Status changed from New to In Progress
  • Assignee set to Maksim Fomin
  • Estimated time set to 3.00 h
Actions #13

Updated by Mikhail Guschin 5 days ago

  • Assignee changed from Maksim Fomin to Mikhail Guschin
Actions #14

Updated by Maksim Fomin 5 days ago

  • Assignee changed from Mikhail Guschin to Maksim Fomin
Actions #15

Updated by Maksim Fomin 5 days ago

  • Description updated (diff)

Updated by Maksim Fomin 4 days ago · Edited

На данный момент принцип работы следующий:
  1. В монолите при обновлении сущностей нужно будет вызывать:
    // На данный момент собирается массив цепочки. 
    $chainJobs = [
                new AddCourse('1','1','1','1','1','1'),
                new AddUser('1','1','1','1','1','1','1')
            ];
            $chain = new Chain($chainJobs);
            $chain->Dispatch();
    
    $chain->Dispatch(); // Сохранит цепочку в таблице.
    
  2. Фоновый скрипт читает очередь, обходит цепочки и устанавливает статусы:
    $limit = 10;
    /** @var SendCourseKeyRequest $command */
    $command = SendCourseKeyRequest::Get();
    $command->HandleRequests($limit);
    

В теории ещё можно проходить в цикле и пытаться прочитать 50 строк беря по 5 полных цепочек, т.к. коллекция очищается.

Actions #17

Updated by Maksim Fomin 4 days ago

  • Description updated (diff)

Updated by Mikhail Guschin about 22 hours ago

Maksim Fomin wrote in #note-5:

Maksim Fomin wrote in #note-3:

важно выбирать полные цепочки - мы можем использовать метку времени для таких цепочек. Например колонку group: а туда вставлять timestump.

Договорились, что можно использовать Uuid для группировки цепочек. Если его нет в проекте, то подключу библиотеку uuid

Ок. Библиотека выглядит живой (крайний стабильный релиз Ноябрь 2023).

Updated by Maksim Fomin about 19 hours ago

Что реализовано на данный момент:
  1. Таблица
    IsSent bool
    SentAt datetime
    Payload json
  1. Классы
    1. Слева классы dto(Job или Command), они совпадают с действием или маршрутом которое нужно совершить в цепочке. Параметры отличаются для каждого маршрута, поэтому и список свойств я решил разделить на разные dto. Далее будет проще понять, что за операция с данными нужна.
    2. Посредине классы для работы с цепочкой очереди(задачами). Chain - содержит одну Request запись из коллекции с которой производит операции сохранения и обновления статусов. Содержит список массив Jobs, который может передать классу ChainSendPolicy.
    3. Справа классы коллекции для работы с таблицей. Умеют кодировать payload в json и декодировать обратно в полноценные объекты для дальнейшей работы. В коллекции есть методы для получения списка коллекций с лимитом и offset для пагинации.
      2 версия класов

Also available in: Atom PDF