<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<div name="messageBodySection">
<div dir="auto">Привет!<br />
<br />
Если нужно что-то делать для 1) “для снижения нагрузки на REST” и если 2) "приложение долго тянет базу из REST API”, то это говорит о неправильной архитектуре системы и/или REST API. Но, менять архитектуру дорого и может не получится. Поэтому, в данной ситуации, я бы или 1) оптимизировал REST API для приложения, или 2) написал свой “прокси" REST API и добавлял туда механизмы кеширования.<br />
<br />
Я всегда предпочитаю multiprocess системы т.к. unix команды kill/top/nice/renice уже существуют десятки лет, прекрасно работают и лишняя complexity здесь не нужна.<br />
<br />
Написание программы с “параллельной”/одновременной работой процессов без locks, shared memory, stateful objects, mutable variables и т.п. требует знаний и навыков, которые есть у очень малого кол-ва программистов. Поэтому, если слова functional programming вызывает только негативные эмоции, но лучше ИМХО и не пытаться.</div>
</div>
<div name="messageSignatureSection"><br />
<div class="matchFont"><span style="color: var(--textColor); background-color: var(--backgroundColor);">Максим</span></div>
</div>
<div name="messageReplySection">On 12 Jan 2021, 17:55 +0100, Volodymyr Litovka <doka@xlit.one>, wrote:<br />
<blockquote type="cite" style="border-left-color: grey; border-left-width: thin; border-left-style: solid; margin: 5px 5px;padding-left: 10px;">
<p>Привет,</p>
<p>а как правильно подойти к следующей задаче?</p>
<p>Есть приложение (e.g. MyApp), которое обрабатывает данные из нескольких источников:</p>
<pre>            +-----------+
            |  REST API |
            +--+-----+--+
               |     |
    PUSH (TCP) |     | GET (HTTP)
               |     |
               v     v
           +---+-----+---+
   UDP     |             |   Output
 --------->+   MyApp     +----------->
           |             |
           +-------------+

</pre>
<p>Поток UDP довольно мощный и является источником RAW data. Для обработки этих данных нужна дополнительная информация, хранящяяся в SQL - она доступа по REST API, а обновления - по TCP PUSH NFYs<br /></p>
<p>Для снижения нагрузки на REST и увеличения собственного быстродействия, при старте MyApp наполняет in-ram cache, запрашивая стартовые данные из REST API и больше никогда к нему не обращаясь, а обновления приходят по TCP (PUSH NFYs)</p>
<p>Таким образом, в процессе работы приложения всегда есть два параллельных процесса, один из которых довольно ёмкий либо по времени, либо по ресурсам -<br /></p>
<p>1) старт - приложение долго тянет базу из REST API, реагируя при этом на периодические TCP PUSH NFYs (тут можно разбить вытягивание большого объема данных на более мелкие чанки)<br />
2) основной цикл работы - приложение слушает очень интенсивный поток UDP (я бы сказал, что делает это без пауз на передохнуть), реагируя при этом на периодические TCP PUSH NFYs</p>
<p>Пока что это пишется на Питоне, что вносит определенные ограничения в набор механизмов. Три варианта, какие я вижу:</p>
<ul>
<li>multiprocess - три отдельных приложения</li>
<ul>
<li>тут более-менее понятно - система сама будет распределять CPU resources между приложениями по требованию + внешняя синхронизация</li>
<li>но выглядит оно эскадрой пушечных парусников из книжки по истории ;-)<br /></li>
</ul>
<li>multithreading - три треда в одном приложении, это уже более "модно и молодежно" (хотя задача синхронизации событий остается), но:</li>
<ul>
<li>гарантируется ли своевременная передача исполнения треду с TCP listener upon packet arrival в услових интенсивной работы треда, обслуживающего UDP?</li>
<li>я читал/слышал, что у Питона сложная история отношений с multi-threading, не наступить бы еще тут на грабли<br /></li>
</ul>
<li>python asyncio</li>
<ul>
<li>это удобно - одно приложение, никакой синхронизации событий между автономными процессами</li>
<li>но вообще это эффективно для такой задачи?<br /></li>
</ul>
</ul>
Что выбрать? Какие еще варианты подхода к снаряду могут быть? Как вообще правильно это делать?<br />
<p>Спасибо!<br /></p>
<pre class="moz-signature" cols="72">--  
Volodymyr Litovka
  "Vision without Execution is Hallucination." -- Thomas Edison</pre>
_______________________________________________<br />
uanog mailing list<br />
uanog@uanog.kiev.ua<br />
https://mailman.uanog.kiev.ua/mailman/listinfo/uanog<br /></blockquote>
</div>
</body>
</html>