|
1 | 1 | # processing-worker |
2 | 2 |
|
3 | | - |
4 | | - |
5 | | - |
| 3 | +Сервис нормализации и ingest для пайплайна NPPWEB. |
6 | 4 |
|
7 | | -Сервис асинхронной обработки и нормализации собранных данных. |
8 | | - |
9 | | -## Что делает этот репозиторий |
| 5 | +## Что делает |
10 | 6 |
|
11 | 7 | - читает `source.raw.v1` из RabbitMQ; |
12 | 8 | - валидирует raw-события; |
13 | 9 | - нормализует payload до формата `source.normalized.v1`; |
14 | | -- отправляет ingest mutation `ingestNormalizedItem` в `backend-api` с заголовком `x-ingest-token`; |
15 | | -- после успешного ingest публикует нормализованные события в `source.normalized.v1`; |
16 | | -- при transient ошибках отправляет сообщение в retry queue, а poison messages складывает в DLQ. |
17 | | - |
18 | | -## Черновая реализация |
19 | | - |
20 | | -- consumer RabbitMQ (`src/messaging/queue-client.ts`); |
21 | | -- нормализатор (`src/normalize.ts`); |
22 | | -- валидация raw/normalized схем через Ajv; |
23 | | -- GraphQL-клиент отправки в backend (`src/backend-client.ts`); |
24 | | -- Dockerfile и CI workflow. |
| 10 | +- отправляет `ingestNormalizedItem` в `npp-backend` с заголовком `x-ingest-token`; |
| 11 | +- публикует успешные нормализованные события в `source.normalized.v1`; |
| 12 | +- при transient ошибках использует retry queue, а poison messages отправляет в DLQ. |
25 | 13 |
|
26 | 14 | ## Переменные окружения |
27 | 15 |
|
28 | | -- `RABBITMQ_URL` - адрес RabbitMQ. |
29 | | -- `QUEUE_RAW_EVENT` - основная очередь входящих raw-событий, по умолчанию `source.raw.v1`. |
30 | | -- `QUEUE_RETRY_EVENT` - очередь retry, по умолчанию `source.raw.retry.v1`. |
31 | | -- `QUEUE_DEAD_LETTER_EVENT` - очередь dead-letter, по умолчанию `source.raw.dlq.v1`. |
32 | | -- `QUEUE_NORMALIZED_EVENT` - очередь нормализованных событий, по умолчанию `source.normalized.v1`. |
33 | | -- `API_BASE_URL` - базовый URL `backend-api`, по умолчанию `http://localhost:3000`. |
34 | | -- `GRAPHQL_PATH` - GraphQL path, по умолчанию `/graphql`. |
35 | | -- `API_GRAPHQL_URL` - явный GraphQL URL. Если задан, имеет приоритет над `API_BASE_URL + GRAPHQL_PATH`. |
36 | | -- `API_INGEST_TOKEN` - токен для заголовка `x-ingest-token`. Должен совпадать с `INGEST_API_TOKEN` в `backend-api`. |
37 | | -- `SHARED_CONTRACTS_DIR` - путь к `shared-contracts`. |
38 | | -- `RETRY_ATTEMPTS`, `RETRY_BASE_DELAY_MS`, `PREFETCH`, `LOG_LEVEL` - параметры обработки и логирования. |
| 16 | +- `RABBITMQ_URL` |
| 17 | +- `QUEUE_RAW_EVENT` |
| 18 | +- `QUEUE_RETRY_EVENT` |
| 19 | +- `QUEUE_DEAD_LETTER_EVENT` |
| 20 | +- `QUEUE_NORMALIZED_EVENT` |
| 21 | +- `API_BASE_URL` |
| 22 | +- `GRAPHQL_PATH` |
| 23 | +- `API_GRAPHQL_URL` |
| 24 | +- `API_INGEST_TOKEN` |
| 25 | +- `SHARED_CONTRACTS_DIR` |
| 26 | +- `RETRY_ATTEMPTS` |
| 27 | +- `RETRY_BASE_DELAY_MS` |
| 28 | +- `PREFETCH` |
| 29 | + |
| 30 | +По умолчанию `SHARED_CONTRACTS_DIR` указывает на `../contracts`. |
39 | 31 |
|
40 | 32 | ## Локальный запуск |
41 | 33 |
|
42 | 34 | ```bash |
| 35 | +cd ../infra |
43 | 36 | cp .env.example .env |
| 37 | +docker compose --env-file .env -f docker-compose.yml -f docker-compose.apps.yml up -d rabbitmq backend-api |
| 38 | + |
| 39 | +cd ../processing-worker |
44 | 40 | npm install |
45 | 41 | npm run start:dev |
46 | 42 | ``` |
47 | 43 |
|
48 | | -Для Docker Compose сервис ожидает: |
49 | | - |
50 | | -- RabbitMQ на `RABBITMQ_URL`; |
51 | | -- `backend-api` на `API_BASE_URL` или `API_GRAPHQL_URL`; |
52 | | -- смонтированный `shared-contracts` в `SHARED_CONTRACTS_DIR`. |
53 | | - |
54 | 44 | ## Ожидаемые очереди |
55 | 45 |
|
56 | | -- `source.raw.v1` - входящие события. |
57 | | -- `source.raw.retry.v1` - delayed retry queue. |
58 | | -- `source.raw.dlq.v1` - dead-letter queue. |
59 | | -- `source.normalized.v1` - успешно обработанные нормализованные события. |
| 46 | +- `source.raw.v1` |
| 47 | +- `source.raw.retry.v1` |
| 48 | +- `source.raw.dlq.v1` |
| 49 | +- `source.normalized.v1` |
60 | 50 |
|
61 | | -## Как проверить обработку |
| 51 | +## Проверка качества |
62 | 52 |
|
63 | | -1. Опубликуй валидное сообщение в `source.raw.v1`. |
64 | | -2. В логах worker должны появиться строки `connected to rabbitmq`, `consuming queue`, `raw event validated`, `normalized event created`, `ingest success`, `published normalized event`, `message acknowledged`. |
65 | | -3. Проверь, что сообщение появилось в `source.normalized.v1`, а запись создалась в `backend-api`. |
66 | | -4. Для transient ошибки временно выключи `backend-api`: worker должен логировать `ingest failed` и `retry scheduled`, а не падать. |
67 | | -5. Для poison message отправь невалидный JSON или payload, нарушающий schema: worker должен логировать `message dead-lettered`, сообщение должно уйти в `source.raw.dlq.v1`. |
| 53 | +```bash |
| 54 | +npm run check |
| 55 | +npm run test |
| 56 | +npm run build |
| 57 | +``` |
68 | 58 |
|
69 | | -## Связи с другими репозиториями |
| 59 | +## Связи |
70 | 60 |
|
71 | | -- получает события от `scraper-service`; |
72 | | -- использует схемы из `shared-contracts`; |
73 | | -- отправляет результаты в `backend-api`. |
| 61 | +- получает события от `scrape-helper`; |
| 62 | +- использует схемы из `contracts`; |
| 63 | +- отправляет результаты в `npp-backend`. |
0 commit comments