Первое приложение (Avalanche — application framework for Java)


"Avalanche — application framework for Java" — реализация технологии стирающей различия между
вызовами локального и удаленного кода. Отказоустойчивость, масштабируемость,
модифицируемость, непрерывная доступность идут в комплекте приятными бонусами.


Все языки программирования предлагают для начала написать простую программу вывода
сообщения "Hello world". Этот пример не подходит для демонстрации функциональных
возможностей "Avalanche — application framework for Java", так как вызов этого примера всегда
возвращает одну и ту же строку и не позволяет идентифицировать источник, возвративший этот
результат.


Для первого приложения потребуется реализовать два класса (функцию и приложение), один
интерфейс (адаптер функции) и одну JSP страницу для отображения результата. Разработанное
приложение будет выполняться под управлением Tomcat.


Реализация класса функции — DemoFunction


В классе реализации функции нет ничего особенного, это обычный класс Java. В качестве
класса функции может быть использован любой класс. Пусть демонстрационный класс функции
возвращает следующую информацию из операционной системы: PID процесса и имя сервера;
версия операционной системы; название операционной системы.


Код класса DemoFunction.java


package ru.funsys.demo.avalanche;

import java.lang.management.ManagementFactory;
import java.util.Hashtable;

public class DemoFunction {

    /**
     * Получить информацию из операционной системе.<br>
     * <br>
     *  Из системных свойств выбираются значения<br>
     * <b>os.name</b> - имя ОС,<br>
     * <b>os.version</b> - версия ОС<br>
     * и <b>PID@name</b> - идентификатор процесса и имя сервера 
     * 
     * @return именованный список с параметрами ОС
     */
    public Hashtable<String, String> getInfo() {
        Hashtable<String, String> result = new Hashtable<String, String>();
        result.put("os.name", System.getProperty("os.name"));
        result.put("os.version", System.getProperty("os.version"));
        result.put("PID@name", ManagementFactory.getRuntimeMXBean().getName());
        return result;
    }

}

Реализация адаптера — DemoAdapter


С точки зрения языка программирования Java, адаптер — это интерфейс, в котором
декларируются методы класса функции, которые планируются вызывать с помощью этого
адаптера. Для класса DemoFunction требуется написать следующий код интерфейса


Код интерфейса DemoAdapter.java


package ru.funsys.demo.avalanche;

import java.util.Hashtable;

import ru.funsys.avalanche.AvalancheRemote;

public interface DemoAdapter {

    public Hashtable<String, String> getInfo() throws AvalancheRemote;

}

Следуют отметить, что все методы созданного интерфейса DemoAdapter должны
обязательно содержать декларирование исключения AvalancheException. Данная
реализация чем то напоминает реализацию RMI в языке программирования Java, но есть и
отличия:


  • Класс функции (в приведенном примере — DemoFunction) не реализует интерфейс адаптера
    (в приведенном примере — DemoAdapter)
  • В интерфейсе (пример — DemoAdapter) не обязательно нужно определять все публичные
    методы класса функции (например, в DemoFunction), достаточно определить только методы,
    которого будут вызываться через данный интерфейс.

Реализация адаптера позволяет вызывать методы функции, где бы она не была опубликована.


Реализация класса приложения — DemoApplication


Класс DemoApplication — выполняет вызов метода getInfo() класса DemoFunction
при помощи адаптера DemoAdapter. Пусть класс DemoApplication преобразует
полученный результат вызова getInfo() в формат TXT или HTML.


Код интерфейса DemoApplication.java


package ru.funsys.demo.avalanche;

import java.util.Enumeration;
import java.util.Hashtable;

import ru.funsys.avalanche.Application;
import ru.funsys.avalanche.AvalancheRemote;

public class DemoApplication extends Application {

    /**
     * Определение поля для хранения экземпляра адаптера
     */
    private DemoAdapter info;

    /**
     * Метод вызова метода адаптера и форматирования полученного результата
     * в текстовый формат или формат HTML в зависимости от параметра метода.
     * 
     * @param html true, если необходим формат HTML, иначе false
     * 
     * @return текс или таблицу HTML с параметрами ОС
     */
    public String getInfo(boolean html) {
        StringBuilder builder = new StringBuilder();
        if (html) {
            builder.append("<table border=\"1\">");
            builder.append("<tr><th>key</th><th>value</th></tr>");
        }
        try {
            // Вызов метода адаптера
            Hashtable<String, String> result = info.getInfo();

            for (Enumeration<String> enumeration = result.keys(); enumeration.hasMoreElements(); ) {
                String key = enumeration.nextElement();
                String value = result.get(key);
                if (html) {
                    builder.append("<tr><td>").append(key).append("</td><td>").append(value).append("</td></tr>");
                } else {
                    builder.append(key).append(": ").append(value).append("\r\n");
                }
            }
        } catch (AvalancheRemote e) {
            if (html) {
                builder.append("<tr><td>").append("error").append("</td><td>").append(e.getLocalizedMessage()).append("</td></tr>");
            } else {
                builder.append("error").append(": ").append(e.getLocalizedMessage()).append("\r\n");
            }
        }
        if (html) builder.append("</table>");
        return builder.toString();
    }

}

К классу приложения предъявляются следующие требование: он обязательно должен наследоваться от класса ru.funsys.avalanche.Application.


Поле info определять не обязательно, ссылку на адаптер можно получить по имени, вызвав наследуемый метод getAdapter(String name) класса ru.funsys.avalanche.Application. Имя адаптера задается в конфигурационном файле приложения. Определение поля позволяет сократить объем кодирования.


Реализация JSP страницы — first.jsp


JSP страница отображает результат вызова метода функции в браузере. Сперва получается ссылка на класс DemoApplication и далее вызывается его метод getInfo c параметром true.


<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Демонстрационное приложение</title>
</head>
<body>
<h1>Демонстрационное приложение</h1>
<jsp:useBean id='DemoApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/>

<%= DemoApp.getInfo(true) %>
<br>

</body>
</html>

Реализация приложения завершена. Теперь нужно определить конфигурацию приложения.


Файл web.xml


В файле web.xml необходимо определить секцию запуска сервлета AvalancheServlet, указав в его параметрах имена конфигурационных файлов приложения и системы логгирования log4j. Сервлет AvalancheServlet инициирует все объекты приложения на основании файла конфигурации avalanche-config.xml.


<?xml version="1.0" encoding="UTF-8"?>
<!--
web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0" 
-->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

    <display-name>Demo Avalanche</display-name>
    <description>
        Демонстрационное приложение с использованием framework Avalanche
    </description>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <display-name>AvalancheServlet</display-name>
        <servlet-name>AvalancheServlet</servlet-name>
        <servlet-class>ru.funsys.servlet.http.AvalancheServlet</servlet-class>
        <init-param>
            <param-name>avalanche.config</param-name>
            <param-value>${catalina.base}/conf/avalanche-config.xml</param-value>
        </init-param>
        <init-param>
            <param-name>avalanche.log4j</param-name>
            <param-value>${catalina.base}/conf/avalanche-log4j.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

</web-app>

Файл конфигурации приложения avalanche-config.xml


Файл конфигурации приложения с локальным вызовом функции имеет следующий вид


<?xml version="1.0" encoding="UTF-8"?>
<avalanche name="Demo Application">

    <function class="ru.funsys.demo.avalanche.DemoFunction" name="info-function" description="Сведения об узле системы" />

    <application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" >
        <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="info-function" />
    </application>

</avalanche>

В этом файле определены две секции <function> и <application>. Секция <application> имеет вложенный элемент <adapter>, в котором в атрибуте uri указано имя локальной функции (см. значение атрибута name секции <function>).


Обращаю внимание на значение атрибута name секции <application>, значение этого атрибута DemoApp указывается в атрибуте id для получения ссылки на экземпляр класса DemoApplication в JSP странице.


Удаленный вызов функции DemoFunction


Вызов удаленной функции обычно требует дополнительной специализированной реализации серверной и клиентской части, предварительно выбрав какое то решения из множества существующих технологий, например REST, SOAP или какую то другую.


"Avalanche — application framework for Java" позволяет избежать дополнительного кодирования для вызова методов удаленной функции DemoFunction. Для этого достаточно изменить конфигурацию приложения и опубликовать копию приложения на удаленном сервере.


Необходимо добавить в конфигурационный файл avalanche-config.xml секции:


  • <interface>, обеспечивает вызов метод удаленных экземпляров объектов по указанному протоколу
  • <connector>, обеспечивает обращение к методам локальных функций с удаленных узлов приложения.

Удаленный вызов по протоколу RMI


Для обеспечения доступа к удаленным объектам по протоколу RMI в файл конфигурации необходимо добавить следующую секцию


<interface name="rmi-interface" uri="rmi://localhost:23000/rmi-connector" />

где:


  • localhost определяет адрес удаленного узла
  • 23000 определяет порт RMI Remote Server коннектора удаленного узла
  • rmi-connector имя коннектора на удаленном узле

На удаленном узле требуется в конфигурационном файле добавить секцию <connector>


<connector class="RMIConnector" name="rmi-connector" port="23000" >
    <publish name="info" function="info-function" />
</connector>

где:


  • rmi-connector имя коннектора
  • 23000 порт RMI Remote Server
  • <publish> публикует локальную функцию info-function в коннекторе, опубликованная функция info-function будет известна удаленным узлам под именем info

Удаленный вызов по протоколу HTTP


Для обеспечения доступа к удаленным объектам по протоколу HTTP в файл конфигурации необходимо добавить следующую секцию


<interface name="http-interface" uri="http://localhost:8080/demo/connector/http-connector" />

где:


  • localhost определяет адрес удаленного узла
  • 8080 определяет порт HTTP Server коннектора удаленного узла
  • demo имя контекста удаленного экземпляра приложения
  • connector имя сервлета AvalancheServlet
  • http-connector имя коннектора на удаленном узле

На удаленном узле требуется в конфигурационном файле добавить секцию <connector>


<connector class="HTTPConnector" name="http-connector" >
    <publish name="info" function="info-function" />
</connector>

где:


  • http-connector имя коннектора
  • <publish> публикует локальную функцию info-function в коннекторе, опубликованная функция info-function будет известна удаленным узлам под именем info

Примечание! Значение HTTP порта не указывается, используется коннектор HTTP сервера (Tomcat).


Дополнительно нужно добавить секции <multipart-config> в конфигурацию сервлета AvalancheServlet и <servlet-mapping> для определения URI этого сервлета в файле web.xml.


Новая редакция файла web.xml


<?xml version="1.0" encoding="UTF-8"?>
<!--
web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0" 
-->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

    <display-name>Demo Avalanche</display-name>
    <description>
        Демонстрационное приложение с использованием framework Avalanche
    </description>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <display-name>AvalancheServlet</display-name>
        <servlet-name>AvalancheServlet</servlet-name>
        <servlet-class>ru.funsys.servlet.http.AvalancheServlet</servlet-class>
        <init-param>
            <param-name>avalanche.config</param-name>
            <param-value>${catalina.base}/conf/avalanche-config.xml</param-value>
        </init-param>
        <init-param>
            <param-name>avalanche.log4j</param-name>
            <param-value>${catalina.base}/conf/avalanche-log4j.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <multipart-config>
            <!-- 50MB max -->
            <max-file-size>52428800</max-file-size>
            <max-request-size>52428800</max-request-size>
            <file-size-threshold>0</file-size-threshold>
        </multipart-config>
    </servlet>

    <servlet-mapping>
        <servlet-name>AvalancheServlet</servlet-name>
        <url-pattern>/connector/*</url-pattern>
    </servlet-mapping>

</web-app>

Чтобы сохранить работоспособность примера локального вызова функции, добавим две копии секции <application> с именами RMIApp и HTTPApp. Атрибуты uri вложенных элементов <adapter> этих секций примут составные значения имя-интерфейса/имя-удаленной функции, т.е. rmi-interface/info и http-interface/info.


Объединенная редакция конфигурационного файла avalanche-config.xml для локального и удаленного вызовов по протоколам RMI и HTTP


<?xml version="1.0" encoding="UTF-8"?>
<avalanche name="Demo Application">

    <interface name="rmi-interface" uri="rmi://localhost:23000/rmi-connector" />

    <interface name="http-interface" uri="http://localhost:8080/demo/connector/http-connector" />

    <function class="ru.funsys.demo.avalanche.DemoFunction" name="info-function" description="Сведения об узле системы" />

    <application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" >
        <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="info-function" />
    </application>

    <application class="ru.funsys.demo.avalanche.DemoApplication" name="RMIApp" >
        <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="rmi-interface/info" />
    </application>

    <application class="ru.funsys.demo.avalanche.DemoApplication" name="HTTPApp" >
        <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="http-interface/info" />
    </application>

    <connector class="RMIConnector" name="rmi-connector" port="23000" >
        <publish name="info" function="info-function" />
    </connector>

    <connector class="HTTPConnector" name="http-connector" >
        <publish name="info" function="info-function" />
    </connector>

</avalanche>

Для сохранения работоспособности JSP страницы first.jsp можно создать ее копии для вызова удаленной функции по протоколу RMI и HTTP, указав значения в атрибуте id RMIApp и HTTPApp соответственно.


Код rmi.jsp


<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Демонстрационное приложение - RMI</title>
</head>
<body>
<h1>Демонстрационное приложение - RMI</h1>
<p>
Удаленный вызов - протокол RMI
</p>
<jsp:useBean id='RMIApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/>

<%= RMIApp.getInfo(true) %>

</body>
</html>

Код http.jsp


<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Демонстрационное приложение - HTTP</title>
</head>
<body>
<h1>Демонстрационное приложение - HTTP</h1>
<p>
Удаленный вызов - протокол HTTP
</p>
<jsp:useBean id='HTTPApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/>

<%= HTTPApp.getInfo(true) %>

</body>
</html>

Теперь достаточно скопировать разработанное приложение на другой узел, при необходимости заменить значение localhost на адрес удаленного узла в секциях <interface> файла avalanche-config.xml, и проверить работоспособность приложения.


Как видно из приведенного примера, для обеспечения удаленного вызова функции не потребовалось вносить каких либо корректировок в программный код локального вызова.


Исходные коды, рассмотренного здесь примера приложения, опубликованы на GitHub

Комментарии (304)


  1. peresada
    25.11.2019 13:27
    +1

    реализация технологии стирающей различия между вызовами локального и удаленного кода


    Не увидел ни одного теста производительности в статье.


    1. vl65 Автор
      25.11.2019 13:55

      Тема производительности выходит за рамки «первого приложения». Эту тему планирую раскрыть позднее.


      1. lair
        25.11.2019 14:15

        Тогда почему хаб "высокая производительность"?


        1. vl65 Автор
          25.11.2019 14:50
          -1

          Позволяет строить высокопроизводительные распределенные отказаустойчивые системы непрерывной доступности.


          1. lair
            25.11.2019 14:50

            Так это утверждение вроде бы нуждается в доказательстве, разве нет?


            1. vl65 Автор
              25.11.2019 14:55
              -1

              Нуждается, но это уже выходит за рамки простого приложения.


              1. lair
                25.11.2019 14:56
                +1

                Значит, в рамках простого приложения этот хаб указан безосновательно.


                1. vl65 Автор
                  25.11.2019 15:04
                  -1

                  В рамках простого приложения этот хаб относится к фремворку, который позволяет это делать. В отличии от того же REST, SOAP и прочих технологий здесь нет «лишних» преобразований при передаче данных между узлами системы, что при всех прочих равных возможностей будет показывать пусть небольшую, но все же большую производительность.


                  1. lair
                    25.11.2019 15:08

                    который позволяет это делать.

                    Это утверждение нуждается в доказательстве.


                    В рамках простого приложения этот хаб относится к фремворку,

                    Поймите: вот я открываю хаб, вижу там вашу статью, захожу в нее — а там про производительность ни одного (полезного) слова.


                    1. vl65 Автор
                      25.11.2019 15:24
                      -1

                      Зачем ходить по кругу, возвращаясь многократно к одному и тому же? Этот вопрос за рамками этой статьи.


                      1. lair
                        25.11.2019 15:34
                        +1

                        Если этот вопрос за рамками этой статьи, то эта статья — за рамками хаба "Высокая производительность". О чем, собственно, я сразу и написал.


                        1. vl65 Автор
                          25.11.2019 15:46

                          Рассмотренная технология позволяет создавать приложения высокой производительности, хотя бы тем, что можно добавлять по своему усмотрению неограниченное число узлов. На GitHub (ссылка в конце статьи) опубликован простой пример каскадной функции, которая "распределяет" нагрузку между множеством узлов, с которых вызывается метод getInfo().


                          DemoCascadeFunction


                          1. lair
                            25.11.2019 15:48

                            (а) в статье об этом ни слова
                            (б) измерения в студию


                            1. vl65 Автор
                              25.11.2019 15:57
                              -1

                              Постараюсь раскрыть эту тему в следующей статье.


  1. lair
    25.11.2019 13:35

    реализация технологии стирающей различия между вызовами локального и удаленного кода.

    Никогда такого не было и вот опять?


    Признайтесь, как вы решили проблему обледенения chatty vs chunky?


  1. ne_kotin
    25.11.2019 13:37
    +1

    Тут упорно избавляются от JSP и сервлет-конфигов последние лет 10, про RMI только в кГовавом энтеГпГайзе помнят.
    А тут мало того, что напиши remotable bean, зарегистрируй его в конфиге, так еще и интерфейс ручками там же свяжи.
    Ради всего святого — зачем?


    1. vl65 Автор
      25.11.2019 14:46

      Жизненный цикл программного обеспечения имеет несколько периодов, самый продолжительный из которых — эксплуатационный. У эксплуатирующей организации возникает много разных непредвиденных ранее требований к программному обеспечению. Файл конфигурации позволяет эксплуатирующей организации самостоятельно реагировать на часть возникающих новых требований.

      На мой взгляд, вынос параметров в конфигурационный файл — это «правило хорошего тона».

      «Зачем?» — ограничено только вашей фантазией. Допустим, что нужно 100% зарезервировать функционал DemoFunction. Что для этого нужно? Опубликовать DemoFunction на множестве узлов и поменять конфигурацию системы. Все. Допустим, что Вам нужно поймать событие вызова метода getInfo() класса DemoFunction. Создаете «каскадную» функцию, которая вызывает DemoFunction и отдает результат DemoApplication попутно выполнив требуемые Вам действия и меняете конфигурацию. Допустим изменился технологический процесс и часть функций вашей информационной системы потеряла актуальность. Для вывода из эксплуатации этой часть достаточно убрать ее из конфигурации системы.


      1. lair
        25.11.2019 14:50

        Допустим изменился технологический процесс и часть функций вашей информационной системы потеряла актуальность. Для вывода из эксплуатации этой часть достаточно убрать ее из конфигурации системы.

        И информационная система магически перестанет вызывать эту "часть системы"?


        1. vl65 Автор
          25.11.2019 14:53

          Перестанет и пользователи перестанут видеть эту часть в своем интерфейсе.


          1. lair
            25.11.2019 14:57
            +1

            Благодаря описанной в посте технологии? Что случится при обращении к first.jsp при такой конфигурации?


            1. vl65 Автор
              25.11.2019 15:22

              Прошу не путать приложение «Hello world» c промышленным приложением.


              1. lair
                25.11.2019 15:33

                Значит, эта часть мотивации неактуальна.


                1. vl65 Автор
                  25.11.2019 19:27
                  -1

                  Это уже дело вашей фантазии как Вы реализуете эту функциональность. Например, 2 года назад, в одном из своих приложений подобным образом была отключена часть утратившей актуальность функций, находящееся в эксплуатации с 2007 года. Приложение, при старте "видит" список объектов в своей конфигурации и на основании этого списка строит пользовательский интерфейс. Отключение одного из элементов в конфигурации привело и к изменению в пользовательском интерфейсе, все связанные с этим элементом пункты меню "чудесным образом" пропали.


                  1. lair
                    25.11.2019 20:16
                    +1

                    Это уже дело вашей фантазии как Вы реализуете эту функциональность

                    … и, возможно, я найду более простой и надежный способ реализовать эту функциональность. Что лишний раз говорит нам, что, может быть, конфиги-то и не так хороши, как кажется?


                    1. vl65 Автор
                      26.11.2019 11:20

                      Использовать для этих целей конфигурацию приложения очень удобно и в первую очередь для эксплуатирующего подразделения! Возникло требование — отключили никого не спрашивая, никому не обращаясь. Возникло требование — подключили. Риск внести ошибку или "сломать" ИС минимальный.


                      "Удобство эксплуатации" для меня имеет существенно более высокий приоритет чем "удобство реализации" (удобство кодирования для программиста).


                      1. lair
                        26.11.2019 11:27

                        Использовать для этих целей конфигурацию приложения очень удобно

                        Конфигурацию приложения в общем понимании? Да. Конфигурацию, как вы ее подаете? Не обязательно.


                        Риск внести ошибку или "сломать" ИС минимальный.

                        Минимальный из каких вариантов?


                        1. vl65 Автор
                          26.11.2019 14:18

                          Минимальный по сравнению с внесением изменений в ПО


                          1. lair
                            26.11.2019 14:20

                            Я еще раз повторю: внесение изменений в конфигурацию — это и есть внесение изменений в ПО, поэтому ваше противопоставление бессмысленно.


                            1. vl65 Автор
                              26.11.2019 14:30

                              Изменение конфигурации — это не изменение ПО. Конфигурация — переменная составляющая. ПО — неизменная составляющая.


                              1. lair
                                26.11.2019 14:33

                                Изменение конфигурации — это не изменение ПО.

                                Почему это?


                                Какая для конечного пользователя разница, что было изменено, если наблюдаемое им поведение программы поменялось?


                                Представьте на минуту, что речь идет не о компилируемых языках, а о чем-нибудь вроде Python.


                                1. vl65 Автор
                                  26.11.2019 14:36

                                  Разница огромная! Для изменения конфигурацию достаточно любого текстового редактора. Для приведенного примера достаточно закомментарить или удалить секцию конфигурации. А что нужно для внесения изменений ПО, потрудитесь описать.


                                  1. lair
                                    26.11.2019 14:40

                                    Для изменения конфигурацию достаточно любого текстового редактора.

                                    Я не зря написал про Python. Для внесения изменений достаточно того же самого текстового редактора.


                                    Или вот возьмите AWS Lambda (или API Gateway, не важно): когда я там что-то меняю — это изменение настройки или ПО? И как вы отличаете одно от другого?


                                    Разница огромная!

                                    Напомню вопрос: "Какая для конечного пользователя разница". Разве он вообще видит, каким редактором вы пользовались для внесения изменений?


                                    1. vl65 Автор
                                      26.11.2019 14:47

                                      Не важно, какой язык Вы используете, важно трудаемкость процесса. Сколько строк кода Вам потребуется вычистить в случае отключения какой то части системы? Вы уверены, что сможете сделать это без ошибок? А вам не приходилось слышать, что "этот код написан очень давно и никто толком не помнит как он работает и лучше его не трогать"?


                                      1. lair
                                        26.11.2019 14:54
                                        +1

                                        Не важно, какой язык Вы используете, важно трудаемкость процесса.

                                        И почему вы утверждаете, что для конфигурации она меньше?


                                        Сколько строк кода Вам потребуется вычистить в случае отключения какой то части системы?

                                        В правильно спроектированной системе? Одну.


                                        Вы уверены, что сможете сделать это без ошибок?

                                        Нет, конечно. Но и человек, правящий конфигурацию, не может быть в этом уверен.


                                        А вам не приходилось слышать, что "этот код написан очень давно и никто толком не помнит как он работает и лучше его не трогать"?

                                        А вам не приходилось слышать "эта строчка в конфигурации написана очень давно, и лучше ее не трогать"?


                                        1. vl65 Автор
                                          26.11.2019 15:16
                                          -1

                                          1. Конфигурацию может поправить любой специалист.


                                          2. У Вас такой не найдется


                                          3. Может. 100% выполнить эту операцию без ошибки.


                                          4. Не приходилось! А мое утверждение — постоянно, когда речь заходит о какой либо модификации кода находящегося в эксплуатации достаточно долгое время. От разных разработчиков, разных контор.



                                          1. staticlab
                                            26.11.2019 15:23
                                            +2

                                            Может. 100% выполнить эту операцию без ошибки.

                                            Человек не может допустить ошибку в конфиге?


                                          1. lair
                                            26.11.2019 15:23

                                            Конфигурацию может поправить любой специалист.

                                            Код может поправить любой специалист.


                                            У Вас такой не найдется

                                            Не найдется чего, простите?


                                            Может. 100% выполнить эту операцию без ошибки.

                                            Если он может, то и я могу. Удалить одну строчку кода — просто.


                                            Не приходилось!

                                            Вам повезло. А мне приходилось, и неоднократно.


                                            1. vl65 Автор
                                              26.11.2019 15:56

                                              В промышленных системах править исходный код, где цена ошибки может принести огромные убытки? Любого просто не подпустят! А править конфиг может (и это его обязанность) администратор системы.


                                              1. lair
                                                26.11.2019 16:03

                                                Вы себе противоречите. Сначала вы говорите, что конфигурацию может поправить любой специалист, потом говорите, что любого не подпустят.


                                                Но в любом случае: в промышленной системе степень ответственности и допуска при правке системы не отличается для кода и конфигурации — что одно, что другое попадает в деплоймент-систему, оттуда выкатывается на стейджинг, оттуда же — на продакшн.


                                                1. vl65 Автор
                                                  26.11.2019 16:09

                                                  Администратор не программист, в его обязанностях нет пункта править код информационной системы.


                                                  1. lair
                                                    26.11.2019 16:15

                                                    Во-первых, что напишут в обязанности, то и будет.
                                                    Во-вторых, править конфигурацию тоже может не входить.
                                                    В-третьих, в его обязанности входит удостовериться, что работает, и выкатить, а кто и как внес изменение — не важно.


                                                    А главное, все это не имеет никакого отношения к тому, является ли изменение конфигурации изменением ПО.


                                                    1. vl65 Автор
                                                      26.11.2019 17:32

                                                      Наши разные взгляды на обязанности администратора системы выходят за рамки рассматриваемой теме


                                                      1. lair
                                                        26.11.2019 17:52

                                                        И именно поэтому вы не можете использовать "обязанности администратора системы" как аргумент в пользу конфигурации вместо кода.


                                                        Что, в свою очередь, снова возвращает нас к утверждению, что и изменение конфигурации, и изменение кода являются изменением ПО (не то что бы обязанности администратора на это как-то влияли).


                                                        1. vl65 Автор
                                                          26.11.2019 17:55

                                                          Моя точка зрения остается неизменной — изменение конфигурации не является изменением ПО. Для меня ваши аргументы не убедительны. Давайте закроем эту тему, она не относится к теме публикации.


                                                          1. lair
                                                            26.11.2019 17:57

                                                            Для меня ваши аргументы не убедительны.

                                                            … однако опровергнуть их вам не удалось.


                                                            Давайте закроем эту тему, она не относится к теме публикации.

                                                            Да нет, напрямую относится. Если из вашего решения выкинуть конфигурацию, что останется?


                                                            1. vl65 Автор
                                                              26.11.2019 18:01

                                                              А Вы доказать вашу правоту не можете. И кто из нас прав?


                                                              1. lair
                                                                26.11.2019 18:03

                                                                Понимаете ли, в чем дело… это вы предлагаете некую технологию, утверждая, что она лучше, удобнее и бла-бла-бла. Вам и доказывать, что это так.


                                                                1. vl65 Автор
                                                                  26.11.2019 18:05
                                                                  -2

                                                                  Совершенно верно — гораздо лучше и гораздо удобнее. Доказано практикой. Не сталкивались вы с подобными проблемами, не можете осознать преимущества подобного подхода.


                                                                  1. lair
                                                                    26.11.2019 18:18

                                                                    Доказано практикой.

                                                                    Чьей практикой? Конкретные примеры, исследования, case studies — в студию.


                                                                    Не сталкивались вы с подобными проблемами

                                                                    Какими "подобными"?


                                                                    1. vl65 Автор
                                                                      26.11.2019 18:45

                                                                      Чьей практикой?

                                                                      многолетней практикой эксплуатации распределенных систем


                                                                      Какими "подобными"?

                                                                      с проблемами эксплуатации распределенных систем


                                                                      1. lair
                                                                        26.11.2019 18:55

                                                                        многолетней практикой эксплуатации распределенных систем

                                                                        Я, мне кажется, спрашивал чьей.


                                                                        с проблемами эксплуатации распределенных систем

                                                                        Вы этого знать не можете, и, как следствие, ошиблись.


                                                                        1. vl65 Автор
                                                                          26.11.2019 19:12
                                                                          -1

                                                                          ответил ниже


                                                                          Вы этого знать не можете, и, как следствие, ошиблись.

                                                                          Тогда странно слышать от Вас некоторые вопросы, при наличии опыта то.


                                                                          1. lair
                                                                            26.11.2019 19:14

                                                                            Тогда странно слышать от Вас некоторые вопросы, при наличии опыта то.

                                                                            Мне тоже странно слышать ваши утверждения, "при наличии опыта-то". Что лишний раз показывает, что (а) опыт у всех отличается и (б) опыт ничего не гарантирует.


                                                                            1. vl65 Автор
                                                                              26.11.2019 19:19

                                                                              У Вас свое представления — как правильно, у меня — свое. возможно мы оба правы. Но у меня пока нет причин менять свою точку зрения.


                                                                              1. lair
                                                                                26.11.2019 19:23

                                                                                … а у меня нет причин считать, что утверждения, сделанные на основе ваших представлений о правильности, будут применимыми за пределами вашего опыта.


                                                                    1. vl65 Автор
                                                                      26.11.2019 19:07

                                                                      В 2003 году развернул свою первую распределенную систему — реального времени. Масштаб развертывания — вся страна (напомню, у нас много часовых поясов). Система находится в эксплуатации до сих пор. Узлов системы много. С тех пор многократно менялось ПО системы. Происходила миграция узлов на другие аппаратные средства. Узлы меняли свою дислокацию на территории страны. И ни разу не было зафиксировано ни одно сбоя по причини ошибок установки ПО или изменения конфигурации узлов. "Косяки" при обслуживании БД были, проблемы связи — были, внесенные ошибки в отдельную функциональность — были, проблемы со смежными системами, влияющими на работоспособность — были.


                                                                      1. lair
                                                                        26.11.2019 19:14

                                                                        Ну то есть вы опираетесь в качестве доказательства на свою собственную практику?


                                                                        1. vl65 Автор
                                                                          26.11.2019 19:16

                                                                          "опыт ошибок трудных"


                                                                          1. lair
                                                                            26.11.2019 19:21

                                                                            … и вас это не смущает, я понял.


                                                                            Я вам честно скажу: при выборе между вашим опытом эксплуатации распределенных систем и аналогичным опытом Google я выберу Google.


                                                                            1. vl65 Автор
                                                                              26.11.2019 19:28

                                                                              Существует немало технологий, которые в свое время активно продвигались в том числе лидирующими на рынке IT — компаниями и о которых сейчас ни вспоминает. Так что лидеры IT рынка тоже ошибаются.


                                                                              1. lair
                                                                                26.11.2019 19:30

                                                                                Вы предлагаете мне считать, что вероятность того, что вы ошибаетесь, меньше, чем вероятность того, что — раздельно друг от друга — ошибаются Google и Хамбл/Фарли (ну и, очень скромно, мой опыт тоже)?


                                                                                1. vl65 Автор
                                                                                  26.11.2019 19:31

                                                                                  Ни в коем случае, лишь отметил, что они тоже могут ошибаться.


                                                                                  1. lair
                                                                                    26.11.2019 19:33

                                                                                    Несомненно, могут. Однако, мое утверждение выше о выборе авторитета остается в силе.


                                                                                    1. vl65 Автор
                                                                                      26.11.2019 19:34

                                                                                      Любите Вы ходить "по кругу"


                                                                                      1. lair
                                                                                        26.11.2019 19:36

                                                                                        Я люблю аккуратно отслеживать аргументы в дискуссии (а не уходить от них в сторону в надежде, что они забудутся).


                                                                                        1. vl65 Автор
                                                                                          26.11.2019 19:39

                                                                                          Сегодня я отвечаю на множество вопрос и не только здесь и не только по этой теме, мог что то и пропустить.


                                                  1. ne_kotin
                                                    26.11.2019 19:08
                                                    +2

                                                    Оч смешно.
                                                    Я когда-то в одно щачло поднял интеграционную платформу с таким низким уровнем вхождения, что типовые скрипты служба поддержки клиентов сама разрабатывала и внедряла чуть ли не копипастя с известного. и объем редко превышал сотню строк.


      1. ne_kotin
        25.11.2019 16:49
        +1

        На мой взгляд, вынос параметров в конфигурационный файл — это «правило хорошего тона».

        Параметров — да. А связывание классов — это уже ответственность слоя бизнес-логики. Был бы у вас целевой класс имплементором удаленного интерфейса — можно было бы применять autodiscovery. Постойте-ка… Но это же RMI!

        А вы мало того, что RMI переизобретаете (в функциональном смысле), так еще и смешиванием слоев даете возможность разработчику выстрелить себе в ногу.
        Не надо так, пожалуйста.


        1. vl65 Автор
          25.11.2019 17:36

          При использовании RMI код "привязан" к только к протоколу RMI. В предложенном решении код изолирован от протокола, что позволяет использовать практически любой известный протокол. Эксплуатирующая организация может изменить его в любой момент по своим собственным соображениям. Заметьте, выбор протокола ни как не сказывается на вашем коде. И в этом решении RMI не переизобретен, а, по сути, усовершенствован.


          Второе, предложенное решение как раз и раскладывает все "по полочкам". И это называется "модифицируемостью" — простотой модификации промышленной системы. Каждый программный слой выполняет только свою функцию. Бизнес логика постоянно меняется. Предложенное решение позволяет IT подразделению заказчика более гибко реагировать на требование бизнеса, а не ждать "у моря погоды", когда будут выделен бюджет на модификацию ПО для удовлетворения "неожиданно" возникших новых требований или изыскивать другие "обходные" решения, например: — "Вы нам сделаете сейчас, а оплатим мы вам из бюджета следующего года".


          1. lair
            25.11.2019 17:44

            Предложенное решение позволяет IT подразделению заказчика более гибко реагировать на требование бизнеса, а не ждать "у моря погоды", когда будут выделен бюджет на модификацию ПО

            Реагировать на требования без модификации ПО? Ну то есть пришел бизнес и говорит "хочу, чтобы курс валют теперь брался из сервиса ЦБРФ, а не вбивался руками", и?..


            1. vl65 Автор
              25.11.2019 17:50

              Пишется новая "функция" и меняется конфигурация системы. Эксплуатируемое ПО не изменяется и, в случае какой либо "неудачи" новой функции, легко может быть возращено в эксплуатацию.


              1. lair
                25.11.2019 17:56

                Во-первых, кто пишет эту новую функцию, если бюджета нет?
                Во-вторых, пусть даже ее напишут, как вы замените ручной ввод на регулярную загрузку из внешнего сервиса без соответствующей заранее предусмотренной точки расширения?


                А в-третьих, и в самых важных, когда вы говорите "эксплуатируемое ПО не изменяется", вы лукавите. Конфигурация — такая же часть эксплуатируемого ПО, как и код, и изменения в ней должны проходить тот же самый цикл при развертывании; с практической точки зрения нет (не должно быть) разницы, выкатываете вы изменения в коде или изменения в конфигурации.


                Проще говоря, нет никакой практической разницы (кроме используемого для изменения набора инструментов) между тем, описаны ваши привязки в конфигурации или в коде.


                1. vl65 Автор
                  25.11.2019 18:08

                  1. Функция может быть заказана любому разработчику или быть реализована программистами заказчика, т.е. небольшие изменения можно вносить в рамках текущего бюджета.


                  2. "Ручной ввод" он же куда сохраняет результаты свой работы, из конфигурации исключаем функцию "ручного ввода" и включаем функцию "загрузки с сайта" с сохранением "в то же место".


                  3. Согласитесь, что процесс изменения конфигурации все же более простоя задача по сравнению изменение программного кода, которое в том числе так же может потребовать и изменения конфигурации.



                  1. lair
                    25.11.2019 18:11
                    +1

                    Функция может быть заказана любому разработчику или быть реализована программистами заказчика, т.е. небольшие изменения можно вносить в рамках текущего бюджета.

                    Ну так что же мешает внести их прямо в ПО?


                    "Ручной ввод" он же куда сохраняет результаты свой работы, из конфигурации исключаем функцию "ручного ввода" и включаем функцию "загрузки с сайта" с сохранением "в то же место".

                    Гм. А как вы из удаленно выполняющейся "функции" получите доступ к "тому же месту"?


                    (Я даже не спрашиваю, как вы собираетесь вызывать это по расписанию)


                    Согласитесь, что процесс изменения конфигурации все же более простоя задача по сравнению изменение программного кода

                    Нет, не соглашусь. Для кода обычно доступно больше средств проверки, чем для конфигурации.


                    1. vl65 Автор
                      25.11.2019 18:34
                      -1

                      А зачем? При вносе изменений прямо в ПО есть риск внести какую то ошибку? Есть. Для изменения ПО необходимо наличие IDE? Необходимо. И т.п. и т.д. Этот процесс гораздо сложнее и "дороже".


                      Напомню, предложенная технология стирает различия в вызовах локального и удаленного кода. Для этой технологии не имеет значения место исполнения функции. А уж по реализацию шедуллера я вообще молчу. Если лень самому "изобретать", то можно воспользоваться готовым из большого множества OpenSource.


                      Диагностика все же больше зависит не от средств проверки кода, а от информативности и однозначности сообщений в файлах журналов системы, которые позволяют быстро устанавливать причину ошибки. Мне нравиться информативность и однозначность сообщений в большинства СУБД. В своих системах предпочитаю реализовывать подобный подход.


                      1. mayorovp
                        25.11.2019 20:10
                        +1

                        Вот только при вашем способе есть ещё больше способов внести какую-то ошибку.


                      1. lair
                        25.11.2019 20:15
                        +2

                        При вносе изменений прямо в ПО есть риск внести какую то ошибку? Есть.

                        … такой же, как при написании "функции" отдельно.


                        Для изменения ПО необходимо наличие IDE? Необходимо.

                        … так же, как и для написания "функции" отдельно.


                        Этот процесс гораздо сложнее и "дороже".

                        Нет, почему бы? Он точно такой же, как при написании "функции" отдельно.


                        Единственная разница в том, где вы пишете привязки — в коде или в конфигурации. И я бы не стал утверждать, что в конфигурации это гарантированно проще и дешевле.


                        Напомню, предложенная технология стирает различия в вызовах локального и удаленного кода. Для этой технологии не имеет значения место исполнения функции.

                        Это еще надо доказать.


                        В частности, как вы обеспечите из "функции", выполняемой на другом сервере, доступ к тому же самому хранилищу, что и из "функции", выполняемой локально?


                        А уж по реализацию шедуллера я вообще молчу.

                        Нет, ну зачем же. Расскажите нам, как вы добавите функциональность шедулера в приложение, в котором нет соответствующей точки расширения, без его модификации.


                        Диагностика все же больше зависит не от средств проверки кода, а от информативности и однозначности сообщений в файлах журналов системы, которые позволяют быстро устанавливать причину ошибки.

                        В смысле — рантайм сообщений? Так это дважды поздно. Меня интересует проверка на этапе разработки, если не получится — на этапе сборки, если и это не получится — на этапе тестирования.


                        В своих системах предпочитаю реализовывать подобный подход.

                        … а я в "своих" системах предпочитаю реализовывать подход, при котором максимальное число ошибок обнаруживается до запуска приложения.


                      1. staticlab
                        26.11.2019 15:12

                        А зачем? При вносе изменений прямо в ПО есть риск внести какую то ошибку? Есть. Для изменения ПО необходимо наличие IDE? Необходимо. И т.п. и т.д. Этот процесс гораздо сложнее и "дороже".

                        Если кто-то опечатается и напишет в вашей конфигурации


                        <adapter class="ru.funsys.demo.avalanche.DemoAdapterr" name="info" uri="info-function" />

                        Что произойдёт с системой и когда сотрудник поймёт, что что-то не так?


                        1. vl65 Автор
                          26.11.2019 15:26

                          В логе будет зафиксировано предупреждение


                          SYS0103W Экземпляр класса "ru.funsys.demo.avalanche.DemoAdapterr" узла <adapter> не создан (класс не найден).


                          1. staticlab
                            26.11.2019 16:25

                            То есть сотруднику, чтобы проверить, не ошибся ли он, нужно будет развернуть всю систему и внимательно прочитать весь лог?


                            1. vl65 Автор
                              26.11.2019 17:16

                              Используемая система логирования достаточно гибкая, можно настроить вывод в отдельный лог для событий отдельного экземпляра объекта (такого решения ни где нет).


                              Сообщения информативны и однозначны.


                              В промышленных системах система диагностики "многоярусная", ошибка находиться и устраняется.


                              1. staticlab
                                26.11.2019 17:19
                                +1

                                можно настроить вывод в отдельный лог для событий отдельного экземпляра объекта (такого решения ни где нет)

                                Какая разница, если можно отфильтровать в Кибане или ещё где-либо?


                                В промышленных системах система диагностики "многоярусная", ошибка находиться и устраняется.

                                Тогда вообще никакого преимущества нет.


                                1. vl65 Автор
                                  26.11.2019 17:27

                                  Преимущества в другом — готовый сервис для создания распределенных масштабируемых систем.


                                  Кстати, сколько бы узлов в распределенной системе не было бы, любая ошибка будет зафиксирована и в вызываемом узле и доставлена и зафиксирована в вызывающий узел. А уж как ей распорядится вызывающий узел — это дело программного кода системы. Анализировать и сопоставлять логи на множестве узлов не нужно.


                                  1. staticlab
                                    26.11.2019 17:33

                                    готовый сервис для создания распределенных масштабируемых систем

                                    Это же был фреймворк, а не сервис.


                                    А написать вызов сервиса с проверкой возвращённой ошибки можно даже на Node.js.


                                    1. vl65 Автор
                                      26.11.2019 17:50

                                      При инициализации приложения на узле системы еще нет ни каких вызовов, нет объекта куда можно возвращать ошибку. Все приложения без исключений в этом состоянии все пишут в лог


                                      1. lair
                                        26.11.2019 17:55
                                        +1

                                        Вот только некоторые ошибки можно ловить до инициализации приложения на узле системы. А вы даже не пытаетесь этого делать.


                                        1. vl65 Автор
                                          26.11.2019 17:59

                                          Все без исключения ошибки инициализации ловятся. Если заметили выдается предупреждение, а не сообщение об ошибке. То есть данная вид ошибок классифицирован, как не критическая ошибка и система может далее загружаться.


                                          1. lair
                                            26.11.2019 18:00

                                            Все без исключения ошибки инициализации ловятся.

                                            … на этапе инициализации.


                                            А я говорю про более ранний этап.


                                            1. vl65 Автор
                                              26.11.2019 18:03
                                              -1

                                              На каком? На этапе написания кода? Код не изменялся, ловить там нечего!


                                              1. lair
                                                26.11.2019 18:04

                                                На каком?

                                                Написания конфигурации, сборки пакета или развертывания пакета.


                                                1. vl65 Автор
                                                  26.11.2019 18:11

                                                  Пакет собран и развернут, конфигурация внешний объект по отношению в собранному и развернутому пакету. Тем более речь идет о системе с множеством узлов и у каждого узла может быть собственная индивидуальная конфигурация. ПО везде одинаковое, а конфигурация везде разная. Будете ваши пакеты под каждый узел собирать? А если их 40 штук? А завтра заказчик захочет 1000 иметь? Что будете делать?


                                                  1. lair
                                                    26.11.2019 18:20

                                                    конфигурация внешний объект по отношению в собранному и развернутому пакету.

                                                    Это противоречит практикам стабильного развертывания. Вы Хамбла/Фарли не читали?..


                                                    Будете ваши пакеты под каждый узел собирать?

                                                    Конечно. Это же очень просто.


                                                    А если их 40 штук? А завтра заказчик захочет 1000 иметь? Что будете делать?

                                                    Версионнику более-менее все равно, хранить один файл конфигурации, 40 или 1000.


                                                    Простите за прямой вопрос: а как вы меняете конфигурацию в продакшн-системах?


                                                    1. vl65 Автор
                                                      26.11.2019 18:34

                                                      Это противоречит практикам стабильного развертывания. Вы Хамбла/Фарли не читали?..

                                                      В промышленных системах непрерывной доступности не нужно быстрое развертывание. Там нужна плановость и управляемость, а так же свобода действий эксплуатирующей организации, что она по своему усмотрению могла менять конфигурацию исходя из текущих потребностей. Вы же когда меняете конфигурацию СУБД к ее производителю не обращаетесь, чтобы он вам собрал новый пакет СУБД исходя из ваших потребностей.


                                                      Простите за прямой вопрос: а как вы меняете конфигурацию в продакшн-системах?

                                                      В продакшен, а каких же еще?


                                                      1. lair
                                                        26.11.2019 18:43
                                                        +1

                                                        В промышленных системах непрерывной доступности не нужно быстрое развертывание.

                                                        А я где-то что-то сказал про быстрое развертывание?


                                                        Там нужна плановость и управляемость

                                                        А чтобы была управляемость, нужна повторяемость, а чтобы была повторяемость, конфигурация должна быть зафиксирована.


                                                        Вы же когда меняете конфигурацию СУБД к ее производителю не обращаетесь, чтобы он вам собрал новый пакет СУБД исходя из ваших потребностей.

                                                        Нет, я обращаюсь к тому, кто отвечает за развертывание этого участка (это могу быть и я сам), и он собирает новый пакет.


                                                        В продакшен, а каких же еще?

                                                        Я спросил как вы это делаете. Ну, по шагам, в смысле.


                                                      1. lair
                                                        26.11.2019 19:31

                                                        Так как же вы меняете конфигурацию системы в продакшн?


                                                        1. vl65 Автор
                                                          26.11.2019 19:33

                                                          Да в продакшен, на пассивных узлах — узлах не несущих нагрузки. После внесения изменений в конфигурацию и проверки функционирования узла он возвращается в систему.


                                                          1. lair
                                                            26.11.2019 19:35

                                                            Я уточню еще раз, вдруг я неправильно понял: вы просто меняете (руками, в редакторе или копированием) файлы конфигурации на узлах системы, не несущих нагрузки?


                                                            1. vl65 Автор
                                                              26.11.2019 19:37

                                                              Эту операцию выполняют администраторы, либо они сами знают что хотят изменить, либо выполняю данные рекомендации.


                                                              1. lair
                                                                26.11.2019 19:38

                                                                Но операция все равно та, которую я описал — ручное изменение конфига на узле?


                                                                1. vl65 Автор
                                                                  26.11.2019 19:41

                                                                  Изменения, как правило не значительные, добавить строчку, удалить строчку или изменить значение атрибута.


                                                                  1. lair
                                                                    26.11.2019 19:42

                                                                    Не важно, какие изменения, просто ответьте на прямой вопрос: да, меняют руками, или нет, меняют как-то иначе?


                                                                    1. vl65 Автор
                                                                      27.11.2019 08:05
                                                                      -1

                                                                      Давно ответил, в любом текстовом редакторе. Да, меняют руками. Я "за" более простые схемы эксплуатации, если можно не использовать в эксплуатации дополнительное ПО, то значит его НЕ НУЖНО использовать. Это понижает требования к сменному персоналу. В критической ситуации какой сотрудник будет ее устранять предсказать невозможно. У сменного персонала сотни разных систем в зоне ответственности.


                                                                      1. mayorovp
                                                                        27.11.2019 09:02
                                                                        +1

                                                                        Подводя итог, я вижу следующее:


                                                                        1. 1000 экземпляров.
                                                                        2. Настраиваются вручную.
                                                                        3. У каждого, потенциально, своя уникальная конфигурация.

                                                                        И это всё как бы надёжно работает?


                                                                        Да вас вообще даже близко подпускать к построению архитектуры нельзя!


                                                                        1. vl65 Автор
                                                                          27.11.2019 09:03
                                                                          -2

                                                                          работает


                                                                        1. vl65 Автор
                                                                          27.11.2019 09:06
                                                                          -1

                                                                          И совершенно не важно, как Вы доставляете конфигурацию до узла системы, Вы ее все равно будете корректировать в ручную — конфигурация каждого узла уникальна.


                                                                          1. lair
                                                                            27.11.2019 10:45

                                                                            Конечно, важно. Во-первых, надо избегать уникальных конфигураций в таких масштабах, во-вторых, даже если все конфигурации уникальны, версионирование и автоматическая доставка дает нам уверенность, что как бы мы не поменяли конфигурацию, мы легко можем ее откатить обратно.


                                                                            1. vl65 Автор
                                                                              27.11.2019 10:46

                                                                              С версионностью нет проблем


                                                                              1. lair
                                                                                27.11.2019 10:47

                                                                                Правда? И как же вы обеспечиваете версионность конфигураций, которые правятся вручную в текстовом редакторе на продакшн-серверах?


                                                                                1. vl65 Автор
                                                                                  27.11.2019 10:55

                                                                                  Так же как и ваше система версионности, создается копия файла. При желании могут вставляется соответствующий комментарий. Это не существенный вопрос и выходит за рамки темы.


                                                                                  1. lair
                                                                                    27.11.2019 10:57
                                                                                    +2

                                                                                    Так же как и ваше система версионности, создается копия файла.

                                                                                    Меня смущает "так же". Я бы понял, если бы вы сказали "файл хранится в системе управления версиями" (хотя тут у меня были бы другие вопросы), но что означает "так же"? Где создается копия файла? Кем? Можно ли изменить конфигурацию, не создавая копию файла.


                                                                                    Это не существенный вопрос и выходит за рамки темы

                                                                                    Это существенный вопрос, потому что он (всегда) является одним из ключевых в дискуссии "конфигурация или код", а это именно то, что мы здесь обсуждаем.


                                                                                    1. vl65 Автор
                                                                                      27.11.2019 11:06
                                                                                      -2

                                                                                      Вам остается только поверить мне на слово. Архитектура система разработана так, что хранить копии конфигурационных файлов не нужно — восстановить предыдущую конфигурацию элементарно.


                                                                                      Вы ушли от темы статьи.


                                                                                      1. lair
                                                                                        27.11.2019 11:09
                                                                                        +2

                                                                                        Вам остается только поверить мне на слово.

                                                                                        Зачем мне это? Я предпочту работать с решениями, где не надо верить на слово, а все можно проверить.


                                                                                        Архитектура система разработана так, что хранить копии конфигурационных файлов не нужно

                                                                                        Мы говорим про конкретную технологию, предлагаемую вами в статье. И как там это "разработано"?


                                                                                        хранить копии конфигурационных файлов не нужно

                                                                                        Вы только что писали "создается копия файла".


                                                                                        Вы ушли от темы статьи.

                                                                                        Нет. Подавляющая часть статьи о том, как можно прописать привязки в комментариях. Я, как и некоторые другие комментаторы, считаю, что это плохо и неправильно. Следовательно, дискуссия, почему это неправильно — по теме статьи.


                                                                                        1. vl65 Автор
                                                                                          27.11.2019 11:20

                                                                                          При передаче изменений, требующих внесения изменения в конфиг — есть стандартная рекомендация, сделать копию файла. Но если по каким либо причинам она не будет сделана, ни какой трагедии не произойдет. Система в целом останется в рабочем состоянии.


                                                                                          1. lair
                                                                                            27.11.2019 11:23

                                                                                            При передаче изменений, требующих внесения изменения в конфиг — есть стандартная рекомендация, сделать копию файла.

                                                                                            Рекомендация — это то, что люди могут проигнорировать.


                                                                                            Особенно хорошо эта рекомендация сочетается с утверждением "Архитектура система разработана так, что хранить копии конфигурационных файлов не нужно".


                                                                                            Но если по каким либо причинам она не будет сделана, ни какой трагедии не произойдет. Система в целом останется в рабочем состоянии.

                                                                                            В общем случае это утверждение заведомо ложно.


                                                                                            1. vl65 Автор
                                                                                              27.11.2019 11:26
                                                                                              -2

                                                                                              жаль. что тут нет смайликов.


                                                                                              Отключение одного узла системы, даже на длительное время — на работоспособности системы не отражается. Не сделали резервной копии и не сделали — нет трагедии.


                                                                                              1. lair
                                                                                                27.11.2019 11:28
                                                                                                +1

                                                                                                Отключение одного узла системы, даже на длительное время — на работоспособности системы не отражается.

                                                                                                В общем случае это утверждение заведомо ложно.


                                                                                                1. vl65 Автор
                                                                                                  27.11.2019 11:37
                                                                                                  -2

                                                                                                  В общем случае это утверждение заведомо ложно.

                                                                                                  Вот это уже с вашей стороны перебор.


                                                                                                  1. lair
                                                                                                    27.11.2019 11:43

                                                                                                    Конечно, нет. Я же говорю про общий случай.


                                                                                                    1. vl65 Автор
                                                                                                      27.11.2019 13:39
                                                                                                      -2

                                                                                                      Конечно, нет. Я же говорю про общий случай.

                                                                                                      Это ложное утверждение


                                                                                                      1. lair
                                                                                                        27.11.2019 13:40

                                                                                                        Утверждение "я говорю о"? О нет.


                                                                        1. vl65 Автор
                                                                          27.11.2019 09:25
                                                                          -2

                                                                          Да вас вообще даже близко подпускать к построению архитектуры нельзя!

                                                                          Это не Вам судить.


                                                                          В системе заложены функции самовосстановления после сбоя, система сама справляется со сбойными ситуациями и восстанавливает свою работу, когда это становиться возможным. Система сама принимает решения по переключению на дублирующие узлы.


                                                                          Так что работает НАДЕЖНО и не требует постоянного "присмотра"


                                                                          1. lair
                                                                            27.11.2019 10:50

                                                                            Это не Вам судить.

                                                                            Почему, кстати? Вы же судите о том, в чем у меня был опыт или не был? А мы так же можем судить о том, можно ли, по нашему мнению, подпускать вас к проектированию крупных систем. Конечно, никто к этому мнению прислушиваться (или даже выслушивать его) не обязан — до тех пор, пока речь не идет о системах под нашим присмотром — но высказать мы его вполне можем.


                                                                      1. lair
                                                                        27.11.2019 10:43

                                                                        Это, если вкратце, очень плохо. Именно потому, что "у сменного персонала сотни разных систем в зоне ответственности" — вероятность человеческой ошибки увеличивается в разы, особенно когда вы "понижаете требования к сменному персоналу". Намного выгоднее — с точки зрения надежности — уменьшать число требуемого персонала за счет автоматизации, и повышать их квалификацию.


                                                                        У ручных изменений много недостатков, но два самых важных — это высокая вероятность человеческой ошибки и невозможность автоматического отката в заведомо рабочее состояние.


                                                                        И да, вернемся к вашему примеру. Вот у вас есть кластер из тысячи узлов (масштабируемость/отказоустойчивость). Вам надо поменять на всем кластере одну настройку. Сколько усилий на это уйдет, и какова вероятность ошибки? А теперь внезапно выяснилось, что настройку менять было не надо, и надо весь кластер откатить обратно. Сколько усилий, какова вероятность ошибки?


                                                                        1. vl65 Автор
                                                                          27.11.2019 10:45
                                                                          -1

                                                                          Сменный персонал не лазит в конфиги от скуки


                                                                          1. lair
                                                                            27.11.2019 10:46

                                                                            А я, вроде бы, и не говорил ничего про скуку. Это рутинная работа по обслуживанию.


                                                                            1. vl65 Автор
                                                                              27.11.2019 10:50

                                                                              Сменный персонал должен иметь возможность внести изменения в конфиг в случае какой то аварии, требующей вмешательства и то, если ему дали такую рекомендацию. ВСЕ! На этом его функции заканчиваются.


                                                                              1. lair
                                                                                27.11.2019 10:54

                                                                                Во-первых, а что тогда с плановыми изменениями?
                                                                                Во-вторых, опыт показывает, что даже в случае аварии изменения лучше проводить по стандартной процедуре, потому что это упрощает дальнейшие действия.


                                                                                1. vl65 Автор
                                                                                  27.11.2019 10:57

                                                                                  При плановых изменениях все прописано — что делать, как откатывать. С этим нет проблем.


                                                                                  1. lair
                                                                                    27.11.2019 11:00
                                                                                    +2

                                                                                    "Все прописано" — это хорошо, но кто это делает?


                                                                                    А если "нет проблем" — то, наверное, нет проблем и ответить на мои комментарии, потому что они в полной мере применимы к плановым обновлениям.


                                                                                    (Удивительно, конечно. Мы занимаемся автоматизацией процессов, потому что машины в среднем лучше следуют инструкциям, нежели люди, но при этом отказываемся видеть, что регламент обновления — это такая же инструкция, которую так же можно автоматизировать.)


                                                                                    1. vl65 Автор
                                                                                      27.11.2019 11:12

                                                                                      Автоматизировать можно все! Лететь на Марс можно хоть сейчас — только сейчас это очень дорого стоить!


                                                                                      Есть экономическая целесообразность. Если текущий процесс не требует затрат, зачем "изобретать велосипед" и вносить в системы еще один узел, который требует опять же какого резервирования, сам подвержен вероятным сбоям и за этим узлом кому то тоже нужно приглядывать?


                                                                                      1. lair
                                                                                        27.11.2019 11:19

                                                                                        только сейчас это очень дорого стоить!

                                                                                        Лететь на Марс, возможно, "очень дорого". Автоматизировать доставку ПО — не очень.


                                                                                        Если текущий процесс не требует затрат, зачем "изобретать велосипед"

                                                                                        Никто не предлагает изобретать велосипед, есть готовые работающие решения.


                                                                                        А зачем? Затем, что вы получаете стабильный и воспроизводимый процесс изменения системы. Вы знаете, в каком состоянии система сейчас, и почему, когда и кем была внесена та или иная настройка.


                                                                                        В каком-то смысле это вопрос того же толка, что и "зачем нужно управление версиями кода". Правда, а зачем?


                                                                                        1. vl65 Автор
                                                                                          27.11.2019 11:23

                                                                                          готовое решение или нет, для системы это "изобретение велосипеда", который "в нужный момент" может оказаться не доступен — сломался, обслуживается, недоступен и т.д.


                                                                                          1. lair
                                                                                            27.11.2019 11:25
                                                                                            +1

                                                                                            для системы это "изобретение велосипеда"

                                                                                            Конечно, нет. "Изобретение велосипеда" — это вполне конкретный антипаттерн, подразумевающий повторное придумывание уже существующей функциональности. Я же предлагаю взять готовое.


                                                                                            который "в нужный момент" может оказаться не доступен — сломался, обслуживается, недоступен

                                                                                            С равным успехом в нужный момент может не оказаться доступа к продакшн-серверу.


                                                                                            Я повторю свой вопрос: зачем нужно управление версиями кода? Текущий процесс не требует затрат, в нужный момент система управления версиями (и сборщик) могут оказаться недоступными… зачем?


                                                                                            1. vl65 Автор
                                                                                              27.11.2019 11:33

                                                                                              С точки зрения системы — это именно именно велосипед. При этом — велосипеда, повышающего вероятность отказа системы!


                                                                                              Сравнили тоже версионность кода и конфига! Конфиг в течении жизненного цикла меняется не существенно. Изменения конфига редкая операция и, как правило, меняются какие то значения атрибутов, добавляются или удаляются какие строки.


                                                                                              Изменения исходника может затронуть весь файл. И таких файлов тьма тьмущая. И таких изменений может быть каждый день, несколько раз на дню.


                                                                                              1. lair
                                                                                                27.11.2019 11:43
                                                                                                +1

                                                                                                С точки зрения системы — это именно именно велосипед.

                                                                                                Докажите это утверждение.


                                                                                                Конфиг в течении жизненного цикла меняется не существенно.

                                                                                                В течение жизненного цикла чего?


                                                                                                Изменения конфига редкая операция

                                                                                                Это утверждение в общем случае неверно. Особенно оно неверно в контексте предлагаемого вами "не хватает ресурсов — переразвернули на кластере и поправили конфиг".


                                                                                                Изменения исходника может затронуть весь файл. И таких файлов тьма тьмущая. И таких изменений может быть каждый день, несколько раз на дню.

                                                                                                Изменения конфига может затронуть весь файл. И таких конфигов тьма тьмущая. И таких изменений может быть каждый день, несколько раз на дню.


                                                                                                Это, заметим, реальная история из того, чем я занимаюсь прямо сейчас. Того, что вы называете "конфигом", по объему больше, чем программного кода, и меняется оно интенсивнее.


                                                                                                1. vl65 Автор
                                                                                                  27.11.2019 11:53
                                                                                                  -1

                                                                                                  Есть одна система многолетней эксплуатации, вы предлагаете другую. Что из этого вытекает? (Оставлю это Вам на размышление.)


                                                                                                  "жизненного цикла" эксплуатации системы


                                                                                                  Да ежедневно и ежечасно только и вносят изменения в конфиги из "нехватки" ресурсов.


                                                                                                  Подражая Вам могу изречь следующее — у Вас плохая система, которая требует каждый раз изменения всего конфига. Теперь понятно, почему Вы постоянно боретесь с "ветряной мельницей"


                                                                                                  1. lair
                                                                                                    27.11.2019 11:57

                                                                                                    Есть одна система многолетней эксплуатации, вы предлагаете другую. Что из этого вытекает?

                                                                                                    Что у существующей есть видимые мне недостатки.


                                                                                                    "жизненного цикла" эксплуатации системы

                                                                                                    В таком случае, это утверждение в общем случае неверно.


                                                                                                    Да ежедневно и ежечасно только и вносят изменения в конфиги из "нехватки" ресурсов.

                                                                                                    Вы про эластичное масштабирование не слышали?


                                                                                                    у Вас плохая система, которая требует каждый раз изменения всего конфига

                                                                                                    Вы ничего не знаете про мою систему (что видно из ошибочного суждения "требует каждый раз изменения всего конфига"), поэтому ваше суждение необосновано.


                                                                                                    1. vl65 Автор
                                                                                                      27.11.2019 13:44
                                                                                                      -1

                                                                                                      Что у существующей есть видимые мне недостатки.

                                                                                                      Это ложное утверждение.


                                                                                                      В таком случае, это утверждение в общем случае неверно.

                                                                                                      Это ложное утверждение.


                                                                                                      Вы ничего не знаете про мою систему (что видно из ошибочного суждения "требует каждый раз изменения всего конфига"), поэтому ваше суждение необосновано.

                                                                                                      Про то, что Вы написали при обсуждении, у меня сложилось впечатление, что ваша работа "носить воду в ступе".


                                                                                                      1. lair
                                                                                                        27.11.2019 13:45

                                                                                                        Это ложное утверждение.

                                                                                                        А теперь докажите это высказывание.


                                                                                                        Про то, что Вы написали при обсуждении, у меня сложилось впечатление, что ваша работа "носить воду в ступе".

                                                                                                        … ошибочное.


                                                                                                        1. vl65 Автор
                                                                                                          27.11.2019 13:49
                                                                                                          -2

                                                                                                          Извините, заниматься ежедневной работой изменения множества конфигураций, часть из которой полностью изменяется — робота не создающая полезного продукта.


                                                                                                          Это все равно, что художник, который каждый свой день начинает писать одну и ту же картину заново.


                                                                                                          Дискуссия на эту тему закрыта.


                                                                                                          1. lair
                                                                                                            27.11.2019 13:52

                                                                                                            Извините, заниматься ежедневной работой изменения множества конфигураций, часть из которой полностью изменяется — робота не создающая полезного продукта.

                                                                                                            А заниматься ежедневной работой изменения множества кода, часть из которого полностью изменяется — это работа, создающая полезный продукт?


                                                                                                            Это все равно, что художник, который каждый свой день начинает писать одну и ту же картину заново.

                                                                                                            Это называется "эскизы".


                                                                                                            1. vl65 Автор
                                                                                                              27.11.2019 13:55
                                                                                                              -1

                                                                                                              Еще раз — речь идет о конфигурациях системы, а не ее исходных кодах. Если втащили конфигурации в исходные коды — это отвратительное решение


                                                                                                              Носите "воду в ступе" и далее. Всего хорошего. Дискуссия закрыта!


                                                                                                              1. lair
                                                                                                                27.11.2019 13:57

                                                                                                                Еще раз — речь идет о конфигурациях системы, а не ее исходных кодах.

                                                                                                                Почему ежедневное изменение одного текстового файла — это полезная работа, а другого — нет? На основании какого формального критерия вы проводите это разделение?


                                                                                                                1. vl65 Автор
                                                                                                                  27.11.2019 14:07

                                                                                                                  Операция изменения конфигурации узла — разовая операция. Она может потребоваться раз в месяц, раз в полгода, раз в год или вообще никогда не потребуется ее выполнять.


                                                                                                                  Вы занимаетесь ежедневным изменением конфигурации, как я понимаю, в следствии изменения кода — это глупость! И еще утверждаете, что это верх совершенства.


                                                                                                                  1. lair
                                                                                                                    27.11.2019 14:10

                                                                                                                    Операция изменения конфигурации узла — разовая операция. Она может потребоваться раз в месяц, раз в полгода, раз в год или вообще никогда не потребуется ее выполнять.

                                                                                                                    Операция изменения кода — разовая операция. Она может потребоваться раз в месяц, раз в полгода или вообще никогда не потребуется ее выполнять.


                                                                                                                    И еще утверждаете, что это верх совершенства.

                                                                                                                    Нет, не утверждаю (в противном случае вы легко можете найти цитату, где я это утверждаю, не правда ли?)


                                                                                                                    Но я задал вам вопрос:


                                                                                                                    почему ежедневное изменение одного текстового файла — это полезная работа, а другого — нет? На основании какого формального критерия вы проводите это разделение?

                                                                                                                    И вы снова на него не ответили.


                                                                                                                    1. vl65 Автор
                                                                                                                      27.11.2019 14:14
                                                                                                                      -1

                                                                                                                      Не пишите глупости.


                                                                                                                      1. lair
                                                                                                                        27.11.2019 14:15

                                                                                                                        Я их и не пишу, в общем-то (обратное тоже было бы несложно продемонстрировать). Может быть, если ваша же возвращенная вам фраза кажется вам глупостью — что-то не так с вашей фразой?


                                                                                                                        1. vl65 Автор
                                                                                                                          27.11.2019 14:17
                                                                                                                          -2

                                                                                                                          Вы откровенно занимаетесь троллингом. Не надо.


                                                                                                                          1. lair
                                                                                                                            27.11.2019 14:20

                                                                                                                            Отнюдь. Я задаю вопросы, цель которых — продемонстрировать мою точку зрения (на правильный процесс управления конфигурацией и развертыванием, и, как следствие, на архитектуру приложения). А вы от них уходите (вероятно, потому что у вас нет на них удобного вам ответа, но это, конечно, мое допущение).


                                                                                                                            1. vl65 Автор
                                                                                                                              27.11.2019 14:35
                                                                                                                              -2

                                                                                                                              Вы решаете свою частную задачу, возможно думаете, что решаете ее правильно. Ну и решайте ее как Вам угодно.


                                                                                                                              1. lair
                                                                                                                                27.11.2019 14:38
                                                                                                                                +1

                                                                                                                                Ну так и вы в процессе написания своего фреймворка решали свою частную задачу, однако почему-то решили поделиться своим фреймворком с общественностью. Не вижу причин, почему я не могу поделиться с общественностью своими взглядами на архитектурные принципы, заложенные в ваш фреймворк, и их применимость для задач, о которых я что-то знаю.


                                                                                                                                1. vl65 Автор
                                                                                                                                  27.11.2019 14:39

                                                                                                                                  Ни кто Вам не мешает написать статью и поделиться своим решением. Пишите.


                                                                                                                                  1. lair
                                                                                                                                    27.11.2019 14:40

                                                                                                                                    Ну вот я и пишу. Просто не вижу смысла писать статью исключительно для критики чужих решений.


                                                                                                                                    1. vl65 Автор
                                                                                                                                      27.11.2019 14:41

                                                                                                                                      Вы напишите о своем решении


                                                                                                                                      1. lair
                                                                                                                                        27.11.2019 14:41

                                                                                                                                        А зачем мне это?


                                                                                                                                        1. vl65 Автор
                                                                                                                                          27.11.2019 14:44
                                                                                                                                          -1

                                                                                                                                          не хоте как хотите


                                                                                                              1. lair
                                                                                                                27.11.2019 14:19
                                                                                                                +1

                                                                                                                Простой тест, кстати.


                                                                                                                Это код или конфигурация? (только сразу объясните, почему)


                                                                                                                Текст
                                                                                                                {
                                                                                                                  "StartAt": "select-task",
                                                                                                                  "States": {
                                                                                                                    "select-task": {
                                                                                                                      "Type": "Choice",
                                                                                                                      "Choices": [
                                                                                                                        {
                                                                                                                          "Variable": "$.startAt",
                                                                                                                          "StringEquals": "describe-endpoint",
                                                                                                                          "Next": "describe-endpoint"
                                                                                                                        },
                                                                                                                        {
                                                                                                                          "Variable": "$.startAt",
                                                                                                                          "StringEquals": "deploy-model",
                                                                                                                          "Next": "deploy-model"
                                                                                                                        }
                                                                                                                      ],
                                                                                                                      "Default": "train"
                                                                                                                    },
                                                                                                                    "train": {
                                                                                                                      "Type": "Task",
                                                                                                                      "Resource": "arn:aws:states:::sagemaker:createTrainingJob.sync",
                                                                                                                      "Parameters": {
                                                                                                                        "TrainingJobName.$": "$.inputs.TrainingJob.TrainingJobName",
                                                                                                                        "Tags.$": "$.inputs.Tags",
                                                                                                                        "AlgorithmSpecification.$": "$.inputs.TrainingJob.AlgorithmSpecification",
                                                                                                                        "RoleArn.$": "$.inputs.TrainingJob.RoleArn",
                                                                                                                        "ResourceConfig.$": "$.inputs.TrainingJob.ResourceConfig",
                                                                                                                        "HyperParameters.$": "$.inputs.TrainingJob.HyperParameters",
                                                                                                                        "StoppingCondition.$": "$.inputs.TrainingJob.StoppingCondition",
                                                                                                                        "InputDataConfig.$": "$.inputs.TrainingJob.InputDataConfig",
                                                                                                                        "OutputDataConfig.$": "$.inputs.TrainingJob.OutputDataConfig"
                                                                                                                      },
                                                                                                                      "ResultPath": "$.outputs.TrainingJob",
                                                                                                                      "Next": "deploy-model"
                                                                                                                    },
                                                                                                                    "deploy-model": {
                                                                                                                      "Type": "Task",
                                                                                                                      "Parameters": {
                                                                                                                        "Model": {
                                                                                                                          "ModelName.$": "$.inputs.Model.ModelName",
                                                                                                                          "Tags.$": "$.inputs.Tags",
                                                                                                                          "ExecutionRoleArn.$": "$.inputs.Model.ExecutionRoleArn",
                                                                                                                          "PrimaryContainer": {
                                                                                                                            "ModelDataUrl.$": "$.outputs.TrainingJob.ModelArtifacts.S3ModelArtifacts",
                                                                                                                            "Environment.$": "$.inputs.Model.Environment",
                                                                                                                            "Image.$": "$.inputs.Model.Image"
                                                                                                                          }
                                                                                                                        },
                                                                                                                        "EndpointConfig": {
                                                                                                                          "EndpointConfigName.$": "$.inputs.EndpointConfig.EndpointConfigName",
                                                                                                                          "Tags.$": "$.inputs.Tags",
                                                                                                                          "InitialInstanceCount.$": "$.inputs.EndpointConfig.InitialInstanceCount",
                                                                                                                          "InstanceType.$": "$.inputs.EndpointConfig.InstanceType"
                                                                                                                        },
                                                                                                                        "Endpoint": {
                                                                                                                          "EndpointName.$": "$.inputs.Endpoint.EndpointName",
                                                                                                                          "Tags.$": "$.inputs.Tags"
                                                                                                                        }
                                                                                                                      },
                                                                                                                      "ResultPath": "$.outputs.Deployment",
                                                                                                                      "Next": "describe-endpoint"
                                                                                                                    },
                                                                                                                    "describe-endpoint": {
                                                                                                                      "Type": "Task",
                                                                                                                      "Parameters": {
                                                                                                                        "EndpointName.$": "$.outputs.Deployment.Endpoint.EndpointName"
                                                                                                                      },
                                                                                                                      "ResultPath": "$.Endpoint",
                                                                                                                      "Next": "check-endpoint-status"
                                                                                                                    },
                                                                                                                    "check-endpoint-status": {
                                                                                                                      "Type": "Choice",
                                                                                                                      "Choices": [
                                                                                                                        {
                                                                                                                          "Variable": "$.Endpoint.EndpointStatus",
                                                                                                                          "StringEquals": "InService",
                                                                                                                          "Next": "endpoint-deployed"
                                                                                                                        },
                                                                                                                        {
                                                                                                                          "Or": [
                                                                                                                            {
                                                                                                                              "Variable": "$.Endpoint.EndpointStatus",
                                                                                                                              "StringEquals": "Creating"
                                                                                                                            },
                                                                                                                            {
                                                                                                                              "Variable": "$.Endpoint.EndpointStatus",
                                                                                                                              "StringEquals": "Updating"
                                                                                                                            }
                                                                                                                          ],
                                                                                                                          "Next": "wait-check"
                                                                                                                        }
                                                                                                                      ],
                                                                                                                      "Default": "fail"
                                                                                                                    },
                                                                                                                    "wait-check": {
                                                                                                                      "Type": "Wait",
                                                                                                                      "Seconds": 60,
                                                                                                                      "Next": "describe-endpoint"
                                                                                                                    },
                                                                                                                    "endpoint-deployed": {
                                                                                                                      "Type": "Succeed"
                                                                                                                    },
                                                                                                                    "fail": {
                                                                                                                      "Type": "Fail"
                                                                                                                    }
                                                                                                                  }
                                                                                                                }


                                                                                                                1. vl65 Автор
                                                                                                                  27.11.2019 14:25
                                                                                                                  -1

                                                                                                                  это некоторый аналог файла pom.xml, используемого maven для сборки проекта. В конфигурации эксплуатируемой системы ни то ни другое не имеет какого либо отношения. Путаете кислое с пресным.


                                                                                                                  1. lair
                                                                                                                    27.11.2019 14:28
                                                                                                                    +1

                                                                                                                    это некоторый аналог файла pom.xml, используемого maven для сборки проекта.

                                                                                                                    Нет. Ну то есть вообще нет, ни в каком месте. Этот пример не имеет никакого отношения к сборке, и используется в ходе штатной эксплуатации одной из разрабатываемых мной систем.


                                                                                                                    Так это код или конфигурация?


                                                                                                                    1. vl65 Автор
                                                                                                                      27.11.2019 14:37
                                                                                                                      -2

                                                                                                                      И что, ваша работа и заключается в постоянном и ежедневном изменении этого файла?


                                                                                                                      1. lair
                                                                                                                        27.11.2019 14:39

                                                                                                                        Не ежедневном, а тогда, когда меняется соответствующий процесс. Сейчас вот AWS выкатили multi-model hosting — будем править соответствующим образом.


                                                                                                                        Но вы так и не ответили на вопрос: это код или конфигурация?


                                                                                                                        1. vl65 Автор
                                                                                                                          27.11.2019 14:40
                                                                                                                          -1

                                                                                                                          не вижу ответа на мой вопрос. Вопрос напомнить?


                                                                                                                          1. lair
                                                                                                                            27.11.2019 14:40

                                                                                                                            Напомните.


                                                                                                                            1. vl65 Автор
                                                                                                                              27.11.2019 14:42
                                                                                                                              -1

                                                                                                                              не проблема
                                                                                                                              И что, ваша работа и заключается в постоянном и ежедневном изменении этого файла?


                                                                                                                              1. lair
                                                                                                                                27.11.2019 14:43

                                                                                                                                Нет, моя работа не заключается в постоянном и ежедневном изменении этого файла.


                                                                                                                                Ваша очередь: это код или конфигурация?


                                                                                                                                1. vl65 Автор
                                                                                                                                  27.11.2019 14:47
                                                                                                                                  -1

                                                                                                                                  напишите статью


                                                                                                                                  1. lair
                                                                                                                                    27.11.2019 14:52

                                                                                                                                    Ээээ… нет.


                                                                                                                                    Если у вас нет ответа на этот вопрос, мне придется считать, что ваше разделение между кодом и конфигурацией — произвольно (проще говоря, "как мне хочется"), а, следовательно, никакой формальной логики за вашими построениями "конфигурацию надо делать вот так, а не так как код" — просто нет.


                                                                                                                                    1. vl65 Автор
                                                                                                                                      27.11.2019 14:57
                                                                                                                                      -1

                                                                                                                                      Ваше решение осуждать бессмысленно, оно здесь не опубликовано. Опубликуйте, по обсуждаем.


                                                                                                                                      1. lair
                                                                                                                                        27.11.2019 14:58

                                                                                                                                        А я не предлагаю обсуждать мое решение, я задаю конкретный вопрос к вашей методологии работы с кодом и конфигурацией: такой файл надо считать кодом или конфигурацией?


                                                                                                                                        1. lair
                                                                                                                                          27.11.2019 15:02

                                                                                                                                          … потому что это вы утверждаете, что изменение конфигурации не является изменением ПО. Вот мне и интересно: изменение этого файла — это изменение ПО, или нет?


                                                                                                                                          1. vl65 Автор
                                                                                                                                            27.11.2019 15:04
                                                                                                                                            -1

                                                                                                                                            статью в студию


                                                                                                                                            1. lair
                                                                                                                                              27.11.2019 15:24

                                                                                                                                              А смысл, мы тут-то пока с вопросами не разобрались. Статья только увеличит их число.


                                                                                                                                        1. vl65 Автор
                                                                                                                                          27.11.2019 15:03
                                                                                                                                          -1

                                                                                                                                          Хорошо. Тоже конкретный встречный вопрос. Облегчу даже Вам задачу, подскажу, пример из фрагмента кода статьи


                                                                                                                                          /**
                                                                                                                                               * Определение поля для хранения экземпляра адаптера
                                                                                                                                               */
                                                                                                                                              private DemoAdapter info;

                                                                                                                                          Это про инициализированная переменная или нет?


                                                                                                                                          1. lair
                                                                                                                                            27.11.2019 15:24

                                                                                                                                            Понятия не имею, я не настолько хорошо знаком с терминологией Java.


                                                                                                                                            1. vl65 Автор
                                                                                                                                              27.11.2019 15:25

                                                                                                                                              Мне продублировать ваш ответ на ваш вопрос?


                                                                                                                                              1. lair
                                                                                                                                                27.11.2019 15:28

                                                                                                                                                Откуда ж я знаю, подходит этот ответ к вашей ситуации, или нет?


                                                                                                                                                1. vl65 Автор
                                                                                                                                                  27.11.2019 15:30

                                                                                                                                                  Ваш ответ на мой вопрос отлично отвечает на ваш вопрос. Дублировать этот ответ, как я понимаю, не надо.


                                                                                                                                                  1. lair
                                                                                                                                                    27.11.2019 15:34
                                                                                                                                                    +1

                                                                                                                                                    Ага, то есть вы говорите, что вы понятия не имеете, является мой пример кодом или конфигурацией, и вы не настолько знакомы с терминологией Java. Окей, так и запишем (это хорошо сочетается с тем, как вы сначала уверенно отписались, что "это некоторый аналог файла pom.xml").


                                                                                                                                                    Отойдем на шаг дальше. Вот у меня есть описание некоего рабочего процесса (workflow), которое никогда не при каких условиях не может быть поправлено конечным пользователем системы. От чего зависит, считать это описание кодом или конфигурацией?


                                                                                                                                                    1. vl65 Автор
                                                                                                                                                      27.11.2019 15:37
                                                                                                                                                      -2

                                                                                                                                                      Очень не хватает тут смайликов.
                                                                                                                                                      Статью в студию.


                                                                                                                                                      1. lair
                                                                                                                                                        27.11.2019 15:38

                                                                                                                                                        Повторюсь, смысла в статье нет, мы с простыми вопросами разобраться не можем.


                                                                                                                                                        1. vl65 Автор
                                                                                                                                                          27.11.2019 15:40
                                                                                                                                                          -1

                                                                                                                                                          Вы задаете вопрос, образно, что в черном ящике.


                                                                                                                                                          Мое видение описано в статье, где ваше?


                                                                                                                                                          1. lair
                                                                                                                                                            27.11.2019 15:42

                                                                                                                                                            Вы задаете вопрос, образно, что в черном ящике.

                                                                                                                                                            Ну так если вам не хватает информации для ответа на вопрос — вы спросите, я отвечу.


                                                                                                                                                            Мое видение описано в статье, где ваше?

                                                                                                                                                            В этой цепочке комментариев.


                                                                                                                                                            И, кстати, ваше видение того, что считать кодом, а что — конфигурацией, и, что важнее, почему, в статье не описано.


                                                                                                                                                            1. vl65 Автор
                                                                                                                                                              27.11.2019 15:43
                                                                                                                                                              -2

                                                                                                                                                              Уже десть раз попросил, статью в студию


                                                                                                                                                              1. lair
                                                                                                                                                                27.11.2019 15:43

                                                                                                                                                                "статья в студию" — это не вопрос. Я же не понимаю, чего вам не хватает для ответа.


                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                  27.11.2019 15:45

                                                                                                                                                                  Хорош, дискуссия уже давно потеряла какой либо конструктивный характер.


                                                                                                                                                                  1. lair
                                                                                                                                                                    27.11.2019 15:48

                                                                                                                                                                    Окей, в полном соответствии с логикой выше придется признать: ваше разделение между кодом и конфигурацией — произвольно (проще говоря, "как мне хочется"), а, следовательно, никакой формальной логики за вашими построениями "конфигурацию надо делать вот так, а не так как код" — просто нет. Как следствие, утверждение "изменение конфигурации не явлется изменением ПО" — необосновано. Как следствие, утверждения, что изменения конфигурации менее рискованны, чем изменения в коде — тоже необоснованы.


                                                                                                                                                                    Ура, что и требовалось доказать.


                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                      27.11.2019 15:49
                                                                                                                                                                      -2

                                                                                                                                                                      в статье все расписано, читайте и найдете ответы на ваши вопросы.


                                                                                                                                                                      1. lair
                                                                                                                                                                        27.11.2019 15:52

                                                                                                                                                                        Нет, не расписано. Там нет ответа на вопрос, почему изменение конфигурации не является изменением ПО.


                                                                                                                                                                        (если есть, вы легко можете его процитировать)


                                                                                                                                                                        1. vl65 Автор
                                                                                                                                                                          27.11.2019 16:02
                                                                                                                                                                          -1

                                                                                                                                                                          Программный код, в общем случае, не привязан к предметной области и среде выполнения. В разных средах выполнения один и тот же программный код может использовать разные конфигурации. Программный код в "чистом виде" переносим из одной среды выполнения в другую.


                                                                                                                                                                          Конфигурация одной среды выполнения может быть не приемлема для этого же программного кода в другой среде выполнения. Конфигурация не переносима из среды в среду.


                                                                                                                                                                          Поэтому программный код должен быть отделен от конфигурации приложения. Если программный код смешан с конфигурацией он теряет переносимость.


                                                                                                                                                                          1. lair
                                                                                                                                                                            27.11.2019 16:13

                                                                                                                                                                            Программный код, в общем случае, не привязан к предметной области

                                                                                                                                                                            То есть как это? Я бы понял "может быть не привязан", но часто привязан же.


                                                                                                                                                                            среде выполнения

                                                                                                                                                                            То есть любой код, который ожидает конкретную БД, автоматически перестают быть программным кодом?


                                                                                                                                                                            Программный код в "чистом виде" переносим из одной среды выполнения в другую.

                                                                                                                                                                            Может быть, но не обязательно. Попробуйте перенести "в чистом виде" систему, написанную для веб-сервера, в мобильное приложение.


                                                                                                                                                                            Конфигурация не переносима из среды в среду.

                                                                                                                                                                            Это тоже не всегда так. Иногда вполне себе переносима (например, если мы говорим о конфигурации модулей приложения).


                                                                                                                                                                            Это, собственно, на примере доступа к БД видно. Вот есть приложение, оно умеет работать с двумя СУБД — MySQL и Oracle. Во-первых, оно не переносимо в среду выполнения, где стоит MS SQL. Во-вторых, конфигурация, которая говорит "для MySQL использовать этот адаптер, а для Oracle — вон тот", прекрасно переносима между всеми средами. И поэтому ваш формальный критерий между тем, что является кодом, а что конфигурацией, здесь работает плохо.


                                                                                                                                                                            Но, что важнее, это не все отвечает на вопрос, почему изменение конфигурации не является изменением ПО.


                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                              27.11.2019 16:30

                                                                                                                                                                              Я описал в общем виде.


                                                                                                                                                                              СУБД в "коробке" программный код? Да. Привязан к предметной области? Нет.


                                                                                                                                                                              Установили, сконфигурировали, создали таблицы предметной области — создали конфигурацию в среде выполнения. Если это все (весь сервер с установленной СУБД и БД) выдернуть и поставить, условно, из Газпрома Роскосмосу. Будет это работать? Нет. Сервер конечно включиться и СУБД запуститься. Но даже подключиться к нему будет нельзя, как минимум надо сетевой интерфейс переконфигурировать.


                                                                                                                                                                              Но если сервер и СУБД переконфигурировать, базу снести и создать другую — создать новую конфигурацию, то будет.


                                                                                                                                                                              1. lair
                                                                                                                                                                                27.11.2019 16:37

                                                                                                                                                                                Я описал в общем виде.

                                                                                                                                                                                Ну вот как раз в общем виде это и не верно. В частных случаях, иногда — да.


                                                                                                                                                                                СУБД в "коробке" программный код? Да. Привязан к предметной области? Нет.

                                                                                                                                                                                На самом деле, привязан, просто ее предметная область — управление БД. Но даже если не вдаваться в эти тонкости, разработанная на заказ система управлением предприятия привязана к предметной области? Да. Программный код?


                                                                                                                                                                                Установили, сконфигурировали, создали таблицы предметной области — создали конфигурацию в среде выполнения.

                                                                                                                                                                                А теперь посмотрим на это с точки зрения приложения, которое с этой СУБД взаимодействует. Ему нужны таблицы, и именно такие. Для него код, создающий эти таблицы — конфигурация или код?


                                                                                                                                                                                Но если сервер и СУБД переконфигурировать, базу снести и создать другую — создать новую конфигурацию, то будет.

                                                                                                                                                                                В чем, в таком случае, отличие между конфигурацией и данными?


                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                  27.11.2019 16:50

                                                                                                                                                                                  СУБД само по себе имеет какую то ценность? Нет и управлять ей нечем, если БД предметной области не будет.


                                                                                                                                                                                  Первоначально, большинство программ разрабатывается на заказ. Затем результат и требования от разных заказчиков анализируется и предметная область отделяется от программного кода. Результат предлагается другим заказчикам. Так появились ОС (Билл Гейтс первую свою ОС по заказу IBM сделал), СУБД, брокеры сообщений и много чего другого.


                                                                                                                                                                                  1. lair
                                                                                                                                                                                    27.11.2019 16:55

                                                                                                                                                                                    СУБД само по себе имеет какую то ценность?

                                                                                                                                                                                    Конечно.


                                                                                                                                                                                    Первоначально, большинство программ разрабатывается на заказ.

                                                                                                                                                                                    Прекрасно. В этом случае привязаны ли они к предметной области?


                                                                                                                                                                                    Затем результат и требования от разных заказчиков анализируется и предметная область отделяется от программного кода.

                                                                                                                                                                                    Совершенно не обязательно.


                                                                                                                                                                                    (У меня создается ощущение, что все направление domain-driven design прошло мимо вас.)


                                                                                                                                                                                    Но предположим. Чем в этом случае становится отделенная от программного кода "предметная область"?


                                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                                      27.11.2019 16:57
                                                                                                                                                                                      -1

                                                                                                                                                                                      Ну не хватает мне смайликов ...


                                                                                                                                                                                      Я высказал свою точку зрения, ваши реплики к ней это уже частности.


                                                                                                                                                                                      1. lair
                                                                                                                                                                                        27.11.2019 17:04

                                                                                                                                                                                        Ваша точка зрения — она и выше была высказана. От того, что вы ее высказали, она более аргументированной не становится, к сожалению.


                                                                                                                                                                                        1. vl65 Автор
                                                                                                                                                                                          27.11.2019 17:08
                                                                                                                                                                                          -1

                                                                                                                                                                                          Вы уже второй день постоянно задаете один и тот же не относящийся к "делу" (статье) вопрос. Все время сваливаетесь на какие частности. Хватит. Не судьба так не судьба.


                                                                                                                                                                                          1. lair
                                                                                                                                                                                            27.11.2019 17:12

                                                                                                                                                                                            Дело как раз в том, что вопрос про разделение кода и конфигурации имеет прямое отношение к вашей статье. Если из нее убрать конфигурацию — что останется-то?


                                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                                              27.11.2019 17:15

                                                                                                                                                                                              Останется код, которому можно "подать" при запуске совершенно другую конфигурацию и таким образом получить совершенно другую информационную систему.


                                                                                                                                                                                              1. lair
                                                                                                                                                                                                27.11.2019 17:21

                                                                                                                                                                                                Останется код, которому можно "подать" при запуске совершенно другую конфигурацию

                                                                                                                                                                                                Вот видите, конфигурация осталась. Если ее выкинуть, это получится обычный загрузчик кода, который без конфигурации бесполезен для конечного пользователя.


                                                                                                                                                                                                (Позднее связывание, плагинные архитектуры — имя им легион.)


                                                                                                                                                                                                Вы, однако, утверждаете, что получение "другой информационной системы" путем подачи на вход загрузчика конфигурации менее рисковано, чем получение "другой информационной системы" путем подачи на вход загрузчика кода.


                                                                                                                                                                                                Почему?


                                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                                  27.11.2019 17:23

                                                                                                                                                                                                  Я что то пропустил? Мы уже ведем речь о загрузчике кода?


                                                                                                                                                                                                  1. lair
                                                                                                                                                                                                    27.11.2019 17:27

                                                                                                                                                                                                    Мы ведем речь о вашем фреймворке. Который, если верить вашему описанию:


                                                                                                                                                                                                    код, которому можно "подать" при запуске совершенно другую конфигурацию и таким образом получить совершенно другую информационную систему.

                                                                                                                                                                                                    фактически, загрузчиком (не только, конечно) и является (занятно, кстати, как это функционально отличается от описания в посте).


                                                                                                                                                                                                    И, собственно, в самом начале дискуссии было озвучено, что связывание компонентов через конфигурацию — не самая лучшая идея. Вы, однако, утверждаете, что это уменьшает риски по сравнению со связыванием компонентов через код. Почему?


                                                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                                                      27.11.2019 17:33

                                                                                                                                                                                                      Вам нужно почитать статьи о загрузчиках Java.


                                                                                                                                                                                                      Динамическое связывание классов во время выполнения — да на этом построена вся идеология среды выполнения JVM.


                                                                                                                                                                                                      1. lair
                                                                                                                                                                                                        27.11.2019 17:35

                                                                                                                                                                                                        Вам нужно почитать статьи о загрузчиках Java.

                                                                                                                                                                                                        Зачем бы? Я не делал о них никаких утверждений.


                                                                                                                                                                                                        Динамическое связывание классов во время выполнения — да на этом построена вся идеология среды выполнения Java.

                                                                                                                                                                                                        Тем более не понятно, что нового в функциональности "можно "подать" при запуске совершенно другую конфигурацию и таким образом получить совершенно другую информационную систему".


                                                                                                                                                                                                        Собственно, в каком-то широком смысле так работает любая среда выполнения. И… что?


                                                                                                                                                                                                        1. vl65 Автор
                                                                                                                                                                                                          27.11.2019 17:41

                                                                                                                                                                                                          Подали эту конфигурацию и получили SOAP-сервис


                                                                                                                                                                                                          Подали эту и уже REST-сервис имеем


                                                                                                                                                                                                          1. lair
                                                                                                                                                                                                            27.11.2019 17:47

                                                                                                                                                                                                            Вы только что проиллюстрировали мой тезис, что вся ваша идея крутится вокруг конфигурации.


                                                                                                                                                                                                            А теперь объясните, почему вы считаете, что ваша конфигурация приносит меньше риска, нежели:


                                                                                                                                                                                                            app.ExposeSoap()

                                                                                                                                                                                                            и


                                                                                                                                                                                                            app.ExposeRest()


                                                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                                                              27.11.2019 17:50

                                                                                                                                                                                                              О каких рисках идет речь?
                                                                                                                                                                                                              И что за код тут опубликован?


                                                                                                                                                                                                              Статью в студию, я не телепат, чтобы по обрывкам кода догадываться, что под ним подразумевается.


                                                                                                                                                                                                              1. lair
                                                                                                                                                                                                                27.11.2019 17:55

                                                                                                                                                                                                                О каких рисках идет речь?

                                                                                                                                                                                                                О тех, о которых вы говорили выше: "Риск внести ошибку или "сломать" ИС минимальный."


                                                                                                                                                                                                                И что за код тут опубликован?

                                                                                                                                                                                                                Альтернативный вашему вариант "сказать" системе, что мы хотим выставлять ее сервисы как REST или как SOAP.


                                                                                                                                                                                                                я не телепат, чтобы по обрывкам кода догадываться, что под ним подразумевается.

                                                                                                                                                                                                                Я, знаете, тоже не телепат, чтобы понять, что будет в результате применения ваших конфигураций. Приходится верить вам на слово, что будет SOAP-сервис или REST-сервис. Вот и вам придется поверить мне на слово, что если поместить первую строку в соответствующее место определенного файла, то будет SOAP-сервис, а если туда же поместить вторую — то будет REST-сервис.


                                                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                                                  27.11.2019 18:00
                                                                                                                                                                                                                  -1

                                                                                                                                                                                                                  При готовой конфигурации, риск отсутствует.


                                                                                                                                                                                                                  Я опять что то пропустил? И мы уже перешли на обсуждение альтернатив публикаций SOAP и REST сервисов? И какое отношение ваши фрагменты кода имеют к распределенным средам?


                                                                                                                                                                                                                  1. lair
                                                                                                                                                                                                                    27.11.2019 18:03

                                                                                                                                                                                                                    При готовой конфигурации, риск отсутствует.

                                                                                                                                                                                                                    Ну так и при готовом коде риск тоже отсутствует.


                                                                                                                                                                                                                    И мы уже перешли на обсуждение альтернатив публикаций SOAP и REST сервисов?

                                                                                                                                                                                                                    Это был ваш пример, вообще-то.


                                                                                                                                                                                                                    И какое отношение ваши фрагменты кода имеют к распределенным средам?

                                                                                                                                                                                                                    Самое что ни на есть прямое. Один из способов конфигурации микросервисов.


                                                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                                                  27.11.2019 18:11

                                                                                                                                                                                                                  Хорошо, говорил. Но если Вы привели мои слова, то вспомните к чему они относились? Они относились к корректировке файла конфигурации. В этих то примерах что править? Тут нет ни одного "переменного" параметра. Править нечего, следовательно внести ошибку невозможно. Если только намерено испортить конфигурационный файл.


                                                                                                                                                                                                                  У меня хоть есть весь исходный успешно выполняемый код на GitHub. У Вас вообще ни чего нет. Обрывки непонятно чего, непонятно откуда. Я же верю Вам на слово.


                                                                                                                                                                                                                  1. lair
                                                                                                                                                                                                                    27.11.2019 18:13

                                                                                                                                                                                                                    В этих то примерах что править? Тут нет ни одного "переменного" параметра.

                                                                                                                                                                                                                    Вот была "конфигурация" для REST. Мы теперь хотим заменить на SOAP. Что нужно править в файле конфигурации? Желательно вот прямо в виде инструкции: такой-то текст заменить на такой-то.


                                                                                                                                                                                                                    (это, повторюсь, ваш пример)


                                                                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                                                                      27.11.2019 18:33

                                                                                                                                                                                                                      Кстати, в конфигурации нет кода, публикующего сервисы. Более того, и в примерах кода вы не найдете строк публикации сервисов. Это делается внутри используемых сторонних библиотек. То есть сравнивать ваш код и конфигурационные файлы просто не корректно.


                                                                                                                                                                                                                      Это разные конфигурации, править ни чего не нужно. Можно конечно слить оба примера и конфигурации в одно приложение, если очень хочется.


                                                                                                                                                                                                                      А что если я усложню задачу! Условный заказчик очень хочет RMI протокол использовать, ну или его "брата" CORBA. И в придачу на почтовые запросы отвечать.


                                                                                                                                                                                                                      Подробную пошаговую инструкцию опубликуете вашего примера.


                                                                                                                                                                                                                      1. lair
                                                                                                                                                                                                                        27.11.2019 18:36

                                                                                                                                                                                                                        Кстати, в конфигурации нет кода, публикующего сервисы.

                                                                                                                                                                                                                        А откуда же берутся сервисы?


                                                                                                                                                                                                                        То есть сравнивать ваш код и конфигурационные файлы просто не корректно.

                                                                                                                                                                                                                        Да нет, корректно. Мой код ведь тоже не публикует сервисы сам, за это отвечают используемые библиотеки.


                                                                                                                                                                                                                        Это разные конфигурации, править ни чего не нужно.

                                                                                                                                                                                                                        Так как же перейти из состояния REST в состояние SOAP? Или вы просто имели в виду, что это два вообще разных приложения?


                                                                                                                                                                                                                        Подробную пошаговую инструкцию опубликуете вашего примера.

                                                                                                                                                                                                                        1. разработать адаптер для протокола X
                                                                                                                                                                                                                        2. добавить адаптер в стартап: app.ExposeX


                                                                                                                                                                                                                        1. vl65 Автор
                                                                                                                                                                                                                          27.11.2019 18:42

                                                                                                                                                                                                                          1. Изменить у REST-класса аннотации
                                                                                                                                                                                                                          2. Добавить библиотеки реализующие спецификацию JAX-WS


                                                                                                                                                                                                                          1. lair
                                                                                                                                                                                                                            27.11.2019 18:43

                                                                                                                                                                                                                            … это все в конфигурации делается? Можете все-таки показать, как изменяется конфигурация, когда вы решаете перейти с предоставления REST на предоставление SOAP для одного и того же сервиса?


                                                                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                                                                              27.11.2019 18:55

                                                                                                                                                                                                                              Для REST-сервиса меняется код класса, конфигурация не затрагивается.


                                                                                                                                                                                                                              Пример SOAP сервиса сделан на более ранних реализациях спецификации SOAP (API). Под более свежей спецификацией JAX-WS, думаю потребовалось бы, тоже пометь только аннотации класса.


                                                                                                                                                                                                                              По сути — аннотация, встроенная в код конфигурация. Что мне очень не нравиться. Из-за этого приходиться править исходный код, а не конфигурационный файл чтобы переключиться на другой протокол.


                                                                                                                                                                                                                              1. lair
                                                                                                                                                                                                                                27.11.2019 18:58

                                                                                                                                                                                                                                То есть получается, что нельзя просто взять и поменять REST-сервис на SOAP в конфигурации, надо трогать код?


                                                                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                                                                  27.11.2019 19:01

                                                                                                                                                                                                                                  Надо трогать зашитую в код конфигурацию. Это особенность используемых библиотек для реализации примера, а не рассмотренного мной решения.


                                                                                                                                                                                                                                  1. lair
                                                                                                                                                                                                                                    27.11.2019 19:15

                                                                                                                                                                                                                                    Надо трогать зашитую в код конфигурацию.

                                                                                                                                                                                                                                    Ну то есть вашего решения недостаточно?


                                                                                                                                                                                                                                    Что же означал комментарий выше:


                                                                                                                                                                                                                                    Подали эту конфигурацию и получили SOAP-сервис
                                                                                                                                                                                                                                    Подали эту и уже REST-сервис имеем

                                                                                                                                                                                                                                    … просто два разных приложения? Или что-то другое?


                                                                                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                                                                                      28.11.2019 07:58

                                                                                                                                                                                                                                      Ну то есть вашего решения недостаточно?
                                                                                                                                                                                                                                      Что же означал комментарий выше:

                                                                                                                                                                                                                                      Еще раз — эта фраза относится к внешнему ПО по отношению к решению, описанному в статье !!!


                                                                                                                                                                                                                                      В комментарии выше относится к этому же внешнему ПО. В этом внешнем ПО можно использовать аннотации Java, которые по своей сути являются встроенной в код конфигурацией. Этот подход (встроенной в код конфигурации) я отвергаю.


                                                                                                                                                                                                                                      … просто два разных приложения? Или что-то другое?

                                                                                                                                                                                                                                      Разные конфигурации создают разные приложения разного назначения. Решение, рассмотренное в статье, позволяет создавать любое приложение, в любом сочетании из пунктов ниже:


                                                                                                                                                                                                                                      • GUI приложение
                                                                                                                                                                                                                                      • WEB приложение
                                                                                                                                                                                                                                      • Кластерное приложение
                                                                                                                                                                                                                                      • распределенное приложение
                                                                                                                                                                                                                                      • отказоустойчивые приложения
                                                                                                                                                                                                                                      • приложения непрерывной доспности
                                                                                                                                                                                                                                      • фоновый процесс операционной системы
                                                                                                                                                                                                                                      • SOAP, REST и прочие приложения
                                                                                                                                                                                                                                      • и т.д. и т.п. (все определяется вашей фантазией, вашими требованиями и вашими желаниями)


                                                                                                                                                                                                                                      1. lair
                                                                                                                                                                                                                                        28.11.2019 11:10

                                                                                                                                                                                                                                        Еще раз — эта фраза относится к внешнему ПО по отношению к решению, описанному в статье !!!

                                                                                                                                                                                                                                        Внешнему. Значит, ваше решение не позволяет выставить произвольный компонент как REST или SOAP, как я изначально подумал по вашему комментарию.


                                                                                                                                                                                                                                        Разные конфигурации создают разные приложения разного назначения. Решение, рассмотренное в статье, позволяет создавать любое приложение, в любом сочетании из пунктов ниже:

                                                                                                                                                                                                                                        Вы же понимаете, что это как раз наиболее тривиальная часть? В широком смысле слова, любая платформа разработки позволяет создавать "любое приложение...". В более узком понимании, вы можете подавать на вход dotnet run -p разные каталоги, и будут запускаться разные приложения. invoke будет запускать разный код в зависимости от того, какие tasks.py и invoke.yml лежат рядом. Веб-сервера будут поднимать разные приложения в зависимости от того, что им подано как home directory. Это повсеместно. Это тривиально.


                                                                                                                                                                                                                                        1. vl65 Автор
                                                                                                                                                                                                                                          28.11.2019 11:17
                                                                                                                                                                                                                                          -1

                                                                                                                                                                                                                                          Опять вы путаете "кислое с пресным". Не можете Вы раскладывать все "по полочкам". Валите все "в кучу" и потом не понимаете, что с этой "кучей" делать. Еще не хватает вашего заявления для полной картины, что рассмотренное в статье решение все же не позволяет лететь на Марс.


                                                                                                                                                                                                                                          1. lair
                                                                                                                                                                                                                                            28.11.2019 11:27

                                                                                                                                                                                                                                            Опять вы путаете "кислое с пресным"

                                                                                                                                                                                                                                            Я? Нет. Я просто пытаюсь следовать за логикой ваших утверждений.


                                                                                                                                                                                                                                            Валите все "в кучу"

                                                                                                                                                                                                                                            А вы не уходите от вопросов, чтобы не было необходимости каждый раз додумывать, как ваш ответ соотносится с моим вопросом, вот и не будет выглядеть как куча.


                                                                                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                                                                                              28.11.2019 11:29
                                                                                                                                                                                                                                              -1

                                                                                                                                                                                                                                              Отделите "кислое" от "пресного" и логика будет у вас перед глазами.


                                                                                                                                                                                                                                              1. lair
                                                                                                                                                                                                                                                28.11.2019 11:30

                                                                                                                                                                                                                                                Повторюсь, у меня нет проблем с логикой. Это вы меня обвиняете в том, что я что-то с чем-то путаю.


                                                                                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                                                                                  29.11.2019 08:17
                                                                                                                                                                                                                                                  -1

                                                                                                                                                                                                                                                  Вы зациклились на вопросах REST и SOAP сервисов, которые не имеют никакого отношения описанному в статье решению, но могут быть использованы для реализации функционала приложения с использованием этого решения.


                                                                                                                                                                                                                                                  1. lair
                                                                                                                                                                                                                                                    29.11.2019 10:16

                                                                                                                                                                                                                                                    Какой пример вы привели, такой я и обсуждаю.


                                                                                                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                                                                                                      29.11.2019 12:01

                                                                                                                                                                                                                                                      В моем примере нет упоминаний о REST и SOAP сервисах. Мои ссылки на эти сервисы были опубликованы в ответ на ваши вопросы. Почему то упорно хотели сравнивать описанное в статье решение с этими сервисами.


                                                                                                                                                                                                                                                      1. lair
                                                                                                                                                                                                                                                        29.11.2019 12:03

                                                                                                                                                                                                                                                        Нет.


                                                                                                                                                                                                                                                        В моем вопросе нет ничего про REST или SOAP, вы совершенно самостоятельно решили привести их в пример.


                                                                                                                                                                                                                  1. lair
                                                                                                                                                                                                                    27.11.2019 18:16

                                                                                                                                                                                                                    У меня хоть есть весь исходный успешно выполняемый код на GitHub.

                                                                                                                                                                                                                    Хм. Вот в этом репозитории?


                                                                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                                                                      27.11.2019 18:34

                                                                                                                                                                                                                      Да


                                                                                                                                                                                                                      1. lair
                                                                                                                                                                                                                        27.11.2019 18:37

                                                                                                                                                                                                                        Там есть строчка, которая меня смущает:


                                                                                                                                                                                                                        Для успешного выполнения проекта требуется наличие следующих библиотек в ./WebContent/WEB-INF/lib:

                                                                                                                                                                                                                        Я в репозитории этих файлов не нашел. Можете показать, где они лежат, или откуда из чего они собираются?


                                                                                                                                                                                                                        1. vl65 Автор
                                                                                                                                                                                                                          27.11.2019 18:57

                                                                                                                                                                                                                          Все библиотеки в открытом доступе, кроме библиотек avalanche*.jar.
                                                                                                                                                                                                                          Интересует?


                                                                                                                                                                                                                          1. lair
                                                                                                                                                                                                                            27.11.2019 18:59

                                                                                                                                                                                                                            Неа. Просто проверяю фразу "есть весь исходный успешно выполняемый код на GitHub".


                                                                                                                                                                                                                            Нету.


                                                                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                                                                              27.11.2019 19:02

                                                                                                                                                                                                                              В публиковать библиотеки в репозиторий дурной тон


                                                                                                                                                                                                                              1. lair
                                                                                                                                                                                                                                27.11.2019 19:17

                                                                                                                                                                                                                                Ну да, обычно исходники публикуют.


                                                                                                                                                                                                                                (впрочем, когда библиотеки — это зависимости, их тоже включают, не в сам репозиторий, так в releases)


                                                                                                                                                                                                                                Но суть, впрочем, в том, что я не могу просто забрать все из репозитория и попробовать, мне надо идти в какое-то необщедоступное (и не указанное в репозитории) место за необходимой частью.


                                                                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                                                                  28.11.2019 08:02

                                                                                                                                                                                                                                  В данном случае, мы с вами в равном положении, я не могу взять ваши две строчки и проверить работоспособность вашего примера.


                                                                                                                                                                                                                                  1. lair
                                                                                                                                                                                                                                    28.11.2019 11:10

                                                                                                                                                                                                                                    Именно, что в равном, а не "У меня хоть есть весь исходный успешно выполняемый код на GitHub. ".


                                                                                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                                                                                      28.11.2019 11:20

                                                                                                                                                                                                                                      Демонстрация проекта


                                                                                                                                                                                                                                      Ролик готовился для выступления на конференции, звука нет. Комментировался во время доклада.


                                                                                                                                                                                                                  1. staticlab
                                                                                                                                                                                                                    28.11.2019 11:35
                                                                                                                                                                                                                    +1

                                                                                                                                                                                                                    У меня хоть есть весь исходный успешно выполняемый код на GitHub. У Вас вообще ни чего нет. Обрывки непонятно чего, непонятно откуда. Я же верю Вам на слово.

                                                                                                                                                                                                                    Справедливости ради, никто кроме вас не может его собрать и выполнить, потому что отсутствуют зависимости, а именно — ваш фреймворк, который вы никому не даёте. Таким образом, ни ваша статья, ни код на гитхабе не имеют никакой ценности, и всем остаётся только верить на слово, что ваш код работает и выполняет то, что заявлено.


                                                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                                                              28.11.2019 08:13

                                                                                                                                                                                                              Пример вызовов по различным протоколам с использованием решения описанном в статье


                                                                                                                                                                                                              Локальный вызов


                                                                                                                                                                                                              info.getInfo();


                                                                                                                                                                                                              Вызов по RMI


                                                                                                                                                                                                              info.getInfo();


                                                                                                                                                                                                              Вызов по HTTP


                                                                                                                                                                                                              info.getInfo();


                                                                                                                                                                                                              и т.д. и т.п.


                                                                                                                                                                                                              Попробуйте найти отличие.


                                                                                                                                                                                                              1. lair
                                                                                                                                                                                                                28.11.2019 11:12

                                                                                                                                                                                                                Гм. Это выглядит как тривиальный полиморфизм.


                                                                                                                                                                                                                Вы, наверное, хотите сказать, что можно переключить вызов с локального на HTTP, изменив только конфигурацию, не трогая ни строчки кода вызывающего приложения, да?


                                                                                                                                                                                                                Если это так, то вы можете привести минимальный изолированный пример необходимого конфигурационного изменения?


                                                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                                                  29.11.2019 07:58

                                                                                                                                                                                                                  Да. Пример же рассмотрен (в общем виде) в статье.


                                                                                                                                                                                                                  Но можно и продублировать


                                                                                                                                                                                                                  Начальная конфигурация вызова локальной функции


                                                                                                                                                                                                                  <?xml version="1.0" encoding="UTF-8"?>
                                                                                                                                                                                                                  <avalanche name="Demo Application">
                                                                                                                                                                                                                  
                                                                                                                                                                                                                      <function class="ru.funsys.demo.avalanche.DemoFunction" name="info-function" description="Сведения об узле системы" />
                                                                                                                                                                                                                  
                                                                                                                                                                                                                      <application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" >
                                                                                                                                                                                                                          <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="info-function" />
                                                                                                                                                                                                                      </application>
                                                                                                                                                                                                                  
                                                                                                                                                                                                                  </avalanche>

                                                                                                                                                                                                                  Вызов по HTTP удаленного объекта — на удаленном узле должен "присутствовать" коннектор c именем http-connector, в котором опубликована функция info. Локальная функция не нужна.


                                                                                                                                                                                                                  <?xml version="1.0" encoding="UTF-8"?>
                                                                                                                                                                                                                  <avalanche name="Demo Application">
                                                                                                                                                                                                                  
                                                                                                                                                                                                                          <interface name="http-interface" uri="http://localhost:8080/demo/connector/http-connector" />
                                                                                                                                                                                                                  
                                                                                                                                                                                                                        <application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" >
                                                                                                                                                                                                                          <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="http-interface/info" />
                                                                                                                                                                                                                      </application>
                                                                                                                                                                                                                  
                                                                                                                                                                                                                  </avalanche>


                                                                                                                                                                                                                  1. lair
                                                                                                                                                                                                                    29.11.2019 10:16

                                                                                                                                                                                                                    Ну то есть поменять надо две строчки:


                                                                                                                                                                                                                    1. добавить interface (не знаю, обязательно ли удалять function)
                                                                                                                                                                                                                    2. поменять uri в adapter (что занятно, часть этого uri должна совпадать с name в interface, но только часть)

                                                                                                                                                                                                                    А теперь давайте сравним с неким (полумифическим) фреймворком.


                                                                                                                                                                                                                    Настройка для локального вызова:


                                                                                                                                                                                                                    builder
                                                                                                                                                                                                                    .Register<DemoFunction>()
                                                                                                                                                                                                                    .As<Function>()

                                                                                                                                                                                                                    Настройка для удаленного вызова:


                                                                                                                                                                                                                    builder
                                                                                                                                                                                                                    .RegisterHttpAdapter("http://localhost:8080/demo/connector/http-connector")
                                                                                                                                                                                                                    .As<Function>()

                                                                                                                                                                                                                    Число изменяемых строчек явно не больше. Внимание, вопрос — почему вы утверждаете, что ваше изменение:


                                                                                                                                                                                                                    1. проще
                                                                                                                                                                                                                    2. имеет меньший риск внести ошибку или сломать ИС?


                                                                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                                                                      29.11.2019 10:29

                                                                                                                                                                                                                      Приведите код "работоспособной" функции и код который ее использует хотя бы.


                                                                                                                                                                                                                      Ваше решение (на вскидку):


                                                                                                                                                                                                                      • Конфигурация зашита в код — плохое решение.
                                                                                                                                                                                                                      • HttpAdapter регистрируется как функция, который таковым не является — это больше протокол обмена
                                                                                                                                                                                                                      • Данного кода не достаточно для успешного вызова удаленного класса
                                                                                                                                                                                                                      • Для отказоустойчивости нужно наворачивать еще код


                                                                                                                                                                                                                      1. lair
                                                                                                                                                                                                                        29.11.2019 11:10

                                                                                                                                                                                                                        Приведите код "работоспособной" функции и код который ее использует хотя бы.

                                                                                                                                                                                                                        "Функция":


                                                                                                                                                                                                                        public string DemoFunction(int someInput)
                                                                                                                                                                                                                        {
                                                                                                                                                                                                                          //делайте что угодно
                                                                                                                                                                                                                          return someOutput;
                                                                                                                                                                                                                        }

                                                                                                                                                                                                                        Точка вызова:


                                                                                                                                                                                                                        [Inject]
                                                                                                                                                                                                                        Function _function;
                                                                                                                                                                                                                        //...
                                                                                                                                                                                                                        Show(_function(42));

                                                                                                                                                                                                                        Обычный DIP, проще говоря, ничего нового или необычного.


                                                                                                                                                                                                                        Конфигурация зашита в код — плохое решение.

                                                                                                                                                                                                                        Ну как так? Я специально написал комментарий, в котором два решения рядом, чтобы попробовать понять, почему это плохое решение, а вы опять пишете "плохое решение", необъясняя. Почему это плохое решение?


                                                                                                                                                                                                                        HttpAdapter регистрируется как функция, который таковым не является — это больше протокол обмена

                                                                                                                                                                                                                        Пожалуйста, специально для вас:


                                                                                                                                                                                                                        builder
                                                                                                                                                                                                                        .RegisterHttpAdapter("http://localhost:8080/demo/connector/http-connector")
                                                                                                                                                                                                                        .For<Function>()

                                                                                                                                                                                                                        Данного кода не достаточно для успешного вызова удаленного класса

                                                                                                                                                                                                                        Ровной в той же мере, в которой вашей конфигурации недостаточно для успешного вызова удаленного класса. Где-то дальше лежит фреймворк, да.


                                                                                                                                                                                                                        Для отказоустойчивости нужно наворачивать еще код

                                                                                                                                                                                                                        Да нет:


                                                                                                                                                                                                                        builder
                                                                                                                                                                                                                        .RoundRobin(
                                                                                                                                                                                                                          Http("http://node1:8080/demo/connector/http-connector"),
                                                                                                                                                                                                                          Http("http://node2:8080/demo/connector/http-connector"),
                                                                                                                                                                                                                          Http("http://node3:8080/demo/connector/http-connector")
                                                                                                                                                                                                                        )
                                                                                                                                                                                                                        .For<Function>()

                                                                                                                                                                                                                        (Это даже не вдаваясь в те детали, что, по моему скромному мнению, за отказоустойчивость должен отвечать поставщик, т.е. http://service:8080/demo/connector/http-connector, где прекрасно можно навернуть любой балансировщик миллионом способов, а не получатель. Инкапсуляция, вот это все.)


                                                                                                                                                                                                                        1. vl65 Автор
                                                                                                                                                                                                                          29.11.2019 12:08

                                                                                                                                                                                                                          Так где связь то между функций DemoFunction и HttpAdapter


                                                                                                                                                                                                                          1. lair
                                                                                                                                                                                                                            29.11.2019 12:10

                                                                                                                                                                                                                            А где она в вашей конфигурации?


                                                                                                                                                                                                                            <?xml version="1.0" encoding="UTF-8"?>
                                                                                                                                                                                                                            <avalanche name="Demo Application">
                                                                                                                                                                                                                            
                                                                                                                                                                                                                                    <interface name="http-interface" uri="http://localhost:8080/demo/connector/http-connector" />
                                                                                                                                                                                                                            
                                                                                                                                                                                                                                  <application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" >
                                                                                                                                                                                                                                    <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="http-interface/info" />
                                                                                                                                                                                                                                </application>
                                                                                                                                                                                                                            
                                                                                                                                                                                                                            </avalanche>


                                                                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                                                                              29.11.2019 14:04
                                                                                                                                                                                                                              -1

                                                                                                                                                                                                                              Перед вашими глазами


                                                                                                                                                                                                                              1. lair
                                                                                                                                                                                                                                29.11.2019 14:08

                                                                                                                                                                                                                                Там нет ни одного упоминания DemoFunction. Если бы было, я бы не спрашивал.


                                                                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                                                                  29.11.2019 14:35

                                                                                                                                                                                                                                  там же сеть комментарий выше над этой конфигураций, там написано что должно быть в удаленном коннекторе.


                                                                                                                                                                                                                                  Описано это и в статье


                                                                                                                                                                                                                                  <?xml version="1.0" encoding="UTF-8"?>
                                                                                                                                                                                                                                  <avalanche name="Demo Application">
                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                      <function class="ru.funsys.demo.avalanche.DemoFunction" name="info-function" description="Сведения об узле системы" />
                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                      <connector class="HTTPConnector" name="http-connector" >
                                                                                                                                                                                                                                          <publish name="info" function="info-function" />
                                                                                                                                                                                                                                      </connector>
                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                  </avalanche>
                                                                                                                                                                                                                                  


                                                                                                                                                                                                                                  1. lair
                                                                                                                                                                                                                                    29.11.2019 14:40

                                                                                                                                                                                                                                    Я и говорю: в вашей конфигурации приложения-потребителя этого нет. Я бы предпочел ей и ограничиваться, это уменьшает объем одновременно обсуждаемых вопросов. Вы уверен, что хотите добавить сюда еще и приложение-поставщик? Потому что на вопросы про приложение-потребитель вы пока не ответили (и приложение-поставщик никак на них не повлияет).


                                                                                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                                                                                      29.11.2019 14:44

                                                                                                                                                                                                                                      так функция вызывается с другого узла, ее нет на вызывающем узле. Вызывающий узел не знает какой класс он вызывает. Он знает узел к которому он должен обратиться, имя экземпляра и метод который вызывается. Остальное его "не интересует". Аналогично вызывается и локальный объект.


                                                                                                                                                                                                                                      1. lair
                                                                                                                                                                                                                                        29.11.2019 14:46

                                                                                                                                                                                                                                        Именно поэтому я предлагаю ограничиться для обсуждения стороной потребителя, не затрагивая поставщик.


                                                                                                                                                                                                                                        1. vl65 Автор
                                                                                                                                                                                                                                          29.11.2019 14:50

                                                                                                                                                                                                                                          В предложенном решении — это не имеет значения (поставщик или потребитель). Предложенное решение позволяет реализовывать распределенные или кластерные приложения, т.е создавать приложение, работающие на множестве узлов — это просто одно приложение.


                                                                                                                                                                                                                                          1. lair
                                                                                                                                                                                                                                            29.11.2019 14:52

                                                                                                                                                                                                                                            В предложенном решении — это не имеет значения (поставщик или потребитель).

                                                                                                                                                                                                                                            В вашем примере есть две разных конфигурации, одна на стороне того, что я называю потребителем, другая — на стороне того, что я называю поставщиком. Я стараюсь ограничить свои вопросы одной конфигурацией, просто чтобы упростить обсуждение. Вы настаиваете, чтобы мы обсуждали обе?


                                                                                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                                                                                              29.11.2019 14:54

                                                                                                                                                                                                                                              Это конфигурации двух разных узлов одного приложения. Приложение одно, код на узлах одинаковый.


                                                                                                                                                                                                                                              1. lair
                                                                                                                                                                                                                                                29.11.2019 14:56

                                                                                                                                                                                                                                                Я стараюсь ограничить свои вопросы одной конфигурацией, просто чтобы упростить обсуждение. Вы настаиваете, чтобы мы обсуждали обе?


                                                                                                                                                                                                                        1. vl65 Автор
                                                                                                                                                                                                                          29.11.2019 12:13

                                                                                                                                                                                                                          а балансировщик кто будет от сбоев "балансировать"?


                                                                                                                                                                                                                          А в распределенных одноранговых системах сколько вам балансировщиков понадобиться?


                                                                                                                                                                                                                          1. lair
                                                                                                                                                                                                                            29.11.2019 12:15

                                                                                                                                                                                                                            а балансировщик кто будет от сбоев "балансировать"?

                                                                                                                                                                                                                            Тот же, кто будет балансировать от сбоев вашего потребителя.


                                                                                                                                                                                                                            А в распределенных одноранговых системах сколько вам балансировщиков понадобиться?

                                                                                                                                                                                                                            Столько, сколько нужно для достижения необходимой надежности.


                                                                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                                                                              29.11.2019 14:03

                                                                                                                                                                                                                              Чем больше добавите, тем меньше надежность — плодите точки отказа, усложняете диагностику отказа, не управляете всеми элементами системы, балансировщики не все данные через себя способы пропустить.


                                                                                                                                                                                                                              В предложенном решении — система управляема, состояние всех каналов контролируется и если канал "не исправен", то запрос сразу перенаправляется на другой узел или, если нет резервных узлов, ошибка сразу возвращается без ожиданий истечения разных TCP соединений. Это не просаживает производительности системы для пользователей при проблемах в ее распределенной среде.


                                                                                                                                                                                                                              1. lair
                                                                                                                                                                                                                                29.11.2019 14:07

                                                                                                                                                                                                                                Чем больше добавите, тем меньше надежность

                                                                                                                                                                                                                                Скажем так, в общем случае это неверно. Иначе бы вообще системы с балансировщиками нагрузок работали хуже, чем без них.


                                                                                                                                                                                                                                не управляете всеми элементами системы

                                                                                                                                                                                                                                Во-первых, почему? Если я за всю систему отвечаю, я и управляю.
                                                                                                                                                                                                                                Во-вторых, почему это плохо? Если удаленный сервис — не моя ответственность, то почему я должен им управлять?


                                                                                                                                                                                                                                В предложенном решении

                                                                                                                                                                                                                                В предложенном в статье решении ничего этого нет. Это просто какие-то ваши обещания относительно какой-то нигде не показанной вашей реализации. Я могу с равным успехом сказать, что при использовании балансировщика X доступно все то же самое, и еще и есть интеграция с Y (что, скажем, будет верно для AWS-инфраструктуры).


                                                                                                                                                                                                                                Но это все, на самом деле, не важно. То, что я предпочитаю отделять инфраструктуру от развернутых приложений — мое собственное предпочтение. На дискуссию "код или конфигурация" оно не влияет никак, потому что задать балансировку через код ничуть не сложнее, чем задать балансировку через конфигурацию.


                                                                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                                                                  29.11.2019 14:32

                                                                                                                                                                                                                                  чем балансировать балансировщики — это тоже точка отказа


                                                                                                                                                                                                                                  все узлы ваши — предложенное решение предназначено для создания распределенных или кластерных приложений


                                                                                                                                                                                                                                  1. lair
                                                                                                                                                                                                                                    29.11.2019 14:34

                                                                                                                                                                                                                                    все узлы ваши — предложенное решение предназначено для создания распределенных или кластерных приложений

                                                                                                                                                                                                                                    Вот как раз в распределенных приложениях совершенно не обязательно, что все узлы мои.


                                                                                                                                                                                                                                    Но, повторюсь, это не важно.


                                                                                                                                                                                                                                    1. vl65 Автор
                                                                                                                                                                                                                                      29.11.2019 14:37

                                                                                                                                                                                                                                      Верно, не обязательно, но контролировать "чужие" узлы все равно обязаны


                                                                                                                                                                                                                                      1. lair
                                                                                                                                                                                                                                        29.11.2019 14:41

                                                                                                                                                                                                                                        Нет, не обязан.


                                                                                                                                                                                                                                        Но, повторюсь, это не важно.


                                                                                                                                                                                                                                        1. vl65 Автор
                                                                                                                                                                                                                                          29.11.2019 14:47

                                                                                                                                                                                                                                          Значит ваше приложение будет проседать в производительность когда "чужие узлы не доступны"


                                                                                                                                                                                                                                          1. lair
                                                                                                                                                                                                                                            29.11.2019 14:50

                                                                                                                                                                                                                                            Оно будет "проседать" в производительности, когда чужие узлы нарушают оговоренные условия обслуживания. И это, в общем-то, неизбежно.


                                                                                                                                                                                                                                            1. vl65 Автор
                                                                                                                                                                                                                                              29.11.2019 14:52

                                                                                                                                                                                                                                              Не верно! При контроле состояния "чужих" узлов можно избежать ухудшения производительности.


                                                                                                                                                                                                                                              1. lair
                                                                                                                                                                                                                                                29.11.2019 14:55

                                                                                                                                                                                                                                                Нельзя. То, что чужой узел предоставляет вам способ контроля его состояния, и то, что этот способ контроля достоверно соотносится с его поведением — это тоже условия обслуживания. Если чужой узел их придерживается — все будет хорошо; но я говорю о ситуации, когда чужой узел их не придерживается.


                                                                                                                                                                                                                                                Поскольку он чужой, вы все равно ничего не можете с этим сделать.


                                                                                                                                                                                                                                                1. vl65 Автор
                                                                                                                                                                                                                                                  29.11.2019 14:57

                                                                                                                                                                                                                                                  С "чужим" нельзя, со своим можно. Зная что чужой узел не доступен, можно вообще не обращаться к нему, пока он снова не станет работоспособным.


                                                1. vl65 Автор
                                                  26.11.2019 18:21
                                                  -1

                                                  А еще один тест вашего "решения". Заказчик начнет плановое обновления аппаратной среды, т.е последовательно будет проводить перемещение своих узлов системы на новые аппаратные средства, что ему по каждому чиху к вам обращаться за новой сборкой каждого узла? Перемещение одного узла может повлечь изменения конфигурации всех узлов! ваше решение будет просто ужас для заказчика


                                                  1. lair
                                                    26.11.2019 18:23
                                                    +1

                                                    Заказчик начнет плановое обновления аппаратной среды, т.е последовательно будет проводить перемещение своих узлов системы на новые аппаратные средства, что ему по каждому чиху к вам обращаться за новой сборкой каждого узла?

                                                    Почему ко мне? К тому, кто отвечает за поддержку и развертывание его системы.


                                                    ваше решение будет просто ужас для заказчика

                                                    Отнюдь. В моем случае развертывание нового узла — это несколько (а может быть и одна) строчка в деплоймент-проекте. Поправил, закоммитил, отправил на деплой.


                              1. lair
                                26.11.2019 17:53

                                такого решения ни где нет

                                Это, очевидно, неправда. Есть как минимум в Serilog.


                                1. vl65 Автор
                                  26.11.2019 17:56

                                  Не знаком с этим продуктом, может вы и правы. Я подобных решений не видел.


    1. zirix
      26.11.2019 15:10

      Там еще и Hashtable используется, который deprecated retrofitted с 1998 года.

      As of the Java 2 platform v1.2, this class was retrofitted to implement the Map interface, making it a member of the Java Collections Framework. Unlike the new collection implementations, Hashtable is synchronized. If a thread-safe implementation is not needed, it is recommended to use HashMap in place of Hashtable. If a thread-safe highly-concurrent implementation is desired, then it is recommended to use ConcurrentHashMap in place of Hashtable.


      1. vl65 Автор
        26.11.2019 15:23
        -1

        В приведенном примере нет параллельного доступа к объекту Hashtable. В случае одновременного обращения нескольких пользователей каждый будет работать со своим экземпляром Hashtable


        1. Lofty
          26.11.2019 15:49
          +1

          Следовательно a thread-safe implementation is not needed и, как следует из рекомендаций it is recommended to use HashMap in place of Hashtable.


        1. zirix
          26.11.2019 15:51
          +1

          Вы меня не поняли, Hashtable — это легаси и не рекомендован к использованию (начиная с 1998 года).


          1. vl65 Автор
            26.11.2019 16:06
            -1

            Это всего лишь пример. В однопоточном варианте класс отлично работает. И даже в документации JDK 13 нет упоминания, что этот класс @Deprecated


            1. zirix
              26.11.2019 16:33
              +1

              Пакеты sun.misc тоже не отмечены как депрекатед (и аналогичными аннотациями), но их использование говорит о серьезных пробелах в знаниях разработчика.
              Просто запомните еще одно правило: Hashtable использовать нельзя.


              1. vl65 Автор
                26.11.2019 16:38
                -1

                Это не существенный вопрос. Да использовать при многопоточном доступе к экземпляру этого объекту — нельзя. Если посмотреть исходный код экого класса, то ничего особенного в нем нет.


  1. Lofty
    25.11.2019 13:52
    +2

    Миллениалы придумали remote ejb?
    Вообще «стирающей различия между вызовами локального и удаленного кода», не то, чтобы прям однозначно преимущество


    1. vl65 Автор
      25.11.2019 19:41

      Зато какие перспективы оно открывает вашему приложению, если не Вам лично, то вашему заказчику уж точно. Запустил он ваше приложение и радуется. Но время идет, интенсивность использования приложения растет, объемы хранения данных тоже увеличиваются. И в один "прекрасный" момент приложение начинает упираться в производительность аппаратной платформы. Что делать заказчику? Покупать новое более мощное железо? А можно взять и растащить приложение на множество узлов, поменяв его конфигурацию. И снова у заказчика наступит "век счастья".


      Сейчас модно говорить о виртуализации серверов, когда на одном физическом сервере запускается множество виртуальных.


      Рассмотренная технология предлагает другую виртуализацию, когда информационная система запускается на множестве виртуальных или физических серверах, объединяя их аппаратные ресурсы, т.е. аппаратные ресурсы вашей системы уже ни чем не ограничены.


      1. ne_kotin
        25.11.2019 19:50
        +2

        Рассмотренная технология предлагает другую виртуализацию, когда информационная система запускается на множестве виртуальных или физических серверах, объединяя их аппаратные ресурсы

        OpenMosix, в котором эта концепция реализовывалась на уровне ядра — задохлился много лет назад почему-то.
        GridGain, который вообще обещал zero deployment уровня «воткни питание и сеть, остальное воспоследует автомагически», ичсх тоже для джава-приложений — тоже немного не смог в автомагию без некоторого количества ручной работы.

        Видимо масштабируемость не так линейна как хочется верить.


        1. vl65 Автор
          26.11.2019 08:02

          Если у кого то не получилось, из этого не следуют, что это нельзя реализовать.


      1. lair
        25.11.2019 20:18

        А можно взять и растащить приложение на множество узлов, поменяв его конфигурацию.

        Неа, нельзя. Если в приложении заранее не заложена такая возможность — и нет, не с помощью вашего транспорта, а на уровне архитектуры, — то не получится такого счастья.


        1. vl65 Автор
          26.11.2019 08:01
          -1

          Неа, нельзя. Если в приложении заранее не заложена такая возможность — и нет, не с помощью вашего транспорта, а на уровне архитектуры, — то не получится такого счастья.

          Рассмотренное решение реализует модель MVFA (Model — View — Function — Application), которая и предоставляет несколько иной взгляд на архитектуру приложения
          Про архитектуру коснусь чуть позднее.


          1. lair
            26.11.2019 11:25

            Ну вот "чуть позднее" и посмотрим, работает ли это всегда, как вы утверждаете, или только в некоторых частных случаях, как говорит (мой, например) опыт. Пока что, за неимением доказательств, продолжаем считать, что нет, нельзя просто "взять и растащить приложение на множество узлов".


          1. lair
            26.11.2019 12:04

            Ну вот вы коснулись:


            • Любые объекты (типы), декларируемые в адаптерах (входные и возвращаемые параметры), [...] должны реализовывать интерфейс…
            • Не все объекты могут быть переданы по сети.

            Из этого явно следует, что нельзя просто "взять и растащить приложение", если оно внутри себя не использует ваши (ненужные для локального исполнения) ограничения.


            1. vl65 Автор
              26.11.2019 14:17

              Любая технология имеет какие либо ограничения и, несмотря на их наличие, они же используются. Учитывая эти ограничения, можно построить систему так, что любые объекты системы можно растащить на любое число узлов. ResultSet, например, можно передать на любой узел системы, хотя он тоже привязан узлу создания экземпляра класса. Для этого достаточно создать собственный класс "обертку", реализующий этот интерфейс.


              1. lair
                26.11.2019 14:19
                +1

                Учитывая эти ограничения, можно построить систему так

                Что и подтверждает мой исходный тезис: чтобы система масштабировалась, ее нужно корректно спроектировать. Просто использовать магический фреймворк недостаточно.


                1. vl65 Автор
                  26.11.2019 14:33

                  Предложенное решение значительно упрощает этот процесс, предоставляя для использования готовую функциональность.


                  1. lair
                    26.11.2019 14:34

                    Неа. Предложенное в посте решение никак не упрощает процесс проектирования — оно только заменяет способ связывания компонентов друг с другом. На то, как компоненты написаны внутри, оно не влияет.


                    1. vl65 Автор
                      26.11.2019 14:42

                      Прокол Вам не нужно "изобретать". Над вопросами надежности Вам не нужно задумываться, предложенный фреймворк решит эту задачу за Вас. Система логирования уже в комплекте. Система мониторинга в комплекте и способна снять "мерки" с вызова любой функции, которую вы еще только напишите.


                      1. lair
                        26.11.2019 14:46

                        … и это все не имеет никакого отношения к пректированию каждого отдельного компонента. Например, к банальной задаче консистентности данных между двумя узлами кластера.


                        1. vl65 Автор
                          26.11.2019 14:50
                          -1

                          А вот здесь вам поможет еще одно замечательное свойство предложенного решения — режим разноверсионности, когда процесс обновления программного обеспечения на разных узлах системы может быть растянут по времени. Это не критично для системы.


                          1. lair
                            26.11.2019 14:56
                            +1

                            А вот здесь вам поможет еще одно замечательное свойство предложенного решения — режим разноверсионности

                            Нет, не поможет.


                            (Я говорю о консистентности данных, если что)


                            Это не критично для системы.

                            Правда? То есть если вы обновляете код таким образом, что меняется логика его работы, и на одной ноде логика старая, на другой — новая, система-потребитель не заметит неконсистентности расчета при балансировке?


                            1. vl65 Автор
                              26.11.2019 15:20

                              Поможет, консистентность данных здесь вообще ни причем. Два узла системы при разнесении на них разных ее "частей" по "определению" имеют разное состояние.


                              Правда, правда. Обновление узлов системы не критично.


                              1. lair
                                26.11.2019 15:28
                                +1

                                Поможет, консистентность данных здесь вообще ни причем.

                                Что значит — не при чем? Система-потребитель ожидает, что данные будут консистентны.


                                Два узла системы при разнесении на них разных ее "частей" по "определению" имеют разное состояние.

                                Вот только система-потребитель не знает, что потребляемый код разнесен на два узла (это вы подаете как достоинство), следовательно, она ожидает, что состояние будет одинаковым.


                                Правда, правда. Обновление узлов системы не критично.

                                Давайте на примере. Вот мы сделали логику расчета скидок для строк в заказе. Она вызывается для каждой строки отдельно. Вы заметили, что считаете медленно, и вынесли эту логику на несколько параллельно работающих узлов.


                                Теперь вы поменяли эту логику, и стали накатывать ее на разные узлы. В некий момент времени на узле А старый алгоритм расчета, на узле Б — новый. Система потребитель, ничего об этом не зная, получает разный расчет скидок для двух разных строк в одном заказе. Пользователь в шоке.


  1. staticlab
    26.11.2019 15:21

    Под какой лицензией распространяется ваш фреймворк и как его можно получить?


    1. vl65 Автор
      26.11.2019 15:50
      -1

      Модель распространения пока не выбрана. Но если Вас заинтересовал этот продукт давайте обсудим это в личных контактах.


      1. zirix
        26.11.2019 15:58
        +1

        Вы его еще и продавать собрались? :)
        На гитхабе только демка, никаких следов фреймворка.