<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Привет,<br>
</p>
<div class="moz-cite-prefix">On 12.01.2021 19:12, Vladimir Sharun
wrote:</div>
<div class="moz-cite-prefix"><br>
</div>
<blockquote type="cite"
cite="mid:1610470996.960569000.xte76fq6@frv53.fwdcdn.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<span style="display:block;" class="xfm_82237771">
<div><span
style="font-size:12pt;line-height:14pt;font-family:Arial;"
class="xfmc1">Постановка задачи требует уточнений. Надо
понимать: <br data-mce-bogus="1">
</span></div>
<ol style="margin:5px 0;" start="1">
<li><span
style="font-size:12pt;line-height:14pt;font-family:Arial;"
class="xfmc1">на каждый UDP пакет надо принимать решение,
основываясь на критериях из кэша/апдейтов_в_пуше ? что это
?<br data-mce-bogus="1">
</span></li>
</ol>
</span></blockquote>
<p>каждый пакет - это текстовая строка, состоящая из 4-х полей, по
одному из которых делается if и есличо, то три других проходят
проверки на валидность и, дополняясь информацией из local cache,
уходят в output</p>
<p>что-то типа</p>
<pre><span style="color:#0033b3;">while True</span>:
data, address = lsock.recvfrom(<span style="color:#1750eb;">1024</span>)
try:
a, b, c, d = [i.strip()) for i in data.decode().split(',)]
a = int(a)
if a == 255:
if not b.isnumeric():
continue
va = memcached.get(b)
if va:
IPAddress(c)
d = int(d)
# we're here because no exception above
data = b.decode() + socket.inet_aton(c) + d.from_bytes(2, 'big) + va
for r in remotes:
rsock.send(data, r) # output UDP
elif a in [3, 5, 7]:
# smth else
...
except:
pass
</pre>
<p>реально - это практически всё как в оригинале, логика простая и
прямолинейная, потому ...</p>
<blockquote type="cite"
cite="mid:1610470996.960569000.xte76fq6@frv53.fwdcdn.com"><span
style="display:block;" class="xfm_82237771">
<ol style="margin:5px 0;" start="1">
<li><span
style="font-size:12pt;line-height:14pt;font-family:Arial;"
class="xfmc1">какой поток UDP пакетов/с, размеры, надо
как-то парсить? большие ? </span></li>
</ol>
</span></blockquote>
<p>я (наивно?) полагаю, что несколько тысяч pps питон вытянет на
среднем железе (у меня нет подобного опыта и отталкиваться не от
чего), а потом таки да -</p>
<p>
<blockquote type="cite">
<div class="moz-cite-prefix">On 12.01.2021 19:19, Mykola
Ulianytskyi wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CA+Medixr3a=3N3fdpPbkL9kc=DQY8ha7h30i+uCjetFidaHNJQ@mail.gmail.com">
<div dir="ltr"> > Что выбрать?
<div><br>
</div>
<div>C++ / C# / Java</div>
</div>
</blockquote>
</blockquote>
уйти на Java<br>
</p>
<p><br>
</p>
<blockquote type="cite"
cite="mid:1610470996.960569000.xte76fq6@frv53.fwdcdn.com"><span
style="display:block;" class="xfm_82237771">
<div><span
style="font-size:12pt;line-height:14pt;font-family:Arial;"
class="xfmc1">Например сразу будь готов к написанию еще с
порога системы контроля версии датасета в базе и у тебя в
кэше, потому что вот эти "усилители класса А без обратной
связи" - часто жертвы самоуверенности (рейс про@бали, дата
не так проинтерпретировалась и т.п.) и в базе одно, а делаем
другое<br data-mce-bogus="1">
</span></div>
</span></blockquote>
<p>была такая мысль, спасибо</p>
<p><br>
</p>
<blockquote type="cite"
cite="mid:1610470996.960569000.xte76fq6@frv53.fwdcdn.com"><span
style="display:block;" class="xfm_82237771">
<div><span
style="font-size:12pt;line-height:14pt;font-family:Arial;"
class="xfmc1">Пока что сходу решение -
С++/Асинхрон/воркеры, типичный пример тут - nginx.</span></div>
</span></blockquote>
<p>ну nginx - это ультра-факин-фотонный звездолет по сравнению с
тем, что написано выше :)</p>
<p><br>
</p>
<blockquote type="cite"
cite="mid:1610470996.960569000.xte76fq6@frv53.fwdcdn.com"><span
style="display:block;" class="xfm_82237771">
<div><span
style="font-size:12pt;line-height:14pt;font-family:Arial;"
class="xfmc1"> </span></div>
<div><span
style="font-size:12pt;line-height:14pt;font-family:Arial;"
class="xfmc1">Да, и inram cache - это тоже штука в себе.</span><br
data-mce-bogus="1">
</div>
</span></blockquote>
<p>а какая разумная альтернатива?<br>
</p>
<p><br>
</p>
<blockquote type="cite"
cite="mid:1610470996.960569000.xte76fq6@frv53.fwdcdn.com"><span
style="display:block;" class="xfm_82237771">
<div><br data-mce-bogus="1">
</div>
<div><i><span style="font-size:10pt;line-height:12pt;"><span
style="font-family:Arial;">12 січня 2021, 18:55:22, від
"Volodymyr Litovka" <</span><a
href="mailto:doka@xlit.one" target="_blank"
moz-do-not-send="true"><span style="font-family:Arial;">doka@xlit.one</span></a><span
style="font-family:Arial;">>:</span></span></i></div>
<div><br>
</div>
<blockquote style="border-left:1px solid #cccccc;margin:0px 0px
0px 0.8ex;padding-left:1ex;">
<div style="display:block;">
<div>Привет,</div>
<div>а как правильно подойти к следующей задаче?</div>
<div>Есть приложение (e.g. MyApp), которое обрабатывает
данные из нескольких источников:</div>
<pre style="margin:5px 0;"> +-----------+
| REST API |
+--+-----+--+
| |
PUSH (TCP) | | GET (HTTP)
| |
v v
+---+-----+---+
UDP | | Output
--------->+ MyApp +----------->
| |
+-------------+
</pre>
<div>Поток UDP довольно мощный и является источником RAW
data. Для обработки этих данных нужна дополнительная
информация, хранящяяся в SQL - она доступа по REST API, а
обновления - по TCP PUSH NFYs</div>
<div>Для снижения нагрузки на REST и увеличения собственного
быстродействия, при старте MyApp наполняет in-ram cache,
запрашивая стартовые данные из REST API и больше никогда к
нему не обращаясь, а обновления приходят по TCP (PUSH
NFYs)</div>
<div>Таким образом, в процессе работы приложения всегда есть
два параллельных процесса, один из которых довольно ёмкий
либо по времени, либо по ресурсам -</div>
<div>1) старт - приложение долго тянет базу из REST API,
реагируя при этом на периодические TCP PUSH NFYs (тут
можно разбить вытягивание большого объема данных на более
мелкие чанки)<br>
2) основной цикл работы - приложение слушает очень
интенсивный поток UDP (я бы сказал, что делает это без
пауз на передохнуть), реагируя при этом на периодические
TCP PUSH NFYs</div>
<div>Пока что это пишется на Питоне, что вносит определенные
ограничения в набор механизмов. Три варианта, какие я
вижу:</div>
<ul style="margin:5px 0;">
<li>multiprocess - три отдельных приложения
<ul style="margin:5px 0;">
<li>тут более-менее понятно - система сама будет
распределять CPU resources между приложениями по
требованию + внешняя синхронизация</li>
<li>но выглядит оно эскадрой пушечных парусников из
книжки по истории ;-)</li>
</ul>
</li>
<li>multithreading - три треда в одном приложении, это уже
более "модно и молодежно" (хотя задача синхронизации
событий остается), но:
<ul style="margin:5px 0;">
<li>гарантируется ли своевременная передача исполнения
треду с TCP listener upon packet arrival в услових
интенсивной работы треда, обслуживающего UDP?</li>
<li>я читал/слышал, что у Питона сложная история
отношений с multi-threading, не наступить бы еще тут
на грабли</li>
</ul>
</li>
<li>python asyncio
<ul style="margin:5px 0;">
<li>это удобно - одно приложение, никакой
синхронизации событий между автономными процессами</li>
<li>но вообще это эффективно для такой задачи?</li>
</ul>
</li>
</ul>
Что выбрать? Какие еще варианты подхода к снаряду могут
быть? Как вообще правильно это делать?<br>
<div>Спасибо!</div>
<pre style="margin:5px 0;">--
Volodymyr Litovka
"Vision without Execution is Hallucination." -- Thomas Edison</pre>
</div>
<pre style="margin:5px 0;">_______________________________________________
uanog mailing list
<a href="mailto:uanog@uanog.kiev.ua" target="_self" rel="noreferrer noopener" moz-do-not-send="true">uanog@uanog.kiev.ua</a>
<a href="https://mailman.uanog.kiev.ua/mailman/listinfo/uanog" target="_blank" rel="noreferrer noopener" moz-do-not-send="true">https://mailman.uanog.kiev.ua/mailman/listinfo/uanog</a>
</pre>
</blockquote>
</span>
</blockquote>
<pre class="moz-signature" cols="72">--
Volodymyr Litovka
"Vision without Execution is Hallucination." -- Thomas Edison</pre>
</body>
</html>