<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>