<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9D%D0%98%D0%A1_%D0%94%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC_II_4_%D0%BA%D1%83%D1%80%D1%81_2024%2F2025_homework</id>
	<title>НИС Дизайн систем II 4 курс 2024/2025 homework - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9D%D0%98%D0%A1_%D0%94%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC_II_4_%D0%BA%D1%83%D1%80%D1%81_2024%2F2025_homework"/>
	<link rel="alternate" type="text/html" href="https://wikicshse.ru/index.php?title=%D0%9D%D0%98%D0%A1_%D0%94%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC_II_4_%D0%BA%D1%83%D1%80%D1%81_2024/2025_homework&amp;action=history"/>
	<updated>2026-06-08T19:33:37Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wikicshse.ru/index.php?title=%D0%9D%D0%98%D0%A1_%D0%94%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC_II_4_%D0%BA%D1%83%D1%80%D1%81_2024/2025_homework&amp;diff=1061&amp;oldid=prev</id>
		<title>imported&gt;Smb1987: Migrated current public revision from wiki.cs.hse.ru</title>
		<link rel="alternate" type="text/html" href="https://wikicshse.ru/index.php?title=%D0%9D%D0%98%D0%A1_%D0%94%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC_II_4_%D0%BA%D1%83%D1%80%D1%81_2024/2025_homework&amp;diff=1061&amp;oldid=prev"/>
		<updated>2024-10-22T17:24:46Z</updated>

		<summary type="html">&lt;p&gt;Migrated current public revision from wiki.cs.hse.ru&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== FR ==&lt;br /&gt;
Описаны в лекции.&lt;br /&gt;
&lt;br /&gt;
* кратко -- реализовать 3 http/grpc/... handler (обработчика, &amp;quot;ручки&amp;quot;)&lt;br /&gt;
* берите тот протокол, что лучше знаете -- смысл не в протоколе)&lt;br /&gt;
* нужно предусмотреть получение данных от источников данных&lt;br /&gt;
* должны быть тесты, (какая-то) БД для хранения итд&lt;br /&gt;
* подсмотреть самую простую реализацию (чтоб не придумывать) можно в репозитории&lt;br /&gt;
&lt;br /&gt;
=== Источники данных ===&lt;br /&gt;
* Данные о заказе&lt;br /&gt;
* Данные о зоне заказа&lt;br /&gt;
* Данные об исполнителе&lt;br /&gt;
* Данные о конфигурационных настройках (см feature flags / feature toggles)&lt;br /&gt;
* Данные о платных дорогах (пока не описано)&lt;br /&gt;
&lt;br /&gt;
== NFR ==&lt;br /&gt;
Тут подсмотреть негде :-) Но можно обсуждать в чате, в ЛС, ну или в вашей команде.&lt;br /&gt;
&lt;br /&gt;
=== Требования по Maintainability ===&lt;br /&gt;
Система должна быть спроектирована с учетом высокой вероятности изменений как в количестве источников данных (могут появляться дополнительные),&lt;br /&gt;
так и в непосредственной логике формирования заказа (для простоты дано буквально 3 варианта бизнес-логики, но в реальности там тысячи строк кода).&lt;br /&gt;
Также, необходимо предусмотреть возможность выполнения дополнительных действий или после назначения заказа, или после его отмены.&lt;br /&gt;
&lt;br /&gt;
=== Требования по Scalability ===&lt;br /&gt;
==== Оригинальная формулировка (общая для всех) ====&lt;br /&gt;
* Рассчитываем систему на X одновременно назначаемых заказов -- внешняя нагрузка. X измеряется в RPS&lt;br /&gt;
* Рассчитываем систему на Y исполнителей -- кол-во пользователей системы. Y измеряется в штуках&lt;br /&gt;
    * Каждый исполнитель раз в 1 минуту спрашивает про свой заказа&lt;br /&gt;
* Каждый заказ занимает Z кб&lt;br /&gt;
* Отмена каждого заказа происходит в среднем за 10 минут -- старый вариант&lt;br /&gt;
  * &amp;#039;&amp;#039;&amp;#039;Обновление&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
  * Каждую секунду отменяется &amp;#039;&amp;#039;&amp;#039;W&amp;#039;&amp;#039;&amp;#039; (процент от рейта заказов) заказов&lt;br /&gt;
  * Если за секунду создается 100 заказов, то в эту же секунду отменяется 50 из них (ну вот такая неэффективная система назначения получается).&lt;br /&gt;
  * Отмененные заказы нельзя показывать исполнителю.&lt;br /&gt;
* Система должна линейно масштабироваться к нагрузке&lt;br /&gt;
Итого, описание каждого варианта будет включать X, Y, Z и возможно еще некоторые требования по Scalability.&lt;br /&gt;
&lt;br /&gt;
==== Возможный вариант домашнего задания ====&lt;br /&gt;
X == 100&lt;br /&gt;
Y == 10k&lt;br /&gt;
Z == 5 kb&lt;br /&gt;
&lt;br /&gt;
Могут быть дополнительные требования по Scalability&lt;br /&gt;
&lt;br /&gt;
=== Требования по Reliability ===&lt;br /&gt;
Разрабатываемая система зависит от 5 источников данных.&lt;br /&gt;
С теоретической точки зрения источники данных могут быть либо критичными, либо некритичными.&lt;br /&gt;
В этой задаче источник данных с заказами является критичным.&lt;br /&gt;
То есть никакие стратегии увеличения надежности для него реализовывать не нужно.&lt;br /&gt;
&lt;br /&gt;
Все остальные источники данных будут разделены на 2 части примерно так:&lt;br /&gt;
&lt;br /&gt;
==== Возможный вариант домашнего задания ====&lt;br /&gt;
**Критичными** источниками данных являются:&lt;br /&gt;
* данные об исполнителе&lt;br /&gt;
&lt;br /&gt;
**Некритичными** источниками данных являются:&lt;br /&gt;
* данные по зоне заказа&lt;br /&gt;
    * Нам подойдет неактуальность данных их этого источника в течение `10 минут`. После этого следует показывать данные из конфига. &lt;br /&gt;
    * (подсказка по защите) ожидаю, что в тексте по защите домашнего задания вы покажете логи/скриншоты итд, которые реализуют все эти сценарии&lt;br /&gt;
* конфиги&lt;br /&gt;
    * сервис должен на старте получать актуальные конфиги и не использовать походы в них при обработке запросов&lt;br /&gt;
    * при недоступности источника конфигов при старте сервис не должен запускаться&lt;br /&gt;
    * сервис может бесконечно долго использовать старые данные&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Должна быть предусмотрена идемпотентность выполняемых операций (может потребовать хранения дополнительных данных)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Как сдавать домашнее задание ==&lt;br /&gt;
Из семинара:&lt;br /&gt;
&lt;br /&gt;
* Нужно описать дизайн системы, отвечающей требованиям&lt;br /&gt;
  * Должен получиться ADR определенной/фиксированной структуры &lt;br /&gt;
* Нужно реализовать систему, отвечающую требованиям &lt;br /&gt;
  * Должен получиться сервис / несколько сервисов + БД для хранения&lt;br /&gt;
  * Детали реализации остаются на ваше усмотрение&lt;br /&gt;
* Нужно показать/продемонстрировать выполнение ключевых FR / NFR&lt;br /&gt;
  * Должен получиться текстовый отчет произвольной структуры &lt;br /&gt;
&lt;br /&gt;
=== Что должно входить в ADR (Architecture Design Record) ===&lt;br /&gt;
Для вдохновения можно почитать:&lt;br /&gt;
- https://github.com/joelparkerhenderson/architecture-decision-record/tree/main/locales/en/templates/decision-record-template-by-jeff-tyree-and-art-akerman&lt;br /&gt;
- https://github.com/joelparkerhenderson/architecture-decision-record/tree/main/locales/en/templates/decision-record-template-of-the-madr-project&lt;br /&gt;
&lt;br /&gt;
==== Расчет нагрузки ====&lt;br /&gt;
Должен входить расчет нагрузки, с пересчетом RPS на каждый endpoint/ручку&lt;br /&gt;
Должен входить расчет по читающим/пишущим запросам в БД (прям вот буквально -- ожидается 100 RPS на запись, 300 RPS на чтение)&lt;br /&gt;
Точно должен входить расчет хранения на БД -- нужно хранить ХХХ Гб&lt;br /&gt;
&lt;br /&gt;
==== Схема системы ====&lt;br /&gt;
- Должны быть показаны пользователи системы (внешние потребители, внешние системы итд)&lt;br /&gt;
- Должны быть показаны микросервис/микросервисы&lt;br /&gt;
- Должны быть показаны БД&lt;br /&gt;
- Могут быть показаны L7-балансировщики&lt;br /&gt;
- Должны быть показаны схемы выполнения запросов, в случае нескольких микросервисов&lt;br /&gt;
&lt;br /&gt;
==== Основные сущности ====&lt;br /&gt;
- Должны быть представлены сущности, которые будут храниться в БД. С описанием полей&lt;br /&gt;
&lt;br /&gt;
=== Что должно входить в детали реализации ===&lt;br /&gt;
- Исходный код реализованных микросервисов (&amp;gt;=1 штуки)&lt;br /&gt;
- Схема выбранной БД на SQL/любом другом диалекте&lt;br /&gt;
- Обратите внимание на следование принципам SOLID, выполнение всех требований по надежности и других требований вашего варианта ДЗ&lt;br /&gt;
&lt;br /&gt;
=== Что должно входить в &amp;quot;текстовый отчет произвольной структуры&amp;quot; ===&lt;br /&gt;
- Вы должны показать, как реализованы и достигаются требования из вашего варианта домашнего задания.&lt;br /&gt;
формат -- произвольный.&lt;br /&gt;
&lt;br /&gt;
==== Например -- требование про &amp;quot;executer -- реализовать поход на фоллбэк-источник данных (service substitution)&amp;quot; ====&lt;br /&gt;
Вы должны показать корректную работу сервиса (через логи, графики итд) при работающем сервисе &amp;quot;executer&amp;quot;&lt;br /&gt;
Вы должны показать корректную работу сервиса (через логи, графики итд) при _неработающем_ сервисе &amp;quot;executer&amp;quot; -- должны быть запросы к другому источнику данных. Сервис должен продолжать корректно отвечать на запросы при этом и выдавать понятные сообщения в логи.&lt;br /&gt;
&lt;br /&gt;
То есть для каждого требования должно быть показано как его успешное выполнение, так и его невыполнение в случае неправильных предположений.&lt;br /&gt;
Если источник с заказами назван &amp;quot;критичным&amp;quot;, то вы должны показать как успешную работу сервиса при работе источника, так и ошибки сервиса с понятными сообщениями в логах при неработоспособности этого источника.&lt;/div&gt;</summary>
		<author><name>imported&gt;Smb1987</name></author>
	</entry>
</feed>