Гонец 3.2a
Pre-releaseОтличные новости - вышла версия 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"}