Я ненавижу руками создавать бойлерплейты. Любые. Нет, LLM-ки тут тоже не помогут: им надо писать промпты (а потом ещё проверять, что оно там нагенерировало). Мне всегда хотелось, чтобы остов приложения задавался конфигурацией, а я бы только добавлял бизнес-логику. Буквально, в уже сгенерированные для неё места.
Именно в такой парадигме написана моя библиотека finitomata, в которой конфигурация конечных автоматов задаётся текстовым представлением (PlantUML/Mermaid), а бизнес-логика просто распихивается по колбэкам переходов. Но мне этого оказалось мало, и я решил обернуть в такие же абстракции хранение и подписку на изменения.
Так родилась библиотека (пока не опубликована, доступна только в исходниках) persistomata
.

Я последовательно шёл к этой реализации, поэтому сначала были созданы Rambla для «публикации» в сторонние источники (текст на хабре) и Antenna для умного пабсаба (текст на хабре). Еще у меня завалялась библиотека Telemetría (текст на хабре), которая, вообще-то изначально писалась для упрощения работы с телеметрией, но потом обзавелась пользовательскими плагинами и теперь прекрасно подходит в качестве просто реализации аспектов для эликсира.
Картина с высоты орлиного полёта выглядит так (см. КДПВ):
все отслеживаемые сущности являются конечными автоматами (это не страшно, в вырожденном случае он может содержать один переход в то же самое состояние с разными пейлоадами, что эмулирует «просто набор функций»);
все переходы между состояниями обёрнуты в аспекты, отсылающие асинхронные сообщения в эфир; на эти сообщения можно подписаться из бизнес-логики (спасибо библиотеке
antenna
— очень гранулярно, если нужно), и на некоторые — подписано ядроpersistomata
;внутренние подписки публикуют полученные данные в настроенные «каналы» (спасибо
rambla
, каналы можно настроить какие угодно — от логов и пресловутой телеметрии, до базы данных) — по умолчанию этоClickhouse
.
Таким образом мы просто шлём сообщения нашим конечным автоматам, инициируя переходы, которые отсылают сообщения во внешний эфир и пишут event log в clickhouse.
Из коробки предоставляется (пока одна) mix task
, которая сгенерирует саму стейт-машину, тест для неё, и миграции для кликхауза. Миграций будет три, потому что помимо собственно ивентлога, мне потребуется нормальная таблица, которая реализована как materialized view на последних виденных состояниях «объектов».
Если помимо кликхауза — хочется прикрутить Postgres — добавьте свой listener средствами Antenna и пишите оттуда в базу. Нужен обмен горячими данными с братским микросервисом — добавьте RabbitMQ в конфигурацию Rambla. И так далее.
Оно по умолчанию прозрачно работает в кластере (горизонтальное масштабирование из коробки), легко дружится с Phoenix (в качестве примера я скоро допишу на этом движке хаброподобный форум, без модераторов и кармы — это чистый вайбкодинг, кстати, там только архитектура требует работы разработчика, со всем остальном справляются генераторы) и требует буквально нулевые ресурсы на взлёте. На моём ноуте (в контейнере с 8G RAM) бенчмарки показывают 80% загрузки на примерно 1000/50000 запросах в секунду (цифры write/read).
Поскольку я сейчас занят реализацией примера использования, очень интересны вопросы, комментарии и предложения. Всё-таки «хабрафорум» — это востребованный пример, но не совсем то, ради чего я затевался. Я метил преимущественно в микросервисы.
Удачного вайбкодинга!
Комментарии (3)
mvv-rus
22.06.2025 09:00Мне всегда хотелось, чтобы остов приложения задавался конфигурацией, а я бы только добавлял бизнес-логику. Буквально, в уже сгенерированные для неё места.
Не кажется ли вам, что вы переоткрыли подход low-code (который ранее переоткрыл Rapid Application Development, который... - и так далее, вглубь истории)?
А вообще, удачи в создании нового фреймворка, может быть - даже первого на ваших изотерических языках. А то фреймворки на JS у всех на слуху, а про ваши изотерические языки, как оно там с фреймворками, я, например, даже не слышал.
А что до вайбкодинга, то для него него вам надо поднакописть кодовую базу. Будет база - будет вам и ваш любимый вайбкодинг, например, чтобы вайбкодить эти самые конфигурации. А потребность в вайбкодинге от смены парадигмы с императивной на декларативную никуда не денется. Потому что декларативный подход сложность, на самом деле, не убирает. Вон, судя по народной любви к ORM, на том же SQL народу программировать работу с БД ничуть не проще, чем с навигационным доступом к БД (типа, как в Clipper).
cupraer Автор
22.06.2025 09:00Не кажется ли вам, что вы переоткрыли подход low-code […]
Нет. Из текста понятно, что ничего общего с low-code в этом решении нет.
про ваши изотерические языки, как оно там с фреймворками, я, например, даже не слышал
Нет там фреймворков, куда уж. Discord, Pepsico, J.P. Morgan, Mozilla, BBVA, да все буквально — прямо в машинных кодах херачат.
А что такое «изотерические», кстати?
фреймворки на JS у всех на слуху
Вы путаете фреймворки и костыли.
Zulu0
А ты умеешь в сарказм. Но статья прям хорша, спасибо