- Описание
- Отправленные решения
239. Сервис подписки
В Яндекс Маркете разрабатывают новый сервис для хранения информации про товарные предложения. В MVP планируется поддержать две основные механики: обработка запросов на частичное обновление товарных предложений в базе и отправка обновленных данных сервисам-подписчикам.
Товарное предложение в базе описывается следующей JSON схемой:
При межсервисном взаимодействии к товарному предложению добавляется контекст, который содержит идентификатор для сквозной трассировки, его схема:
Сервис, который отправляет запрос на обновление товарного предложения, обязательно заполняет идентификатор оффера (поле ) и идентификатор для трассировки (поле ). Все остальные поля в запросе опциональны. В таком случае при применении обновления будет происходить слияние полей. Например, в базе у оффера заполнены поля , и приходит обновление , тогда в базе будут сохранены оба поля . Гарантируется, что все входящие запросы валидны и соответствуют схеме. Так как это прототип, удаление товаров из базы и очищение полей было решено не поддерживать.
Помимо хранения товарных предложений в базе, в сервисе необходима функция доставки обновлений в сервисы-подписчиков. Одна подписка включает в себя два набора полей: trigger и shipment, не обязательно листовых. Когда изменяется любое trigger поле или поле, вложенное в trigger поле, подписчику отправляется сообщение. В сообщении находятся все shipment и trigger поля этого подписчика, а также идентификаторы оффера и трассировки из запроса, который привел к этому сообщению. Инициализация поля также считается за его изменении и создает сообщение об обновлении.
Формат ввода
Первая строка входных данных содержит два целых числа и () — количество сервисов подписчиков и количество запросов на обновления.
Следующие строк содержат описания сервисов подписчиков: -я строка содержит описание -го подписчика. В начале строки задается и — количество trigger и shipment полей соответственно. Далее trigger полей, и shipment полей.
Следующие строк содержат запросы на обновление, каждая строка — это валидный json, удовлетворяющий схеме .
Формат вывода
На каждое событие обновления выведите сообщений в формате , где — это количество сервисов-подписчиков, которым данное событие интересно. Сообщения должны идти в том же порядке, что и обновления, которые привели к ним. Сообщения в рамках одного обновления должны быть отсортированы по порядковому номеру подписчика.
Примечание
Для решений на языке Python доступны библиотеки json, requests и urllib.
Для решений на языке Java доступны библиотеки jackson-core:2.13.1, jackson-annotations:2.13.1 и jackson-databind:2.13.1 . Соответствующие функции импорта могут иметь вид:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
Для решений на языке C++ доступна библиотека nlohmann/json v3.8.0. Соответствующая директива include выглядит так:
#include "json.hpp"
Для решений на языке Golang доступны все стандартные пакеты, включая encoding/json, net/http, sort и другие.
Для решений на C# доступны библиотеки System.Text.Json и Newtonsoft.Json. Соответствующие using могут выглядеть так:
using Newtonsoft.Json;
using System.Text.Json;
Ограничения
Ограничение времени
8 с
Ограничение памяти
512 МБ
Пример 1
2 5
2 0 price stock_count
1 0 partner_content
{"trace_id": "1", "offer": {"id": "1", "price": 9990}}
{"trace_id": "2", "offer": {"id": "1", "stock_count": 100}}
{"trace_id": "3", "offer": {"id": "2", "partner_content": {"title": "Backpack"}}}
{"trace_id": "4", "offer": {"id": "1", "stock_count": 100}}
{"trace_id": "5", "offer": {"id": "2", "partner_content": {"description": "Best backpack ever"}}}
{"trace_id":"1","offer":{"id":"1","price":9990}}
{"trace_id":"2","offer":{"id":"1","price":9990,"stock_count":100}}
{"trace_id":"3","offer":{"id":"2","partner_content":{"title":"Backpack"}}}
{"trace_id":"5","offer":{"id":"2","partner_content":{"description":"Best backpack ever","title":"Backpack"}}}