1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/nlh774-DotnetSpider

Клонировать/Скачать
DistributeDesign.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 04.06.2025 17:03 b48ecee

Проектирование

                                                               +----------------+
                                                        +----->| Узел консоли 1 |
                                                        |      +----------------+
                                                        |
+--------------+                  +---------+           |      +----------------+
| Scheduler.NET|<------HTTP------>| Брокер  |<--SignalR-|----->| Веб-узел 1     |
+--------------+                  +----^----+           |      +----------------+
                                       |                |
                                     SignalR            |      +----------------+
                                       |                +----->| Веб-узел 2     |
                               +-------+---------+             +----------------+
                               |                 |
                         +-----v----+     +------v---+
                         | Рабочий 1|     | Рабочий 2|
                         +----------+     +----------+

Модули

Узел

Узел отправляет пульсацию сердца брокеру и получает сообщения от брокера через WebSocket.

Тип узла: консоль, веб```markdown +--------------------------------------------------------+ | Узел | +------------------------+--------------+----------------+ | + Id | GUID | PRIMARY | +------------------------+--------------+----------------+ | + Тип узла | STRING(50) | | +------------------------+--------------+----------------+ | + IP-адрес | STRING(50) | | +------------------------+--------------+----------------+ | + Количество процессоров | INT | | +------------------------+--------------+----------------+ | + Группа | STRING(50) | | +------------------------+--------------+----------------+ | + Операционная система | STRING(50) | | +------------------------+--------------+----------------+ | + Память | INT | | +------------------------+--------------+----------------+ | + Включен | BOOL | | +------------------------+--------------+----------------+ | + Время создания | DATETIME | | +------------------------+--------------+----------------+

+---------------------------------------------------+ 
|                    NodeStatus                     |
+-------------------+--------------+----------------+
| + Id              | INT          | PRIMARY, AI    |
+-------------------+--------------+----------------+
| + NodeId          | GUID         |                |
+-------------------+--------------+----------------+
| + ProcessCount    | INT          |                |
+-------------------+--------------+----------------+
| + Cpu             | INT          |                |
+-------------------+--------------+----------------+
| + FreeMemory      | INT          |                |
+-------------------+--------------+----------------+
| + CreationTime    | DATETIME     |                |
+-------------------+--------------+----------------+
```### Broker

+---------------------------------------------------+ | Job | +-------------------+--------------+----------------+ | + Id | GUID | PRIMARY | +-------------------+--------------+----------------+ | + Name | STRING(50) | | +-------------------+--------------+----------------+ | + JobType | ENUM | | +-------------------+--------------+----------------+ | + Cron | STRING(50) | | +-------------------+--------------+----------------+ | + Description | STRING(500) | | +-------------------+--------------+----------------+ | + IsEnabled | BOOL | | +-------------------+--------------+----------------+ | + IsDeleted | BOOL | | +-------------------+--------------+----------------+

JobType: Block | Application

Узел используется как распределённый загрузчик для задачи типа Block, запускает построителя запросов, обработчика и конвейера, который является рабочим процессом, используется как агент для задач типа Application.

|                      JobProperty                  |
+-------------------+--------------+----------------+
| + Id              | INT          | PRIMARY, AI    |
+-------------------+--------------+----------------+
| + JobId           | GUID         |                |
+-------------------+--------------+----------------+
| + Key             | STRING(50)   |                |
+-------------------+--------------+----------------+
| + Value           | STRING(500)  |                |
+-------------------+--------------+----------------+

Блоковая задача: FullClassName, Аргументы
Задача приложения: Package, Application, Аргументы, NodeCount, NodeGroup, Os

---------------------------------------------------------------------------------------------------------------
```+---------------------------------------------------+ 
|                      Worker                       |
+-------------------+--------------+----------------+
| + Id              | INT          | PRIMARY, AI    |
+-------------------+--------------+----------------+
| + FullClassName   | STRING(100)  |                |
+-------------------+--------------+----------------+
| + ConnectionId    | STRING(50)   |                |
+-------------------+--------------+----------------+
| + ConnectTime     | DATETIME     |                |
+-------------------+--------------+----------------+
| + DisconnectTime  | DATETIME     |                |
+-------------------+--------------+----------------+---------------------------------------------------------------------------------------------------------------
+---------------------------------------------------+ 
|                      Block                        |
+-------------------+--------------+----------------+
| + Id              | GUID         | PRIMARY        |
+-------------------+--------------+----------------+
| + Identity        | GUID         | INDEX_IDENTITY |
+-------------------+--------------+----------------+
| + State           | ENUM         |                |
+-------------------+--------------+----------------+
| + CreationTime    | DATETIME     |                |
+-------------------+--------------+----------------+

Состояние блока: готов (1), используется (2), успешен (4), неуспешен (8)

---------------------------------------------------------------------------------------------------------------
+---------------------------------------------------+ 
|                      Запуск                         |
+-------------------+--------------+-----------------+
| + JobId           | GUID         | PRIMARY         |
+-------------------+--------------+-----------------+
| + Identity        | GUID         | INDEX_IDENTITY  |
+-------------------+--------------+-----------------+
| + Consuming       | INT          |                 |
+-------------------+--------------+-----------------+
| + Priority        | INT          |                 |
+-------------------+--------------+-----------------+
| + CreationTime    | DATETIME     |                 |
+-------------------+--------------+-----------------+---------------------------------------------------------------------------------------------------------------+---------------------------------------------------+ 
|                      JobStatus                    |
+-------------------+--------------+----------------+
| + JobId           | GUID         | PRIMARY        |
+-------------------+--------------+----------------+
| + Identity        | GUID         | PRIMARY        |
+-------------------+--------------+----------------+
| + NodeId          | GUID         |                |
+-------------------+--------------+----------------+
| + Status          | ENUM         |                |
+-------------------+--------------+----------------+
| + Left            | INT          |                |
+-------------------+--------------+----------------+
| + Success         | INT          |                |
+-------------------+--------------+----------------+
| + Error           | INT          |                |
+-------------------+--------------+----------------+
| + Total           | INT          |                |
+-------------------+--------------+----------------+
| + UpdateTime      | DATETIME     |                |
+-------------------+--------------+----------------+```

### Задача приложения

#### Создание задачи

1. Добавить в Scheduler.NET
2. Сохранить в базе данных

#### Удаление задачи

1. Установить IsDeleted задачи в true

#### Обновление задачи

1. Обновить cron в Scheduler.NET, если необходимо
2. Обновить в базе данных

#### Триггер задачи

1. Scheduler.NET вызывает обратный вызов, аргументом является id задачи
2. Проверить наличие задачи по id задачи
3. Проверить, включен ли задача
4. Получить доступного агента
5. Вызвать агента для выполнения задачи через SignalR 

### Блокировка задачи

#### Создание & Удаление & Обновление задачи аналогичны задаче приложения

#### Регистрация работника

1. Работник подключается к брокеру через SignalR
2. Сохранить работника в базе данных

#### Триггер задачи

1. Scheduler.NET вызывает обратный вызов, аргументом является id задачи
2. Проверить наличие задачи по id задачи
3. Проверить, включен ли задача
4. Проверить, если какой-либо работник наблюдает за этой задачей
5. Вызвать работника через SignalR

### Брокер

#### OnConnected

1. Добавить в таблицу узлов, если не существует, обновить, если существует

#### Heartbeat: BlockDto Heartbeat(AddNodeStatusDto dto)

+----------------------------------+ | AddNodeStatusDto | +-------------------+--------------+ | + ProcessCount | INT | +-------------------+--------------+ | + Cpu | INT | +-------------------+--------------+ | + FreeMemory | INT | +-------------------+--------------+


1. Добавить в таблицу nodeheartbeat
```#### Очередь

1. Push(string identity, Request[] requests)
2. IEnumable<Request> Poll(string identity)

### Конфигурация агента

+ maxProcessCount: 5
+ broker: http://localhost:55626/
+ token: 1234
+ heartbeat: 30
+ retryDownload: 3

#### Подключение к брокеру

1. Подключиться к брокеру по URL http://localhost:55626/?nodeid={guid}&operationsystem=windows&proccessorcount=4&memory=1600&nodetype=console&group=default&sign={guid}

#### Управление сердцебиением

1. Отправить сердцебиение каждые 5 секунд и вернуть запросы: Heartbeat(HeartbeatDto dto)
2. Скачать все запросы и отправить ответы брокеру: SaveBlockResponse(BlockResponse response), для каждого сайта и идентификатора используется один HttpClient, и устанавливаются cookies, если это необходимо (используются одинаковые cookies или устанавливаются cookies перед первым запросом), сохраняются скачанные байты в брокере.

+--------------------------------------+ | BlockDto | +-------------------+------------------+ | + BlockId | STRING | +-------------------+------------------+ | + Identity | STRING | +-------------------+------------------+ | + ThreadNum | INT | +-------------------+------------------+ | + ChangeIpPattern | STRING | +-------------------+------------------+ | + Content | Site | +-------------------+------------------+ | + Cookies | STRING | +-------------------+------------------+


#### Запуск задачи агента

1. Брокер вызывает агента для запуска задачи: RunApplication(string package, string application, string arguments)

#### Управление задачей агента

+ Exit(string identity)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/nlh774-DotnetSpider.git
git@api.gitlife.ru:oschina-mirror/nlh774-DotnetSpider.git
oschina-mirror
nlh774-DotnetSpider
nlh774-DotnetSpider
master