Pre-release
Pre-release

@covrom covrom released this Oct 6, 2017 · 190 commits to master since this release

Assets 4

Отличные новости - вышла версия 3.2а!

  • Виртуальная машина получила работу с синхронным пулом Го (sync.Pool), что позволило оптимизировать использование памяти при работе с регистрами и переменными в стэке вызовов.
  • Оптимизирована работа с переменными в окружениях
  • Появились первые базовые объекты метаданных: Сервер и Клиент

Подробнее о сервере и клиенте

Реализован собственный бинарный протокол общения интерпретаторов Гонец между собой, запущенных на разных серверах. Протокол простой, быстрый и компактный, TCP. Используется бинарное представление встроенных типов виртуальной машины.
По протоколу всегда передается структура, которая может содержать вложенные структуры, массивы и значения.
Каждое соединение получает свой уникальный идентификатор, который можно использовать в сообщениях.
Трафик шифруется алгоритмом AES128 (без усложнений, для скорости).
Работа клиента и сервера производится в горутинах, т.е. полностью параллельно, что можно увидеть по результатам ниже, в примере - видна хаотичная очередность обработки параллельных транзакций.

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

В дальнейшем, будет расширение функционала сервера и клиента до обмена по протоколам HTTP(S) / JSON.

Пример работы с сервером и клиентом

Обратите внимание, исполняемый ниже код из 10 соединений и отправки простых сообщений суммарно (сервер+клиент) потратил времени всего ... 2 миллисекунды!

Функция ОбработатьСерв(соед)
   сообщить("Сервер получил соединение:",соед)
   сообщить("Запрос:",соед.Получить())
Конецфункции

серв = Новый Сервер
Попытка
  серв.Открыть("tcp", "127.0.0.1:9990", 1000, ОбработатьСерв)
Исключение
 сообщить(ОписаниеОшибки())
 сообщить("Кажется сервер уже запущен, или тут какая-то другая ошибка, но мы все равно попробуем отправить запрос :)")
КонецПопытки

кли = Новый Клиент
Для н=1 по 10 Цикл

  // определяем анонимную функцию здесь, чтобы подхватилась переменная "н"
  ф = Функция (соед)
    Сообщить("Устанавливаем соединение:",соед)
    запр={
      "id":соед.Идентификатор(),
      "query":"Запрос по tcp протоколу, номер "+строка(н),
    }
    Сообщить("Отправляем:", запр)
    соед.Отправить(запр)
  КонецФункции

  кли.Открыть("tcp", "127.0.0.1:9990", ф)

КонецЦикла

Результат:

Сервер получил соединение: Соединение с клиентом 127.0.0.1:50482
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"23aa9e11-890d-4edf-b0b8-224cb8a77d08","query":"Запрос по tcp протоколу, номер 2"}
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50483
Отправляем: {"id":"72600d14-5ac8-4be2-9a70-70631d66ac1d","query":"Запрос по tcp протоколу, номер 3"}
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50484
Отправляем: {"id":"d9909db3-ea24-4013-b358-d0163ddbe7d3","query":"Запрос по tcp протоколу, номер 4"}
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50485
Отправляем: {"id":"637d338e-46e0-4e30-933d-6a255efa0c0c","query":"Запрос по tcp протоколу, номер 5"}
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50486
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"f6e5ebc0-7818-4861-8586-a3c891efcc55","query":"Запрос по tcp протоколу, номер 6"}
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"d8725203-4476-42f7-b6cd-dd98a0cb4041","query":"Запрос по tcp протоколу, номер 7"}
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"8f426e94-9242-4854-8053-20665d69dc16","query":"Запрос по tcp протоколу, номер 8"}
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50488
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50489
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"68ef9ea5-08b8-44bf-bf75-0eda6b43ab9f","query":"Запрос по tcp протоколу, номер 9"}
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50490
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"50a4ff77-8e26-4322-ae11-08d27873e5bc","query":"Запрос по tcp протоколу, номер 10"}
Время компиляции: 0s
Время исполнения: 2.0019ms
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50491
Отправляем: {"id":"b5304e60-c3b8-4562-b1bc-b8668e68230f","query":"Запрос по tcp протоколу, номер 10"}