LINUX.ORG.RU

Ergo Framework 3.1

 , ,


0

2

После года разработки вышла очередная версия фреймворка для построения распределенных решений на языке Golang – Ergo Framework 3.1

Ergo Framework – это реализация идей, технологий и шаблонов проектирования из мира Erlang на языке программирования Go. Он построен на акторной модели, сетевой прозрачности и наборе готовых компонентов для разработки. Это значительно упрощает создание сложных и распределенных решений, обеспечивая при этом высокий уровень надежности и производительности.

Ключевые возможности этой версии

Основные улучшения:

  • Cron планировщик для выполнения задач по времени со стандартными cron выражениями
  • Port Meta Process для управления внешними процессами ОС с двунаправленной связью
  • Фреймворк для юнит-тестирования изолированного тестирования акторов с валидацией событий
  • Улучшенное логирование с JSON выводом и структурированными полями

Экосистема внешних библиотек:

  • Все внешние библиотеки теперь независимые Go модули с отдельным управлением зависимостями
  • Новый etcd Registrar для распределенного service discovery с событиями кластера в реальном времени
  • Улучшенный Observer со страницей Applications и мониторингом Cron задач
  • Производительность сериализации EDF теперь конкурирует с Protobuf, сохраняя гибкость runtime reflection
  • Erlang protocol stack переведен с лицензии BSL 1.1 на MIT
  • Все инструменты консолидированы под доменом ergo.tools

Производительность

Более 21М сообщений/сек локально и 5М сообщений/сек по сети на 64-ядерных системах. Сериализация EDF конкурентоспособна с Protobuf для большинства типов данных.

Ресурсы

Подробный changelog смотрите в README.md на https://github.com/ergo-services/ergo

Приятного кодинга✌️ https://ergo.services

>>> Подробности

★★★

Проверено: hobbit ()
Последнее исправление: unfo (всего исправлений: 3)

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

skyman ★★★★
()

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

Enthusiast ★★★
()

Выглядит очень интересно, но непонятно. Нужны ли знания Erlang, чтобы подцепить Ergo?

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

(Обычно этот титул занимают Rust и Haskell в глазах других людей, но контроль за памятью и типами как будто не расширяет профиль программиста, а скорее лечит травмы программирования на C, заменяя тулинг, тесты и отладку на унылую алгебру типов и владений.)

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 6)
Ответ на: комментарий от kaldeon

Нужны ли знания Erlang, чтобы подцепить Ergo?

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

PS: не применительно к вам, но заметил тенденцию к сильному обленению (не знаю как правильней сказать) программистов - даже наличие в новости ссылок на документацию и примеры не достаточно, что не получать комментарии вида «Does anyone have any tutorials or something for ergo. I’ve been interested in learning actor frameworks but have no idea where to start». Вот как отвечать на подобные комментарии? :)

ergo ★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

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

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Я на вопрос о сложности изучения Go отвечал. Извиняюсь, если непонятно вышло.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от ergo

Как вариант — повыше ссылки добавить, в стиле:

После года разработки вышла очередная версия фреймворка для построения распределенных решений на языке Golang – Ergo Framework 3.1 (примеры, документация)

Кстати, а где найти примеры и документацию?

kaldeon
()
Ответ на: комментарий от ergo

Вот как отвечать на подобные комментарии? :)

Ну а что, вот я например захожу на сайт RabbitMQ, и там тьюториалы, т.е. мне сразу объясняют, что в примерах та или иная строка делает, а не просто ворох примеров и всё.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 2)
Ответ на: комментарий от pihter

А че такое акторная модель, в двух словах, кому не сложно?

Модель в которой некая работа распределяется по куче изолированных независимых воркеров(акторов).

Вот тут более подробно.

https://www.youtube.com/watch?v=CBUWcUuG6Ss&t=1s

bdrbt
()
Ответ на: комментарий от pihter

А че такое акторная модель, в двух словах, кому не сложно?

Весь мир - фреймоврк, в нём все - акто́ры.

LamerOk ★★★★★
()
Ответ на: комментарий от sanyo1234

Хорошая табличка. Только с небольшими неточностями - у ergo собственный сетевой стек (ENP + EDF) + реализация эрлангового стека в виде отдельного модуля. В остальном вроде верно 👍

ergo ★★★
() автор топика
Последнее исправление: ergo (всего исправлений: 1)

Добрый день.


func factorySub() gen.ProcessBehavior {
	return &actorSub{}
}

type actorSub struct {
	act.Actor
}

func (a *actorSub) Init(args ...any) error {
	// Linking/Monitoring are not allowed here since this
	// process is not fully initialized.
	a.Send(a.PID(), "init")
	a.Log().Info("MyNode1: started subscriber process on: %s", a.Node().Name())
	return nil
}

func (a *actorSub) HandleMessage(from gen.PID, message any) error {
	remoteNode := gen.Atom("MyNode@localhost")
	switch message {
	case "init":
		eventName := gen.Event{
			Name: eventName1,
			Node: remoteNode,
			// a.Node().Name(),
		}
		// making subscription using MonitorEvent of the gen.Process interface
		if _, err := a.MonitorEvent(eventName); err != nil {
			return err
		}
		a.Log().Info("MyNode1: successfully subscribed to: %s", eventName)
		return nil
	}
	a.Log().Error("MyNode1: unknown message %#v", message)
	return nil
}

func (a *actorSub) HandleEvent(event gen.MessageEvent) error {
	a.Log().Info("MyNode1: received event %s with value: %#v", event.Event, event.Message)
	return nil
}

func (a *actorSub) ProcessTerminate(reason error) {
	a.Log().Info("MyNode1: terminated with reason: %s", reason)
}

Это запускается так

// Init invoked on a spawn Supervisor process. This is a mandatory callback for the implementation
func (sup *MySup) Init(args ...any) (act.SupervisorSpec, error) {
	var spec act.SupervisorSpec

	// set supervisor type
	// spec.Type = act.SupervisorTypeRestForOne

	// add children
	spec.Children = []act.SupervisorChildSpec{
		// {
		// 	Name:    "myactor",
		// 	Factory: factory_MyActor,
		// },
		// {
		// 	Name:    "mypub",
		// 	Factory: factoryPub,
		// },
		{
			Name:        "mysub",
			Factory:     factorySub,
			Significant: true,
		},
	}

	// set strategy
	spec.Restart.Strategy = act.SupervisorStrategyTransient
	spec.Restart.Intensity = 2 // How big bursts of restarts you want to tolerate.
	spec.Restart.Period = 5    // In seconds.

	return spec, nil
}

В результате получаю вот такой лог

1757404629932803209 [info] A05E4F3D: node 'MyNode1@localhost' built with "Ergo Framework:3.1.0" successfully started
mod1:1757404629932943725 [error] <A05E4F3D.0.1005>: process terminated abnormally - no route
1757404629932986101 [info] <A05E4F3D.0.1005>: MyNode1: terminated with reason: no route
1757404629933043463 [info] <A05E4F3D.0.1006>: MyNode1: started subscriber process on: 'MyNode1@localhost'
1757404629933062415 [error] <A05E4F3D.0.1006>: process terminated abnormally - no route
1757404629933066157 [info] <A05E4F3D.0.1006>: MyNode1: terminated with reason: no route
1757404629933074079 [info] <A05E4F3D.0.1007>: MyNode1: started subscriber process on: 'MyNode1@localhost'
1757404629933081561 [error] <A05E4F3D.0.1007>: process terminated abnormally - no route
1757404629933084424 [info] <A05E4F3D.0.1007>: MyNode1: terminated with reason: no route
1757404629933098793 [error] <A05E4F3D.0.1004>: process terminated abnormally - restart intensity is exceeded

Вопрос: что надо указывать в

// set strategy
	spec.Restart.Strategy = act.SupervisorStrategyTransient
	spec.Restart.Intensity = 2 // How big bursts of restarts you want to tolerate.
	spec.Restart.Period = 5    // In seconds.

Для того что бы sub-процесс factorySub перезапускался постоянно.

Спасибо.

alnkapa
()
Ответ на: комментарий от alnkapa

можно использовать стратегию Permanent, но у вас проблема в другом

// making subscription using MonitorEvent of the gen.Process interface
		if _, err := a.MonitorEvent(eventName); err != nil {
			return err
		}

если имя ивента указано неверно (в общем-то в логах по-моему как раз тот случай ибо ошибка «no route»), то return err - это терминация актора с ошибкой. Супервизор пытается рестартануть, но у него выставлены лимиты - 2 рестарта в теч 5 секунд, поэтому он отключает чилда.

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

ЗЫ если любой из колбеков актора возвращает ошибку, то это терминирует актор https://docs.ergo.services/basics/process#process-termination

про супервизор, его типы и стратегии рестарта - https://docs.ergo.services/actors/supervisor

ergo ★★★
() автор топика
Последнее исправление: ergo (всего исправлений: 1)
Ответ на: комментарий от ergo

Что делать если нода с MonitorEvent запустилась раньше ноды с RegisterEvent лучше всего? Ждать в factorySub типа for {…} или отдаться актеру пусть перезапускает.

alnkapa
()
Ответ на: комментарий от alnkapa

это уже на уровне логики приложения. я бы на ошибку монитора просто делал a.SendAfter(a.PID(), "init", time.Second) с некоторым лимитом на попытку такого инита.

Ждать в factorySub типа for {…}

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

ergo ★★★
() автор топика
Последнее исправление: ergo (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.